]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/modules/m_ircv3.cpp
Update wiki links to use HTTPS and point to the correct pages.
[user/henk/code/inspircd.git] / src / modules / m_ircv3.cpp
index fe400fa80eb62830af17b34bc84d64e985b9dc51..b7dd0e81bbfcd1e50a00f9f5aa198ec27804d0e2 100644 (file)
@@ -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,16 +75,20 @@ 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)
        {
                ConfigTag* conf = ServerInstance->Config->ConfValue("ircv3");
-               accountnotify = conf->getBool("accoutnotify", true);
+               accountnotify = conf->getBool("accountnotify", conf->getBool("accoutnotify", true));
                awaynotify = conf->getBool("awaynotify", true);
                extendedjoin = conf->getBool("extendedjoin", true);
        }
@@ -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) && (IS_AWAY(memb->user)))
+                       last_excepts = excepts;
+
                if (!extendedjoin)
                        return;
 
@@ -200,6 +210,27 @@ class ModuleIRCv3 : public Module
                return MOD_RES_PASSTHRU;
        }
 
+       void OnPostJoin(Membership *memb)
+       {
+               if ((!awaynotify) || (!IS_AWAY(memb->user)))
+                       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()) && (it->second != memb))
+                       {
+                               member->Write(line);
+                       }
+               }
+
+               last_excepts.clear();
+       }
+
        void Prioritize()
        {
                ServerInstance->Modules->SetPriority(this, I_OnUserJoin, PRIORITY_LAST);