diff options
-rw-r--r-- | include/modules.h | 10 | ||||
-rw-r--r-- | src/modules.cpp | 2 | ||||
-rw-r--r-- | src/modules/m_deaf.cpp | 61 | ||||
-rw-r--r-- | src/modules/m_silence_ext.cpp | 33 | ||||
-rw-r--r-- | src/modules/m_spanningtree.cpp | 35 |
5 files changed, 102 insertions, 39 deletions
diff --git a/include/modules.h b/include/modules.h index c6ea35104..e3780ee64 100644 --- a/include/modules.h +++ b/include/modules.h @@ -56,6 +56,11 @@ enum TargetTypeFlags { TYPE_OTHER }; +enum MessageType { + MSG_PRIVMSG = 0, + MSG_NOTICE = 1 +}; + #include "globals.h" #include "dynamic.h" #include "base.h" @@ -640,10 +645,13 @@ class Module : public Extensible /** Called whenever the server wants to build the exemption list for a channel, but is not directly doing a PRIVMSG or NOTICE. * For example, the spanningtree protocol will call this event when passing a privmsg on (but not processing it directly). + * @param message_type The message type, either MSG_PRIVMSG or MSG_NOTICE * @param chan The channel to build the exempt list of + * @param sender The original sender of the PRIVMSG or NOTICE + * @param status The status char to be used for the channel list * @param exempt_list The exempt list to be populated */ - virtual void OnBuildExemptList(chanrec* chan, CUList &exempt_list); + virtual void OnBuildExemptList(MessageType message_type, chanrec* chan, userrec* sender, char status, CUList &exempt_list); /** Called before any nickchange, local or remote. This can be used to implement Q-lines etc. * Please note that although you can see remote nickchanges through this function, you should diff --git a/src/modules.cpp b/src/modules.cpp index a11bdd772..1e33eb26c 100644 --- a/src/modules.cpp +++ b/src/modules.cpp @@ -192,7 +192,7 @@ void Module::OnSetAway(userrec* user) { }; void Module::OnCancelAway(userrec* user) { }; int Module::OnUserList(userrec* user, chanrec* Ptr) { return 0; }; int Module::OnWhoisLine(userrec* user, userrec* dest, int &numeric, std::string &text) { return 0; }; -void Module::OnBuildExemptList(chanrec* chan, CUList &exempt_list) { }; +void Module::OnBuildExemptList(MessageType message_type, chanrec* chan, userrec* sender, char status, CUList &exempt_list) { }; long InspIRCd::PriorityAfter(const std::string &modulename) { diff --git a/src/modules/m_deaf.cpp b/src/modules/m_deaf.cpp index 67c2b7210..6ec65437c 100644 --- a/src/modules/m_deaf.cpp +++ b/src/modules/m_deaf.cpp @@ -65,7 +65,7 @@ class ModuleDeaf : public Module void Implements(char* List) { - List[I_OnUserPreMessage] = List[I_OnUserPreNotice] = 1; + List[I_OnUserPreMessage] = List[I_OnUserPreNotice] = List[I_OnBuildExemptList] = 1; } virtual int OnUserPreNotice(userrec* user,void* dest,int target_type, std::string &text, char status, CUList &exempt_list) @@ -78,6 +78,37 @@ class ModuleDeaf : public Module return PreText(user, dest, target_type, text, status, exempt_list); } + virtual void OnBuildExemptList(MessageType message_type, chanrec* chan, userrec* sender, char status, CUList &exempt_list) + { + CUList *ulist; + switch (status) + { + case '@': + ulist = chan->GetOppedUsers(); + break; + case '%': + ulist = chan->GetHalfoppedUsers(); + break; + case '+': + ulist = chan->GetVoicedUsers(); + break; + default: + ulist = chan->GetUsers(); + break; + } + + for (CUList::iterator i = ulist->begin(); i != ulist->end(); i++) + { + if (IS_LOCAL(i->second)) + { + if (i->second->IsModeSet('d')) + { + exempt_list[i->second] = i->second; + } + } + } + } + virtual int PreText(userrec* user,void* dest,int target_type, std::string &text, char status, CUList &exempt_list) { if (target_type == TYPE_CHANNEL) @@ -85,33 +116,7 @@ class ModuleDeaf : public Module chanrec* chan = (chanrec*)dest; if (chan) { - CUList *ulist; - switch (status) - { - case '@': - ulist = chan->GetOppedUsers(); - break; - case '%': - ulist = chan->GetHalfoppedUsers(); - break; - case '+': - ulist = chan->GetVoicedUsers(); - break; - default: - ulist = chan->GetUsers(); - break; - } - - for (CUList::iterator i = ulist->begin(); i != ulist->end(); i++) - { - if ((IS_LOCAL(i->second)) && (user != i->second)) - { - if (i->second->IsModeSet('d')) - { - exempt_list[i->second] = i->second; - } - } - } + this->OnBuildExemptList(chan, status, exempt_list); } } return 0; diff --git a/src/modules/m_silence_ext.cpp b/src/modules/m_silence_ext.cpp index a6a7f60ca..19abc679f 100644 --- a/src/modules/m_silence_ext.cpp +++ b/src/modules/m_silence_ext.cpp @@ -255,7 +255,7 @@ class ModuleSilence : public Module void Implements(char* List) { - List[I_OnUserQuit] = List[I_On005Numeric] = List[I_OnUserPreNotice] = List[I_OnUserPreMessage] = List[I_OnUserPreInvite] = 1; + List[I_OnBuildExemptList] = List[I_OnUserQuit] = List[I_On005Numeric] = List[I_OnUserPreNotice] = List[I_OnUserPreMessage] = List[I_OnUserPreInvite] = 1; } virtual void OnUserQuit(userrec* user, const std::string &reason) @@ -276,6 +276,37 @@ class ModuleSilence : public Module output = output + " ESILENCE SILENCE=999"; } + virtual void OnBuildExemptList(MessageType message_type, chanrec* chan, userrec* sender, char status, CUList &exempt_list) + { + int public_silence = (message_type == MSG_PRIVMSG ? SILENCE_CHANNEL : SILENCE_CNOTICE); + CUList *ulist; + switch (status) + { + case '@': + ulist = chan->GetOppedUsers(); + break; + case '%': + ulist = chan->GetHalfoppedUsers(); + break; + case '+': + ulist = chan->GetVoicedUsers(); + break; + default: + ulist = chan->GetUsers(); + break; + } + + for (CUList::iterator i = ulist->begin(); i != ulist->end(); i++) + { + if (IS_LOCAL(i->second)) + { + if (MatchPattern(i->second, sender, public_silence) == 1) + { + exempt_list[i->second] = i->second; + } + } + } + } virtual int PreText(userrec* user,void* dest,int target_type, std::string &text, char status, CUList &exempt_list, int silence_type) { diff --git a/src/modules/m_spanningtree.cpp b/src/modules/m_spanningtree.cpp index 42a939a7d..f3c312b50 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<TreeServer*> &list); /** Compile a list of servers which contain members of channel c */ - void GetListOfServersForChannel(chanrec* c, std::deque<TreeServer*> &list, const CUList &exempt_list); + void GetListOfServersForChannel(chanrec* c, std::deque<TreeServer*> &list, char status, const CUList &exempt_list); /** Find a server by name */ TreeServer* FindServer(const std::string &ServerName); @@ -3789,9 +3789,24 @@ void SpanningTreeUtilities::AddThisServer(TreeServer* server, std::deque<TreeSer } /** returns a list of DIRECT servernames for a specific channel */ -void SpanningTreeUtilities::GetListOfServersForChannel(chanrec* c, std::deque<TreeServer*> &list, const CUList &exempt_list) +void SpanningTreeUtilities::GetListOfServersForChannel(chanrec* c, std::deque<TreeServer*> &list, char status, const CUList &exempt_list) { - CUList *ulist = c->GetUsers(); + CUList *ulist; + switch (status) + { + case '@': + ulist = c->GetOppedUsers(); + break; + case '%': + ulist = c->GetHalfoppedUsers(); + break; + case '+': + ulist = c->GetVoicedUsers(); + break; + default: + ulist = c->GetUsers(); + break; + } for (CUList::iterator i = ulist->begin(); i != ulist->end(); i++) { if ((i->second->GetFd() < 0) && (exempt_list.find(i->second) == exempt_list.end())) @@ -3806,6 +3821,7 @@ void SpanningTreeUtilities::GetListOfServersForChannel(chanrec* c, std::deque<Tr bool SpanningTreeUtilities::DoOneToAllButSenderRaw(const std::string &data, const std::string &omit, const std::string &prefix, const irc::string &command, std::deque<std::string> ¶ms) { + char pfx = 0; TreeServer* omitroute = this->BestRouteTo(omit); if ((command == "NOTICE") || (command == "PRIVMSG")) { @@ -3814,6 +3830,7 @@ bool SpanningTreeUtilities::DoOneToAllButSenderRaw(const std::string &data, cons /* Prefixes */ if ((*(params[0].c_str()) == '@') || (*(params[0].c_str()) == '%') || (*(params[0].c_str()) == '+')) { + pfx = params[0][0]; params[0] = params[0].substr(1, params[0].length()-1); } if ((*(params[0].c_str()) != '#') && (*(params[0].c_str()) != '$')) @@ -3840,11 +3857,13 @@ bool SpanningTreeUtilities::DoOneToAllButSenderRaw(const std::string &data, cons else { chanrec* c = ServerInstance->FindChan(params[0]); - if (c) + userrec* u = ServerInstance->FindNick(prefix); + if (c && u) { - CUList empty; + CUList elist; std::deque<TreeServer*> list; - GetListOfServersForChannel(c,list,empty); + FOREACH_MOD(I_OnBuildExemptList, OnBuildExemptList((command == "PRIVMSG" ? MSG_PRIVMSG : MSG_NOTICE), c, u, pfx, elist)); + GetListOfServersForChannel(c,list,pfx,elist); unsigned int lsize = list.size(); for (unsigned int i = 0; i < lsize; i++) { @@ -4809,7 +4828,7 @@ class ModuleSpanningTree : public Module if (status) cname = status + cname; std::deque<TreeServer*> list; - Utils->GetListOfServersForChannel(c,list,exempt_list); + Utils->GetListOfServersForChannel(c,list,status,exempt_list); unsigned int ucount = list.size(); for (unsigned int i = 0; i < ucount; i++) { @@ -4860,7 +4879,7 @@ class ModuleSpanningTree : public Module if (status) cname = status + cname; std::deque<TreeServer*> list; - Utils->GetListOfServersForChannel(c,list,exempt_list); + Utils->GetListOfServersForChannel(c,list,status,exempt_list); unsigned int ucount = list.size(); for (unsigned int i = 0; i < ucount; i++) { |