From ee3a514fe2e12ec326b4505e6c5bec19f074a899 Mon Sep 17 00:00:00 2001 From: brain Date: Mon, 27 Nov 2006 17:03:47 +0000 Subject: Add exception lists to OnUserMessage and OnUserNotice, to be used for smarter routing of messages in spanningtree amongst other things git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@5817 e03df62e-2008-0410-955e-edbf42e46eb7 --- include/modules.h | 6 +++--- src/cmd_notice.cpp | 6 +++--- src/cmd_privmsg.cpp | 6 +++--- src/modules.cpp | 4 ++-- src/modules/m_messageflood.cpp | 4 ++-- src/modules/m_spanningtree.cpp | 17 +++++++++-------- 6 files changed, 22 insertions(+), 21 deletions(-) diff --git a/include/modules.h b/include/modules.h index deb7dcf22..b1b682801 100644 --- a/include/modules.h +++ b/include/modules.h @@ -74,7 +74,7 @@ enum TargetTypeFlags { * ipv4 servers, so this value will be ten times as * high on ipv6 servers. */ -#define NATIVE_API_VERSION 11005 +#define NATIVE_API_VERSION 11006 #ifdef IPV6 #define API_VERSION (NATIVE_API_VERSION * 10) #else @@ -659,7 +659,7 @@ class Module : public Extensible * @param text the text being sent by the user * @param status The status being used, e.g. PRIVMSG @#chan has status== '@', 0 to send to everyone. */ - virtual void OnUserMessage(userrec* user, void* dest, int target_type, const std::string &text, char status); + virtual void OnUserMessage(userrec* user, void* dest, int target_type, const std::string &text, char status, const CUList &exempt_list); /** Called after any NOTICE sent from a user. * The dest variable contains a userrec* if target_type is TYPE_USER and a chanrec* @@ -670,7 +670,7 @@ class Module : public Extensible * @param text the text being sent by the user * @param status The status being used, e.g. NOTICE @#chan has status== '@', 0 to send to everyone. */ - virtual void OnUserNotice(userrec* user, void* dest, int target_type, const std::string &text, char status); + virtual void OnUserNotice(userrec* user, void* dest, int target_type, const std::string &text, char status, const CUList &exempt_list); /** Called after every MODE command sent from a user * The dest variable contains a userrec* if target_type is TYPE_USER and a chanrec* diff --git a/src/cmd_notice.cpp b/src/cmd_notice.cpp index c9c06ff67..385219c1e 100644 --- a/src/cmd_notice.cpp +++ b/src/cmd_notice.cpp @@ -52,7 +52,7 @@ CmdResult cmd_notice::Handle (const char** parameters, int pcnt, userrec *user) { user->NoticeAll("%s",parameters[1]); } - FOREACH_MOD(I_OnUserMessage,OnUserNotice(user,(void*)parameters[0],TYPE_SERVER,parameters[1],0)); + FOREACH_MOD(I_OnUserMessage,OnUserNotice(user,(void*)parameters[0],TYPE_SERVER,parameters[1],0,exempt_list)); return CMD_SUCCESS; } char status = 0; @@ -100,7 +100,7 @@ CmdResult cmd_notice::Handle (const char** parameters, int pcnt, userrec *user) chan->WriteAllExcept(user, false, status, exempt_list, "NOTICE %s :%s", chan->name, parameters[1]); - FOREACH_MOD(I_OnUserNotice,OnUserNotice(user,chan,TYPE_CHANNEL,parameters[1],status)); + FOREACH_MOD(I_OnUserNotice,OnUserNotice(user,chan,TYPE_CHANNEL,parameters[1],status,exempt_list)); } else { @@ -129,7 +129,7 @@ CmdResult cmd_notice::Handle (const char** parameters, int pcnt, userrec *user) user->WriteTo(dest, "NOTICE %s :%s", dest->nick, parameters[1]); } - FOREACH_MOD(I_OnUserNotice,OnUserNotice(user,dest,TYPE_USER,parameters[1],0)); + FOREACH_MOD(I_OnUserNotice,OnUserNotice(user,dest,TYPE_USER,parameters[1],0,exempt_list)); } else { diff --git a/src/cmd_privmsg.cpp b/src/cmd_privmsg.cpp index d3d7e483e..896aa4c3e 100644 --- a/src/cmd_privmsg.cpp +++ b/src/cmd_privmsg.cpp @@ -54,7 +54,7 @@ CmdResult cmd_privmsg::Handle (const char** parameters, int pcnt, userrec *user) { ServerInstance->ServerPrivmsgAll("%s",parameters[1]); } - FOREACH_MOD(I_OnUserMessage,OnUserMessage(user,(void*)parameters[0],TYPE_SERVER,parameters[1],0)); + FOREACH_MOD(I_OnUserMessage,OnUserMessage(user,(void*)parameters[0],TYPE_SERVER,parameters[1],0,except_list)); return CMD_SUCCESS; } char status = 0; @@ -100,7 +100,7 @@ CmdResult cmd_privmsg::Handle (const char** parameters, int pcnt, userrec *user) } chan->WriteAllExcept(user, false, status, except_list, "PRIVMSG %s :%s", chan->name, parameters[1]); - FOREACH_MOD(I_OnUserMessage,OnUserMessage(user,chan,TYPE_CHANNEL,parameters[1],status)); + FOREACH_MOD(I_OnUserMessage,OnUserMessage(user,chan,TYPE_CHANNEL,parameters[1],status,except_list)); } else { @@ -135,7 +135,7 @@ CmdResult cmd_privmsg::Handle (const char** parameters, int pcnt, userrec *user) user->WriteTo(dest, "PRIVMSG %s :%s", dest->nick, parameters[1]); } - FOREACH_MOD(I_OnUserMessage,OnUserMessage(user,dest,TYPE_USER,parameters[1],0)); + FOREACH_MOD(I_OnUserMessage,OnUserMessage(user,dest,TYPE_USER,parameters[1],0,except_list)); } else { diff --git a/src/modules.cpp b/src/modules.cpp index a8e7a2f75..454268964 100644 --- a/src/modules.cpp +++ b/src/modules.cpp @@ -157,8 +157,8 @@ void Module::OnRawSocketAccept(int fd, const std::string &ip, int localport) { int Module::OnRawSocketWrite(int fd, const char* buffer, int count) { return 0; }; void Module::OnRawSocketClose(int fd) { }; int Module::OnRawSocketRead(int fd, char* buffer, unsigned int count, int &readresult) { return 0; }; -void Module::OnUserMessage(userrec* user, void* dest, int target_type, const std::string &text, char status) { }; -void Module::OnUserNotice(userrec* user, void* dest, int target_type, const std::string &text, char status) { }; +void Module::OnUserMessage(userrec* user, void* dest, int target_type, const std::string &text, char status, const CUList &exempt_list) { }; +void Module::OnUserNotice(userrec* user, void* dest, int target_type, const std::string &text, char status, const CUList &exempt_list) { }; void Module::OnRemoteKill(userrec* source, userrec* dest, const std::string &reason) { }; void Module::OnUserInvite(userrec* source,userrec* dest,chanrec* channel) { }; void Module::OnPostLocalTopicChange(userrec* user, chanrec* chan, const std::string &topic) { }; diff --git a/src/modules/m_messageflood.cpp b/src/modules/m_messageflood.cpp index d01b01ad9..436e57867 100644 --- a/src/modules/m_messageflood.cpp +++ b/src/modules/m_messageflood.cpp @@ -246,7 +246,7 @@ class ModuleMsgFlood : public Module } } - virtual void OnUserMessage(userrec* user, void* dest, int target_type, const std::string &text, char status) + virtual void OnUserMessage(userrec* user, void* dest, int target_type, const std::string &text, char status, const CUList &exempt_list) { if (target_type == TYPE_CHANNEL) { @@ -254,7 +254,7 @@ class ModuleMsgFlood : public Module } } - virtual void OnUserNotice(userrec* user, void* dest, int target_type, const std::string &text, char status) + virtual void OnUserNotice(userrec* user, void* dest, int target_type, const std::string &text, char status, const CUList &exempt_list) { if (target_type == TYPE_CHANNEL) { diff --git a/src/modules/m_spanningtree.cpp b/src/modules/m_spanningtree.cpp index b5c4ce92d..42a939a7d 100644 --- a/src/modules/m_spanningtree.cpp +++ b/src/modules/m_spanningtree.cpp @@ -182,7 +182,7 @@ class SpanningTreeUtilities void AddThisServer(TreeServer* server, std::deque &list); /** Compile a list of servers which contain members of channel c */ - void GetListOfServersForChannel(chanrec* c, std::deque &list); + void GetListOfServersForChannel(chanrec* c, std::deque &list, const CUList &exempt_list); /** Find a server by name */ TreeServer* FindServer(const std::string &ServerName); @@ -3789,12 +3789,12 @@ void SpanningTreeUtilities::AddThisServer(TreeServer* server, std::deque &list) +void SpanningTreeUtilities::GetListOfServersForChannel(chanrec* c, std::deque &list, const CUList &exempt_list) { CUList *ulist = c->GetUsers(); for (CUList::iterator i = ulist->begin(); i != ulist->end(); i++) { - if (i->second->GetFd() < 0) + if ((i->second->GetFd() < 0) && (exempt_list.find(i->second) == exempt_list.end())) { TreeServer* best = this->BestRouteTo(i->second->server); if (best) @@ -3842,8 +3842,9 @@ bool SpanningTreeUtilities::DoOneToAllButSenderRaw(const std::string &data, cons chanrec* c = ServerInstance->FindChan(params[0]); if (c) { + CUList empty; std::deque list; - GetListOfServersForChannel(c,list); + GetListOfServersForChannel(c,list,empty); unsigned int lsize = list.size(); for (unsigned int i = 0; i < lsize; i++) { @@ -4783,7 +4784,7 @@ class ModuleSpanningTree : public Module } } - virtual void OnUserNotice(userrec* user, void* dest, int target_type, const std::string &text, char status) + virtual void OnUserNotice(userrec* user, void* dest, int target_type, const std::string &text, char status, const CUList &exempt_list) { if (target_type == TYPE_USER) { @@ -4808,7 +4809,7 @@ class ModuleSpanningTree : public Module if (status) cname = status + cname; std::deque list; - Utils->GetListOfServersForChannel(c,list); + Utils->GetListOfServersForChannel(c,list,exempt_list); unsigned int ucount = list.size(); for (unsigned int i = 0; i < ucount; i++) { @@ -4832,7 +4833,7 @@ class ModuleSpanningTree : public Module } } - virtual void OnUserMessage(userrec* user, void* dest, int target_type, const std::string &text, char status) + virtual void OnUserMessage(userrec* user, void* dest, int target_type, const std::string &text, char status, const CUList &exempt_list) { if (target_type == TYPE_USER) { @@ -4859,7 +4860,7 @@ class ModuleSpanningTree : public Module if (status) cname = status + cname; std::deque list; - Utils->GetListOfServersForChannel(c,list); + Utils->GetListOfServersForChannel(c,list,exempt_list); unsigned int ucount = list.size(); for (unsigned int i = 0; i < ucount; i++) { -- cgit v1.2.3