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