diff options
| -rw-r--r-- | ClientInfo.hpp | 4 | ||||
| -rw-r--r-- | crsm.cpp | 66 | ||||
| -rw-r--r-- | crsm.hpp | 2 |
3 files changed, 57 insertions, 15 deletions
diff --git a/ClientInfo.hpp b/ClientInfo.hpp index 9c39c44..e2c7864 100644 --- a/ClientInfo.hpp +++ b/ClientInfo.hpp @@ -74,12 +74,12 @@ public: return ret; } - inline bool operator==(const ClientInfo& other) + inline bool operator==(const ClientInfo& other) const { return other.interface == interface && other.nick == nick && (interface == Clonk ? other.pcName == pcName && other.CUID == CUID : true); } - inline bool operator!=(const ClientInfo& other) + inline bool operator!=(const ClientInfo& other) const { return !operator==(other); } @@ -683,6 +683,8 @@ void CRSM::readConfig() lists.clear(); settings.clear(); settings["EmptyTimer"] = "60"; + settings["MaxUserWishes"] = "2"; + settings["MaxScenWishes"] = "2"; QFile config(CONFIG_FILE_NAME); if(!config.exists() || !config.open(QIODevice::ReadOnly | QIODevice::Text)) { @@ -1336,7 +1338,7 @@ void CRSM::setupCmds() addCommand("help", &CRSM::help, Clonk | IRC | Management, User, "Zeigt die Hilfe an.", "[long¦Befehlsname]", "Listet alle verfügbaren Befehle auf. Mit long werden alle verfügbaren Befehle mit Kurzbeschreibung aufgelistet."); addCommand("stop", &CRSM::passToClonk, Clonk | IRC | Management, Admin, "Stoppt einen laufenden Countdown."); addCommand("start", &CRSM::passToClonk, Clonk | IRC | Management, Admin, "Startet den Countdown.", "[Countdownzeit in s]"); - addCommand("teamdist", &CRSM::passToClonk, Clonk | IRC | Management, Admin, "Ändert die Teamverteilung.", "<none¦free¦host¦random¦radnominv>"); + addCommand("teamdist", &CRSM::passToClonk, Clonk | IRC | Management, Admin, "Ändert die Teamverteilung.", "<none¦free¦host¦random¦randominv>"); addCommand("plrteam", &CRSM::passToClonk, Clonk | IRC, Admin, "Ändert das Team eines Spielers.", "<Spieler> <neues Team>", "Verschiebt <Spieler> in das <neue Team>."); addCommand("pause", &CRSM::passToClonk, Clonk | IRC | Management, Admin, "Pausiert das Spiel."); addCommand("unpause", &CRSM::passToClonk, Clonk | IRC | Management, Admin, "Setzt das pausierte Spiel fort."); @@ -1349,9 +1351,10 @@ void CRSM::setupCmds() addCommand("centralctrl", &CRSM::passToClonk, Clonk | IRC | Management, Admin, "Aktiviert den zentralen Netzwerkmodus."); addCommand("decentralctrl", &CRSM::passToClonk, Clonk | IRC | Management, Admin, "Aktiviert den dezentralen Netzwerkmodus."); addCommand("newscriptplayer", &CRSM::passToClonk, Clonk | IRC | Management, Admin, "Fügt in der Lobby einen Script spieler hinzu.", "[Spielername]"); + addCommand("removeplr", &CRSM::passToClonk, Clonk | IRC | Management, Admin, "Entfernt einen Spieler in der Lobby.", "[Spielername]"); addCommand("nodebug", &CRSM::passToClonk, Clonk | IRC | Management, Admin, "Deaktiviert den Debug-Modus zwingend für alle."); - addCommand("autohost", &CRSM::autohost, Clonk | IRC | Management, Moderator, "Deaktiviert den Debug-Modus zwingend für alle."); - addCommand("noautohost", &CRSM::autohost, Clonk | IRC | Management, Moderator, "Deaktiviert den Debug-Modus zwingend für alle."); + addCommand("autohost", &CRSM::autohost, Clonk | IRC | Management, Moderator, "Aktiviert Auto-Hosting."); + addCommand("noautohost", &CRSM::autohost, Clonk | IRC | Management, Moderator, "Deaktiviert Auto-Hosting."); addCommand("set", &CRSM::set, Clonk | IRC | Management, Admin, "Setzt diverse Einstellungen entsprechend dem /set Befehl von Clonk.", "<maxplayer¦password¦faircrew¦teamcolors¦runtimejoin> [on¦off¦<Passwort>¦<Spieleranzahl>]"); addCommand("skip", &CRSM::skip, Clonk | IRC | Management, Moderator, "Entfernt das nächste Szenario aus der Wunschliste."); @@ -1497,6 +1500,40 @@ void CRSM::replayOutputBuffer(QTcpSocket *socket, bool clear) } } +bool CRSM::scenAllowed(const ScenarioSettings &scen, const ClientInfo &client, UserType userType) +{ + if(userType >= UserType::Moderator) + { + return true; + } + QString scenName = scen.name; + while(maps["Alias"].contains(scenName)) + scenName = maps["Alias"].value(scenName); + + int scenCount = 0; + int userCount = 0; + foreach(const ScenarioSettings& setting, userlist) + { + userCount += (setting.wishClient == client); + + QString otherScenName = setting.name; + while(maps["Alias"].contains(otherScenName)) + otherScenName = maps["Alias"].value(otherScenName); + + scenCount += (otherScenName == scenName); + } + if(scenCount >= settings["MaxScenWishes"].toInt()) + { + respond(client, "Dieses Szenario ist jetzt oft genug in der Wunschliste!\n"); + return false; + } + if(userCount >= settings["MaxUserWishes"].toInt()) + { + respond(client, "Von dir sind jetzt genug Wünsche in der Liste!\n"); + return false; + } +} + CMD_FUNCTION_IMPL(help) { bool longHelp = args == "long"; @@ -1607,17 +1644,20 @@ CMD_FUNCTION_IMPL(host) } if(scenExists(scen.name)) { - userlist << scen; - respond(client, "Szenario " + scen.name + " wurde der Warteschlange" + (scen.league ? " mit Liga" : "") + " hinzugefügt.\n"); - if(userlist.length() == 1 && session["userwish"] != "true" && session["running"] != "true" && session["hosting"] == "true" && clients.size() > 0) - respond(client, "Überrede alle Spieler zu leaven und dein Wunsch wird sofort gehostet ;-)\n"); - else if(session["hosting"] != "true") + if(scenAllowed(scen, client, userType)) { - nextScen(); - } - else if(clients.size() == 0) - { - processManager->closeProgFifos(); + userlist << scen; + respond(client, "Szenario " + scen.name + " wurde der Warteschlange" + (scen.league ? " mit Liga" : "") + " hinzugefügt.\n"); + if(userlist.length() == 1 && session["userwish"] != "true" && session["running"] != "true" && session["hosting"] == "true" && clients.size() > 0) + respond(client, "Überrede alle Spieler zu leaven und dein Wunsch wird sofort gehostet ;-)\n"); + else if(session["hosting"] != "true") + { + nextScen(); + } + else if(clients.size() == 0) + { + processManager->closeProgFifos(); + } } } else @@ -178,6 +178,8 @@ private: void out(const QString& text); void replayOutputBuffer(QTcpSocket *socket, bool clear = true); + bool scenAllowed(const ScenarioSettings& scen, const ClientInfo& client, UserType userType); + CMD_FUNCTION(help); CMD_FUNCTION(passToClonk); CMD_FUNCTION(admin); |
