]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/modules/m_spanningtree/main.cpp
MetaData rework
[user/henk/code/inspircd.git] / src / modules / m_spanningtree / main.cpp
index 37ed06c3ad316b36ed4c830f4f35b73238b64961..2ecbd8a88709f261bdec25cab12a75976d56011a 100644 (file)
 #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,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_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)
@@ -259,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(),':'))
        {
@@ -268,7 +265,6 @@ void ModuleSpanningTree::ConnectServer(Link* x)
                        ipvalid = false;
        }
        else
-#endif
        {
                in_addr n;
                if (inet_aton(x->IPAddr.c_str(),&n) < 1)
@@ -444,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));
@@ -454,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);
@@ -464,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);
        }
@@ -481,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);
@@ -514,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);
@@ -535,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);
@@ -568,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);
@@ -583,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.
@@ -605,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;
@@ -617,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);
 }
@@ -626,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);
@@ -638,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)
                {
@@ -662,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!
@@ -677,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);
@@ -696,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();
@@ -706,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);
 }
@@ -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)
@@ -921,6 +940,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");