Skip to content

Instantly share code, notes, and snippets.

@em92
Created October 13, 2024 17:19
Show Gist options
  • Save em92/01b31705075251ad4332db62be9cd75d to your computer and use it in GitHub Desktop.
Save em92/01b31705075251ad4332db62be9cd75d to your computer and use it in GitHub Desktop.
ban_silence_diff.diff
diff --git a/ban.py b/ban.py
index 5a034f2..6c58099 100644
--- a/ban.py
+++ b/ban.py
@@ -20,6 +20,7 @@ import minqlx
import datetime
import time
import re
+import redis
LENGTH_REGEX = re.compile(r"(?P<number>[0-9]+) (?P<scale>seconds?|minutes?|hours?|days?|weeks?|months?|years?)")
TIME_FORMAT = "%Y-%m-%d %H:%M:%S"
@@ -49,7 +50,7 @@ class ban(minqlx.Plugin):
# List of players playing that could potentially be considered leavers.
self.players_start = []
self.pending_warnings = {}
-
+
def handle_player_connect(self, player):
status = self.leave_status(player.steam_id)
# Check if a player has been banned for leaving, if we're doing that.
@@ -58,7 +59,7 @@ class ban(minqlx.Plugin):
# Check if player needs to be warned.
elif status and status[0] == "warn":
self.pending_warnings[player.steam_id] = status[1]
-
+
# Check if a player has been banned manually.
banned = self.is_banned(player.steam_id)
if banned:
@@ -156,14 +157,14 @@ class ban(minqlx.Plugin):
except minqlx.NonexistentPlayerError:
channel.reply("Invalid client ID. Use either a client ID or a SteamID64.")
return
-
+
if target_player:
name = target_player.name
else:
name = ident
# Permission level 5 players not bannable.
- if self.db.has_permission(ident, 5):
+ if False: # self.db.has_permission(ident, 5):
channel.reply("^6{}^7 has permission level 5 and cannot be banned.".format(name))
return
@@ -171,14 +172,14 @@ class ban(minqlx.Plugin):
reason = " ".join(msg[4:])
else:
reason = ""
-
+
r = LENGTH_REGEX.match(" ".join(msg[2:4]).lower())
if r:
number = float(r.group("number"))
if number <= 0: return
scale = r.group("scale").rstrip("s")
td = None
-
+
if scale == "second":
td = datetime.timedelta(seconds=number)
elif scale == "minute":
@@ -193,17 +194,21 @@ class ban(minqlx.Plugin):
td = datetime.timedelta(days=number * 30)
elif scale == "year":
td = datetime.timedelta(weeks=number * 52)
-
+
now = datetime.datetime.now().strftime(TIME_FORMAT)
expires = (datetime.datetime.now() + td).strftime(TIME_FORMAT)
base_key = PLAYER_KEY.format(ident) + ":bans"
ban_id = self.db.zcard(base_key)
db = self.db.pipeline()
- db.zadd(base_key, time.time() + td.total_seconds(), ban_id)
+ ban_time = time.time() + td.total_seconds()
+ if redis.VERSION < (3,):
+ db.zadd(base_key, ban_time, ban_id)
+ else:
+ db.zadd(base_key, {ban_id: ban_time})
ban = {"expires": expires, "reason": reason, "issued": now, "issued_by": player.steam_id}
db.hmset(base_key + ":{}".format(ban_id), ban)
db.execute()
-
+
try:
self.kick(ident, "has been banned until ^6{}^7: {}".format(expires, reason))
except ValueError:
@@ -226,7 +231,7 @@ class ban(minqlx.Plugin):
except minqlx.NonexistentPlayerError:
channel.reply("Invalid client ID. Use either a client ID or a SteamID64.")
return
-
+
if target_player:
name = target_player.name
else:
@@ -239,7 +244,10 @@ class ban(minqlx.Plugin):
else:
db = self.db.pipeline()
for ban_id, score in bans:
- db.zincrby(base_key, ban_id, -score)
+ if redis.VERSION < (3,):
+ db.zincrby(base_key, ban_id, -score)
+ else:
+ db.zincrby(base_key, -score, ban_id)
db.execute()
channel.reply("^6{}^7 has been unbanned.".format(name))
@@ -260,7 +268,7 @@ class ban(minqlx.Plugin):
except minqlx.NonexistentPlayerError:
channel.reply("Invalid client ID. Use either a client ID or a SteamID64.")
return
-
+
if target_player:
name = target_player.name
else:
@@ -280,7 +288,7 @@ class ban(minqlx.Plugin):
if status and status[0] == "ban":
channel.reply("^6{} ^7is banned for having left too many games.".format(name))
return
-
+
channel.reply("^6{} ^7is not banned.".format(name))
def cmd_forgive(self, player, msg, channel):
@@ -300,7 +308,7 @@ class ban(minqlx.Plugin):
except minqlx.NonexistentPlayerError:
channel.reply("Invalid client ID. Use either a client ID or a SteamID64.")
return
-
+
if target_player:
name = target_player.name
else:
@@ -310,12 +318,12 @@ class ban(minqlx.Plugin):
if base_key not in self.db:
channel.reply("I do not know ^6{}^7.".format(name))
return
-
+
try:
leaves = int(self.db[base_key + ":games_left"])
except KeyError:
leaves = 0
-
+
if leaves <= 0:
channel.reply("^6{}^7's leaves are already at ^6{}^7.".format(name, leaves))
return
@@ -353,7 +361,7 @@ class ban(minqlx.Plugin):
expires = datetime.datetime.strptime(longest_ban["expires"], TIME_FORMAT)
if (expires - datetime.datetime.now()).total_seconds() > 0:
return expires, longest_ban["reason"]
-
+
return None
def leave_status(self, steam_id):
@@ -368,7 +376,7 @@ class ban(minqlx.Plugin):
left = self.db[PLAYER_KEY.format(steam_id) + ":games_left"]
except KeyError:
return None
-
+
completed = int(completed)
left = int(left)
@@ -386,7 +394,7 @@ class ban(minqlx.Plugin):
ratio = (completed + (min_games_completed - total)) / min_games_completed
else:
ratio = completed / total
-
+
if ratio <= warn_threshold and (ratio > ban_threshold or total < min_games_completed):
action = "warn"
elif ratio <= ban_threshold and total >= min_games_completed:
diff --git a/silence.py b/silence.py
index 95632ad..d5ed4ef 100644
--- a/silence.py
+++ b/silence.py
@@ -20,6 +20,7 @@ import minqlx
import datetime
import time
import re
+import redis
LENGTH_REGEX = re.compile(r"(?P<number>[0-9]+) (?P<scale>seconds?|minutes?|hours?|days?|weeks?|months?|years?)")
TIME_FORMAT = "%Y-%m-%d %H:%M:%S"
@@ -37,7 +38,7 @@ class silence(minqlx.Plugin):
self.add_command("checksilence", self.cmd_checksilence, usage="<id>")
self.silenced = {}
-
+
def handle_player_loaded(self, player):
silenced = self.is_silenced(player.steam_id)
if not silenced:
@@ -58,7 +59,7 @@ class silence(minqlx.Plugin):
def handle_client_command(self, player, cmd):
if player.steam_id not in self.silenced:
return
-
+
if (cmd.lower().startswith("say ") or cmd.lower().startswith("say_team ")):
expires, score, reason = self.silenced[player.steam_id]
if time.time() < score:
@@ -69,7 +70,7 @@ class silence(minqlx.Plugin):
else:
del self.silenced[player.steam_id]
player.unmute()
-
+
@minqlx.next_frame
def repeat_command():
minqlx.client_command(player.id, cmd)
@@ -106,7 +107,7 @@ class silence(minqlx.Plugin):
except minqlx.NonexistentPlayerError:
channel.reply("Invalid client ID. Use either a client ID or a SteamID64.")
return
-
+
if target_player:
name = target_player.name
else:
@@ -120,14 +121,14 @@ class silence(minqlx.Plugin):
reason = " ".join(msg[4:])
else:
reason = ""
-
+
r = LENGTH_REGEX.match(" ".join(msg[2:4]).lower())
if r:
number = float(r.group("number"))
if number <= 0: return
scale = r.group("scale").rstrip("s")
td = None
-
+
if scale == "second":
td = datetime.timedelta(seconds=number)
elif scale == "minute":
@@ -142,14 +143,17 @@ class silence(minqlx.Plugin):
td = datetime.timedelta(days=number * 30)
elif scale == "year":
td = datetime.timedelta(weeks=number * 52)
-
+
now = datetime.datetime.now().strftime(TIME_FORMAT)
expires = (datetime.datetime.now() + td).strftime(TIME_FORMAT)
base_key = PLAYER_KEY.format(ident) + ":silences"
silence_id = self.db.zcard(base_key)
score = time.time() + td.total_seconds()
db = self.db.pipeline()
- db.zadd(base_key, score, silence_id)
+ if redis.VERSION < (3,):
+ db.zadd(base_key, score, silence_id)
+ else:
+ db.zadd(base_key, {silence_id: score})
silence = {"expires": expires, "reason": reason, "issued": now, "issued_by": player.steam_id}
db.hmset(base_key + ":{}".format(silence_id), silence)
db.execute()
@@ -181,7 +185,7 @@ class silence(minqlx.Plugin):
except minqlx.NonexistentPlayerError:
channel.reply("Invalid client ID. Use either a client ID or a SteamID64.")
return
-
+
if target_player:
name = target_player.name
else:
@@ -194,7 +198,10 @@ class silence(minqlx.Plugin):
else:
db = self.db.pipeline()
for silence_id, score in silences:
- db.zincrby(base_key, silence_id, -score)
+ if redis.VERSION < (3,):
+ db.zincrby(base_key, silence_id, -score)
+ else:
+ db.zincrby(base_key, -score, silence_id)
db.execute()
if ident in self.silenced:
del self.silenced[ident]
@@ -219,7 +226,7 @@ class silence(minqlx.Plugin):
except minqlx.NonexistentPlayerError:
channel.reply("Invalid client ID. Use either a client ID or a SteamID64.")
return
-
+
if target_player:
name = target_player.name
else:
@@ -234,7 +241,7 @@ class silence(minqlx.Plugin):
else:
channel.reply("^6{}^7 is silenced until ^6{}^7.".format(name, expires))
return
-
+
channel.reply("^6{} ^7is not silenced.".format(name))
# ====================================================================
@@ -252,5 +259,5 @@ class silence(minqlx.Plugin):
expires = datetime.datetime.strptime(longest_silence["expires"], TIME_FORMAT)
if (expires - datetime.datetime.now()).total_seconds() > 0:
return expires, score, longest_silence["reason"]
-
+
return None
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment