]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/modules/m_ircv3.cpp
Merge branch 'master+chanwritenotice'
[user/henk/code/inspircd.git] / src / modules / m_ircv3.cpp
index b80c110f4a60cbfb568a63258f4b6dc5241a55d7..9e94e556dbc4e2052e85fe5b1edef8ce6ce65c59 100644 (file)
 #include "inspircd.h"
 #include "modules/account.h"
 #include "modules/cap.h"
-
-class WriteNeighboursWithExt : public User::ForEachNeighborHandler
-{
-       const LocalIntExt& ext;
-       const std::string& msg;
-
-       void Execute(LocalUser* user) CXX11_OVERRIDE
-       {
-               if (ext.get(user))
-                       user->Write(msg);
-       }
-
- public:
-       WriteNeighboursWithExt(User* user, const std::string& message, const LocalIntExt& extension)
-               : ext(extension)
-               , msg(message)
-       {
-               user->ForEachNeighbor(*this, false);
-       }
-};
+#include "modules/ircv3.h"
 
 class ModuleIRCv3 : public Module, public AccountEventListener
 {
-       GenericCap cap_accountnotify;
-       GenericCap cap_awaynotify;
-       GenericCap cap_extendedjoin;
-       bool accountnotify;
-       bool awaynotify;
-       bool extendedjoin;
+       Cap::Capability cap_accountnotify;
+       Cap::Capability cap_awaynotify;
+       Cap::Capability cap_extendedjoin;
 
        CUList last_excepts;
 
@@ -63,20 +41,9 @@ class ModuleIRCv3 : public Module, public AccountEventListener
        void ReadConfig(ConfigStatus& status) CXX11_OVERRIDE
        {
                ConfigTag* conf = ServerInstance->Config->ConfValue("ircv3");
-               accountnotify = conf->getBool("accountnotify", true);
-               awaynotify = conf->getBool("awaynotify", true);
-               extendedjoin = conf->getBool("extendedjoin", true);
-       }
-
-       void OnEvent(Event& ev) CXX11_OVERRIDE
-       {
-               if (awaynotify)
-                       cap_awaynotify.HandleEvent(ev);
-               if (extendedjoin)
-                       cap_extendedjoin.HandleEvent(ev);
-
-               if (accountnotify)
-                       cap_accountnotify.HandleEvent(ev);
+               cap_accountnotify.SetActive(conf->getBool("accountnotify", true));
+               cap_awaynotify.SetActive(conf->getBool("awaynotify", true));
+               cap_extendedjoin.SetActive(conf->getBool("extendedjoin", true));
        }
 
        void OnAccountChange(User* user, const std::string& newaccount) CXX11_OVERRIDE
@@ -90,16 +57,16 @@ class ModuleIRCv3 : public Module, public AccountEventListener
                else
                        line += newaccount;
 
-               WriteNeighboursWithExt(user, line, cap_accountnotify.ext);
+               IRCv3::WriteNeighborsWithCap(user, line, cap_accountnotify);
        }
 
        void OnUserJoin(Membership* memb, bool sync, bool created, CUList& excepts) CXX11_OVERRIDE
        {
                // Remember who is not going to see the JOIN because of other modules
-               if ((awaynotify) && (memb->user->IsAway()))
+               if ((cap_awaynotify.IsActive()) && (memb->user->IsAway()))
                        last_excepts = excepts;
 
-               if (!extendedjoin)
+               if (!cap_extendedjoin.IsActive())
                        return;
 
                /*
@@ -119,7 +86,7 @@ class ModuleIRCv3 : public Module, public AccountEventListener
                {
                        // Send the extended join line if the current member is local, has the extended-join cap and isn't excepted
                        User* member = IS_LOCAL(it->first);
-                       if ((member) && (cap_extendedjoin.ext.get(member)) && (excepts.find(member) == excepts.end()))
+                       if ((member) && (cap_extendedjoin.get(member)) && (excepts.find(member) == excepts.end()))
                        {
                                // Construct the lines we're going to send if we haven't constructed them already
                                if (line.empty())
@@ -168,7 +135,7 @@ class ModuleIRCv3 : public Module, public AccountEventListener
 
        ModResult OnSetAway(User* user, const std::string &awaymsg) CXX11_OVERRIDE
        {
-               if (awaynotify)
+               if (cap_awaynotify.IsActive())
                {
                        // Going away: n!u@h AWAY :reason
                        // Back from away: n!u@h AWAY
@@ -176,14 +143,14 @@ class ModuleIRCv3 : public Module, public AccountEventListener
                        if (!awaymsg.empty())
                                line += " :" + awaymsg;
 
-                       WriteNeighboursWithExt(user, line, cap_awaynotify.ext);
+                       IRCv3::WriteNeighborsWithCap(user, line, cap_awaynotify);
                }
                return MOD_RES_PASSTHRU;
        }
 
        void OnPostJoin(Membership *memb) CXX11_OVERRIDE
        {
-               if ((!awaynotify) || (!memb->user->IsAway()))
+               if ((!cap_awaynotify.IsActive()) || (!memb->user->IsAway()))
                        return;
 
                std::string line = ":" + memb->user->GetFullHost() + " AWAY :" + memb->user->awaymsg;
@@ -193,7 +160,7 @@ class ModuleIRCv3 : public Module, public AccountEventListener
                {
                        // Send the away notify line if the current member is local, has the away-notify cap and isn't excepted
                        User* member = IS_LOCAL(it->first);
-                       if ((member) && (cap_awaynotify.ext.get(member)) && (last_excepts.find(member) == last_excepts.end()))
+                       if ((member) && (cap_awaynotify.get(member)) && (last_excepts.find(member) == last_excepts.end()) && (it->second != memb))
                        {
                                member->Write(line);
                        }