diff options
-rw-r--r-- | include/modules.h | 12 | ||||
-rw-r--r-- | src/mode.cpp | 10 | ||||
-rw-r--r-- | src/modules.cpp | 1 | ||||
-rw-r--r-- | src/modules/m_chanprotect.cpp | 29 |
4 files changed, 51 insertions, 1 deletions
diff --git a/include/modules.h b/include/modules.h index 44c91a47c..0e8a6a865 100644 --- a/include/modules.h +++ b/include/modules.h @@ -374,6 +374,16 @@ class Module : public classbase * any five second period, directly from the main loop of the server. */ virtual void OnBackgroundTimer(time_t curtime); + + /** Called whenever a list is needed for a listmode. + * For example, when a /MODE #channel +b (without any other parameters) is called, + * if a module was handling +b this function would be called. The function can then + * output any lists it wishes to. Please note that all modules will see all mode + * characters to provide the ability to extend each other, so please only output + * a list if the mode character given matches the one(s) you want to handle. + */ + virtual void OnSendList(userrec* user, chanrec* channel, char mode); + }; @@ -538,7 +548,7 @@ class Server : public classbase * so the above example would become '+aa one three' after processing. */ virtual bool AddExtendedListMode(char modechar); - + /** Adds a command to the command table. * This allows modules to add extra commands into the command table. You must place a function within your * module which is is of type handlerfunc: diff --git a/src/mode.cpp b/src/mode.cpp index 3d25e6c06..467b3d09b 100644 --- a/src/mode.cpp +++ b/src/mode.cpp @@ -1283,6 +1283,16 @@ void handle_mode(char **parameters, int pcnt, userrec *user) WriteServ(user->fd,"368 %s %s :End of channel ban list",user->nick, Ptr->name); return; } + char* mode = parameters[1]; + if (*mode == '+') + mode++; + if ((ModeDefined(*mode,MT_CHANNEL)) && (ModeIsListMode(*mode,MT_CHANNEL))) + { + // list of items for an extmode + log(DEBUG,"Calling OnSendList for all modules, list output for mode %c",*mode); + FOREACH_MOD OnSendList(user,Ptr,*mode); + return; + } } if ((Ptr) && (!has_channel(user,Ptr))) diff --git a/src/modules.cpp b/src/modules.cpp index 5d75ea20d..1bed5bd18 100644 --- a/src/modules.cpp +++ b/src/modules.cpp @@ -331,6 +331,7 @@ void Module::On005Numeric(std::string &output) { }; int Module::OnKill(userrec* source, userrec* dest, std::string reason) { return 0; }; void Module::OnLoadModule(Module* mod,std::string name) { }; void Module::OnBackgroundTimer(time_t curtime) { }; +void Module::OnSendList(userrec* user, chanrec* channel, char mode) { }; // server is a wrapper class that provides methods to all of the C-style // exports in the core diff --git a/src/modules/m_chanprotect.cpp b/src/modules/m_chanprotect.cpp index 65a7b0e84..5a8e40a36 100644 --- a/src/modules/m_chanprotect.cpp +++ b/src/modules/m_chanprotect.cpp @@ -279,6 +279,35 @@ class ModuleChanProtect : public Module } return 0; } + + virtual void OnSendList(userrec* user, chanrec* channel, char mode) + { + if (mode == 'q') + { + chanuserlist cl = Srv->GetUsers(channel); + for (int i = 0; i < cl.size(); i++) + { + if (cl[i]->GetExt("cm_founder_"+std::string(channel->name))) + { + WriteServ(user->fd,"386 %s %s %s",user->nick, channel->name,cl[i]->nick); + } + } + WriteServ(user->fd,"387 %s %s :End of channel founder list",user->nick, channel->name); + } + if (mode == 'a') + { + chanuserlist cl = Srv->GetUsers(channel); + for (int i = 0; i < cl.size(); i++) + { + if (cl[i]->GetExt("cm_protect_"+std::string(channel->name))) + { + WriteServ(user->fd,"388 %s %s %s",user->nick, channel->name,cl[i]->nick); + } + } + WriteServ(user->fd,"389 %s %s :End of channel protected user list",user->nick, channel->name); + } + + } virtual ~ModuleChanProtect() { |