2 * InspIRCd -- Internet Relay Chat Daemon
4 * Copyright (C) 2008 Craig Edwards <craigedwards@brainbox.cc>
6 * This file is part of InspIRCd. InspIRCd is free software: you can
7 * redistribute it and/or modify it under the terms of the GNU General Public
8 * License as published by the Free Software Foundation, version 2.
10 * This program is distributed in the hope that it will be useful, but WITHOUT
11 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
12 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
15 * You should have received a copy of the GNU General Public License
16 * along with this program. If not, see <http://www.gnu.org/licenses/>.
22 class ModuleAbbreviation : public Module
27 ServerInstance->Modules->SetPriority(this, I_OnPreCommand, PRIORITY_FIRST);
30 Version GetVersion() CXX11_OVERRIDE
32 return Version("Provides the ability to abbreviate commands a-la BBC BASIC keywords.",VF_VENDOR);
35 ModResult OnPreCommand(std::string &command, std::vector<std::string> ¶meters, LocalUser *user, bool validated, const std::string &original_line) CXX11_OVERRIDE
37 /* Command is already validated, has a length of 0, or last character is not a . */
38 if (validated || command.empty() || *command.rbegin() != '.')
39 return MOD_RES_PASSTHRU;
41 /* Look for any command that starts with the same characters, if it does, replace the command string with it */
42 size_t clen = command.length() - 1;
43 std::string foundcommand, matchlist;
44 bool foundmatch = false;
45 const CommandParser::CommandMap& commands = ServerInstance->Parser.GetCommands();
46 for (CommandParser::CommandMap::const_iterator n = commands.begin(); n != commands.end(); ++n)
48 if (!command.compare(0, clen, n->first, 0, clen))
50 if (matchlist.length() > 450)
52 user->WriteNumeric(420, ":Ambiguous abbreviation and too many possible matches.");
58 /* Found the command */
59 foundcommand = n->first;
63 matchlist.append(" ").append(n->first);
67 /* Ambiguous command, list the matches */
68 if (!matchlist.empty())
70 user->WriteNumeric(420, ":Ambiguous abbreviation, posssible matches: %s%s", foundcommand.c_str(), matchlist.c_str());
74 if (!foundcommand.empty())
76 command = foundcommand;
79 return MOD_RES_PASSTHRU;
83 MODULE_INIT(ModuleAbbreviation)