X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Fmodules%2Fm_namedmodes.cpp;h=8233f4357b061bf2b62ad42f45180670c57f3736;hb=553a8da754c8cd308bad2008018849714e70f9b7;hp=c113b502ca5f5f5aa90b0f1bd4c98e8096e083ca;hpb=0675ffde8d774d9213ca2323faa9fce36c19bf74;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/modules/m_namedmodes.cpp b/src/modules/m_namedmodes.cpp index c113b502c..8233f4357 100644 --- a/src/modules/m_namedmodes.cpp +++ b/src/modules/m_namedmodes.cpp @@ -1,16 +1,22 @@ -/* +------------------------------------+ - * | Inspire Internet Relay Chat Daemon | - * +------------------------------------+ +/* + * InspIRCd -- Internet Relay Chat Daemon * - * InspIRCd: (C) 2002-2010 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" static void DisplayList(User* user, Channel* channel) @@ -23,10 +29,9 @@ static void DisplayList(User* user, Channel* channel) continue; if (!channel->IsModeSet(letter)) continue; - std::string item = mh->name; + items << " +" << mh->name; if (mh->GetNumParams(true)) - item += "=" + channel->GetModeParameter(letter); - items << item << " "; + items << " " << channel->GetModeParameter(letter); } char pfx[MAXBUF]; snprintf(pfx, MAXBUF, ":%s 961 %s %s", ServerInstance->Config->ServerName.c_str(), user->nick.c_str(), channel->name.c_str()); @@ -39,8 +44,7 @@ class CommandProp : public Command public: CommandProp(Module* parent) : Command(parent, "PROP", 1) { - syntax = " [{+|-}[=value]]"; - TRANSLATE3(TR_TEXT, TR_TEXT, TR_END); + syntax = " {[+-] []}*"; } CmdResult Handle(const std::vector ¶meters, User *src) @@ -52,50 +56,61 @@ class CommandProp : public Command DisplayList(src, chan); return CMD_SUCCESS; } - - std::string prop = parameters[1], value; - std::string::size_type eq = prop.find('='); - if (eq != std::string::npos) + unsigned int i = 1; + std::vector modes; + modes.push_back(parameters[0]); + modes.push_back(""); + while (i < parameters.size()) { - value = prop.substr(eq + 1); - prop = prop.substr(0, eq); - } - bool plus = prop[0] != '-'; - if (prop[0] == '+' || prop[0] == '-') - prop.erase(prop.begin()); + std::string prop = parameters[i++]; + bool plus = prop[0] != '-'; + if (prop[0] == '+' || prop[0] == '-') + prop.erase(prop.begin()); - for(char letter = 'A'; letter <= 'z'; letter++) - { - ModeHandler* mh = ServerInstance->Modes->FindMode(letter, MODETYPE_CHANNEL); - if (mh && mh->name == prop) + for(char letter = 'A'; letter <= 'z'; letter++) { - if (mh->GetNumParams(plus) && value.empty()) - return CMD_FAILURE; - std::vector modes; - modes.push_back(parameters[0]); - modes.push_back((plus ? "+" : "-") + std::string(1, letter)); - modes.push_back(value); - ServerInstance->SendGlobalMode(modes, src); - return CMD_SUCCESS; + ModeHandler* mh = ServerInstance->Modes->FindMode(letter, MODETYPE_CHANNEL); + if (mh && mh->name == prop) + { + modes[1].append((plus ? "+" : "-") + std::string(1, letter)); + if (mh->GetNumParams(plus)) + { + if (i != parameters.size()) + modes.push_back(parameters[i++]); + } + } } } - return CMD_FAILURE; + ServerInstance->SendGlobalMode(modes, src); + return CMD_SUCCESS; + } +}; + +class DummyZ : public ModeHandler +{ + public: + DummyZ(Module* parent) : ModeHandler(parent, "namebase", 'Z', PARAM_ALWAYS, MODETYPE_CHANNEL) + { + list = true; } }; class ModuleNamedModes : public Module { CommandProp cmd; + DummyZ dummyZ; public: - ModuleNamedModes() : cmd(this) + ModuleNamedModes() : cmd(this), dummyZ(this) { } void init() { ServerInstance->Modules->AddService(cmd); - Implementation eventlist[] = { I_OnPreMode, I_On005Numeric }; - ServerInstance->Modules->Attach(eventlist, this, 2); + ServerInstance->Modules->AddService(dummyZ); + + Implementation eventlist[] = { I_OnPreMode }; + ServerInstance->Modules->Attach(eventlist, this, 1); } Version GetVersion() @@ -108,18 +123,6 @@ class ModuleNamedModes : public Module ServerInstance->Modules->SetPriority(this, I_OnPreMode, PRIORITY_FIRST); } - void On005Numeric(std::string& line) - { - 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'); - } - } - ModResult OnPreMode(User* source, User* dest, Channel* channel, const std::vector& parameters) { if (!channel)