X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fmodules%2Fm_namedmodes.cpp;h=5c0ffeea5510ca4e0e09b703f97e0039b4c4a8dd;hb=acccaa39641500b8a691db4136e6571102a438ed;hp=6f6dda491c474c9518feede4ea3bfd2dd6e46790;hpb=4663fd393f925e0ff976dddd8df42cab3e5d2893;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/modules/m_namedmodes.cpp b/src/modules/m_namedmodes.cpp index 6f6dda491..5c0ffeea5 100644 --- a/src/modules/m_namedmodes.cpp +++ b/src/modules/m_namedmodes.cpp @@ -1,71 +1,116 @@ -/* +------------------------------------+ - * | Inspire Internet Relay Chat Daemon | - * +------------------------------------+ +/* + * InspIRCd -- Internet Relay Chat Daemon * - * InspIRCd: (C) 2002-2009 InspIRCd Development Team - * See: http://wiki.inspircd.org/Credits + * Copyright (C) 2009-2010 Daniel De Graaf * - * This program is free but copyrighted software; see - * the file COPYING for details. + * This file is part of InspIRCd. InspIRCd is free software: you can + * redistribute it and/or modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation, version 2. * - * --------------------------------------------------- + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . */ + #include "inspircd.h" -class ModuleNamedModes : public Module +static void DisplayList(User* user, Channel* channel) +{ + std::stringstream items; + const ModeParser::ModeHandlerMap& mhs = ServerInstance->Modes->GetModes(MODETYPE_CHANNEL); + for (ModeParser::ModeHandlerMap::const_iterator i = mhs.begin(); i != mhs.end(); ++i) + { + ModeHandler* mh = i->second; + if (!channel->IsModeSet(mh)) + continue; + items << " +" << mh->name; + if (mh->GetNumParams(true)) + items << " " << channel->GetModeParameter(mh); + } + const std::string line = ":" + ServerInstance->Config->ServerName + " 961 " + user->nick + " " + channel->name; + user->SendText(line, items); + user->WriteNumeric(960, "%s :End of mode list", channel->name.c_str()); +} + +class CommandProp : public Command { public: - ModuleNamedModes() + CommandProp(Module* parent) : Command(parent, "PROP", 1) { - Implementation eventlist[] = { I_OnPreMode, I_On005Numeric }; - ServerInstance->Modules->Attach(eventlist, this, 2); + syntax = " {[+-] []}*"; } - Version GetVersion() + CmdResult Handle(const std::vector ¶meters, User *src) { - return Version("Provides the ability to manipulate modes via long names.",VF_VENDOR); + if (parameters.size() == 1) + { + Channel* chan = ServerInstance->FindChan(parameters[0]); + if (chan) + DisplayList(src, chan); + return CMD_SUCCESS; + } + unsigned int i = 1; + std::vector modes; + modes.push_back(parameters[0]); + modes.push_back(""); + while (i < parameters.size()) + { + std::string prop = parameters[i++]; + bool plus = prop[0] != '-'; + if (prop[0] == '+' || prop[0] == '-') + prop.erase(prop.begin()); + + ModeHandler* mh = ServerInstance->Modes->FindMode(prop, MODETYPE_CHANNEL); + if (mh) + { + modes[1].push_back(plus ? '+' : '-'); + modes[1].push_back(mh->GetModeChar()); + if (mh->GetNumParams(plus)) + { + if (i != parameters.size()) + modes.push_back(parameters[i++]); + } + } + } + ServerInstance->Modes->Process(modes, src); + return CMD_SUCCESS; } +}; - void Prioritize() +class DummyZ : public ModeHandler +{ + public: + DummyZ(Module* parent) : ModeHandler(parent, "namebase", 'Z', PARAM_ALWAYS, MODETYPE_CHANNEL) { - ServerInstance->Modules->SetPriority(this, I_OnPreMode, PRIORITY_FIRST); + list = true; } +}; - void On005Numeric(std::string& line) +class ModuleNamedModes : public Module +{ + CommandProp cmd; + DummyZ dummyZ; + public: + ModuleNamedModes() : cmd(this), dummyZ(this) { - std::string::size_type pos = line.find(" CHANMODES="); - if (pos != std::string::npos) - { - pos += 11; - while (line[pos] > 'A' && line[pos] < 'Z') - pos++; - line.insert(pos, 1, 'Z'); - } } - void DisplayList(User* user, Channel* channel) + Version GetVersion() CXX11_OVERRIDE { - std::stringstream items; - for(char letter = 'A'; letter <= 'z'; letter++) - { - ModeHandler* mh = ServerInstance->Modes->FindMode(letter, MODETYPE_CHANNEL); - if (!mh || mh->IsListMode()) - continue; - if (!channel->IsModeSet(letter)) - continue; - std::string item = mh->name; - if (mh->GetNumParams(true)) - item += "=" + channel->GetModeParameter(letter); - items << item << " "; - } - char pfx[MAXBUF]; - snprintf(pfx, MAXBUF, ":%s 961 %s %s", ServerInstance->Config->ServerName.c_str(), user->nick.c_str(), channel->name.c_str()); - user->SendText(std::string(pfx), items); - user->WriteNumeric(960, "%s %s :End of mode list", user->nick.c_str(), channel->name.c_str()); + return Version("Provides the ability to manipulate modes via long names.",VF_VENDOR); } - ModResult OnPreMode(User* source, User* dest, Channel* channel, const std::vector& parameters) + void Prioritize() + { + ServerInstance->Modules->SetPriority(this, I_OnPreMode, PRIORITY_FIRST); + } + + ModResult OnPreMode(User* source, User* dest, Channel* channel, const std::vector& parameters) CXX11_OVERRIDE { if (!channel) return MOD_RES_PASSTHRU; @@ -95,7 +140,6 @@ class ModuleNamedModes : public Module ModeHandler *mh = ServerInstance->Modes->FindMode(modechar, MODETYPE_CHANNEL); if (modechar == 'Z') { - modechar = 0; std::string name, value; if (param_at < parameters.size()) name = parameters[param_at++]; @@ -105,31 +149,28 @@ class ModuleNamedModes : public Module value = name.substr(eq + 1); name = name.substr(0, eq); } - for(char letter = 'A'; modechar == 0 && letter <= 'z'; letter++) + + mh = ServerInstance->Modes->FindMode(name, MODETYPE_CHANNEL); + if (!mh) { - mh = ServerInstance->Modes->FindMode(letter, MODETYPE_CHANNEL); - if (mh && mh->name == name) + // Mode handler not found + modelist.erase(i--, 1); + continue; + } + + if (mh->GetNumParams(adding)) + { + if (value.empty()) { - if (mh->GetNumParams(adding)) - { - if (!value.empty()) - { - newparms.push_back(value); - modechar = letter; - break; - } - } - else - { - modechar = letter; - break; - } + // Mode needs a parameter but there wasn't one + modelist.erase(i--, 1); + continue; } + + newparms.push_back(value); } - if (modechar) - modelist[i] = modechar; - else - modelist.erase(i, 1); + + modelist[i] = mh->GetModeChar(); } else if (mh && mh->GetNumParams(adding) && param_at < parameters.size()) { @@ -137,7 +178,7 @@ class ModuleNamedModes : public Module } } newparms[1] = modelist; - ServerInstance->Modes->Process(newparms, source, false); + ServerInstance->Modes->Process(newparms, source); return MOD_RES_DENY; } };