From d7dad41dd72b537cb722d1040c5a280db684f9fe Mon Sep 17 00:00:00 2001 From: attilamolnar Date: Thu, 7 Jun 2012 21:14:48 +0200 Subject: [PATCH] m_namesx Add support for altering /WHO replies to be compliant with the specification --- src/modules/m_namesx.cpp | 37 ++++++++++++++++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/src/modules/m_namesx.cpp b/src/modules/m_namesx.cpp index 603af0693..4d29a2754 100644 --- a/src/modules/m_namesx.cpp +++ b/src/modules/m_namesx.cpp @@ -35,7 +35,7 @@ class ModuleNamesX : public Module void init() { - Implementation eventlist[] = { I_OnPreCommand, I_OnNamesListItem, I_On005Numeric, I_OnEvent }; + Implementation eventlist[] = { I_OnPreCommand, I_OnNamesListItem, I_On005Numeric, I_OnEvent, I_OnSendWhoLine }; ServerInstance->Modules->Attach(eventlist, this, sizeof(eventlist)/sizeof(Implementation)); } @@ -80,6 +80,41 @@ class ModuleNamesX : public Module prefixes = memb->chan->GetAllPrefixChars(memb->user); } + void OnSendWhoLine(User* source, const std::vector& params, User* user, std::string& line) + { + if (!cap.ext.get(source) || line.empty()) + return; + + std::string::size_type pos = line.find(':'); + if (pos == std::string::npos || pos < 2) + return; + pos -= 2; + // Don't do anything if the user has no prefixes + if ((line[pos] == 'H') || (line[pos] == 'G') || (line[pos] == '*')) + return; + + // 352 21DAAAAAB #chan ident localhost insp21.test 21DAAAAAB H@ :0 a + // a b pos + std::string::size_type a = 4 + source->nick.length() + 1; + std::string::size_type b = line.find(' ', a); + if (b == std::string::npos) + return; + + // Try to find this channel + std::string channame = line.substr(a, b-a); + Channel* chan = ServerInstance->FindChan(channame.c_str()); + if (!chan) + return; + + // Don't do anything if the user has only one prefix + std::string prefixes = chan->GetAllPrefixChars(user); + if (prefixes.length() <= 1) + return; + + line.erase(pos, 1); + line.insert(pos, prefixes); + } + void OnEvent(Event& ev) { cap.HandleEvent(ev);