]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/modules/m_spanningtree/main.cpp
Remove unneeded ProtocolInterface::Introduce
[user/henk/code/inspircd.git] / src / modules / m_spanningtree / main.cpp
index 51a9eb025535e215c8df936d50f267e82bc430f5..c402b145a7afd76955f76bc5da68878d722502c7 100644 (file)
@@ -3,7 +3,7 @@
  *       +------------------------------------+
  *
  *  InspIRCd: (C) 2002-2009 InspIRCd Development Team
- * See: http://www.inspircd.org/wiki/index.php/Credits
+ * See: http://wiki.inspircd.org/Credits
  *
  * This program is free but copyrighted software; see
  *         the file COPYING for details.
 #include "commands/cmd_stats.h"
 #include "socket.h"
 #include "xline.h"
-#include "transport.h"
-
-#include "m_spanningtree/cachetimer.h"
-#include "m_spanningtree/resolvers.h"
-#include "m_spanningtree/main.h"
-#include "m_spanningtree/utils.h"
-#include "m_spanningtree/treeserver.h"
-#include "m_spanningtree/link.h"
-#include "m_spanningtree/treesocket.h"
-#include "m_spanningtree/rconnect.h"
-#include "m_spanningtree/rsquit.h"
-#include "m_spanningtree/protocolinterface.h"
+#include "../transport.h"
+
+#include "cachetimer.h"
+#include "resolvers.h"
+#include "main.h"
+#include "utils.h"
+#include "treeserver.h"
+#include "link.h"
+#include "treesocket.h"
+#include "rconnect.h"
+#include "rsquit.h"
+#include "protocolinterface.h"
 
 /* $ModDep: m_spanningtree/cachetimer.h m_spanningtree/resolvers.h m_spanningtree/main.h m_spanningtree/utils.h m_spanningtree/treeserver.h m_spanningtree/link.h m_spanningtree/treesocket.h m_spanningtree/rconnect.h m_spanningtree/rsquit.h m_spanningtree/protocolinterface.h */
 
@@ -48,21 +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_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, 29);
+       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)
@@ -192,6 +191,12 @@ void ModuleSpanningTree::DoPingChecks(time_t curtime)
        {
                TreeServer *s = i->second;
 
+               // Fix for bug #792, do not ping servers that are not connected yet!
+               // Remote servers have Socket == NULL and local connected servers have
+               // Socket->LinkState == CONNECTED
+               if (s->GetSocket() && s->GetSocket()->GetLinkState() != CONNECTED)
+                       continue;
+
                // Now do PING checks on all servers
                TreeServer *mts = Utils->BestRouteTo(s->GetID());
 
@@ -252,7 +257,6 @@ void ModuleSpanningTree::ConnectServer(Link* x)
        }
 
        QueryType start_type = DNS_QUERY_A;
-#ifdef IPV6
        start_type = DNS_QUERY_AAAA;
        if (strchr(x->IPAddr.c_str(),':'))
        {
@@ -261,7 +265,6 @@ void ModuleSpanningTree::ConnectServer(Link* x)
                        ipvalid = false;
        }
        else
-#endif
        {
                in_addr n;
                if (inet_aton(x->IPAddr.c_str(),&n) < 1)
@@ -437,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));
@@ -447,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);
@@ -457,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);
        }
