]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/modules/m_spanningtree/main.cpp
Make VF_OPTCOMMON module mismatches a fatal link error by default
[user/henk/code/inspircd.git] / src / modules / m_spanningtree / main.cpp
index 28473fdf9930edc25b81ce874f445c66ff2f3d61..2ecbd8a88709f261bdec25cab12a75976d56011a 100644 (file)
@@ -48,22 +48,20 @@ ModuleSpanningTree::ModuleSpanningTree(InspIRCd* Me)
        Implementation eventlist[] =
        {
                I_OnPreCommand, I_OnGetServerDescription, I_OnUserInvite, I_OnPostLocalTopicChange,
-               I_OnWallops, I_OnUserNotice, I_OnUserMessage, I_OnBackgroundTimer,
-               I_OnUserJoin, I_OnChangeLocalUserHost, I_OnChangeName, I_OnUserPart, I_OnUnloadModule,
-               I_OnUserQuit, I_OnUserPostNick, I_OnUserKick, I_OnRemoteKill, I_OnRehash, I_OnPreRehash,
-               I_OnOper, I_OnAddLine, I_OnDelLine, I_ProtoSendMode, I_OnMode, I_OnLoadModule,
-               I_OnStats, I_ProtoSendMetaData, I_OnEvent, I_OnSetAway, I_OnPostCommand
+               I_OnWallops, I_OnUserNotice, I_OnUserMessage, I_OnBackgroundTimer, I_OnUserJoin,
+               I_OnChangeLocalUserHost, I_OnChangeName, I_OnUserPart, I_OnUnloadModule, I_OnUserQuit,
+               I_OnUserPostNick, I_OnUserKick, I_OnRemoteKill, I_OnRehash, I_OnPreRehash, I_OnOper,
+               I_OnAddLine, I_OnDelLine, I_OnMode, I_OnLoadModule, I_OnStats, I_OnEvent, I_OnSetAway,
+               I_OnPostCommand, I_OnUserConnect
        };
-       ServerInstance->Modules->Attach(eventlist, this, 30);
+       ServerInstance->Modules->Attach(eventlist, this, sizeof(eventlist)/sizeof(Implementation));
 
        delete ServerInstance->PI;
        ServerInstance->PI = new SpanningTreeProtocolInterface(this, Utils, ServerInstance);
        loopCall = false;
 
-       for (std::vector<User*>::const_iterator i = ServerInstance->Users->local_users.begin(); i != ServerInstance->Users->local_users.end(); i++)
-       {
-               ServerInstance->PI->Introduce(*i);
-       }
+       // update our local user count
+       Utils->TreeRoot->SetUserCount(ServerInstance->Users->local_users.size());
 }
 
 void ModuleSpanningTree::ShowLinks(TreeServer* Current, User* user, int hops)
