diff options
| author | Markus Mittendrein <git@maxmitti.tk> | 2015-10-06 14:26:05 +0200 |
|---|---|---|
| committer | Markus Mittendrein <git@maxmitti.tk> | 2015-10-07 14:50:25 +0200 |
| commit | f6073e15bb79cc1f75f1c83f41ec81495dc35281 (patch) | |
| tree | 89e7d5e8bfddb4a347b1dea97937f3be7f441869 /src | |
| parent | cb032e2185ee9d3b81fa4d56a6cce865a62db0aa (diff) | |
| download | manager-f6073e15bb79cc1f75f1c83f41ec81495dc35281.tar.gz manager-f6073e15bb79cc1f75f1c83f41ec81495dc35281.zip | |
Add command groups
Diffstat (limited to 'src')
| -rw-r--r-- | src/crsm.cpp | 121 | ||||
| -rw-r--r-- | src/crsm.hpp | 9 |
2 files changed, 110 insertions, 20 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) { diff --git a/src/crsm.hpp b/src/crsm.hpp index b2f0671..3f10471 100644 --- a/src/crsm.hpp +++ b/src/crsm.hpp @@ -173,6 +173,7 @@ private: QStringList ircModIOList; QString writtenToServer; QMap<QString, CmdFunctionRef> cmds; + QStringList cmdGroups; ProcessManager* processManager = nullptr; QTcpServer managementServer; QMap<QTcpSocket*, ManagementConnection> managementConnections; @@ -202,8 +203,11 @@ private: void ircSetIngameChannelTopic(); void addCommand(const QString& name, CmdFunction func, int interfaces = Clonk | IRC, UserType userType = User, const QString& shortDescription = "", const QString &argList = "", const QString &longDescription = ""); + inline void addCommandGroup(const QString& name, int interfaces = Clonk | IRC, UserType userType = User, const QString& shortDescription = "", const QString &longDescription = ""); bool cmdExists(const QString& name, ClientInterface interface); - bool cmd(const QString& name, const QString& args, const ClientInfo& client); + CmdFunctionRef* findCommand(const QString& cmd, ClientInterface interface); + CmdFunctionRef* findCommand(QStringList &&cmd, ClientInterface interface); + bool cmd(const QString& cmd, const ClientInfo& client); void rightsFailMessage(const ClientInfo& info, UserType minUserType); UserType clientUserType(const ClientInfo& client); @@ -263,6 +267,9 @@ private: CMD_FUNCTION(reconnectIrc); + CMD_FUNCTION(groupinfo); + CMD_FUNCTION(grouphelp); + IRC_CHECK_CALLBACK(ircSetAdmin); IRC_CHECK_CALLBACK(ircModCmd); }; |
