X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fmodules%2Fm_ircv3.cpp;h=5cb2ab6b131bc6f3f51e6ccb02a8311406848f58;hb=c77cc4f737c782c3a56d69da0eac82edd41d4976;hp=fe400fa80eb62830af17b34bc84d64e985b9dc51;hpb=6e5a68a30d2f8582593aa50267464b786f134f8d;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/modules/m_ircv3.cpp b/src/modules/m_ircv3.cpp index fe400fa80..5cb2ab6b1 100644 --- a/src/modules/m_ircv3.cpp +++ b/src/modules/m_ircv3.cpp @@ -16,11 +16,9 @@ * along with this program. If not, see . */ -/* $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,12 +29,14 @@ 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); + IncludeChanList chans(user->chans.begin(), user->chans.end()); std::map exceptions; - FOREACH_MOD(I_OnBuildNeighborList, OnBuildNeighborList(user, chans, exceptions)); + FOREACH_MOD(OnBuildNeighborList, (user, chans, exceptions)); // Send it to all local users who were explicitly marked as neighbours by modules and have the required ext for (std::map::const_iterator i = exceptions.begin(); i != exceptions.end(); ++i) @@ -48,9 +48,9 @@ class ModuleIRCv3 : public Module // Now consider sending it to all other users who has at least a common channel with the user std::set already_sent; - for (UCListIter i = chans.begin(); i != chans.end(); ++i) + for (IncludeChanList::const_iterator i = chans.begin(); i != chans.end(); ++i) { - const UserMembList* userlist = (*i)->GetUsers(); + const UserMembList* userlist = (*i)->chan->GetUsers(); for (UserMembList::const_iterator m = userlist->begin(); m != userlist->end(); ++m) { /* @@ -74,20 +74,17 @@ class ModuleIRCv3 : public Module cap_awaynotify(this, "away-notify"), cap_extendedjoin(this, "extended-join") { - OnRehash(NULL); - Implementation eventlist[] = { I_OnUserJoin, I_OnSetAway, I_OnEvent }; - ServerInstance->Modules->Attach(eventlist, this, 3); } - void OnRehash(User* user) + void ReadConfig(ConfigStatus& status) CXX11_OVERRIDE { ConfigTag* conf = ServerInstance->Config->ConfValue("ircv3"); - accountnotify = conf->getBool("accoutnotify", true); + accountnotify = conf->getBool("accountnotify", true); awaynotify = conf->getBool("awaynotify", true); extendedjoin = conf->getBool("extendedjoin", true); } - void OnEvent(Event& ev) + void OnEvent(Event& ev) CXX11_OVERRIDE { if (awaynotify) cap_awaynotify.HandleEvent(ev); @@ -116,8 +113,12 @@ class ModuleIRCv3 : public Module } } - void OnUserJoin(Membership* memb, bool sync, bool created, CUList& excepts) + 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())) + last_excepts = excepts; + if (!extendedjoin) return; @@ -185,7 +186,7 @@ class ModuleIRCv3 : public Module } } - ModResult OnSetAway(User* user, const std::string &awaymsg) + ModResult OnSetAway(User* user, const std::string &awaymsg) CXX11_OVERRIDE { if (awaynotify) { @@ -200,12 +201,33 @@ class ModuleIRCv3 : public Module return MOD_RES_PASSTHRU; } + void OnPostJoin(Membership *memb) CXX11_OVERRIDE + { + 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); } - Version GetVersion() + Version GetVersion() CXX11_OVERRIDE { return Version("Provides support for extended-join, away-notify and account-notify CAP capabilities", VF_VENDOR); }