summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarkus Mittendrein <git@maxmitti.tk>2015-04-20 17:36:17 +0200
committerMarkus Mittendrein <git@maxmitti.tk>2015-04-20 17:36:17 +0200
commitbbd9118633963232ad1f357cba4b99394d2f4f82 (patch)
tree84823b1e69546c5958a344544b02e54ffa62f45c
parentf8e811491c7413689896efdf452493d114644221 (diff)
downloadmanager-bbd9118633963232ad1f357cba4b99394d2f4f82.tar.gz
manager-bbd9118633963232ad1f357cba4b99394d2f4f82.zip
Added command !removeplr.
Added basic anti spam for same scenarios and the same user.
-rw-r--r--ClientInfo.hpp4
-rw-r--r--crsm.cpp66
-rw-r--r--crsm.hpp2
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);
}
diff --git a/crsm.cpp b/crsm.cpp
index cd7c9c7..4a7c726 100644
--- a/crsm.cpp
+++ b/crsm.cpp
@@ -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
diff --git a/crsm.hpp b/crsm.hpp
index 5e8b570..b353950 100644
--- a/crsm.hpp
+++ b/crsm.hpp
@@ -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);