]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/modules/m_alias.cpp
PreCommand/PostCommand are local-only hooks
[user/henk/code/inspircd.git] / src / modules / m_alias.cpp
index 522259ebd126541ea858e990dbe0173601e285f7..c7f0da690ed8b9eb80cae4378f3b0afc51c91163 100644 (file)
@@ -2,7 +2,7 @@
  *       | Inspire Internet Relay Chat Daemon |
  *       +------------------------------------+
  *
- *  InspIRCd: (C) 2002-2009 InspIRCd Development Team
+ *  InspIRCd: (C) 2002-2010 InspIRCd Development Team
  * See: http://wiki.inspircd.org/Credits
  *
  * This program is free but copyrighted software; see
@@ -73,11 +73,10 @@ class ModuleAlias : public Module
                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();
                        tag->readString("replace", a.ReplaceFormat, true);
@@ -136,7 +135,7 @@ class ModuleAlias : public Module
                return word;
        }
 
-       virtual ModResult OnPreCommand(std::string &command, std::vector<std::string> &parameters, User *user, bool validated, const std::string &original_line)
+       virtual ModResult OnPreCommand(std::string &command, std::vector<std::string> &parameters, LocalUser *user, bool validated, const std::string &original_line)
        {
                std::multimap<irc::string, Alias>::iterator i, upperbound;
 
@@ -307,55 +306,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<std::string> 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 == '$')
                        {
-                               newline.erase(x, var.length());
-                               newline.insert(x, GetVar(var, original_line));
-                               x = newline.find(var);
+                               if (isdigit(newline[i+1]))
+                               {
+                                       int len = (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<std::string> pars;
                std::string command, token;
 
                ss.GetToken(command);