mirror of
https://github.com/MuRuLOSE/limoka.git
synced 2026-06-18 15:14:18 +02:00
Commited backup
This commit is contained in:
791
GD-alt/mm-hikka-mods/LiMERPMod.py
Normal file
791
GD-alt/mm-hikka-mods/LiMERPMod.py
Normal file
@@ -0,0 +1,791 @@
|
||||
# meta developer: @mm_mods
|
||||
# requires: toml
|
||||
import os
|
||||
from hikka import loader, utils
|
||||
import pickle
|
||||
from telethon.tl.types import Channel
|
||||
import toml
|
||||
|
||||
|
||||
# noinspection PyCallingNonCallable
|
||||
@loader.tds
|
||||
class RPMod(loader.Module):
|
||||
"""A little upgraded mod of module of @trololo_1."""
|
||||
|
||||
def __init__(self):
|
||||
self.config = loader.ModuleConfig(
|
||||
loader.ConfigValue(
|
||||
"action_decoration",
|
||||
'normal | без стилей',
|
||||
lambda: self.strings("cfg_action_decoration"),
|
||||
validator=loader.validators.Choice(
|
||||
[
|
||||
"normal | без стилей",
|
||||
"bold | полужирный",
|
||||
"italic | курсив",
|
||||
"underlined | подчёркнутый",
|
||||
"strikethrough | зачёркнутый",
|
||||
"spoiler | скрытый",
|
||||
]
|
||||
),
|
||||
),
|
||||
|
||||
loader.ConfigValue(
|
||||
"replica_decoration",
|
||||
'normal | без стилей',
|
||||
lambda: self.strings("cfg_replica_decoration"),
|
||||
validator=loader.validators.Choice(
|
||||
[
|
||||
"normal | без стилей",
|
||||
"bold | полужирный",
|
||||
"italic | курсив",
|
||||
"underlined | подчёркнутый",
|
||||
"strikethrough | зачёркнутый",
|
||||
"spoiler | скрытый",
|
||||
]
|
||||
),
|
||||
),
|
||||
|
||||
loader.ConfigValue(
|
||||
"speech_bubble",
|
||||
'💬',
|
||||
lambda: self.strings("cfg_speech_bubble"),
|
||||
validator=loader.validators.String()
|
||||
)
|
||||
)
|
||||
|
||||
strings = {
|
||||
'name': 'LiMERPMod',
|
||||
'separator…': '🤐 <b>Here\'s an emoji separator, but no emoji. eh</b>',
|
||||
'name?': '🧐 <b>Where\'s the name of the RP command?</b>',
|
||||
'action?': '🧐 <b>Where\'s the action of the RP command?</b>',
|
||||
'aarf': '🤢 <b>RP commands can\'t be named "all"</b>',
|
||||
'space': '🤐 <b>RP commands consisting of multiple words aren\'t supported.</b>',
|
||||
'added1': "🤩 <b>Command '<code>{}</code>' succesfully added with emoji '{}'!</b>",
|
||||
'added2': "☺️ <b>Command '<code>{}</code>' succesfully added!</b>",
|
||||
'weresall': '🤐 <b>You\'ve not entered separator or have\'nt entered anything at all.</b>',
|
||||
'cleared': '🍃 <b>RP commands succesfully cleared!</b>',
|
||||
'arg?': '🧐 <b>Where\'s the argument?</b>',
|
||||
'deleted': '🗑️ <b>RP command <code>{}</code> succesfully deleted!</b>',
|
||||
'notfound': '🧐 <b>Command <code>{}</code> not found!</b>',
|
||||
'on': '😀 <b>RP commands are now on!</b>',
|
||||
'off': '😴 <b>RP commands are now off!</b>',
|
||||
's-t-wrong': '😟 <b>Something went wrong!</b>',
|
||||
'nick-changed': '🏷️ <b>RP nickname of {} succesfully changed to <code>{}</code>!</b>',
|
||||
'count': '📋 <b>You have <code>{}</code> commands</b>',
|
||||
'error-with-type': '❌ <b>Error: <code>{}</code></b>',
|
||||
'actualised': '👍🏻 <b>RP commands succesfully actualised!</b>',
|
||||
'chat-excluded': '➖ <b>Chat {} succesfully excluded!</b>',
|
||||
'chat-included': '➕ <b>Chat {} succesfully included!</b>',
|
||||
'id-wrong': '🔢 <b>Wrong ID!</b>',
|
||||
'empty-exclude': '🪁 <b>Excluded chats list is empty!</b>',
|
||||
'excluded-chats': '📃 <b>Excluded chats:</b>',
|
||||
'on-in-chat': '📗💬 <b>RP commands are now on for members of this chat!</b>',
|
||||
'off-in-chat': '📕💬 <b>RP commands are now off for members of this chat!</b>',
|
||||
'who-have': '📄 <b>Who have RP commands access:</b>',
|
||||
'chats-s': '💬 <b>Chats:</b>',
|
||||
'users-s': '👤 <b>Users:</b>',
|
||||
'on-for-usr': '📗 <b>RP commands are now on for <code>{}</code>!</b>',
|
||||
'off-for-usr': '📕 <b>RP commands are now off for <code>{}</code>!</b>',
|
||||
'whatschanged': '''🍋 <b>LIME</b> (1.2) — mod of RPMod (@trololo_1) by @mm_mods
|
||||
What\'s changed?
|
||||
• No limits now!
|
||||
• No check for emoji validity now — add custom emojies…
|
||||
• No buggy import now, everyone can use the module.
|
||||
• Additions and replicas now save there\'s case.
|
||||
• New commands backup format.
|
||||
• Config optoins moved to config.
|
||||
Enjoy!''',
|
||||
'with-replica': 'Saying:',
|
||||
'arg-unknown': '🤌🏻 <b>Unknown argument!</b>',
|
||||
'num-unknown': 'Ⓜ️ <b>Unknown number!</b>',
|
||||
'done': '✅ <b>Done!</b>',
|
||||
'less-then-2': '▫️ <b>Less then 2 arguments!</b>',
|
||||
'toml-minparse-failure': '😦 <b>Failed to parse toml!</b>\nAre you sure it\'s a backup?',
|
||||
'toml-parse-failure': '💀 <b>Failed to parse toml!</b>\nThe backup is corrupted.',
|
||||
'cfg_action_decoration': 'Decoration for RP action',
|
||||
'cfg_replica_decoration': 'Decoration for RP replica',
|
||||
'cfg_speech_bubble': 'Speech bubble emoji for «with replica»',
|
||||
}
|
||||
|
||||
strings_ru = {
|
||||
'name': 'LiMERPMod',
|
||||
'separator…': '🤐 <b>Вот разделитель, но нет эмодзи. епт</b>',
|
||||
'name?': '🧐 <b>Где имя РП-команды?</b>',
|
||||
'action?': '🧐 <b>Где действие РП-команды?</b>',
|
||||
'aarf': '🤢 <b>РП-команды не могут называться "all"</b>',
|
||||
'space': '🤐 <b>Многословные команды не поддерживаются.</b>',
|
||||
'added1': "🤩 <b>Команда '<code>{}</code>' успешно добавлена с эмодзи '{}'!</b>",
|
||||
'added2': "☺️ <b>Команда '<code>{}</code>' успешно добавлена!</b>",
|
||||
'weresall': '🤐 <b>Вы не ввели разделитель или ничего не ввели вообще.</b>',
|
||||
'cleared': '🍃 <b>РП-команды успешно очищены!</b>',
|
||||
'arg?': '🧐 <b>Где аргумент?</b>',
|
||||
'deleted': '🗑️ <b>РП-команда <code>{}</code> успешно удалена!</b>',
|
||||
'notfound': '🧐 <b>Команда <code>{}</code> не найдена!</b>',
|
||||
'on': '😀 <b>РП-команды теперь включены!</b>',
|
||||
'off': '😴 <b>РП-команды теперь выключены!</b>',
|
||||
's-t-wrong': '😟 <b>Что-то пошло не так!</b>',
|
||||
'nick-changed': '🏷️ <b>Ник {} успешно изменен на <code>{}</code>!</b>',
|
||||
'count': '📋 <b>У вас <code>{}</code> команд</b>',
|
||||
'error-with-type': '❌ <b>Ошибка: <code>{}</code></b>',
|
||||
'actualised': '👍🏻 <b>РП-команды успешно обновлены!</b>',
|
||||
'chat-excluded': '➖ <b>Чат {} успешно исключен!</b>',
|
||||
'chat-included': '➕ <b>Чат {} успешно включен!</b>',
|
||||
'id-wrong': '🔢 <b>Неверный ID!</b>',
|
||||
'empty-exclude': '🪁 <b>Список исключённых чатов пуст!</b>',
|
||||
'excluded-chats': '📃 <b>Исключённые чаты:</b>',
|
||||
'on-in-chat': '📗💬 <b>РП-команды теперь включены для участников этого чата!</b>',
|
||||
'off-in-chat': '📕💬 <b>РП-команды теперь выключены для участников этого чата!</b>',
|
||||
'who-have': '📄 <b>Кто имеет доступ к РП-командам:</b>',
|
||||
'chats-s': '💬 <b>Чаты:</b>',
|
||||
'users-s': '👤 <b>Пользователи:</b>',
|
||||
'on-for-usr': '📗 <b>РП-команды теперь включены для <code>{}</code>!</b>',
|
||||
'off-for-usr': '📕 <b>РП-команды теперь выключены для <code>{}</code>!</b>',
|
||||
'whatschanged': '''🍋 <b>LIME</b> (1.2) — модуль RPMod (@trololo_1) от @mm_mods
|
||||
Что изменилось?
|
||||
• Больше нет ограничений!
|
||||
• Больше нет проверки на валидность эмодзи — добавляйте кастомные эмодзи…
|
||||
• Больше нет багов с импортом — теперь модуль может использовать каждый.
|
||||
• Дополнения и реплики теперь сохраняют свой регистр.
|
||||
• Новый формат сохранения команд.
|
||||
• Опции конфига переехали в конфиг.
|
||||
Наслаждайтесь!''',
|
||||
'with-replica': 'С репликой:',
|
||||
'arg-unknown': '🤌🏻 <b>Неизвестный аргумент!</b>',
|
||||
'num-unknown': 'Ⓜ️ <b>Неизвестная цифра!</b>',
|
||||
'done': '✅ <b>Готово!</b>',
|
||||
'less-then-2': '▫️ <b>Меньше 2 аргументов!</b>',
|
||||
'toml-minparse-failure': '😦 <b>Ошибка парсинга toml!</b>\nЭто точно бэкап?',
|
||||
'toml-parse-failure': '💀 <b>Ошибка парсинга toml!</b>\nБэкап повреждён.',
|
||||
'cfg_action_decoration': 'Декорация для действия РП-команды',
|
||||
'cfg_replica_decoration': 'Декорация для реплики РП-команды',
|
||||
'cfg_speech_bubble': 'Эмодзи речевого пузыря для «с репликой»',
|
||||
'_cls_doc': 'Слегка улучшенный мод на модуль от @trololo_1.',
|
||||
'_cmd_doc_dobrp': 'Создать РП-команду. Аргументы: <команда>/<действие>[/<эмодзи>]',
|
||||
'_cmd_doc_addrp': 'Псевдоним для .dobrp.',
|
||||
'_cmd_doc_delrp': 'Удалить РП-команду. Аргументы: <команда>',
|
||||
'_cmd_doc_rplist': 'Показать список РП-команд.',
|
||||
'_cmd_doc_rpconf': 'Настроить шаблон для РП-команд. Аргументы: <параметр> <значение>',
|
||||
'_cmd_doc_orpback': 'Сохранить/загрузить РП-команды (старый метод). Используйте без аргументов, чтобы '
|
||||
'сохранить, или в ответ на файл, чтобы загрузить.',
|
||||
'_cmd_doc_rpback': 'Новый метод, чтобы сохранить/загрузить РП-команды. Используйте без аргументов, чтобы '
|
||||
'сохранить, или в ответ на файл, чтобы загрузить.',
|
||||
'_cmd_doc_rpnick': 'Изменить ник для РП-команд. Аргументы: <ник> или без ника, чтобы его сбросить. '
|
||||
'В ответ на сообщение нужного пользователя.',
|
||||
'_cmd_doc_rpnicks': 'Используйте .rpnicks, чтобы просмотреть список ников для РП-команд.',
|
||||
'_cmd_doc_rpblock': 'Заблокировать/разблокировать РП-команды в чате. Аргументы: <айди чата>. '
|
||||
'Можно и без него, чтобы сменить настройки в этом чате.',
|
||||
'_cmd_doc_rptoggle': 'Используйте .rptoggle, чтобы включить/выключить РП-мод.',
|
||||
'_cmd_doc_useraccept': 'Допустить или нет пользователя/чат к РП-командам. Аргументы: <айди пользователя/чата>. '
|
||||
'Можно без ответа и аргумента, тогда действие будет выполнена над текущим чатом. '
|
||||
'Можно просто без аргумента, тогда действие будет выполнено над пользователем из '
|
||||
'ответа. Еси использовано с -l (л), то будет показан список допущенных пользователей/чатов.',
|
||||
'_cmd_doc_mmminfo': 'Показать информацию о моде.',
|
||||
}
|
||||
|
||||
async def client_ready(self, client, db):
|
||||
self.db = db
|
||||
|
||||
if not self.db.get("RPMod", "exlist", False):
|
||||
self.db.set("RPMod", "exlist", [])
|
||||
|
||||
if not self.db.get("RPMod", "status", False):
|
||||
self.db.get("RPMod", "status", 1)
|
||||
|
||||
if not self.db.get("RPMod", "rpnicks", False):
|
||||
self.db.set("RPMod", "rpnicks", {})
|
||||
|
||||
if not self.db.get("RPMod", "rpcomands", False):
|
||||
self.db.set("RPMod", "rpcomands", {})
|
||||
|
||||
if not self.db.get("RPMod", "rpemoji", False):
|
||||
self.db.set("RPMod", "rpemoji", {})
|
||||
|
||||
if not self.db.get("RPMod", "nrpcommands", False):
|
||||
# Check if the old version of the module is installed
|
||||
if self.db.get("RPMod", "rpcomands", False):
|
||||
# Copy the dict
|
||||
commands_old = self.db.get("RPMod", "rpcomands")
|
||||
emoji_old = self.db.get("RPMod", "rpemoji")
|
||||
# Create a new dict
|
||||
commands_new = {}
|
||||
# For each key in the old dict try to find the emoji in the old dict and add as second element of list
|
||||
for key in commands_old:
|
||||
try:
|
||||
commands_new[key] = [commands_old[key], emoji_old[key]]
|
||||
except KeyError:
|
||||
commands_new[key] = [commands_old[key], '']
|
||||
|
||||
# Save the new dict
|
||||
self.db.set("RPMod", "nrpcommands", commands_new)
|
||||
|
||||
else:
|
||||
# If the old version of the module is not installed, create an empty dict
|
||||
self.db.set("RPMod", "nrpcommands", {})
|
||||
|
||||
if not self.db.get("RPMod", "useraccept", False):
|
||||
self.db.set("RPMod", "useraccept", {"chats": [], "users": []})
|
||||
|
||||
elif isinstance(type(self.db.get("RPMod", "useraccept")), list):
|
||||
self.db.set(
|
||||
"RPMod",
|
||||
"useraccept",
|
||||
{"chats": [], "users": self.db.get("RPMod", "useraccept")},
|
||||
)
|
||||
|
||||
async def dobrpcmd(self, message):
|
||||
"""Use: .dobrp (command) / (action) / (emoji) to add command. You can do it without emoji."""
|
||||
args = utils.get_args_raw(message)
|
||||
dict_rp = self.db.get("RPMod", "nrpcommands")
|
||||
|
||||
try:
|
||||
key_rp = str(args.split("/")[0]).strip().casefold()
|
||||
value_rp = str(args.split("/", maxsplit=2)[1]).strip()
|
||||
lenght_args = args.split("/")
|
||||
count_emoji = 0
|
||||
|
||||
if ' ' in key_rp:
|
||||
await utils.answer(message, self.strings("space"))
|
||||
return
|
||||
|
||||
if len(lenght_args) >= 3:
|
||||
emoji_rp = str(message.text.split("/", maxsplit=2)[2]).strip()
|
||||
count_emoji = 1
|
||||
|
||||
if not emoji_rp or not emoji_rp.strip():
|
||||
await utils.answer(
|
||||
message, self.strings("separator…")
|
||||
)
|
||||
return
|
||||
|
||||
if not key_rp or not key_rp.strip():
|
||||
return await utils.answer(message, self.strings("name?"))
|
||||
|
||||
elif not value_rp or not value_rp.strip():
|
||||
return await utils.answer(
|
||||
message, self.strings("action")
|
||||
)
|
||||
|
||||
elif key_rp == "all":
|
||||
return await utils.answer(
|
||||
message, self.strings("aarf"),
|
||||
)
|
||||
|
||||
elif count_emoji == 1:
|
||||
dict_rp[key_rp] = [value_rp, emoji_rp]
|
||||
self.db.set("RPMod", "nrpcommands", dict_rp)
|
||||
await utils.answer(
|
||||
message,
|
||||
self.strings("added1").format(key_rp, emoji_rp),
|
||||
)
|
||||
|
||||
else:
|
||||
dict_rp[key_rp] = [value_rp, '']
|
||||
self.db.set("RPMod", "nrpcommands", dict_rp)
|
||||
await utils.answer(
|
||||
message,
|
||||
self.strings("added2").format(key_rp),
|
||||
)
|
||||
|
||||
except Exception:
|
||||
await utils.answer(
|
||||
message, self.strings("weresall"),
|
||||
)
|
||||
|
||||
async def addrpcmd(self, message):
|
||||
"""dobrp alias."""
|
||||
await self.dobrpcmd(message)
|
||||
|
||||
async def delrpcmd(self, message):
|
||||
"""Use: .delrp (command) to delete command.
|
||||
Use: .delrp all to delete all commands."""
|
||||
dict_rp = self.db.get("RPMod", "nrpcommands")
|
||||
|
||||
args = utils.get_args_raw(message)
|
||||
key_rp = str(args)
|
||||
|
||||
if key_rp == "all":
|
||||
dict_rp.clear()
|
||||
self.db.set("RPMod", "nrpcommands", dict_rp)
|
||||
await utils.answer(message, self.strings("cleared"))
|
||||
return
|
||||
|
||||
elif not key_rp or not key_rp.strip():
|
||||
await utils.answer(message, self.strings("name?"))
|
||||
|
||||
else:
|
||||
try:
|
||||
dict_rp.pop(key_rp)
|
||||
self.db.set("RPMod", "nrpcommands", dict_rp)
|
||||
|
||||
await utils.answer(
|
||||
message, self.strings("deleted").format(key_rp),
|
||||
)
|
||||
|
||||
except KeyError:
|
||||
await utils.answer(message, self.strings("notfound"))
|
||||
|
||||
async def rptogglecmd(self, message):
|
||||
"""Use: .rptoggle to turn on/off RP mode."""
|
||||
status = self.db.get("RPMod", "status")
|
||||
|
||||
if status == 1:
|
||||
self.db.set("RPMod", "status", 2)
|
||||
await utils.answer(message, self.strings("off"))
|
||||
|
||||
else:
|
||||
self.db.set("RPMod", "status", 1)
|
||||
await utils.answer(message, self.strings("on"))
|
||||
|
||||
async def rplistcmd(self, message):
|
||||
"""Use: .rplist to see list of RP commands."""
|
||||
com = self.db.get("RPMod", "nrpcommands")
|
||||
|
||||
coms_amount = len(com)
|
||||
com_list = self.strings("count").format(coms_amount)
|
||||
|
||||
if len(com) == 0:
|
||||
await utils.answer(message, self.strings("count").format(coms_amount))
|
||||
return
|
||||
|
||||
for i in com:
|
||||
if com[i][1] != '':
|
||||
com_list += f"\n• <b><code>{i}</code> - {com[i][0]} |</b> {com[i][1]}"
|
||||
else:
|
||||
com_list += f"\n• <b><code>{i}</code> - {com[i][0]}</b>"
|
||||
|
||||
await utils.answer(message, com_list)
|
||||
|
||||
async def rpnickcmd(self, message):
|
||||
"""Use: .rpnick (nick) to change nick to user or yourself."""
|
||||
args = utils.get_args_raw(message).strip()
|
||||
reply = await message.get_reply_message()
|
||||
nicks = self.db.get("RPMod", "rpnicks")
|
||||
|
||||
if not reply:
|
||||
user = await message.client.get_entity(message.sender_id)
|
||||
else:
|
||||
user = await message.client.get_entity(reply.sender_id)
|
||||
|
||||
if not args:
|
||||
if str(user.id) in nicks:
|
||||
nicks.pop(str(user.id))
|
||||
|
||||
self.db.set("RPMod", "rpnicks", nicks)
|
||||
return await utils.answer(
|
||||
message,
|
||||
self.strings("nick-changed").format(user.id, user.first_name),
|
||||
)
|
||||
|
||||
nicks[str(user.id)] = args
|
||||
self.db.set("RPMod", "rpnicks", nicks)
|
||||
await utils.answer(
|
||||
message,
|
||||
self.strings("nick-changed").format(user.id, args),
|
||||
)
|
||||
|
||||
async def rpnickscmd(self, message):
|
||||
"""Use: .rpnicks to see list of nicknames."""
|
||||
nicks = self.db.get("RPMod", "rpnicks")
|
||||
|
||||
if len(nicks) == 0:
|
||||
return await utils.answer(message, self.strings("no-nicks"))
|
||||
|
||||
str_nicks = "• " + "\n •".join(
|
||||
" --- ".join([f"<code>{user_id}</code>", f"<b>{nick}</b>"])
|
||||
for user_id, nick in nicks.items()
|
||||
)
|
||||
await utils.answer(message, str_nicks)
|
||||
|
||||
async def orpbackcmd(self, message):
|
||||
"""Backup RP commands (old fashioned method).
|
||||
Use as reply to file with commands to load them or use without
|
||||
arguments to back up them."""
|
||||
commands = self.db.get("RPMod", "nrpcommands")
|
||||
file_name = "LiMERPModBackUp (on compat).pickle"
|
||||
mes_id = message.to_id
|
||||
|
||||
reply = await message.get_reply_message()
|
||||
|
||||
if not reply:
|
||||
# Split them into 2 dicts
|
||||
emojies = {}
|
||||
for key, value in commands.items():
|
||||
if commands[key][1] != "":
|
||||
emojies[key] = commands[key][1]
|
||||
commands[key] = commands[key][0]
|
||||
|
||||
try:
|
||||
await message.delete()
|
||||
dict_all = {"rp": commands, "emj": emojies}
|
||||
|
||||
with open(file_name, "wb") as f:
|
||||
pickle.dump(dict_all, f)
|
||||
|
||||
await message.client.send_file(mes_id, file_name)
|
||||
os.remove(file_name)
|
||||
|
||||
except Exception as e:
|
||||
await utils.answer(message, f"<b>Ошибка:\n</b>{e}")
|
||||
|
||||
else:
|
||||
try:
|
||||
if not reply.document:
|
||||
await utils.answer(message, self.strings("itsnotafile"))
|
||||
await reply.download_media(file_name)
|
||||
|
||||
with open(file_name, "rb") as f:
|
||||
data = pickle.load(f)
|
||||
|
||||
rp = data["rp"]
|
||||
emj = data["emj"]
|
||||
|
||||
# Iterating through keys
|
||||
for key in rp.keys():
|
||||
if key in emj.keys():
|
||||
rp[key] = [rp[key], emj[key]]
|
||||
|
||||
self.db.set("RPMod", "nrpcommands", rp)
|
||||
|
||||
await utils.answer(message, self.strings("actualised"))
|
||||
|
||||
except Exception as e:
|
||||
await utils.answer(message, self.strings("error-with-type").format(e))
|
||||
|
||||
async def rpbackcmd(self, message):
|
||||
"""New way to backup RP commands. Use as reply to file with commands to load them or use without arguments to back up them."""
|
||||
commands = self.db.get("RPMod", "nrpcommands")
|
||||
file_name = "LiMERPModBackUp.toml"
|
||||
mes_id = message.to_id
|
||||
|
||||
reply = await message.get_reply_message()
|
||||
|
||||
if not reply:
|
||||
# Dump it into toml
|
||||
try:
|
||||
await message.delete()
|
||||
with open(file_name, "w") as f:
|
||||
toml.dump(commands, f)
|
||||
|
||||
await message.client.send_file(mes_id, file_name)
|
||||
os.remove(file_name)
|
||||
|
||||
except Exception as e:
|
||||
await utils.answer(message, f"<b>Ошибка:\n</b>{e}")
|
||||
|
||||
else:
|
||||
try:
|
||||
if not reply.document:
|
||||
await utils.answer(message, self.strings("itsnotafile"))
|
||||
await reply.download_media(file_name)
|
||||
|
||||
with open(file_name, "r") as f:
|
||||
try:
|
||||
data = toml.load(f)
|
||||
except toml.TomlDecodeError as e:
|
||||
return await utils.answer(message, self.strings("toml-parse-failure"))
|
||||
|
||||
# Check validity
|
||||
for key in data.keys():
|
||||
if not isinstance(data[key], list):
|
||||
return await utils.answer(message, self.strings("toml-minparse-failure"))
|
||||
if len(data[key]) != 2:
|
||||
return await utils.answer(message, self.strings("toml-minparse-failure"))
|
||||
|
||||
self.db.set("RPMod", "nrpcommands", data)
|
||||
|
||||
await utils.answer(message, self.strings("actualised"))
|
||||
|
||||
except Exception as e:
|
||||
await utils.answer(message, self.strings("error-with-type").format(e))
|
||||
|
||||
async def rpblockcmd(self, message):
|
||||
"""Use: .rpblock to add/remove exception (use in needed chat).
|
||||
Use: .rpblock list to see exceptions.
|
||||
Use .rpblock (id) to remove chat from exceptions."""
|
||||
args = utils.get_args_raw(message)
|
||||
ex = self.db.get("RPMod", "exlist")
|
||||
if not args:
|
||||
a = await message.client.get_entity(message.to_id)
|
||||
if a.id in ex:
|
||||
ex.remove(a.id)
|
||||
self.db.set("RPMod", "exlist", ex)
|
||||
try:
|
||||
name = a.title
|
||||
except Exception:
|
||||
name = a.first_name
|
||||
await utils.answer(
|
||||
message,
|
||||
self.strings("chat-included").format(name),
|
||||
)
|
||||
else:
|
||||
ex.append(a.id)
|
||||
self.db.set("RPMod", "exlist", ex)
|
||||
try:
|
||||
name = a.title
|
||||
except Exception:
|
||||
name = a.first_name
|
||||
await utils.answer(
|
||||
message,
|
||||
self.strings("chat-excluded").format(name),
|
||||
)
|
||||
|
||||
elif args.isdigit():
|
||||
args = int(args)
|
||||
if args in ex:
|
||||
ex.remove(args)
|
||||
self.db.set("RPMod", "exlist", ex)
|
||||
a = await message.client.get_entity(args)
|
||||
try:
|
||||
name = a.title
|
||||
except Exception:
|
||||
name = a.first_name
|
||||
await utils.answer(
|
||||
message,
|
||||
self.strings("chat-included").format(name),
|
||||
)
|
||||
else:
|
||||
try:
|
||||
a = await message.client.get_entity(args)
|
||||
except Exception:
|
||||
return await utils.answer(message, self.strings("id-wrong"))
|
||||
|
||||
ex.append(args)
|
||||
self.db.set("RPMod", "exlist", ex)
|
||||
try:
|
||||
name = a.title
|
||||
except Exception:
|
||||
name = a.first_name
|
||||
await utils.answer(message, self.strings("chat-excluded").format(name))
|
||||
|
||||
elif args == "list":
|
||||
ex_len = len(ex)
|
||||
if ex_len == 0:
|
||||
await utils.answer(message, self.strings("empty-exclude"))
|
||||
return
|
||||
sms = self.strings("excluded-chats")
|
||||
for i in ex:
|
||||
try:
|
||||
a = await message.client.get_entity(i)
|
||||
except Exception:
|
||||
await utils.answer(message, self.strings("id-wrong"))
|
||||
return
|
||||
try:
|
||||
name = a.title
|
||||
except Exception:
|
||||
name = a.first_name
|
||||
sms += f"\n• <b><u>{name}</u> --- </b><code>{i}</code>"
|
||||
await utils.answer(message, sms)
|
||||
else:
|
||||
await utils.answer(message, self.strings("s-t-wrong"))
|
||||
|
||||
async def useracceptcmd(self, message):
|
||||
"""Adding/removing users/chats, allowed to use your commands.
|
||||
.useraccept {id/reply}
|
||||
To add chat use without reply and args. Use with -l (L) to see list of users/chats."""
|
||||
reply = await message.get_reply_message()
|
||||
args = utils.get_args_raw(message)
|
||||
user_a = self.db.get("RPMod", "useraccept")
|
||||
if not reply and not args and message.is_group:
|
||||
chat = message.chat
|
||||
if chat.id not in user_a["chats"]:
|
||||
user_a["chats"].append(chat.id)
|
||||
return await utils.answer(
|
||||
message,
|
||||
self.strings("on-in-chat").format(chat.title),
|
||||
)
|
||||
else:
|
||||
user_a["chats"].remove(chat.id)
|
||||
return await utils.answer(
|
||||
message,
|
||||
self.strings("off-in-chat").format(chat.title),
|
||||
)
|
||||
|
||||
elif args.lower() == "-l" or args.lower() == "л":
|
||||
sms = self.strings("who-have")
|
||||
for k, v in user_a.items():
|
||||
if k == "chats":
|
||||
sms += '\n' + self.strings("chats-s")
|
||||
else:
|
||||
sms += '\n' + self.strings("users-s")
|
||||
for i in v:
|
||||
try:
|
||||
user = (
|
||||
(await message.client.get_entity(int(i))).title
|
||||
if k == "chats"
|
||||
else (await message.client.get_entity(int(i))).first_name
|
||||
)
|
||||
sms += f"\n<b>• <u>{user}</u> ---</b> <code>{i}</code>"
|
||||
except Exception:
|
||||
sms += f"\n<b>•</b> <code>{i}</code>"
|
||||
await utils.answer(message, sms)
|
||||
|
||||
elif args or reply:
|
||||
args = int(args) if args.isdigit() else reply.sender_id
|
||||
if args in user_a["users"]:
|
||||
user_a["users"].remove(args)
|
||||
self.db.set("RPMod", "useraccept", user_a)
|
||||
await utils.answer(
|
||||
message,
|
||||
self.strings("off-for-usr").format(args)
|
||||
)
|
||||
elif args in user_a["chats"]:
|
||||
user_a["chats"].remove(args)
|
||||
self.db.set("RPMod", "useraccept", user_a)
|
||||
await utils.answer(
|
||||
message, self.strings("off-in-chat").format(args)
|
||||
)
|
||||
elif (
|
||||
args not in user_a["chats"]
|
||||
and type(await message.client.get_entity(args)) == Channel
|
||||
):
|
||||
user_a["chats"].append(args)
|
||||
self.db.set("RPMod", "useraccept", user_a)
|
||||
await utils.answer(
|
||||
message, self.strings("on-in-chat").format(args)
|
||||
)
|
||||
else:
|
||||
user_a["users"].append(args)
|
||||
self.db.set("RPMod", "useraccept", user_a)
|
||||
await utils.answer(
|
||||
message,
|
||||
self.strings("on-for-usr").format(args),
|
||||
)
|
||||
else:
|
||||
await utils.answer(message, self.strings("s-t-wrong"))
|
||||
|
||||
async def mmminfocmd(self, message):
|
||||
"""Read mod information and updates."""
|
||||
await utils.answer(message, self.strings("whatschanged"))
|
||||
|
||||
async def rpchatscmd(self, message):
|
||||
"""Use: .rpchats to see list of chats where RP commands are allowed."""
|
||||
user_a = self.db.get("RPMod", "useraccept")
|
||||
sms = self.strings("who-have")
|
||||
for i in user_a["chats"]:
|
||||
try:
|
||||
chat = await message.client.get_entity(i)
|
||||
sms += f"\n• <b><u>{chat.title}</u> ---</b> <code>{i}</code>"
|
||||
except Exception:
|
||||
sms += f"\n• <code>{i}</code>"
|
||||
await utils.answer(message, sms)
|
||||
|
||||
async def watcher(self, message):
|
||||
try:
|
||||
status = self.db.get("RPMod", "status")
|
||||
commands = self.db.get("RPMod", "nrpcommands")
|
||||
ex = self.db.get("RPMod", "exlist")
|
||||
nicks = self.db.get("RPMod", "rpnicks")
|
||||
users_accept = self.db.get("RPMod", "useraccept")
|
||||
|
||||
chat_rp = await message.client.get_entity(message.to_id)
|
||||
if status != 1 or chat_rp.id in ex:
|
||||
return
|
||||
|
||||
me_id = (await message.client.get_me()).id
|
||||
|
||||
if (
|
||||
message.sender_id not in users_accept["users"]
|
||||
and message.sender_id != me_id
|
||||
and chat_rp.id not in users_accept["chats"]
|
||||
):
|
||||
return
|
||||
|
||||
me = await message.client.get_entity(message.sender_id)
|
||||
|
||||
if str(me.id) in nicks.keys():
|
||||
nick = nicks[str(me.id)]
|
||||
else:
|
||||
nick = me.first_name
|
||||
|
||||
if ' ' in message.text and '\n' not in message.text:
|
||||
args = message.text.split(' ', 1)[0].casefold() + ' ' + message.text.split(' ', 1)[1]
|
||||
|
||||
elif '\n' in message.text:
|
||||
arl = message.text.split('\n', 1)
|
||||
if ' ' in arl[0]:
|
||||
args = arl[0].split(' ', 1)[0].casefold() + ' ' + arl[0].split(' ', 1)[1] + '\n' + arl[1]
|
||||
else:
|
||||
args = arl[0].casefold() + '\n' + arl[1]
|
||||
|
||||
else:
|
||||
args = message.text.casefold()
|
||||
|
||||
lines = args.splitlines()
|
||||
tags = lines[0].split(" ")
|
||||
|
||||
if not tags[-1].startswith("@"):
|
||||
reply = await message.get_reply_message()
|
||||
user = await message.client.get_entity(reply.sender_id)
|
||||
else:
|
||||
if not tags[-1][1:].isdigit():
|
||||
user = await message.client.get_entity(tags[-1])
|
||||
else:
|
||||
user = await message.client.get_entity(int(tags[-1][1:]))
|
||||
lines[0] = lines[0].rsplit(" ", 1)[0]
|
||||
|
||||
detail = lines[0].split(" ", maxsplit=1)
|
||||
if len(detail) < 2:
|
||||
detail.append(" ")
|
||||
|
||||
if detail[0] not in commands.keys():
|
||||
return
|
||||
|
||||
command = commands[detail[0]]
|
||||
|
||||
detail[1] = " " + detail[1]
|
||||
user.first_name = (
|
||||
nicks[str(user.id)] if str(user.id) in nicks else user.first_name
|
||||
)
|
||||
|
||||
action_decoration = self.config['action_decoration']
|
||||
replica_decoration = self.config['replica_decoration']
|
||||
bubble = self.config['speech_bubble']
|
||||
|
||||
if 'bold' in action_decoration:
|
||||
s1 = ["<b>", "</b>"]
|
||||
elif 'italic' in action_decoration:
|
||||
s1 = ["<i>", "</i>"]
|
||||
elif 'underline' in action_decoration:
|
||||
s1 = ["<u>", "</u>"]
|
||||
elif 'strikethrough' in action_decoration:
|
||||
s1 = ["<s>", "</s>"]
|
||||
elif 'spoiler' in action_decoration:
|
||||
s1 = ["<spoiler>", "</spoiler>"]
|
||||
else:
|
||||
s1 = ["", ""]
|
||||
|
||||
if 'bold' in replica_decoration:
|
||||
s2 = ["<b>", "</b>"]
|
||||
elif 'italic' in replica_decoration:
|
||||
s2 = ["<i>", "</i>"]
|
||||
elif 'underline' in replica_decoration:
|
||||
s2 = ["<u>", "</u>"]
|
||||
elif 'strikethrough' in replica_decoration:
|
||||
s2 = ["<s>", "</s>"]
|
||||
elif 'spoiler' in replica_decoration:
|
||||
s2 = ["<spoiler>", "</spoiler>"]
|
||||
else:
|
||||
s2 = ["", ""]
|
||||
|
||||
rp_message_send = ""
|
||||
if command[1]:
|
||||
rp_message_send += command[1] + " | "
|
||||
|
||||
rp_message_send += f"<a href=tg://user?id={me.id}>{nick}</a> {s1[0]}{command[0]}{s1[1]} " \
|
||||
f"<a href=tg://user?id={user.id}>{user.first_name}</a>{detail[1]}"
|
||||
|
||||
if len(lines) >= 2:
|
||||
replica = '\n'.join(lines[1:])
|
||||
rp_message_send += f"\n{bubble} {self.strings('with-replica')} {s2[0]}{replica}{s2[1]}"
|
||||
|
||||
return await utils.answer(message, rp_message_send)
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
@staticmethod
|
||||
def merge_dict(d1, d2):
|
||||
d_all = {**d1, **d2}
|
||||
for key in d_all:
|
||||
d_all[key] = {**d1[key], **d_all[key]}
|
||||
return d_all
|
||||
Reference in New Issue
Block a user