Created
October 13, 2024 17:19
-
-
Save em92/01b31705075251ad4332db62be9cd75d to your computer and use it in GitHub Desktop.
ban_silence_diff.diff
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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