X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fmodules%2Fm_ircv3.cpp;h=0e28d59f2e6b8bead8c7ef97ad0dbce8d05cbab8;hb=551d687ec6d7ce44be35fae0dd7345fe73c4f63a;hp=fe400fa80eb62830af17b34bc84d64e985b9dc51;hpb=f293861ab70eab76ae0715a5f2c2769de332c779;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/modules/m_ircv3.cpp b/src/modules/m_ircv3.cpp index fe400fa80..0e28d59f2 100644 --- a/src/modules/m_ircv3.cpp +++ b/src/modules/m_ircv3.cpp @@ -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);