X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fmodules%2Fm_hostcycle.cpp;h=b33c101efb83b9eca3e4ed3f477a3adf085cb302;hb=a86e320ac19fbbd6034d0447f048beb8b4a0ad1d;hp=79b4169ec65f302999d0e9ac217d9e88986761b4;hpb=1031f333332cf1b09db4fd632f141143ee637c34;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/modules/m_hostcycle.cpp b/src/modules/m_hostcycle.cpp index 79b4169ec..b33c101ef 100644 --- a/src/modules/m_hostcycle.cpp +++ b/src/modules/m_hostcycle.cpp @@ -19,20 +19,23 @@ #include "inspircd.h" +#include "modules/cap.h" class ModuleHostCycle : public Module { + Cap::Reference chghostcap; + /** Send fake quit/join/mode messages for host or ident cycle. */ - static void DoHostCycle(User* user, const std::string& newident, const std::string& newhost, const char* quitmsg) + void DoHostCycle(User* user, const std::string& newident, const std::string& newhost, const char* quitmsg) { // GetFullHost() returns the original data at the time this function is called const std::string quitline = ":" + user->GetFullHost() + " QUIT :" + quitmsg; - already_sent_t silent_id = ++LocalUser::already_sent_id; - already_sent_t seen_id = ++LocalUser::already_sent_id; + already_sent_t silent_id = ServerInstance->Users.NextAlreadySentId(); + already_sent_t seen_id = ServerInstance->Users.NextAlreadySentId(); - UserChanList include_chans(user->chans); + IncludeChanList include_chans(user->chans.begin(), user->chans.end()); std::map exceptions; FOREACH_MOD(OnBuildNeighborList, (user, include_chans, exceptions)); @@ -40,7 +43,7 @@ class ModuleHostCycle : public Module for (std::map::iterator i = exceptions.begin(); i != exceptions.end(); ++i) { LocalUser* u = IS_LOCAL(i->first); - if (u && !u->quitting) + if ((u) && (!u->quitting) && (!chghostcap.get(u))) { if (i->second) { @@ -56,10 +59,10 @@ class ModuleHostCycle : public Module std::string newfullhost = user->nick + "!" + newident + "@" + newhost; - for (UCListIter i = include_chans.begin(); i != include_chans.end(); ++i) + for (IncludeChanList::const_iterator i = include_chans.begin(); i != include_chans.end(); ++i) { - Channel* c = *i; - Membership* memb = c->GetUser(user); + Membership* memb = *i; + Channel* c = memb->chan; const std::string joinline = ":" + newfullhost + " JOIN " + c->name; std::string modeline; @@ -72,14 +75,16 @@ class ModuleHostCycle : public Module modeline.append(" ").append(user->nick); } - const UserMembList* ulist = c->GetUsers(); - for (UserMembList::const_iterator j = ulist->begin(); j != ulist->end(); ++j) + const Channel::MemberMap& ulist = c->GetUsers(); + for (Channel::MemberMap::const_iterator j = ulist.begin(); j != ulist.end(); ++j) { LocalUser* u = IS_LOCAL(j->first); if (u == NULL || u == user) continue; if (u->already_sent == silent_id) continue; + if (chghostcap.get(u)) + continue; if (u->already_sent != seen_id) { @@ -95,6 +100,11 @@ class ModuleHostCycle : public Module } public: + ModuleHostCycle() + : chghostcap(this, "chghost") + { + } + void OnChangeIdent(User* user, const std::string& newident) CXX11_OVERRIDE { DoHostCycle(user, newident, user->dhost, "Changing ident");