diff --git a/src/config.py b/src/config.py
index 3b8fbfc..8546b7c 100644
--- a/src/config.py
+++ b/src/config.py
@@ -196,6 +196,13 @@ COMMAND_MESSAGES = {
"π₯ ΠΠΠΠ£Π‘: ΠΠ»Π°Π³ΠΎΠ΄Π°ΡΠ½ΠΎΡΡΡ Ρ Π²ΠΎΡΠΊΠ»ΠΈΡΠ°ΡΠ΅Π»ΡΠ½ΡΠΌ Π·Π½Π°ΠΊΠΎΠΌ Π΄Π°ΡΡ x2 ΠΊΠ°ΡΠΌΡ!\n"
"β’ ΡΠΏΠ°ΡΠΈΠ±ΠΎ! β +2 ΠΊΠ°ΡΠΌΡ ππ\n"
"β’ thanks! β +2 ΠΊΠ°ΡΠΌΡ ππ\n\n"
+ "β± ΠΠ΅Π΄Π»Π΅Π½Π½ΡΠΉ ΡΠ΅ΠΆΠΈΠΌ Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ ΠΊΠ°ΡΠΌΡ:\n"
+ "β’ ΠΠ°ΡΠΌΠ° 0: 30 ΡΠ΅ΠΊ ΠΌΠ΅ΠΆΠ΄Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡΠΌΠΈ\n"
+ "β’ ΠΠ°ΡΠΌΠ° > 0: ΠΌΠ΅Π½ΡΡΠ΅ Π·Π°Π΄Π΅ΡΠΆΠΊΠ° (50+ = Π½Π΅Ρ Π·Π°Π΄Π΅ΡΠΆΠΊΠΈ)\n"
+ "β’ ΠΠ°ΡΠΌΠ° < 0: Π±ΠΎΠ»ΡΡΠ΅ Π·Π°Π΄Π΅ΡΠΆΠΊΠ° (-50 = 120 ΡΠ΅ΠΊ)\n\n"
+ "β οΈ Π‘Π½ΡΡΠΈΠ΅ ΠΊΠ°ΡΠΌΡ:\n"
+ "β’ ΠΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ (/warn): -5 ΠΊΠ°ΡΠΌΡ\n"
+ "β’ ΠΡΡ (/mute ΠΈΠ»ΠΈ Π°Π²ΡΠΎΠΌΡΡ): -10 ΠΊΠ°ΡΠΌΡ\n\n"
"β± ΠΠ΄Π½ΠΎΠΌΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΌΠΎΠΆΠ½ΠΎ Π΄Π°Π²Π°ΡΡ ΠΊΠ°ΡΠΌΡ ΡΠ°Π· Π² ΡΠ°Ρ"
),
'top_karma_help': (
diff --git a/src/karma_slow_mode.py b/src/karma_slow_mode.py
new file mode 100644
index 0000000..6c50b58
--- /dev/null
+++ b/src/karma_slow_mode.py
@@ -0,0 +1,149 @@
+# Π‘ΠΈΡΡΠ΅ΠΌΠ° ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎΠ³ΠΎ ΡΠ΅ΠΆΠΈΠΌΠ° Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ ΠΊΠ°ΡΠΌΡ
+# Π£ΠΏΡΠ°Π²Π»ΡΠ΅Ρ ΡΠ°ΡΡΠΎΡΠΎΠΉ ΠΎΡΠΏΡΠ°Π²ΠΊΠΈ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΠΌΠΈ Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΎΡ ΠΈΡ
ΠΊΠ°ΡΠΌΡ
+
+import time
+import logging
+from collections import defaultdict
+from typing import Dict, Tuple
+
+logger = logging.getLogger(__name__)
+
+# Π₯ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΡ
ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ: {(user_id, chat_id): timestamp}
+_last_message_times: Dict[Tuple[int, int], float] = {}
+
+def calculate_slow_mode_delay(karma: int) -> int:
+ """
+ ΠΡΡΠΈΡΠ»ΡΠ΅Ρ Π·Π°Π΄Π΅ΡΠΆΠΊΡ ΠΌΠ΅ΠΆΠ΄Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡΠΌΠΈ Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ ΠΊΠ°ΡΠΌΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ.
+
+ ΠΠΎΠ³ΠΈΠΊΠ°:
+ - ΠΠ°ΡΠΌΠ° = 0: 30 ΡΠ΅ΠΊΡΠ½Π΄
+ - ΠΠ°ΡΠΌΠ° < 0: ΠΏΡΠΎΠ³ΡΠ΅ΡΡΠΈΠ²Π½ΠΎΠ΅ ΡΠ²Π΅Π»ΠΈΡΠ΅Π½ΠΈΠ΅ (Π΄ΠΎ 120 ΡΠ΅ΠΊΡΠ½Π΄ ΠΏΡΠΈ ΠΊΠ°ΡΠΌΠ΅ -50 ΠΈ Π½ΠΈΠΆΠ΅)
+ - ΠΠ°ΡΠΌΠ° > 0: ΠΏΡΠΎΠ³ΡΠ΅ΡΡΠΈΠ²Π½ΠΎΠ΅ ΡΠΌΠ΅Π½ΡΡΠ΅Π½ΠΈΠ΅ (Π΄ΠΎ 0 ΡΠ΅ΠΊΡΠ½Π΄ ΠΏΡΠΈ ΠΊΠ°ΡΠΌΠ΅ 50 ΠΈ Π²ΡΡΠ΅)
+
+ Args:
+ karma: ΠΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΊΠ°ΡΠΌΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ
+
+ Returns:
+ ΠΠ°Π΄Π΅ΡΠΆΠΊΠ° Π² ΡΠ΅ΠΊΡΠ½Π΄Π°Ρ
+ """
+ if karma == 0:
+ return 30
+
+ elif karma > 0:
+ # ΠΠΎΠ»ΠΎΠΆΠΈΡΠ΅Π»ΡΠ½Π°Ρ ΠΊΠ°ΡΠΌΠ°: ΡΠΌΠ΅Π½ΡΡΠ°Π΅ΠΌ Π·Π°Π΄Π΅ΡΠΆΠΊΡ
+ # ΠΡ 30 ΡΠ΅ΠΊΡΠ½Π΄ (ΠΊΠ°ΡΠΌΠ° 1) Π΄ΠΎ 0 ΡΠ΅ΠΊΡΠ½Π΄ (ΠΊΠ°ΡΠΌΠ° 50+)
+ # Π€ΠΎΡΠΌΡΠ»Π°: 30 - (karma * 0.6)
+ delay = max(0, 30 - (karma * 0.6))
+ return int(delay)
+
+ else: # karma < 0
+ # ΠΡΡΠΈΡΠ°ΡΠ΅Π»ΡΠ½Π°Ρ ΠΊΠ°ΡΠΌΠ°: ΡΠ²Π΅Π»ΠΈΡΠΈΠ²Π°Π΅ΠΌ Π·Π°Π΄Π΅ΡΠΆΠΊΡ
+ # ΠΡ 30 ΡΠ΅ΠΊΡΠ½Π΄ (ΠΊΠ°ΡΠΌΠ° -1) Π΄ΠΎ 120 ΡΠ΅ΠΊΡΠ½Π΄ (ΠΊΠ°ΡΠΌΠ° -50 ΠΈ Π½ΠΈΠΆΠ΅)
+ # Π€ΠΎΡΠΌΡΠ»Π°: 30 + (abs(karma) * 1.8)
+ delay = min(120, 30 + (abs(karma) * 1.8))
+ return int(delay)
+
+def check_slow_mode(user_id: int, chat_id: int, karma: int) -> Tuple[bool, int]:
+ """
+ ΠΡΠΎΠ²Π΅ΡΡΠ΅Ρ, ΠΌΠΎΠΆΠ΅Ρ Π»ΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΎΡΠΏΡΠ°Π²ΠΈΡΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΡΠΎΠ³Π»Π°ΡΠ½ΠΎ ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎΠΌΡ ΡΠ΅ΠΆΠΈΠΌΡ.
+
+ Args:
+ user_id: ID ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ
+ chat_id: ID ΡΠ°ΡΠ°
+ karma: ΠΠ°ΡΠΌΠ° ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ
+
+ Returns:
+ Tuple[bool, int]: (ΠΌΠΎΠΆΠ½ΠΎ Π»ΠΈ ΠΎΡΠΏΡΠ°Π²ΠΈΡΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅, ΠΎΡΡΠ°Π²ΡΠ΅Π΅ΡΡ Π²ΡΠ΅ΠΌΡ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ Π² ΡΠ΅ΠΊΡΠ½Π΄Π°Ρ
)
+ """
+ current_time = time.time()
+ key = (user_id, chat_id)
+
+ # ΠΡΡΠΈΡΠ»ΡΠ΅ΠΌ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΡΡ Π·Π°Π΄Π΅ΡΠΆΠΊΡ
+ required_delay = calculate_slow_mode_delay(karma)
+
+ # ΠΡΠ»ΠΈ Π·Π°Π΄Π΅ΡΠΆΠΊΠ° 0, ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΈΡΠ°ΡΡ Π±Π΅Π· ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠΉ
+ if required_delay == 0:
+ _last_message_times[key] = current_time
+ return True, 0
+
+ # ΠΡΠΎΠ²Π΅ΡΡΠ΅ΠΌ, Π΅ΡΡΡ Π»ΠΈ Π·Π°ΠΏΠΈΡΡ ΠΎ ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅ΠΌ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΈ
+ if key not in _last_message_times:
+ _last_message_times[key] = current_time
+ return True, 0
+
+ # ΠΡΡΠΈΡΠ»ΡΠ΅ΠΌ Π²ΡΠ΅ΠΌΡ Ρ ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅Π³ΠΎ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ
+ last_message_time = _last_message_times[key]
+ time_passed = current_time - last_message_time
+
+ # ΠΡΠΎΠ²Π΅ΡΡΠ΅ΠΌ, ΠΏΡΠΎΡΠ»ΠΎ Π»ΠΈ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ
+ if time_passed >= required_delay:
+ _last_message_times[key] = current_time
+ return True, 0
+ else:
+ # ΠΡΡΠΈΡΠ»ΡΠ΅ΠΌ ΠΎΡΡΠ°Π²ΡΠ΅Π΅ΡΡ Π²ΡΠ΅ΠΌΡ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ
+ remaining_time = int(required_delay - time_passed)
+ return False, remaining_time
+
+def get_slow_mode_info(karma: int) -> str:
+ """
+ ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎΠΌ ΡΠ΅ΠΆΠΈΠΌΠ΅ Π΄Π»Ρ Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΡΡΠΎΠ²Π½Ρ ΠΊΠ°ΡΠΌΡ.
+
+ Args:
+ karma: ΠΠ°ΡΠΌΠ° ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ
+
+ Returns:
+ Π‘ΡΡΠΎΠΊΠ° Ρ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ΠΌ ΡΠ΅ΠΆΠΈΠΌΠ°
+ """
+ delay = calculate_slow_mode_delay(karma)
+
+ if delay == 0:
+ return "π’ ΠΠ΅Π΄Π»Π΅Π½Π½ΡΠΉ ΡΠ΅ΠΆΠΈΠΌ ΠΎΡΠΊΠ»ΡΡΠ΅Π½ (Π²ΡΡΠΎΠΊΠ°Ρ ΠΊΠ°ΡΠΌΠ°!)"
+ elif delay <= 10:
+ return f"π’ ΠΠ΅Π΄Π»Π΅Π½Π½ΡΠΉ ΡΠ΅ΠΆΠΈΠΌ: {delay} ΡΠ΅ΠΊ (Ρ
ΠΎΡΠΎΡΠ°Ρ ΠΊΠ°ΡΠΌΠ°)"
+ elif delay <= 30:
+ return f"π‘ ΠΠ΅Π΄Π»Π΅Π½Π½ΡΠΉ ΡΠ΅ΠΆΠΈΠΌ: {delay} ΡΠ΅ΠΊ (Π½Π΅ΠΉΡΡΠ°Π»ΡΠ½Π°Ρ ΠΊΠ°ΡΠΌΠ°)"
+ elif delay <= 60:
+ return f"π ΠΠ΅Π΄Π»Π΅Π½Π½ΡΠΉ ΡΠ΅ΠΆΠΈΠΌ: {delay} ΡΠ΅ΠΊ (Π½ΠΈΠ·ΠΊΠ°Ρ ΠΊΠ°ΡΠΌΠ°)"
+ else:
+ return f"π΄ ΠΠ΅Π΄Π»Π΅Π½Π½ΡΠΉ ΡΠ΅ΠΆΠΈΠΌ: {delay} ΡΠ΅ΠΊ (ΠΎΡΠ΅Π½Ρ Π½ΠΈΠ·ΠΊΠ°Ρ ΠΊΠ°ΡΠΌΠ°)"
+
+def format_time(seconds: int) -> str:
+ """
+ Π€ΠΎΡΠΌΠ°ΡΠΈΡΡΠ΅Ρ Π²ΡΠ΅ΠΌΡ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ Π² ΡΠΈΡΠ°Π΅ΠΌΡΠΉ ΡΠΎΡΠΌΠ°Ρ.
+
+ Args:
+ seconds: ΠΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΡΠ΅ΠΊΡΠ½Π΄
+
+ Returns:
+ ΠΡΡΠΎΡΠΌΠ°ΡΠΈΡΠΎΠ²Π°Π½Π½Π°Ρ ΡΡΡΠΎΠΊΠ°
+ """
+ if seconds < 60:
+ return f"{seconds} ΡΠ΅ΠΊ"
+ else:
+ minutes = seconds // 60
+ remaining_seconds = seconds % 60
+ if remaining_seconds > 0:
+ return f"{minutes} ΠΌΠΈΠ½ {remaining_seconds} ΡΠ΅ΠΊ"
+ else:
+ return f"{minutes} ΠΌΠΈΠ½"
+
+def cleanup_old_records(max_age_seconds: int = 3600):
+ """
+ ΠΡΠΈΡΠ°Π΅Ρ ΡΡΡΠ°ΡΠ΅Π²ΡΠΈΠ΅ Π·Π°ΠΏΠΈΡΠΈ ΠΈΠ· ΠΊΡΡΠ° (ΡΡΠ°ΡΡΠ΅ max_age_seconds).
+ Π Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΠ΅ΡΡΡ Π²ΡΠ·ΡΠ²Π°ΡΡ ΠΏΠ΅ΡΠΈΠΎΠ΄ΠΈΡΠ΅ΡΠΊΠΈ Π΄Π»Ρ ΡΠΊΠΎΠ½ΠΎΠΌΠΈΠΈ ΠΏΠ°ΠΌΡΡΠΈ.
+
+ Args:
+ max_age_seconds: ΠΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΡΠΉ Π²ΠΎΠ·ΡΠ°ΡΡ Π·Π°ΠΏΠΈΡΠΈ Π² ΡΠ΅ΠΊΡΠ½Π΄Π°Ρ
(ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ 1 ΡΠ°Ρ)
+ """
+ current_time = time.time()
+ keys_to_remove = []
+
+ for key, timestamp in _last_message_times.items():
+ if current_time - timestamp > max_age_seconds:
+ keys_to_remove.append(key)
+
+ for key in keys_to_remove:
+ del _last_message_times[key]
+
+ if keys_to_remove:
+ logger.info(f"ΠΡΠΈΡΠ΅Π½ΠΎ {len(keys_to_remove)} ΡΡΡΠ°ΡΠ΅Π²ΡΠΈΡ
Π·Π°ΠΏΠΈΡΠ΅ΠΉ slow mode")
\ No newline at end of file
diff --git a/src/main.py b/src/main.py
index ebca443..138abb5 100644
--- a/src/main.py
+++ b/src/main.py
@@ -76,6 +76,22 @@ class UserUpdateMiddleware(BaseMiddleware):
tag=message.from_user.username
)
+ # ΠΠΠΠΠ: ΠΡΡΠΈΡΡΠ΅ΠΌ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ Π΄Π»Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΡΠ΅Π°ΠΊΡΠΈΠΉ
+ # ΠΠΌΠΏΠΎΡΡΠΈΡΡΠ΅ΠΌ ΡΡΠ½ΠΊΡΠΈΡ ΠΊΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΈΠ· karma_tracker
+ try:
+ from modules import karma_tracker
+ if hasattr(karma_tracker, '_cache_message') and message.chat.type in ['group', 'supergroup']:
+ karma_tracker._cache_message(message.chat.id, message.message_id, message.from_user.id)
+ logger.debug(f"[CACHE] Π‘ΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ {message.message_id} ΠΎΡ {message.from_user.id} Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΎ Π² ΠΊΡΡ")
+ except Exception as e:
+ logger.error(f"ΠΡΠΈΠ±ΠΊΠ° ΠΊΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ: {e}")
+
+ # ΠΠΠΠΠ: ΠΡΠΎΠ²Π΅ΡΡΠ΅ΠΌ slow mode Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ ΠΊΠ°ΡΠΌΡ
+ # ΠΡΠΈΠΌΠ΅Π½ΡΠ΅ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π² Π³ΡΡΠΏΠΏΠΎΠ²ΡΡ
ΡΠ°ΡΠ°Ρ
ΠΈ Π½Π΅ Π΄Π»Ρ ΠΊΠΎΠΌΠ°Π½Π΄
+ if await self._check_slow_mode(message):
+ # Π‘ΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ Π·Π°Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½ΠΎ slow mode, ΠΏΡΠ΅ΡΡΠ²Π°Π΅ΠΌ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΡ
+ return None
+
# ΠΠΠΠΠ: ΠΡΠΎΠ²Π΅ΡΡΠ΅ΠΌ Π½Π° ΠΌΠ°Ρ ΠΠ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠΈ Π΄ΡΡΠ³ΠΈΠΌ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ°ΠΌ
# ΠΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ auto_mute ΡΠ°Π±ΠΎΡΠ°ΡΡ Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎ ΠΎΡ karma_tracker
await self._check_profanity(message)
@@ -90,6 +106,70 @@ class UserUpdateMiddleware(BaseMiddleware):
)
return data
+ # ΠΡΠΎΠ²Π΅ΡΠΊΠ° slow mode Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ ΠΊΠ°ΡΠΌΡ (Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ Π² middleware)
+ async def _check_slow_mode(self, message):
+ """
+ ΠΡΠΎΠ²Π΅ΡΡΠ΅Ρ, ΠΌΠΎΠΆΠ΅Ρ Π»ΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΎΡΠΏΡΠ°Π²ΠΈΡΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΡΠΎΠ³Π»Π°ΡΠ½ΠΎ slow mode.
+
+ Returns:
+ True Π΅ΡΠ»ΠΈ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ Π·Π°Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½ΠΎ, False Π΅ΡΠ»ΠΈ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΎ
+ """
+ from karma_slow_mode import check_slow_mode, format_time
+
+ # Π’ΠΎΠ»ΡΠΊΠΎ Π΄Π»Ρ Π³ΡΡΠΏΠΏΠΎΠ²ΡΡ
ΡΠ°ΡΠΎΠ²
+ if message.chat.type not in ['group', 'supergroup']:
+ return False
+
+ # ΠΠ΅ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅ΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Ρ
+ if not message.text or message.text.startswith('/'):
+ return False
+
+ # ΠΡΠΎΠ²Π΅ΡΡΠ΅ΠΌ, ΡΠ²Π»ΡΠ΅ΡΡΡ Π»ΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π°Π΄ΠΌΠΈΠ½ΠΈΡΡΡΠ°ΡΠΎΡΠΎΠΌ
+ try:
+ chat_member = await self.bot.get_chat_member(message.chat.id, message.from_user.id)
+ if chat_member.status in ['administrator', 'creator']:
+ # ΠΠ΄ΠΌΠΈΠ½ΠΈΡΡΡΠ°ΡΠΎΡΡ Π½Π΅ ΠΏΠΎΠ΄ΡΠΈΠ½ΡΡΡΡΡ slow mode
+ return False
+ except Exception as e:
+ logger.error(f"ΠΡΠΈΠ±ΠΊΠ° ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ ΡΡΠ°ΡΡΡΠ° ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π΄Π»Ρ slow mode: {e}")
+ return False
+
+ # ΠΠΎΠ»ΡΡΠ°Π΅ΠΌ ΠΊΠ°ΡΠΌΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ
+ user_karma = self.db.get_karma(message.from_user.id, message.chat.id)
+
+ # ΠΡΠΎΠ²Π΅ΡΡΠ΅ΠΌ slow mode
+ can_send, remaining_time = check_slow_mode(message.from_user.id, message.chat.id, user_karma)
+
+ if not can_send:
+ # Π£Π΄Π°Π»ΡΠ΅ΠΌ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅
+ try:
+ await self.bot.delete_message(message.chat.id, message.message_id)
+ logger.info(f"[SLOW MODE] Π£Π΄Π°Π»Π΅Π½ΠΎ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎΡ {message.from_user.id} (ΠΊΠ°ΡΠΌΠ°: {user_karma}, ΠΎΡΡΠ°Π»ΠΎΡΡ ΠΆΠ΄Π°ΡΡ: {remaining_time}Ρ)")
+ except Exception as e:
+ logger.error(f"ΠΠ΅ ΡΠ΄Π°Π»ΠΎΡΡ ΡΠ΄Π°Π»ΠΈΡΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ slow mode: {e}")
+
+ # ΠΡΠΏΡΠ°Π²Π»ΡΠ΅ΠΌ ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅ (ΠΈ ΡΡΠ°Π·Ρ ΡΠ΄Π°Π»ΡΠ΅ΠΌ ΡΠ΅ΡΠ΅Π· 5 ΡΠ΅ΠΊΡΠ½Π΄)
+ try:
+ notification = await self.bot.send_message(
+ chat_id=message.chat.id,
+ text=f"β± {message.from_user.first_name}, ΠΏΠΎΠ΄ΠΎΠΆΠ΄ΠΈΡΠ΅ Π΅ΡΡ {format_time(remaining_time)} ΠΏΠ΅ΡΠ΅Π΄ ΠΎΡΠΏΡΠ°Π²ΠΊΠΎΠΉ ΡΠ»Π΅Π΄ΡΡΡΠ΅Π³ΠΎ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ.\n\n"
+ f"π‘ ΠΠ°ΡΠ° ΠΊΠ°ΡΠΌΠ°: {user_karma}. ΠΠΎΠ²ΡΡΠ°ΠΉΡΠ΅ ΠΊΠ°ΡΠΌΡ, ΡΡΠΎΠ±Ρ ΡΠΌΠ΅Π½ΡΡΠΈΡΡ Π·Π°Π΄Π΅ΡΠΆΠΊΡ!",
+ message_thread_id=message.message_thread_id,
+ )
+
+ # Π£Π΄Π°Π»ΡΠ΅ΠΌ ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅ ΡΠ΅ΡΠ΅Π· 5 ΡΠ΅ΠΊΡΠ½Π΄
+ await asyncio.sleep(5)
+ try:
+ await self.bot.delete_message(message.chat.id, notification.message_id)
+ except:
+ pass
+ except Exception as e:
+ logger.error(f"ΠΡΠΈΠ±ΠΊΠ° ΠΎΡΠΏΡΠ°Π²ΠΊΠΈ ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΡ slow mode: {e}")
+
+ return True # Π‘ΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ Π·Π°Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½ΠΎ
+
+ return False # Π‘ΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΎ
+
# ΠΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° Π½Π΅ΡΠ΅Π½Π·ΡΡΠ½ΡΡ Π»Π΅ΠΊΡΠΈΠΊΡ (Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ Π² middleware)
async def _check_profanity(self, message):
"""ΠΡΠΎΠ²Π΅ΡΡΠ΅Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ Π½Π° ΠΌΠ°Ρ ΠΈ ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅Ρ ΠΌΡΡ Π΅ΡΠ»ΠΈ Π½ΡΠΆΠ½ΠΎ"""
diff --git a/src/modules/0_karma_tracker.py b/src/modules/0_karma_tracker.py
index c165bb3..e8b971f 100644
--- a/src/modules/0_karma_tracker.py
+++ b/src/modules/0_karma_tracker.py
@@ -119,18 +119,6 @@ def register_handlers(bot: AsyncTeleBot):
except Exception as e:
logger.error(f"ΠΡΠΈΠ±ΠΊΠ° ΠΏΡΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ΅ ΡΠ΅Π°ΠΊΡΠΈΠΈ: {e}", exc_info=True)
- # ΠΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ Π²ΡΠ΅Ρ
ΡΠ΅ΠΊΡΡΠΎΠ²ΡΡ
ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ Π΄Π»Ρ ΠΊΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ
- @bot.message_handler(content_types=['text'])
- async def cache_messages(message: Message):
- """ΠΡΡΠΈΡΡΠ΅Ρ Π²ΡΠ΅ ΡΠ΅ΠΊΡΡΠΎΠ²ΡΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ Π΄Π»Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΡΠ΅Π°ΠΊΡΠΈΠΉ"""
- try:
- # ΠΡΡΠΈΡΡΠ΅ΠΌ ΡΠΎΠ»ΡΠΊΠΎ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ Π² Π³ΡΡΠΏΠΏΠΎΠ²ΡΡ
ΡΠ°ΡΠ°Ρ
- if message.chat.type in ['group', 'supergroup']:
- _cache_message(message.chat.id, message.message_id, message.from_user.id)
- logger.debug(f"[CACHE] Π‘ΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ {message.message_id} ΠΎΡ {message.from_user.id} Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΎ Π² ΠΊΡΡ")
- except Exception as e:
- logger.error(f"ΠΡΠΈΠ±ΠΊΠ° ΠΊΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ: {e}")
-
@bot.message_handler(func=lambda message: message.reply_to_message is not None and message.text and not message.text.startswith('/'))
async def handle_thank_message(message: Message):
"""
diff --git a/src/modules/auto_mute.py b/src/modules/auto_mute.py
index ce71a02..ca04ea8 100644
--- a/src/modules/auto_mute.py
+++ b/src/modules/auto_mute.py
@@ -90,6 +90,10 @@ async def apply_mute(bot: AsyncTeleBot, message: Message, user_id: int, duration
until_date=until_date
)
+ # Π‘Π½ΠΈΠΌΠ°Π΅ΠΌ ΠΊΠ°ΡΠΌΡ Π·Π° Π°Π²ΡΠΎΠΌΡΡ
+ db.add_karma(user_id, message.chat.id, -10)
+ logger.info(f"Π‘Π½ΡΡΠΎ 10 ΠΊΠ°ΡΠΌΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ {user_id} Π·Π° Π°Π²ΡΠΎΠΌΡΡ")
+
# Π£Π΄Π°Π»ΡΠ΅ΠΌ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ Ρ ΠΌΠ°ΡΠΎΠΌ
try:
await bot.delete_message(chat_id=message.chat.id, message_id=message.message_id)
diff --git a/src/modules/mute.py b/src/modules/mute.py
index 0ba6551..4601474 100644
--- a/src/modules/mute.py
+++ b/src/modules/mute.py
@@ -279,6 +279,10 @@ async def mute_command(bot: AsyncTeleBot, message: Message, photo_path: str = No
until_date=until_date
)
+ # Π‘Π½ΠΈΠΌΠ°Π΅ΠΌ ΠΊΠ°ΡΠΌΡ Π·Π° ΠΌΡΡ
+ db.add_karma(target_user.id, message.chat.id, -10)
+ logger.info(f"Π‘Π½ΡΡΠΎ 10 ΠΊΠ°ΡΠΌΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ {target_user.id} Π·Π° ΠΌΡΡ")
+
# Π€ΠΎΡΠΌΠ°ΡΠΈΡΡΠ΅ΠΌ Π²ΡΠ΅ΠΌΡ Π² ΡΠ΄ΠΎΠ±Π½ΡΠΉ ΡΠΎΡΠΌΠ°Ρ
time_display = format_mute_time(mute_seconds)
diff --git a/src/modules/warn.py b/src/modules/warn.py
index 203cfdc..6f1c320 100644
--- a/src/modules/warn.py
+++ b/src/modules/warn.py
@@ -144,6 +144,10 @@ async def warn_command(bot: AsyncTeleBot, message: Message):
admin_id=message.from_user.id
)
+ # Π‘Π½ΠΈΠΌΠ°Π΅ΠΌ ΠΊΠ°ΡΠΌΡ Π·Π° ΠΏΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΠ΅
+ db.add_karma(target_user.id, message.chat.id, -5)
+ logger.info(f"Π‘Π½ΡΡΠΎ 5 ΠΊΠ°ΡΠΌΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ {target_user.id} Π·Π° ΠΏΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΠ΅")
+
# ΠΠΌΠΏΠΎΡΡΠΈΡΡΠ΅ΠΌ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΡ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ
from config import ONE_WEEK, TWO_WEEKS