X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fmodules%2Fm_alias.cpp;h=32fc80b64d5427638a4a7919b2d437fa34afdec3;hb=a5d110282a864fd2e91b51ce360a977cd0643657;hp=522259ebd126541ea858e990dbe0173601e285f7;hpb=4fca1ffbc43dd0eda8e6df665dac0fa83512daf8;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/modules/m_alias.cpp b/src/modules/m_alias.cpp index 522259ebd..32fc80b64 100644 --- a/src/modules/m_alias.cpp +++ b/src/modules/m_alias.cpp @@ -1,16 +1,25 @@ -/* +------------------------------------+ - * | 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 Daniel De Graaf + * Copyright (C) 2005, 2009 Robin Burchell + * Copyright (C) 2004-2007, 2009 Craig Edwards + * Copyright (C) 2007 Dennis Friis * - * 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" /* $ModDesc: Provides aliases of commands. */ @@ -65,26 +74,24 @@ class ModuleAlias : public Module virtual void ReadAliases() { - ConfigReader MyConf; - - AllowBots = MyConf.ReadFlag("fantasy", "allowbots", "no", 0); - - std::string fpre = MyConf.ReadValue("fantasy","prefix",0); + ConfigTag* fantasy = ServerInstance->Config->ConfValue("fantasy"); + AllowBots = fantasy->getBool("allowbots", false); + std::string fpre = fantasy->getString("prefix", "!"); fprefix = fpre.empty() ? '!' : fpre[0]; Aliases.clear(); - for (int i = 0;; i++) + ConfigTagList tags = ServerInstance->Config->ConfTags("alias"); + for(ConfigIter i = tags.first; i != tags.second; ++i) { - ConfigTag* tag = ServerInstance->Config->ConfValue("alias", i); - if (!tag) - break; + ConfigTag* tag = i->second; Alias a; - a.AliasedCommand = tag->getString("text").c_str(); + std::string aliastext = tag->getString("text"); + a.AliasedCommand = aliastext.c_str(); tag->readString("replace", a.ReplaceFormat, true); a.RequiredNick = tag->getString("requires"); a.ULineOnly = tag->getBool("uline"); - a.ChannelCommand = tag->getBool("channelcommand", "no"); - a.UserCommand = tag->getBool("usercommand", "yes"); + a.ChannelCommand = tag->getBool("channelcommand", false); + a.UserCommand = tag->getBool("usercommand", true); a.OperOnly = tag->getBool("operonly"); a.format = tag->getString("format"); a.CaseSensitive = tag->getBool("matchcase"); @@ -94,12 +101,11 @@ class ModuleAlias : public Module public: - ModuleAlias() + void init() { ReadAliases(); - ServerInstance->Modules->Attach(I_OnPreCommand, this); - ServerInstance->Modules->Attach(I_OnRehash, this); - ServerInstance->Modules->Attach(I_OnUserMessage, this); + Implementation eventlist[] = { I_OnPreCommand, I_OnRehash, I_OnUserMessage }; + ServerInstance->Modules->Attach(eventlist, this, sizeof(eventlist)/sizeof(Implementation)); } virtual ~ModuleAlias() @@ -136,7 +142,7 @@ class ModuleAlias : public Module return word; } - virtual ModResult OnPreCommand(std::string &command, std::vector ¶meters, User *user, bool validated, const std::string &original_line) + virtual ModResult OnPreCommand(std::string &command, std::vector ¶meters, LocalUser *user, bool validated, const std::string &original_line) { std::multimap::iterator i, upperbound; @@ -245,7 +251,7 @@ class ModuleAlias : public Module } - int DoAlias(User *user, Channel *c, Alias *a, const std::string compare, const std::string safe) + int DoAlias(User *user, Channel *c, Alias *a, const std::string& compare, const std::string& safe) { User *u = NULL; @@ -272,7 +278,7 @@ class ModuleAlias : public Module u = ServerInstance->FindNick(a->RequiredNick); if (!u) { - user->WriteNumeric(401, ""+std::string(user->nick)+" "+a->RequiredNick+" :is currently unavailable. Please try again later."); + user->WriteNumeric(401, ""+user->nick+" "+a->RequiredNick+" :is currently unavailable. Please try again later."); return 1; } } @@ -281,7 +287,7 @@ class ModuleAlias : public Module if (!ServerInstance->ULine(u->server)) { ServerInstance->SNO->WriteToSnoMask('a', "NOTICE -- Service "+a->RequiredNick+" required by alias "+std::string(a->AliasedCommand.c_str())+" is not on a u-lined server, possibly underhanded antics detected!"); - user->WriteNumeric(401, ""+std::string(user->nick)+" "+a->RequiredNick+" :is an imposter! Please inform an IRC operator as soon as possible."); + user->WriteNumeric(401, ""+user->nick+" "+a->RequiredNick+" :is an imposter! Please inform an IRC operator as soon as possible."); return 1; } } @@ -307,55 +313,57 @@ class ModuleAlias : public Module } } - void DoCommand(std::string newline, User* user, Channel *c, const std::string &original_line) + void DoCommand(const std::string& newline, User* user, Channel *chan, const std::string &original_line) { - std::vector pars; - - for (int v = 1; v < 10; v++) + std::string result; + result.reserve(MAXBUF); + for (unsigned int i = 0; i < newline.length(); i++) { - std::string var = "$"; - var.append(ConvToStr(v)); - var.append("-"); - std::string::size_type x = newline.find(var); - - while (x != std::string::npos) - { - newline.erase(x, var.length()); - newline.insert(x, GetVar(var, original_line)); - x = newline.find(var); - } - - var = "$"; - var.append(ConvToStr(v)); - x = newline.find(var); - - while (x != std::string::npos) + char c = newline[i]; + if ((c == '$') && (i + 1 < newline.length())) { - newline.erase(x, var.length()); - newline.insert(x, GetVar(var, original_line)); - x = newline.find(var); + if (isdigit(newline[i+1])) + { + int len = ((i + 2 < newline.length()) && (newline[i+2] == '-')) ? 3 : 2; + std::string var = newline.substr(i, len); + result.append(GetVar(var, original_line)); + i += len - 1; + } + else if (newline.substr(i, 5) == "$nick") + { + result.append(user->nick); + i += 4; + } + else if (newline.substr(i, 5) == "$host") + { + result.append(user->host); + i += 4; + } + else if (newline.substr(i, 5) == "$chan") + { + if (chan) + result.append(chan->name); + i += 4; + } + else if (newline.substr(i, 6) == "$ident") + { + result.append(user->ident); + i += 5; + } + else if (newline.substr(i, 6) == "$vhost") + { + result.append(user->dhost); + i += 5; + } + else + result.push_back(c); } + else + result.push_back(c); } - /* Special variables */ - SearchAndReplace(newline, std::string("$nick"), user->nick); - SearchAndReplace(newline, std::string("$ident"), user->ident); - SearchAndReplace(newline, std::string("$host"), user->host); - SearchAndReplace(newline, std::string("$vhost"), user->dhost); - - if (c) - { - /* Channel specific variables */ - SearchAndReplace(newline, std::string("$chan"), c->name); - } - else - { - /* We don't want these in a user alias */ - SearchAndReplace(newline, std::string("$chan"), std::string("")); - } - - irc::tokenstream ss(newline); - pars.clear(); + irc::tokenstream ss(result); + std::vector pars; std::string command, token; ss.GetToken(command);