]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/modules/m_ircv3.cpp
m_spanningtree Remove unneeded #includes
[user/henk/code/inspircd.git] / src / modules / m_ircv3.cpp
index fe400fa80eb62830af17b34bc84d64e985b9dc51..0e28d59f2e6b8bead8c7ef97ad0dbce8d05cbab8 100644 (file)
@@ -19,8 +19,8 @@
 /* $ModDesc: Provides support for extended-join, away-notify and account-notify CAP capabilities */
 
 #include "inspircd.h"
-#include "account.h"
-#include "m_cap.h"
+#include "modules/account.h"
+#include "modules/cap.h"
 
 class ModuleIRCv3 : public Module
 {
@@ -31,6 +31,8 @@ class ModuleIRCv3 : public Module
        bool awaynotify;
        bool extendedjoin;
 
+       CUList last_excepts;
+
        void WriteNeighboursWithExt(User* user, const std::string& line, const LocalIntExt& ext)
        {
                UserChanList chans(user->chans);
@@ -73,10 +75,14 @@ class ModuleIRCv3 : public Module
        ModuleIRCv3() : cap_accountnotify(this, "account-notify"),
                                        cap_awaynotify(this, "away-notify"),
                                        cap_extendedjoin(this, "extended-join")
+       {
+       }
+
+       void init()
        {
                OnRehash(NULL);
-               Implementation eventlist[] = { I_OnUserJoin, I_OnSetAway, I_OnEvent };
-               ServerInstance->Modules->Attach(eventlist, this, 3);
+               Implementation eventlist[] = { I_OnUserJoin, I_OnPostJoin, I_OnSetAway, I_OnEvent, I_OnRehash };
+               ServerInstance->Modules->Attach(eventlist, this, sizeof(eventlist)/sizeof(Implementation));
        }
 
        void OnRehash(User* user)
@@ -118,6 +124,10 @@ class ModuleIRCv3 : public Module
 
        void OnUserJoin(Membership* memb, bool sync, bool created, CUList& excepts)
        {
+               // Remember who is not going to see the JOIN because of other modules
+               if ((awaynotify) && (memb->user->IsAway()))
+                       last_excepts = excepts;
+
                if (!extendedjoin)
                        return;
 
@@ -200,6 +210,27 @@ class ModuleIRCv3 : public Module
                return MOD_RES_PASSTHRU;
        }
 
+       void OnPostJoin(Membership *memb)
+       {
+               if ((!awaynotify) || (!memb->user->IsAway()))
+                       return;
+
+               std::string line = ":" + memb->user->GetFullHost() + " AWAY :" + memb->user->awaymsg;
+
+               const UserMembList* userlist = memb->chan->GetUsers();
+               for (UserMembCIter it = userlist->begin(); it != userlist->end(); ++it)
+               {
+                       // 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()))
+                       {
+                               member->Write(line);
+                       }
+               }
+
+               last_excepts.clear();
+       }
+
        void Prioritize()
        {
                ServerInstance->Modules->SetPriority(this, I_OnUserJoin, PRIORITY_LAST);