# █ █ ▀ █▄▀ ▄▀█ █▀█ ▀
# █▀█ █ █ █ █▀█ █▀▄ █
# © 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"))