]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/modules/m_services_account.cpp
m_spanningtree Remove unneeded #includes
[user/henk/code/inspircd.git] / src / modules / m_services_account.cpp
index 57a08ada48e02c1395e3650dc489c89ab6b89c3e..bdd47b4bc8f0764b0563bb3c300ad7283142eee4 100644 (file)
@@ -25,7 +25,7 @@
 /* $ModDesc: Provides support for ircu-style services accounts, including chmode +R, etc. */
 
 #include "inspircd.h"
-#include "account.h"
+#include "modules/account.h"
 
 /** Channel mode +r - mark a channel as identified
  */
@@ -37,22 +37,20 @@ class Channel_r : public ModeHandler
        ModeAction OnModeChange(User* source, User* dest, Channel* channel, std::string &parameter, bool adding)
        {
                // only a u-lined server may add or remove the +r mode.
-               if (!IS_LOCAL(source) || ServerInstance->ULine(source->nick.c_str()) || ServerInstance->ULine(source->server))
+               if (!IS_LOCAL(source) || ServerInstance->ULine(source->server))
                {
                        // Only change the mode if it's not redundant
-                       if ((adding && !channel->IsModeSet('r')) || (!adding && channel->IsModeSet('r')))
+                       if ((adding != channel->IsModeSet('r')))
                        {
                                channel->SetMode('r',adding);
                                return MODEACTION_ALLOW;
                        }
-
-                       return MODEACTION_DENY;
                }
                else
                {
                        source->WriteNumeric(500, "%s :Only a server may modify the +r channel mode", source->nick.c_str());
-                       return MODEACTION_DENY;
                }
+               return MODEACTION_DENY;
        }
 };
 
@@ -66,20 +64,19 @@ class User_r : public ModeHandler
 
        ModeAction OnModeChange(User* source, User* dest, Channel* channel, std::string &parameter, bool adding)
        {
-               if (!IS_LOCAL(source) || ServerInstance->ULine(source->nick.c_str()) || ServerInstance->ULine(source->server))
+               if (!IS_LOCAL(source) || ServerInstance->ULine(source->server))
                {
-                       if ((adding && !dest->IsModeSet('r')) || (!adding && dest->IsModeSet('r')))
+                       if ((adding != dest->IsModeSet('r')))
                        {
                                dest->SetMode('r',adding);
                                return MODEACTION_ALLOW;
                        }
-                       return MODEACTION_DENY;
                }
                else
                {
                        source->WriteNumeric(500, "%s :Only a server may modify the +r user mode", source->nick.c_str());
-                       return MODEACTION_DENY;
                }
+               return MODEACTION_DENY;
        }
 };
 
@@ -123,22 +120,18 @@ class ModuleServicesAccount : public Module
 
        void init()
        {
-               ServerInstance->Modules->AddService(m1);
-               ServerInstance->Modules->AddService(m2);
-               ServerInstance->Modules->AddService(m3);
-               ServerInstance->Modules->AddService(m4);
-               ServerInstance->Modules->AddService(m5);
-               ServerInstance->Modules->AddService(accountname);
+               ServiceProvider* providerlist[] = { &m1, &m2, &m3, &m4, &m5, &accountname };
+               ServerInstance->Modules->AddServices(providerlist, sizeof(providerlist)/sizeof(ServiceProvider*));
                Implementation eventlist[] = { I_OnWhois, I_OnUserPreMessage, I_OnUserPreNotice, I_OnUserPreJoin, I_OnCheckBan,
                        I_OnDecodeMetaData, I_On005Numeric, I_OnUserPostNick, I_OnSetConnectClass };
 
-               ServerInstance->Modules->Attach(eventlist, this, 9);
+               ServerInstance->Modules->Attach(eventlist, this, sizeof(eventlist)/sizeof(Implementation));
        }
 
-       void On005Numeric(std::string &t)
+       void On005Numeric(std::map<std::string, std::string>& tokens)
        {
-               ServerInstance->AddExtBanChar('R');
-               ServerInstance->AddExtBanChar('U');
+               tokens["EXTBAN"].push_back('R');
+               tokens["EXTBAN"].push_back('U');
        }
 
        /* <- :twisted.oscnet.org 330 w00t2 w00t2 w00t :is logged in as */
@@ -192,7 +185,7 @@ class ModuleServicesAccount : public Module
                        if (c->IsModeSet('M') && !is_registered && res != MOD_RES_ALLOW)
                        {
                                // 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");
+                               user->WriteNumeric(477, user->nick+" "+c->name+" :You need to be identified to a registered account to message this channel");
                                return MOD_RES_DENY;
                        }
                }
@@ -212,7 +205,11 @@ class ModuleServicesAccount : public Module
 
        ModResult OnCheckBan(User* user, Channel* chan, const std::string& mask)
        {
-               if (mask[1] == ':')
+               static bool checking = false;
+               if (checking)
+                       return MOD_RES_PASSTHRU;
+
+               if ((mask.length() > 2) && (mask[1] == ':'))
                {
                        if (mask[0] == 'R')
                        {
@@ -229,7 +226,11 @@ class ModuleServicesAccount : public Module
 
                                /* If we made it this far we know the user isn't registered
                                        so just deny if it matches */
-                               if (chan->GetExtBanStatus(user, 'U') == MOD_RES_DENY)
+                               checking = true;
+                               bool result = chan->CheckBan(user, mask.substr(2));
+                               checking = false;
+
+                               if (result)
                                        return MOD_RES_DENY;
                        }
                }
@@ -244,7 +245,7 @@ class ModuleServicesAccount : public Module
                return OnUserPreMessage(user, dest, target_type, text, status, exempt_list);
        }
 
-       ModResult OnUserPreJoin(User* user, Channel* chan, const char* cname, std::string &privs, const std::string &keygiven)
+       ModResult OnUserPreJoin(User* user, Channel* chan, const std::string& cname, std::string& privs, const std::string& keygiven)
        {
                if (!IS_LOCAL(user))
                        return MOD_RES_PASSTHRU;
@@ -318,3 +319,4 @@ class ModuleServicesAccount : public Module
 };
 
 MODULE_INIT(ModuleServicesAccount)
+