summaryrefslogtreecommitdiffstats
path: root/src/crsm.cpp
diff options
context:
space:
mode:
authorMarkus Mittendrein <git@maxmitti.tk>2015-10-06 14:26:05 +0200
committerMarkus Mittendrein <git@maxmitti.tk>2015-10-07 14:50:25 +0200
commitf6073e15bb79cc1f75f1c83f41ec81495dc35281 (patch)
tree89e7d5e8bfddb4a347b1dea97937f3be7f441869 /src/crsm.cpp
parentcb032e2185ee9d3b81fa4d56a6cce865a62db0aa (diff)
downloadmanager-f6073e15bb79cc1f75f1c83f41ec81495dc35281.tar.gz
manager-f6073e15bb79cc1f75f1c83f41ec81495dc35281.zip
Add command groups
Diffstat (limited to 'src/crsm.cpp')
-rw-r--r--src/crsm.cpp121
1 files changed, 102 insertions, 19 deletions
diff --git a/src/crsm.cpp b/src/crsm.cpp
index da9ea81..5452556 100644
--- a/src/crsm.cpp
+++ b/src/crsm.cpp
@@ -161,12 +161,11 @@ void CRSM::readServerOutput()
else if(!isMeMessage)
{
QString msg = userexp.cap(5).trimmed();
- QRegExp commandExp("^\\" CMD_SIGN "([^ ]+)(\\s+(.*)\\s*)?$");
+ QRegExp commandExp("^\\" CMD_SIGN "([^ ]+\\s+(.*)\\s*)?$");
if(commandExp.exactMatch(msg))
{
QString command = commandExp.cap(1).trimmed();
- QString commandArgs = commandExp.cap(2).trimmed();
- if(!cmd(command, commandArgs, info))
+ if(!cmd(command, info))
{
respond(info, "Unbekannter Befehl: \"" + command + "\"!\n");
}
@@ -462,12 +461,13 @@ void CRSM::ircMessageReceived(IrcMessage *message)
}
else if(mess.length() > QString(CMD_SIGN).length() && mess.left(QString(CMD_SIGN).length()) == CMD_SIGN)
{
- QStringList args = mess.right(mess.length() - QString(CMD_SIGN).length()).split(" ", QString::SkipEmptyParts);
- QString command = args.first().trimmed();
- args.removeFirst();
- QString arg = args.join(" ").trimmed();
+<<<<<<< HEAD
+ QString command = mess.right(mess.length() - QString(CMD_SIGN).length());
+=======
+ QString command = mess.mid(Config.CRSM.CommandSign.length()).trimmed();
+>>>>>>> 49e362f... fixup! Add command groups
const ClientInfo& client = ClientInfo::ircClient(message->nick(), target);
- if(!cmd(command, arg, client))
+ if(!cmd(command, client))
{
respond(client, "Unbekannter Befehl: \"" + command + "\"!");
}
@@ -603,10 +603,8 @@ void CRSM::newManagementData()
ManagementConnection& conn = managementConnections[sock];
if(data.at(0) == '/')
{
- QStringList split = data.right(data.length() - 1).split(' ');
- QString cmdName = split.first();
- split.removeFirst();
- if(cmd(cmdName, split.join(' '), ClientInfo::managementClient(conn)))
+ QString command = data.mid(1).trimmed();
+ if(cmd(command, ClientInfo::managementClient(conn)))
{
continue;
}
@@ -1252,22 +1250,57 @@ void CRSM::addCommand(const QString &name, CmdFunction func, int interfaces, Use
cmds.insert(name.trimmed(), CmdFunctionRef(name.trimmed(), func, interfaces, userType, shortDescription, argList, longDescription));
}
+void CRSM::addCommandGroup(const QString &name, int interfaces, UserType userType, const QString &shortDescription, const QString &longDescription)
+{
+ if(!cmdGroups.contains(name)) cmdGroups.append(name);
+ addCommand(name, &CRSM::groupinfo, interfaces, userType, shortDescription, "", longDescription);
+ addCommand(name + " help", &CRSM::grouphelp, interfaces, userType, "Gibt Hilfe zu den Unterbefehlen von " + name);
+}
+
bool CRSM::cmdExists(const QString &name, ClientInterface interface)
{
return cmds.contains(name) && cmds.value(name).interfaces & interface;
}
-bool CRSM::cmd(const QString &name, const QString &args, const ClientInfo &client)
+CmdFunctionRef* CRSM::findCommand(const QString &cmd, ClientInterface interface)
+{
+ return findCommand(cmd.split(QRegularExpression(R"(\s)"), QString::KeepEmptyParts), interface);
+}
+
+CmdFunctionRef* CRSM::findCommand(QStringList&& cmd, ClientInterface interface)
+{
+ if(cmd.length() > 0)
+ {
+ const QString& cmdPart = cmd.join(' ');
+ if(cmdExists(cmdPart, interface))
+ {
+ return &cmds[cmdPart];
+ }
+ else
+ {
+ cmd.removeLast();
+ return findCommand(std::move(cmd), interface);
+ }
+ }
+ else
+ {
+ return nullptr;
+ }
+}
+
+bool CRSM::cmd(const QString &cmd, const ClientInfo &client)
{
- if(cmdExists(name, client.interface))
+ CmdFunctionRef* cmdPtr;
+ if((cmdPtr = findCommand(cmd, client.interface)) != nullptr)
{
- const CmdFunctionRef& cmdRef = cmds.value(name);
+ const CmdFunctionRef& cmdRef = *cmdPtr;
+ QString args = cmd.mid(cmdRef.name.length()).trimmed();
switch(client.interface)
{
case Clonk:
if(clientUserType(client) >= cmdRef.userType)
{
- (this->*cmdRef.func)(name, args, client, clientUserType(client));
+ (this->*cmdRef.func)(cmdRef.name, args, client, clientUserType(client));
}
else
{
@@ -1277,7 +1310,7 @@ bool CRSM::cmd(const QString &name, const QString &args, const ClientInfo &clien
case IRC:
if(cmdRef.userType == User || ((cmdRef.userType == Admin && (clientUserType(client) >= Admin)) || (cmdRef.userType == Moderator && clientUserType(client) >= Moderator)))
{
- (this->*cmdRef.func)(name, args, client, clientUserType(client));
+ (this->*cmdRef.func)(cmdRef.name, args, client, clientUserType(client));
}
else if(cmdRef.userType >= Admin)
{
@@ -1285,7 +1318,7 @@ bool CRSM::cmd(const QString &name, const QString &args, const ClientInfo &clien
}
break;
case Management:
- (this->*cmdRef.func)(name, args, client, UserType::Max);
+ (this->*cmdRef.func)(cmdRef.name, args, client, UserType::Max);
break;
case Auto: //just to avoid the compiler warning, there can't be a command from this interface
break;
@@ -1603,6 +1636,7 @@ CMD_FUNCTION_IMPL(help)
QString response = "Verfügbare Befehle: ";
foreach(const CmdFunctionRef& cmd, cmds)
{
+ if(cmd.name.contains(' ')) continue;
if((cmd.interfaces & client.interface) == client.interface && userType >= cmd.userType)
{
if(longHelp)
@@ -1618,7 +1652,8 @@ CMD_FUNCTION_IMPL(help)
respond(client, response + "\n");
respond(client, "Genauere Informationen zu einem Befehl mit " CMD_SIGN "help <Befehlsname>\n"
"[Sachen in eckigen Klammern sind optional]\n"
- "<Sachen in spitzen Klammern sind benoetigte Argumente>\n");
+ "<Sachen in spitzen Klammern sind benoetigte Argumente>\n"
+ "Beim Einsetzen der Argumente werden die <> bzw. [] weggelassen.\n");
}
else
{
@@ -1626,6 +1661,39 @@ CMD_FUNCTION_IMPL(help)
{
const CmdFunctionRef& cmd = cmds.value(args);
respond(client, CMD_SIGN + cmd.name + " " + (!cmd.argList.isEmpty() ? cmd.argList + " " : "") + (!cmd.longDescription.isEmpty() ? "- " + cmd.longDescription : !cmd.shortDescription.isEmpty() ? "- " + cmd.shortDescription : "") + "\n");
+ if(cmdGroups.contains(args))
+ {
+ bool first = true;
+ QString response;
+ QString cmdPart = args + " ";
+ foreach(const QString& cmdName, cmds.keys())
+ {
+ if(cmdName.length() > args.length() && cmdName.left(args.length() + 1) == cmdPart)
+ {
+ CmdFunctionRef& cmdRef = cmds[cmdName];
+ if(cmdRef.userType > userType || !(cmdRef.interfaces & client.interface)) continue;
+ if(first)
+ {
+ response = "Verfügbare Unterbefehle für " + args + " (nähere Infos zu einem Befehl mit " CMD_SIGN "help " + args + " <Unterbefehlsname>):\n ";
+ first = false;
+ }
+ else
+ {
+ response += ", ";
+ }
+ response += cmdName.midRef(args.length() + 1);
+ }
+ }
+ if(first)
+ {
+ respond(client, "Dieser Befehl hat keine Unterbefehle.\n");
+ }
+ else
+ {
+ response += "\n";
+ respond(client, response);
+ }
+ }
}
else
{
@@ -2098,6 +2166,21 @@ CMD_FUNCTION_IMPL(reconnectIrc)
prepareAndConnectIrc();
}
+CMD_FUNCTION_IMPL(groupinfo)
+ help("help", cmd, client, userType);
+}
+
+CMD_FUNCTION_IMPL(grouphelp)
+ if(args.isEmpty())
+ {
+ groupinfo(QString(cmd).replace(" help", ""), "", client, userType);
+ }
+ else
+ {
+ help("help", QString(cmd).replace(cmd.indexOf("help"), 4, "") + args, client, userType);
+ }
+}
+
IRC_CHECK_CALLBACK_IMPL(ircSetAdmin)
if(status <= 0)
{