# █ █ ▀ █▄▀ ▄▀█ █▀█ ▀ # █▀█ █ █ █ █▀█ █▀▄ █ # © Copyright 2022 # https://t.me/hikariatama # # 🔒 Licensed under the GNU AGPLv3 # 🌐 https://www.gnu.org/licenses/agpl-3.0.html # scope: hikka_min 1.2.10 # meta pic: https://img.icons8.com/fluency/48/000000/macbook-chat.png # meta banner: https://mods.hikariatama.ru/badges/keyword.jpg # meta developer: @hikarimods # scope: hikka_only import contextlib import re from telethon.tl.types import Message from .. import loader, utils @loader.tds class KeywordMod(loader.Module): """Allows you to create custom filters with regexes, commands and unlimited funcionality""" strings = { "name": "Keyword", "args": "🚫 Args are incorrect", "kw_404": '🚫 Keyword "{}" not found', "kw_added": "✅ New keyword:\nTrigger: {}\nMessage: {}\n{}{}{}{}{}", "kw_removed": '✅ Keyword "{}" removed', "kwbl_list": "🦊 Blacklisted chats:\n{}", "bl_added": "✅ This chat is now blacklisted for Keywords", "bl_removed": "✅ This chat is now whitelisted for Keywords", "sent": "🦊 [Keywords]: Sent message to {}, triggered by {}:\n{}", "kwords": "🦊 Current keywords:\n{}", "no_command": ( "🚫 Execution of command forbidden, because message contains reply" ), } strings_ru = { "args": "🚫 Неверные аргументы", "kw_404": '🚫 Кейворд "{}" не найден', "kw_added": "✅ Новый кейворд:\nТриггер: {}\nСообщение: {}\n{}{}{}{}{}", "kw_removed": '✅ Кейворд "{}" удален', "kwbl_list": "🦊 Чаты в черном списке:\n{}", "bl_added": "✅ Этот чат теперь в черном списке Кейвордов", "bl_removed": "✅ Этот чат больше не в черном списке Кейвордов", "sent": "🦊 [Кейворды]: Отправлено сообщение в {}, активировано {}:\n{}", "kwords": "🦊 Текущие кейворды:\n{}", "no_command": ( "🚫 Команда не была выполнена, так как сообщение содержит реплай" ), "_cmd_doc_kword": ( "<кейворд | можно в кавычках | & для нескольких слов, которые должны быть в" " сообщении в любом порядке> <сообщение | оставь пустым для удаления" " кейворда> [-r для полного совпадения] [-m для автопрочтения сообщения]" " [-l для включения логирования] [-e для включения регулярных выражений]" ), "_cmd_doc_kwords": "Показать активные кейворды", "_cmd_doc_kwbl": "Добавить чат в черный список кейвордов", "_cmd_doc_kwbllist": "Показать чаты в черном списке", "_cls_doc": "Создавай кастомные кейворды с регулярными выражениями и командами", } strings_de = { "args": "🚫 Falsche Argumente", "kw_404": '🚫 Keyword "{}" nicht gefunden', "kw_added": "✅ Neuer Keyword:\nTrigger: {}\nNachricht: {}\n{}{}{}{}{}", "kw_removed": '✅ Keyword "{}" entfernt', "kwbl_list": "🦊 Blacklisted Chats:\n{}", "bl_added": "✅ Dieser Chat ist nun blacklisted für Keywords", "bl_removed": "✅ Dieser Chat ist nun whitelisted für Keywords", "sent": "🦊 [Keywords]: Nachricht an {}, getriggert durch {}:\n{}", "kwords": "🦊 Aktuelle Keywords:\n{}", "no_command": ( "🚫 Kommando nicht ausgeführt, da die Nachricht einen Reply enthält" ), "_cmd_doc_kword": ( " [-r für exakte Übereinstimmung] [-m für" " automatische Nachrichtenlöschung] [-l für Logging] [-e für reguläre" " Ausdrücke]" ), "_cmd_doc_kwords": "Zeige aktive Keywords", "_cmd_doc_kwbl": "Füge Chat zur Keyword Blacklist hinzu", "_cmd_doc_kwbllist": "Zeige Chats in der Keyword Blacklist", "_cls_doc": "Erstelle eigene Keywords mit regulären Ausdrücken und Befehlen", } strings_hi = { "args": "🚫 गलत तर्क", "kw_404": '🚫 "{}" कीवर्ड नहीं मिला', "kw_added": "✅ नया कीवर्ड:\nट्रिगर: {}\nसंदेश: {}\n{}{}{}{}{}", "kw_removed": '✅ "{}" कीवर्ड हटा दिया', "kwbl_list": "🦊 ब्लैकलिस्टेड चैट्स:\n{}", "bl_added": "✅ यह चैट अब कीवर्ड ब्लैकलिस्ट में है", "bl_removed": "✅ यह चैट अब कीवर्ड व्हाइटलिस्ट में है", "sent": "🦊 [कीवर्ड्स]: {} को, {} ने ट्रिगर किया:\n{}", "kwords": "🦊 वर्तमान कीवर्ड्स:\n{}", "no_command": "🚫 कमांड नहीं चलाया क्योंकि संदेश रिप्लाई का सामना कर रहा है", "_cmd_doc_kword": ( "<कीवर्ड | उदाहरण के लिए & | & के बाद एक से अधिक शब्द, जो संदेश में किसी भी" " क्रम में होने चाहिए> <संदेश | खाली छोड़ने से कीवर्ड हट जाएगा> [-r बिल्कुल" " मेल के लिए] [-m स्वचालित संदेश हटाने के लिए] [-l लॉगिंग के लिए] [-e" " रेगुलर एक्सप्रेशन के लिए]" ), "_cmd_doc_kwords": "वर्तमान कीवर्ड्स दिखाएं", "_cmd_doc_kwbl": "कीवर्ड ब्लैकलिस्ट में चैट जोड़ें", "_cmd_doc_kwbllist": "कीवर्ड ब्लैकलिस्ट में चैट दिखाएं", "_cls_doc": "रेगुलर एक्सप्रेशन और कमांड के साथ अपने कीवर्ड बनाएं", } strings_uz = { "args": "🚫 Noto'g'ri argument", "kw_404": '🚫 "{}" kalit so\'z topilmadi', "kw_added": "✅ Yangi kalit so'z:\nTriger: {}\nXabar: {}\n{}{}{}{}{}", "kw_removed": "✅ \"{}\" kalit so'z o'chirildi", "kwbl_list": "🦊 Qora ro'yxatli guruhlar:\n{}", "bl_added": "✅ Bu guruh kalit so'zlarni qora ro'yxatga qo'shildi", "bl_removed": "✅ Bu guruh kalit so'zlarni oq ro'yxatga qo'shildi", "sent": "🦊 [Kalit so'zlarni]: {} ga, {} guruhga xabar jo'natdi:\n{}", "kwords": "🦊 Hozirgi kalit so'zlarni:\n{}", "no_command": "🚫 Komanda bajarilmadi chunki xabar javob qaytaradi", "_cmd_doc_kword": ( " [-r to'g'ri moslik uchun] [-m avtomatik xabar o'chirish" " uchun] [-l yozuvni qayd etish uchun] [-e regular ifodalar uchun]" ), "_cmd_doc_kwords": "Hozirgi kalit so'zlarni ko'rsatish", "_cmd_doc_kwbl": "Qora ro'yxatga guruh qo'shish", "_cmd_doc_kwbllist": "Qora ro'yxatda guruhlar ro'yxatini ko'rsatish", "_cls_doc": "Regular ifodalarni va buyruqlarni ishlatib kalit so'z yarating", } strings_tr = { "args": "🚫 Yanlış argüman", "kw_404": '🚫 "{}" anahtar kelime bulunamadı', "kw_added": "✅ Yeni anahtar kelime:\nTriger: {}\nMesaj: {}\n{}{}{}{}{}", "kw_removed": '✅ "{}" anahtar kelime kaldırıldı', "kwbl_list": "🦊 Kara liste sohbetler:\n{}", "bl_added": "✅ Bu sohbet anahtar kelimeleri kara listeye eklendi", "bl_removed": "✅ Bu sohbet anahtar kelimeleri açık listeye eklendi", "sent": "🦊 [Anahtar Kelimeler]: {}'a, {} sohbetine mesaj gönderdi:\n{}", "kwords": "🦊 Geçerli anahtar kelimeler:\n{}", "no_command": "🚫 Komut yürütülemedi çünkü mesaj yanıt veriyor", "_cmd_doc_kword": ( " [-r tam eşleme için] [-m otomatik mesaj silmek için]" " [-l kayıt için] [-e düzenli ifadeler için]" ), "_cmd_doc_kwords": "Geçerli anahtar kelimeleri göster", "_cmd_doc_kwbl": "Sohbeti kara listeye ekle", "_cmd_doc_kwbllist": "Kara listede sohbetleri göster", "_cls_doc": ( "Anahtar kelimeleri oluşturmak için düzenli ifadeleri ve komutları kullanın" ), } async def client_ready(self): self.keywords = self.get("keywords", {}) self.bl = self.get("bl", []) async def kwordcmd(self, message: Message): """ [-r for full match] [-m for autoreading msg] [-l to log in pm] [-e for regular expressions]""" args = utils.get_args_raw(message) kw, ph, restrict, ar, l, e, c = "", "", False, False, False, False, False if "-r" in args: restrict = True args = args.replace(" -r", "").replace("-r", "") if "-m" in args: ar = True args = args.replace(" -m", "").replace("-m", "") if "-l" in args: l = True args = args.replace(" -l", "").replace("-l", "") if "-e" in args: e = True args = args.replace(" -e", "").replace("-e", "") if "-c" in args: c = True args = args.replace(" -c", "").replace("-c", "") if args[0] == "'": kw = args[1 : args.find("'", 1)] args = args[args.find("'", 1) + 1 :] elif args[0] == '"': kw = args[1 : args.find('"', 1)] args = args[args.find('"', 1) + 1 :] else: kw = args.split()[0] try: args = args.split(maxsplit=1)[1] except Exception: args = "" if ph := args: ph = ph.strip() kw = kw.strip() self.keywords[kw] = [f"🤖 {ph}", restrict, ar, l, e, c] self.set("keywords", self.keywords) return await utils.answer( message, self.strings("kw_added").format( kw, utils.escape_html(ph), ("Restrict: yes\n" if restrict else ""), ("Auto-read: yes\n" if ar else ""), ("Log: yes" if l else ""), ("Regex: yes" if e else ""), ("Command: yes" if c else ""), ), ) else: if kw not in self.keywords: return await utils.answer(message, self.strings("kw_404").format(kw)) del self.keywords[kw] self.set("keywords", self.keywords) return await utils.answer(message, self.strings("kw_removed").format(kw)) async def kwordscmd(self, message: Message): """List current kwords""" res = "" for kw, ph in self.keywords.items(): res += ( "" + kw + "\nMessage: " + utils.escape_html(ph[0]) + "\n" + ("Restrict: yes\n" if ph[1] else "") + ("Auto-read: yes\n" if ph[2] else "") + ("Log: yes" if ph[3] else "") + ("Regex: yes" if len(ph) > 4 and ph[4] else "") + ("Command: yes" if len(ph) > 5 and ph[5] else "") + "" ) if res[-1] != "\n": res += "\n" res += "\n" await utils.answer(message, self.strings("kwords").format(res)) @loader.group_admin_ban_users async def kwblcmd(self, message: Message): """Blacklist chat from answering keywords""" cid = utils.get_chat_id(message) if cid not in self.bl: self.bl.append(cid) self.set("bl", self.bl) return await utils.answer(message, self.strings("bl_added")) else: self.bl.remove(cid) self.set("bl", self.bl) return await utils.answer(message, self.strings("bl_removed")) async def kwbllistcmd(self, message: Message): """List blacklisted chats""" chat = str(utils.get_chat_id(message)) res = "" for user in self.bl: try: u = await self._client.get_entity(user) except Exception: self.chats[chat]["defense"].remove(user) continue tit = ( u.first_name if getattr(u, "first_name", None) is not None else u.title ) res += ( " 👺 {tit}{(' ' + u.last_name) if getattr(u, 'last_name', None) is not None else ''}\n" ) if not res: res = "No" return await utils.answer(message, self.strings("kwbl_list").format(res)) async def watcher(self, message: Message): with contextlib.suppress(Exception): cid = utils.get_chat_id(message) if cid in self.bl: return for kw, ph in self.keywords.copy().items(): if len(ph) > 4 and ph[4]: try: if not re.match(kw, message.raw_text): continue except Exception: continue else: kws = [ _.strip() for _ in ([kw] if "&" not in kw else kw.split("&")) ] trigger = False for k in kws: if k.lower() in message.text.lower(): trigger = True if not ph[1]: break elif k.lower() not in message.text.lower() and ph[1]: trigger = False break if not trigger: continue offset = 2 if ( len(ph) > 5 and ph[5] and ph[0][offset:].startswith(self.get_prefix()) ): offset += 1 if ph[2]: await self._client.send_read_acknowledge(cid, clear_mentions=True) if ph[3]: chat = await message.get_chat() ch = ( message.first_name if getattr(message, "first_name", None) is not None else "" ) if not ch: ch = ( chat.title if getattr(message, "title", None) is not None else "" ) await self._client.send_message( "me", self.strings("sent").format(ch, kw, ph[0]) ) if not message.reply_to_msg_id: ms = await utils.answer(message, ph[0]) else: ms = await message.respond(ph[0]) ms.text = ph[0][2:] if len(ph) > 5 and ph[5]: if ph[0][offset:].split()[0] == "del": await message.delete() await ms.delete() elif not message.reply_to_msg_id: cmd = ph[0][offset:].split()[0] if cmd in self.allmodules.commands: await self.allmodules.commands[cmd](ms) else: await ms.respond(self.strings("no_command"))