diff options
author | w00t <w00t@e03df62e-2008-0410-955e-edbf42e46eb7> | 2008-07-14 12:58:44 +0000 |
---|---|---|
committer | w00t <w00t@e03df62e-2008-0410-955e-edbf42e46eb7> | 2008-07-14 12:58:44 +0000 |
commit | 056c2a49cc58577e2f54af8cf7aeafbc758650e9 (patch) | |
tree | 58e8b474ccf9f678c086c77e462535ac10216055 | |
parent | f474e7e6dc2d36f96150ebe33b23b4ea76814415 (diff) |
Add extban types +bb R: and M: - stops matching account masks from joining and speaking respectively
git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@10020 e03df62e-2008-0410-955e-edbf42e46eb7
-rw-r--r-- | conf/modules.conf.example | 4 | ||||
-rw-r--r-- | src/modules/m_services_account.cpp | 49 |
2 files changed, 39 insertions, 14 deletions
diff --git a/conf/modules.conf.example b/conf/modules.conf.example index 63b6e1767..948bbf4cf 100644 --- a/conf/modules.conf.example +++ b/conf/modules.conf.example @@ -1168,6 +1168,10 @@ # Services support module: Adds several usermodes such as +R and +M # this module implements the 'identified' state via account names (AC) # and is similar in operation to the way asuka and ircu handle services. +# +# Also of note is that this module implements two extbans: +# +b R: (stop matching account names from joining) +# +b M: (stop matching account names from speaking) # # N O T E!! # >> This CAN NOT be used at the same time as m_services << diff --git a/src/modules/m_services_account.cpp b/src/modules/m_services_account.cpp index 4a3e0c48b..60d852cf5 100644 --- a/src/modules/m_services_account.cpp +++ b/src/modules/m_services_account.cpp @@ -57,9 +57,15 @@ class ModuleServicesAccount : public Module throw ModuleException("Could not add new modes!"); Implementation eventlist[] = { I_OnWhois, I_OnUserPreMessage, I_OnUserPreNotice, I_OnUserPreJoin, - I_OnSyncUserMetaData, I_OnUserQuit, I_OnCleanup, I_OnDecodeMetaData }; + I_OnSyncUserMetaData, I_OnUserQuit, I_OnCleanup, I_OnDecodeMetaData, I_On005Numeric }; - ServerInstance->Modules->Attach(eventlist, this, 8); + ServerInstance->Modules->Attach(eventlist, this, 9); + } + + virtual void On005Numeric(std::string &t) + { + ServerInstance->AddExtBanChar("R"); + ServerInstance->AddExtBanChar("M"); } /* <- :twisted.oscnet.org 330 w00t2 w00t2 w00t :is logged in as */ @@ -84,35 +90,40 @@ class ModuleServicesAccount : public Module user->GetExt("accountname", account); + if ((ServerInstance->ULine(user->nick.c_str())) || (ServerInstance->ULine(user->server))) + { + // user is ulined, can speak regardless + return 0; + } + if (target_type == TYPE_CHANNEL) { Channel* c = (Channel*)dest; if ((c->IsModeSet('M')) && (!account)) { - if ((ServerInstance->ULine(user->nick.c_str())) || (ServerInstance->ULine(user->server))) - { - // user is ulined, can speak regardless - return 0; - } - // user messaging a +M channel and is not registered user->WriteNumeric(477, ""+std::string(user->nick)+" "+std::string(c->name)+" :You need to be identified to a registered account to message this channel"); return 1; } + + if (account) + { + if (c->IsExtBanned(*account, 'M')) + { + // may not speak + user->WriteNumeric(477, ""+std::string(user->nick)+" "+std::string(c->name)+" :You may not speak in this channel"); + return 1; + } + } } + if (target_type == TYPE_USER) { User* u = (User*)dest; if ((u->modes['R'-65]) && (!account)) { - if ((ServerInstance->ULine(user->nick.c_str())) || (ServerInstance->ULine(user->server))) - { - // user is ulined, can speak regardless - return 0; - } - // user messaging a +R user and is not registered user->WriteNumeric(477, ""+ user->nick +" "+ u->nick +" :You need to be identified to a registered account to message this user"); return 1; @@ -147,6 +158,16 @@ class ModuleServicesAccount : public Module return 1; } } + + if (account) + { + if (chan->IsExtBanned(*account, 'R')) + { + // may not join + user->WriteNumeric(477, ""+std::string(user->nick)+" "+std::string(chan->name)+" :You may not join. this channel"); + return 1; + } + } } return 0; } |