# -*- coding: utf-8 -*- # Module author: @Fl1yd import requests from telethon.tl.functions.channels import EditBannedRequest as eb from telethon.tl.types import ChatBannedRights as cb from .. import loader, utils @loader.tds class BanWordsMod(loader.Module): """Плохие слова.""" strings = {"name": "Ban Words"} async def client_ready(self, client, db): self.db = db async def addbwcmd(self, message): """Добавить слово в список "Плохих слов". Используй: .addbw <слово>.""" if not message.is_private: chat = await message.get_chat() if not chat.admin_rights and not chat.creator: return await message.edit("Я не админ здесь.") else: if not chat.admin_rights.delete_messages: return await message.edit("У меня нет нужных прав.") words = self.db.get("BanWords", "bws", {}) args = utils.get_args_raw(message).lower() if not args: return await message.edit("[BanWords] Нет аргументов.") chat_id = str(message.chat_id) if chat_id not in words: words.setdefault(chat_id, []) if "stats" not in words: words.update( {"stats": {chat_id: {"action": "none", "antimat": False, "limit": 5}}} ) if args not in words[chat_id]: if ", " in args: args = args.split(", ") words[chat_id].extend(args) self.db.set("BanWords", "bws", words) await message.edit( f"[BanWords] В список чата добавлены слова - \"{'; '.join(args)}\"." ) else: words[chat_id].append(args) self.db.set("BanWords", "bws", words) await message.edit( f'[BanWords] В список чата добавлено слово - "{args}".' ) else: return await message.edit( "[BanWords] Такое слово уже есть в списке слов чата." ) async def rmbwcmd(self, message): """Удалить слово из список "Плохих слов". Используй: .rmbw <слово или all/clearall (по желанию)>.\nall - удаляет все слова из списка.\nclearall - удаляет все сохраненные данные модуля.""" words = self.db.get("BanWords", "bws", {}) args = utils.get_args_raw(message) if not args: return await message.edit("[BanWords] Нет аргументов.") chat_id = str(message.chat_id) try: if args == "all": words.pop(chat_id) words["stats"].pop(chat_id) self.db.set("BanWords", "bws", words) return await message.edit( "[BanWords] Из списка чата удалены все слова." ) if args == "clearall": self.db.set("BanWords", "bws", {}) return await message.edit( "[BanWords] Все списки из всех чатов были удалены." ) words[chat_id].remove(args) if len(words[chat_id]) == 0: words.pop(chat_id) self.db.set("BanWords", "bws", words) await message.edit( f'[BanWords] Из списка чата удалено слово - "{args}".' ) except (KeyError, ValueError): return await message.edit( "[BanWords] Этого слова нет в словаре этого чата." ) async def bwscmd(self, message): """Посмотреть список "Плохих слов". Используй: .bws.""" words = self.db.get("BanWords", "bws", {}) chat_id = str(message.chat_id) try: ls = words[chat_id] if len(ls) == 0: raise KeyError except KeyError: return await message.edit("[BanWords] В этом чате нет списка слов.") word = "".join(f"• {_}\n" for _ in ls) await message.edit(f"[BanWords] Список слов в этом чате:\n\n{word}") async def bwstatscmd(self, message): """Статистика "Плохих слов". Используй: .bwstats .\n* - сбросить настройки чата.""" words = self.db.get("BanWords", "bws", {}) chat_id = str(message.chat_id) args = utils.get_args_raw(message) if args == "clear": try: words["stats"].pop(chat_id) words["stats"].update( {chat_id: {"antimat": False, "action": "none", "limit": 5}} ) self.db.set("BanWords", "bws", words) return await message.edit("[BanWords] Настройки чата сброшены.") except KeyError: return await message.edit( "[BanWords] Нет статистики пользователей." ) try: w = "" for _ in words["stats"][chat_id]: if ( _ not in ["action", "antimat", "limit"] and words["stats"][chat_id][_] != 0 ): user = await message.client.get_entity(int(_)) w += f'• {user.first_name}: {words["stats"][chat_id][_]}\n' return await message.edit( f"[BanWords] Кто использовал спец.слова:\n\n{w}" ) except KeyError: return await message.edit( "[BanWords] В этом чате нет тех, кто использовал спец.слова." ) async def swbwcmd(self, message): """Переключить режим "Плохих слов". Используй: .swbw <режим(antimat/kick/ban/mute/none)>, или .swbw limit <кол-во:int>.""" if not message.is_private: chat = await message.get_chat() if chat.admin_rights or chat.creator: if chat.admin_rights.delete_messages is False: return await message.edit("У меня нет нужных прав.") else: return await message.edit("Я не админ здесь.") words = self.db.get("BanWords", "bws", {}) args = utils.get_args_raw(message) chat_id = str(message.chat_id) if chat_id not in words: words.setdefault(chat_id, []) if "stats" not in words: words.update( {"stats": {chat_id: {"action": "none", "antimat": False, "limit": 5}}} ) if not args: return await message.edit( f"[BanWords] Настройки чата:\n\n" f"Лимит спец.слов: {words['stats'][chat_id]['limit']}\n" f"При достижении лимита спец.слов будет выполняться действие: {words['stats'][chat_id]['action']}\n" f"Статус режима \"антимат\": {words['stats'][chat_id]['antimat']}" ) if "limit" in args: try: limit = int(utils.get_args_raw(message).split(" ", 1)[1]) words["stats"][chat_id].update({"limit": limit}) self.db.set("BanWords", "bws", words) return await message.edit( f"[BanWords] Лимит спец.слов был установлен на {words['stats'][chat_id]['limit']}." ) except (IndexError, ValueError): return await message.edit( f"[BanWords] Лимит спец.слов в этом чате - {words['stats'][chat_id]['limit']}\n" f"Установить новый можно командой .bwsw limit <кол-во:int>." ) if args == "antimat": if words["stats"][chat_id]["antimat"]: words["stats"][chat_id]["antimat"] = False self.db.set("BanWords", "bws", words) return await message.edit('[BanWords] Режим "антимат" выключен.') else: words["stats"][chat_id]["antimat"] = True self.db.set("BanWords", "bws", words) return await message.edit('[BanWords] Режим "антимат" включен.') else: if args == "kick": words["stats"][chat_id].update({"action": "kick"}) elif args == "ban": words["stats"][chat_id].update({"action": "ban"}) elif args == "mute": words["stats"][chat_id].update({"action": "mute"}) elif args == "none": words["stats"][chat_id].update({"action": "none"}) else: return await message.edit( "[BanWords] Такого режима нет в списке. Есть: kick/ban/mute/none." ) self.db.set("BanWords", "bws", words) return await message.edit( f"[BanWords] Теперь при достижении лимита спец.слов будет выполняться действие: {words['stats'][chat_id]['action']}." ) async def watcher(self, message): """Обновление от 19.03: Фикс говнокода.""" try: if message.sender_id == (await message.client.get_me()).id: return words = self.db.get("BanWords", "bws", {}) chat_id = str(message.chat_id) user_id = str(message.sender_id) user = await message.client.get_entity(int(user_id)) if chat_id not in str(words): return action = words["stats"][chat_id]["action"] if words["stats"][chat_id]["antimat"] is True: r = requests.get("https://api.fl1yd.ml/badwords") ls = r.text.split(", ") else: ls = words[chat_id] for _ in ls: if _.lower() in message.raw_text.lower().split(): if user_id not in words["stats"][chat_id]: words["stats"][chat_id].setdefault(user_id, 0) count = words["stats"][chat_id][user_id] words["stats"][chat_id].update({user_id: count + 1}) self.db.set("BanWords", "bws", words) if count == words["stats"][chat_id]["limit"]: try: if action == "kick": await message.client.kick_participant( int(chat_id), int(user_id) ) elif action == "ban": await message.client( eb( int(chat_id), user_id, cb(until_date=None, view_messages=True), ) ) elif action == "mute": await message.client( eb( int(chat_id), user.id, cb(until_date=True, send_messages=True), ) ) words["stats"][chat_id].pop(user_id) self.db.set("BanWords", "bws", words) await message.respond( f"[BanWords] {user.first_name} достиг лимит ({words['stats'][chat_id]['limit']}) спец.слова, и был ограничен в чате." ) except: pass await message.client.delete_messages(message.chat_id, message.id) except: pass