@@ -474,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);
@@ -507,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);
@@ -528,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);
@@ -561,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);
@@ -576,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.
@@ -595,7 +617,10 @@ void ModuleSpanningTree::OnUserJoin(User* user, Channel* channel, bool sync, boo
 
 int ModuleSpanningTree::OnChangeLocalUserHost(User* user, const std::string &newhost)
 {
-       std::deque<std::string> params;
+       if (user->registered != REG_ALL)
+               return 0;
+
+       parameterlist params;
        params.push_back(newhost);
        Utils->DoOneToMany(user->uuid,"FHOST",params);
        return 0;
@@ -606,7 +631,8 @@ void ModuleSpanningTree::OnChangeName(User* user, const std::string &gecos)
        // only occurs for local clients
        if (user->registered != REG_ALL)
                return;
-       std::deque<std::string> params;
+
+       parameterlist params;
        params.push_back(gecos);
        Utils->DoOneToMany(user->uuid,"FNAME",params);
 }
@@ -615,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);
@@ -627,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)
                {
@@ -651,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!
@@ -666,28 +692,26 @@ void ModuleSpanningTree::OnUserPostNick(User* user, const std::string &oldnick)
 
 void ModuleSpanningTree::OnUserKick(User* source, User* user, Channel* chan, const std::string &reason, bool &silent)
 {
-       if ((source) && (IS_LOCAL(source)))
+       parameterlist params;
+       params.push_back(chan->name);
+       params.push_back(user->uuid);
+       params.push_back(":"+reason);
+       if (IS_LOCAL(source))
        {
-               std::deque<std::string> params;
-               params.push_back(chan->name);
-               params.push_back(user->uuid);
-               params.push_back(":"+reason);
                Utils->DoOneToMany(source->uuid,"KICK",params);
        }
-       else if (!source)
+       else if (IS_FAKE(source) && source != Utils->ServerUser)
        {
-               std::deque<std::string> params;
-               params.push_back(chan->name);
-               params.push_back(user->uuid);
-               params.push_back(":"+reason);
                Utils->DoOneToMany(ServerInstance->Config->GetSID(),"KICK",params);
        }
 }
 
 void ModuleSpanningTree::OnRemoteKill(User* source, User* dest, const std::string &reason, const std::string &operreason)
 {
-       if (!IS_LOCAL(source)) return; // Only start routing if we're origin.
-       std::deque<std::string> params;
+       if (!IS_LOCAL(source))
+               return; // Only start routing if we're origin.
+
+       parameterlist params;
        params.push_back(":"+reason);
        Utils->DoOneToMany(dest->uuid,"OPERQUIT",params);
        params.clear();
@@ -697,19 +721,21 @@ void ModuleSpanningTree::OnRemoteKill(User* source, User* dest, const std::strin
        Utils->DoOneToMany(source->uuid,"KILL",params);
 }
 
-void ModuleSpanningTree::OnRehash(User* user, const std::string &parameter)
+void ModuleSpanningTree::OnPreRehash(User* user, const std::string &parameter)
 {
        ServerInstance->Logs->Log("remoterehash", DEBUG, "called with param %s", parameter.c_str());
 
        // Send out to other servers
        if (!parameter.empty() && parameter[0] != '-')
        {
-               ServerInstance->Logs->Log("remoterehash", DEBUG, "sending out lol");
-               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);
        }
+}
 
+void ModuleSpanningTree::OnRehash(User* user)
+{
        // Re-read config stuff
        Utils->ReadConfiguration(true);
 }
@@ -749,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);
        }
@@ -757,13 +783,13 @@ void ModuleSpanningTree::OnOper(User* user, const std::string &opertype)
 
 void ModuleSpanningTree::OnAddLine(User* user, XLine *x)
 {
-       if (!x->IsBurstable())
+       if (!x->IsBurstable() || loopCall)
                return;
 
        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)
@@ -785,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)
@@ -800,11 +826,11 @@ void ModuleSpanningTree::OnDelLine(User* user, XLine *x)
        }
 }
 
-void ModuleSpanningTree::OnMode(User* user, void* dest, int target_type, const std::string &text, const std::vector<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;
 
@@ -836,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);
                }
@@ -851,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::string &modeline, const std::vector<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;
@@ -912,6 +938,9 @@ ModuleSpanningTree::~ModuleSpanningTree()
        /* This will also free the listeners */
        delete Utils;
 
+       delete command_rconnect;
+       delete command_rsquit;
+
        ServerInstance->Timers->DelTimer(RefreshTimer);
 
        ServerInstance->Modules->DoneWithInterface("BufferedSocketHook");