From 715eba3932edef74b3983792be524192bb0fa102 Mon Sep 17 00:00:00 2001 From: brain Date: Fri, 6 Jun 2008 16:09:23 +0000 Subject: On ambiguous abbreviation, list all possibilities and eat the command (numeric 420, unused and as close as i could get it to numeric 421, unknown command) git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@9847 e03df62e-2008-0410-955e-edbf42e46eb7 --- src/commands/cmd_commands.cpp | 2 +- src/commands/cmd_stats.cpp | 2 +- src/modules/m_abbreviation.cpp | 32 +++++++++++++++++++++++++++----- 3 files changed, 29 insertions(+), 7 deletions(-) diff --git a/src/commands/cmd_commands.cpp b/src/commands/cmd_commands.cpp index 3f8542aa2..9d77de6ca 100644 --- a/src/commands/cmd_commands.cpp +++ b/src/commands/cmd_commands.cpp @@ -23,7 +23,7 @@ extern "C" DllExport Command* init_command(InspIRCd* Instance) CmdResult CommandCommands::Handle (const std::vector&, User *user) { - for (Commandable::iterator i = ServerInstance->Parser->cmdlist.begin(); i != ServerInstance->Parser->cmdlist.end(); i++) + for (Commandtable::iterator i = ServerInstance->Parser->cmdlist.begin(); i != ServerInstance->Parser->cmdlist.end(); i++) { user->WriteNumeric(702, "%s :%s %s %d %d", user->nick.c_str(), diff --git a/src/commands/cmd_stats.cpp b/src/commands/cmd_stats.cpp index fafa97581..03c48609f 100644 --- a/src/commands/cmd_stats.cpp +++ b/src/commands/cmd_stats.cpp @@ -163,7 +163,7 @@ DllExport void DoStats(InspIRCd* ServerInstance, char statschar, User* user, str /* stats m (list number of times each command has been used, plus bytecount) */ case 'm': - for (Commandable::iterator i = ServerInstance->Parser->cmdlist.begin(); i != ServerInstance->Parser->cmdlist.end(); i++) + for (Commandtable::iterator i = ServerInstance->Parser->cmdlist.begin(); i != ServerInstance->Parser->cmdlist.end(); i++) { if (i->second->use_count) { diff --git a/src/modules/m_abbreviation.cpp b/src/modules/m_abbreviation.cpp index f94f8a5cc..dbda047b5 100644 --- a/src/modules/m_abbreviation.cpp +++ b/src/modules/m_abbreviation.cpp @@ -44,6 +44,8 @@ class ModuleAbbreviation : public Module /* Look for any command that starts with the same characters, if it does, replace the command string with it */ size_t clen = command.length(); + std::string foundcommand, matchlist; + bool foundmatch = false; for (Commandtable::iterator n = ServerInstance->Parser->cmdlist.begin(); n != ServerInstance->Parser->cmdlist.end(); ++n) { if (n->first.length() < clen) @@ -51,14 +53,34 @@ class ModuleAbbreviation : public Module if (command == n->first.substr(0, clen)) { - /* Found the command */ - command = n->first; - return false; + if (!foundmatch) + { + /* Found the command */ + foundcommand = n->first; + foundmatch = true; + } + else + matchlist.append(" ").append(n->first); } } - /* No match, we have to put the . back again so that the invalid command numeric looks correct. */ - command += '.'; + /* Ambiguous command, list the matches */ + if (!matchlist.empty()) + { + user->WriteNumeric(420, "%s :Ambiguous abbreviation, posssible matches: %s%s", user->nick.c_str(), foundcommand.c_str(), matchlist.c_str()); + return true; + } + + if (foundcommand.empty()) + { + /* No match, we have to put the . back again so that the invalid command numeric looks correct. */ + command += '.'; + } + else + { + command = foundcommand; + } + return false; } }; -- cgit v1.2.3