@@ -442,7 +440,7 @@ void ModuleSpanningTree::OnUserInvite(User* source,User* dest,Channel* channel,
 {
        if (IS_LOCAL(source))
        {
-               std::deque<std::string> params;
+               parameterlist params;
                params.push_back(dest->uuid);
                params.push_back(channel->name);
                params.push_back(ConvToStr(expiry));
@@ -452,7 +450,7 @@ void ModuleSpanningTree::OnUserInvite(User* source,User* dest,Channel* channel,
 
 void ModuleSpanningTree::OnPostLocalTopicChange(User* user, Channel* chan, const std::string &topic)
 {
-       std::deque<std::string> params;
+       parameterlist params;
        params.push_back(chan->name);
        params.push_back(":"+topic);
        Utils->DoOneToMany(user->uuid,"TOPIC",params);
@@ -462,7 +460,7 @@ void ModuleSpanningTree::OnWallops(User* user, const std::string &text)
 {
        if (IS_LOCAL(user))
        {
-               std::deque<std::string> params;
+               parameterlist params;
                params.push_back(":"+text);
                Utils->DoOneToMany(user->uuid,"WALLOPS",params);
        }
@@ -479,8 +477,7 @@ void ModuleSpanningTree::OnUserNotice(User* user, void* dest, int target_type, c
                User* d = (User*)dest;
                if ((d->GetFd() < 0) && (IS_LOCAL(user)))
                {
-                       std::deque<std::string> params;
-                       params.clear();
+                       parameterlist params;
                        params.push_back(d->uuid);
                        params.push_back(":"+text);
                        Utils->DoOneToOne(user->uuid,"NOTICE",params,d->server);
@@ -512,7 +509,7 @@ void ModuleSpanningTree::OnUserNotice(User* user, void* dest, int target_type, c
                if (IS_LOCAL(user))
                {
                        char* target = (char*)dest;
-                       std::deque<std::string> par;
+                       parameterlist par;
                        par.push_back(target);
                        par.push_back(":"+text);
                        Utils->DoOneToMany(user->uuid,"NOTICE",par);
@@ -533,8 +530,7 @@ void ModuleSpanningTree::OnUserMessage(User* user, void* dest, int target_type,
                User* d = (User*)dest;
                if ((d->GetFd() < 0) && (IS_LOCAL(user)))
                {
-                       std::deque<std::string> params;
-                       params.clear();
+                       parameterlist params;
                        params.push_back(d->uuid);
                        params.push_back(":"+text);
                        Utils->DoOneToOne(user->uuid,"PRIVMSG",params,d->server);
@@ -566,7 +562,7 @@ void ModuleSpanningTree::OnUserMessage(User* user, void* dest, int target_type,
                if (IS_LOCAL(user))
                {
                        char* target = (char*)dest;
-                       std::deque<std::string> par;
+                       parameterlist par;
                        par.push_back(target);
                        par.push_back(":"+text);
                        Utils->DoOneToMany(user->uuid,"PRIVMSG",par);
@@ -581,12 +577,33 @@ void ModuleSpanningTree::OnBackgroundTimer(time_t curtime)
        DoConnectTimeout(curtime);
 }
 
-void ModuleSpanningTree::OnUserJoin(User* user, Channel* channel, bool sync, bool &silent)
+void ModuleSpanningTree::OnUserConnect(User* user)
+{
+       if (user->quitting)
+               return;
+
+       parameterlist params;
+       params.push_back(user->uuid);
+       params.push_back(ConvToStr(user->age));
+       params.push_back(user->nick);
+       params.push_back(user->host);
+       params.push_back(user->dhost);
+       params.push_back(user->ident);
+       params.push_back(user->GetIPString());
+       params.push_back(ConvToStr(user->signon));
+       params.push_back("+"+std::string(user->FormatModes(true)));
+       params.push_back(":"+std::string(user->fullname));
+       Utils->DoOneToMany(ServerInstance->Config->GetSID(), "UID", params);
+
+       Utils->TreeRoot->SetUserCount(1); // increment by 1
+}
+
+void ModuleSpanningTree::OnUserJoin(User* user, Channel* channel, bool sync, bool &silent, bool created)
 {
        // Only do this for local users
        if (IS_LOCAL(user))
        {
-               std::deque<std::string> params;
+               parameterlist params;
                // set up their permissions and the channel TS with FJOIN.
                // All users are FJOINed now, because a module may specify
                // new joining permissions for the user.
@@ -603,7 +620,7 @@ int ModuleSpanningTree::OnChangeLocalUserHost(User* user, const std::string &new
        if (user->registered != REG_ALL)
                return 0;
 
-       std::deque<std::string> params;
+       parameterlist params;
        params.push_back(newhost);
        Utils->DoOneToMany(user->uuid,"FHOST",params);
        return 0;
@@ -615,7 +632,7 @@ void ModuleSpanningTree::OnChangeName(User* user, const std::string &gecos)
        if (user->registered != REG_ALL)
                return;
 
-       std::deque<std::string> params;
+       parameterlist params;
        params.push_back(gecos);
        Utils->DoOneToMany(user->uuid,"FNAME",params);
 }
@@ -624,7 +641,7 @@ void ModuleSpanningTree::OnUserPart(User* user, Channel* channel,  std::string &
 {
        if (IS_LOCAL(user))
        {
-               std::deque<std::string> params;
+               parameterlist params;
                params.push_back(channel->name);
                if (!partmessage.empty())
                        params.push_back(":"+partmessage);
@@ -636,7 +653,7 @@ void ModuleSpanningTree::OnUserQuit(User* user, const std::string &reason, const
 {
        if ((IS_LOCAL(user)) && (user->registered == REG_ALL))
        {
-               std::deque<std::string> params;
+               parameterlist params;
 
                if (oper_message != reason)
                {
@@ -660,7 +677,7 @@ void ModuleSpanningTree::OnUserPostNick(User* user, const std::string &oldnick)
 {
        if (IS_LOCAL(user))
        {
-               std::deque<std::string> params;
+               parameterlist params;
                params.push_back(user->nick);
 
                /** IMPORTANT: We don't update the TS if the oldnick is just a case change of the newnick!
@@ -675,7 +692,7 @@ void ModuleSpanningTree::OnUserPostNick(User* user, const std::string &oldnick)
 
 void ModuleSpanningTree::OnUserKick(User* source, User* user, Channel* chan, const std::string &reason, bool &silent)
 {
-       std::deque<std::string> params;
+       parameterlist params;
        params.push_back(chan->name);
        params.push_back(user->uuid);
        params.push_back(":"+reason);
@@ -694,7 +711,7 @@ void ModuleSpanningTree::OnRemoteKill(User* source, User* dest, const std::strin
        if (!IS_LOCAL(source))
                return; // Only start routing if we're origin.
 
-       std::deque<std::string> params;
+       parameterlist params;
        params.push_back(":"+reason);
        Utils->DoOneToMany(dest->uuid,"OPERQUIT",params);
        params.clear();
@@ -711,7 +728,7 @@ void ModuleSpanningTree::OnPreRehash(User* user, const std::string &parameter)
        // Send out to other servers
        if (!parameter.empty() && parameter[0] != '-')
        {
-               std::deque<std::string> params;
+               parameterlist params;
                params.push_back(parameter);
                Utils->DoOneToAllButSender(user ? user->uuid : ServerInstance->Config->GetSID(), "REHASH", params, user ? user->server : ServerInstance->Config->ServerName);
        }
@@ -758,7 +775,7 @@ void ModuleSpanningTree::OnOper(User* user, const std::string &opertype)
 {
        if (IS_LOCAL(user))
        {
-               std::deque<std::string> params;
+               parameterlist params;
                params.push_back(opertype);
                Utils->DoOneToMany(user->uuid,"OPERTYPE",params);
        }
@@ -772,7 +789,7 @@ void ModuleSpanningTree::OnAddLine(User* user, XLine *x)
        char data[MAXBUF];
        snprintf(data,MAXBUF,"%s %s %s %lu %lu :%s", x->type.c_str(), x->Displayable(),
        ServerInstance->Config->ServerName, (unsigned long)x->set_time, (unsigned long)x->duration, x->reason);
-       std::deque<std::string> params;
+       parameterlist params;
        params.push_back(data);
 
        if (!user)
@@ -794,7 +811,7 @@ void ModuleSpanningTree::OnDelLine(User* user, XLine *x)
 
        char data[MAXBUF];
        snprintf(data,MAXBUF,"%s %s", x->type.c_str(), x->Displayable());
-       std::deque<std::string> params;
+       parameterlist params;
        params.push_back(data);
 
        if (!user)
@@ -809,11 +826,11 @@ void ModuleSpanningTree::OnDelLine(User* user, XLine *x)
        }
 }
 
-void ModuleSpanningTree::OnMode(User* user, void* dest, int target_type, const std::deque<std::string> &text, const std::deque<TranslateType> &translate)
+void ModuleSpanningTree::OnMode(User* user, void* dest, int target_type, const parameterlist &text, const std::vector<TranslateType> &translate)
 {
        if ((IS_LOCAL(user)) && (user->registered == REG_ALL))
        {
-               std::deque<std::string> params;
+               parameterlist params;
                std::string command;
                std::string output_text;
 
@@ -845,13 +862,13 @@ int ModuleSpanningTree::OnSetAway(User* user, const std::string &awaymsg)
        {
                if (awaymsg.empty())
                {
-                       std::deque<std::string> params;
+                       parameterlist params;
                        params.clear();
                        Utils->DoOneToMany(user->uuid,"AWAY",params);
                }
                else
                {
-                       std::deque<std::string> params;
+                       parameterlist params;
                        params.push_back(":" + awaymsg);
                        Utils->DoOneToMany(user->uuid,"AWAY",params);
                }
@@ -860,7 +877,7 @@ int ModuleSpanningTree::OnSetAway(User* user, const std::string &awaymsg)
        return 0;
 }
 
-void ModuleSpanningTree::ProtoSendMode(void* opaque, TargetTypeFlags target_type, void* target, const std::deque<std::string> &modeline, const std::deque<TranslateType> &translate)
+void ModuleSpanningTree::ProtoSendMode(void* opaque, TargetTypeFlags target_type, void* target, const parameterlist &modeline, const std::vector<TranslateType> &translate)
 {
        TreeSocket* s = (TreeSocket*)opaque;
        std::string output_text;
@@ -882,26 +899,28 @@ void ModuleSpanningTree::ProtoSendMode(void* opaque, TargetTypeFlags target_type
        }
 }
 
-void ModuleSpanningTree::ProtoSendMetaData(void* opaque, TargetTypeFlags target_type, void* target, const std::string &extname, const std::string &extdata)
+void ModuleSpanningTree::ProtoSendMetaData(void* opaque, Extensible* target, const std::string &extname, const std::string &extdata)
 {
-       TreeSocket* s = (TreeSocket*)opaque;
-       if (target)
-       {
-               if (target_type == TYPE_USER)
-               {
-                       User* u = (User*)target;
-                       s->WriteLine(std::string(":")+ServerInstance->Config->GetSID()+" METADATA "+u->uuid+" "+extname+" :"+extdata);
-               }
-               else if (target_type == TYPE_CHANNEL)
-               {
-                       Channel* c = (Channel*)target;
-                       s->WriteLine(std::string(":")+ServerInstance->Config->GetSID()+" METADATA "+c->name+" "+extname+" :"+extdata);
-               }
-       }
-       if (target_type == TYPE_OTHER)
-       {
+       TreeSocket* s = static_cast<TreeSocket*>(opaque);
+       User* u = dynamic_cast<User*>(target);
+       Channel* c = dynamic_cast<Channel*>(target);
+       if (u)
+               s->WriteLine(std::string(":")+ServerInstance->Config->GetSID()+" METADATA "+u->uuid+" "+extname+" :"+extdata);
+       else if (c)
+               s->WriteLine(std::string(":")+ServerInstance->Config->GetSID()+" METADATA "+c->name+" "+extname+" :"+extdata);
+       else if (!target)
                s->WriteLine(std::string(":")+ServerInstance->Config->GetSID()+" METADATA * "+extname+" :"+extdata);
-       }
+}
+
+std::string ModuleSpanningTree::ProtoTranslate(Extensible* item)
+{
+       User* u = dynamic_cast<User*>(item);
+       Channel* c = dynamic_cast<Channel*>(item);
+       if (u)
+               return u->uuid;
+       if (c)
+               return c->name;
+       return "*";
 }
 
 void ModuleSpanningTree::OnEvent(Event* event)