]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/modules/m_alias.cpp
Move ident lookups to the OnSetUserIP hook.
[user/henk/code/inspircd.git] / src / modules / m_alias.cpp
index 935cb8259b2af57cdc309d32dbf106df0afbaa7b..3e00db7656b854754ec114cef33a3f0947aaf5d0 100644 (file)
@@ -68,34 +68,46 @@ class ModuleAlias : public Module
        bool AllowBots;
        UserModeReference botmode;
 
+       // Whether we are actively executing an alias.
+       bool active;
+
  public:
        void ReadConfig(ConfigStatus& status) CXX11_OVERRIDE
        {
-               ConfigTag* fantasy = ServerInstance->Config->ConfValue("fantasy");
-               AllowBots = fantasy->getBool("allowbots", false);
-               fprefix = fantasy->getString("prefix", "!", 1, ServerInstance->Config->Limits.MaxLine);
-
-               Aliases.clear();
+               AliasMap newAliases;
                ConfigTagList tags = ServerInstance->Config->ConfTags("alias");
                for(ConfigIter i = tags.first; i != tags.second; ++i)
                {
                        ConfigTag* tag = i->second;
                        Alias a;
                        a.AliasedCommand = tag->getString("text");
-                       std::transform(a.AliasedCommand.begin(), a.AliasedCommand.end(), a.AliasedCommand.begin(), ::toupper);
+                       if (a.AliasedCommand.empty())
+                               throw ModuleException("<alias:text> is empty! at " + tag->getTagLocation());
+
                        tag->readString("replace", a.ReplaceFormat, true);
+                       if (a.ReplaceFormat.empty())
+                               throw ModuleException("<alias:replace> is empty! at " + tag->getTagLocation());
+
                        a.RequiredNick = tag->getString("requires");
                        a.ULineOnly = tag->getBool("uline");
                        a.ChannelCommand = tag->getBool("channelcommand", false);
                        a.UserCommand = tag->getBool("usercommand", true);
                        a.OperOnly = tag->getBool("operonly");
                        a.format = tag->getString("format");
-                       Aliases.insert(std::make_pair(a.AliasedCommand, a));
+
+                       std::transform(a.AliasedCommand.begin(), a.AliasedCommand.end(), a.AliasedCommand.begin(), ::toupper);
+                       newAliases.insert(std::make_pair(a.AliasedCommand, a));
                }
+
+               ConfigTag* fantasy = ServerInstance->Config->ConfValue("fantasy");
+               AllowBots = fantasy->getBool("allowbots", false);
+               fprefix = fantasy->getString("prefix", "!", 1, ServerInstance->Config->Limits.MaxLine);
+               Aliases.swap(newAliases);
        }
 
        ModuleAlias()
                : botmode(this, "bot")
+               , active(false)
        {
        }
 
@@ -177,6 +189,15 @@ class ModuleAlias : public Module
                return MOD_RES_PASSTHRU;
        }
 
+       ModResult OnUserPreMessage(User* user, const MessageTarget& target, MessageDetails& details) CXX11_OVERRIDE
+       {
+               // Don't echo anything which is caused by an alias.
+               if (active)
+                       details.echo = false;
+
+               return MOD_RES_PASSTHRU;
+       }
+
        void OnUserPostMessage(User* user, const MessageTarget& target, const MessageDetails& details) CXX11_OVERRIDE
        {
                if ((target.type != MessageTarget::TYPE_CHANNEL) || (details.type != MSG_PRIVMSG))
@@ -351,7 +372,10 @@ class ModuleAlias : public Module
                {
                        pars.push_back(token);
                }
+
+               active = true;
                ServerInstance->Parser.CallHandler(command, pars, user);
+               active = false;
        }
 
        void Prioritize() CXX11_OVERRIDE