X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fmodules%2Fm_namesx.cpp;h=020fb99bd142bcd79772ebae16cdef86d5668d6b;hb=e4560ecec44e74cff7b31695114a3b52304beac3;hp=d7a76e8060f3982a1317ac9ab13de4dab63dda2f;hpb=8f62016f16cf2419817738904153cb3711b20d7e;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/modules/m_namesx.cpp b/src/modules/m_namesx.cpp index d7a76e806..020fb99bd 100644 --- a/src/modules/m_namesx.cpp +++ b/src/modules/m_namesx.cpp @@ -2,7 +2,7 @@ * InspIRCd -- Internet Relay Chat Daemon * * Copyright (C) 2019 linuxdaemon - * Copyright (C) 2013, 2018-2020 Sadie Powell + * Copyright (C) 2013, 2018-2021 Sadie Powell * Copyright (C) 2012-2016 Attila Molnar * Copyright (C) 2012, 2019 Robby * Copyright (C) 2009-2010 Daniel De Graaf @@ -27,11 +27,13 @@ #include "modules/cap.h" #include "modules/names.h" #include "modules/who.h" +#include "modules/whois.h" class ModuleNamesX : public Module , public Names::EventListener , public Who::EventListener + , public Whois::LineEventListener { private: Cap::Capability cap; @@ -40,13 +42,14 @@ class ModuleNamesX ModuleNamesX() : Names::EventListener(this) , Who::EventListener(this) + , Whois::LineEventListener(this) , cap(this, "multi-prefix") { } Version GetVersion() CXX11_OVERRIDE { - return Version("Provides the NAMESX (CAP multi-prefix) capability", VF_VENDOR); + return Version("Provides the IRCv3 multi-prefix client capability.", VF_VENDOR); } void On005Numeric(std::map& tokens) CXX11_OVERRIDE @@ -104,6 +107,50 @@ class ModuleNamesX numeric.GetParams()[flag_index].append(prefixes, 1, std::string::npos); return MOD_RES_PASSTHRU; } + + ModResult OnWhoisLine(Whois::Context& whois, Numeric::Numeric& numeric) CXX11_OVERRIDE + { + if (numeric.GetNumeric() != RPL_WHOISCHANNELS || !cap.get(whois.GetSource())) + return MOD_RES_PASSTHRU; + + // :testnet.inspircd.org 319 test Sadie :#test ~#inspircd + if (numeric.GetParams().size() < 2 || numeric.GetParams().back().empty()) + return MOD_RES_PASSTHRU; + + std::stringstream newchannels; + irc::spacesepstream channelstream(numeric.GetParams().back()); + for (std::string channel; channelstream.GetToken(channel); ) + { + size_t hashpos = channel.find('#'); + if (!hashpos || hashpos == std::string::npos) + { + // The entry is malformed or the user has no privs. + newchannels << channel << ' '; + continue; + } + + Channel* chan = ServerInstance->FindChan(channel.substr(hashpos)); + if (!chan) + { + // Should never happen. + newchannels << channel << ' '; + continue; + } + + Membership* memb = chan->GetUser(whois.GetTarget()); + if (!memb) + { + // Should never happen. + newchannels << channel << ' '; + continue; + } + + newchannels << memb->GetAllPrefixChars() << chan->name << ' '; + } + + numeric.GetParams().back() = newchannels.str(); + return MOD_RES_PASSTHRU; + } }; MODULE_INIT(ModuleNamesX)