# meta developer: @trololo_1
# MIT License
# Copyright (c) 2022 trololo65
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
# The above copyright notice and this permission notice shall be included in all
# copies or substantial portions of the Software.
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
import subprocess
try:
import emoji # max work version 1.7.0
except:
mod_inst = subprocess.Popen("pip install emoji==1.7.0", shell=True)
mod_inst.wait()
import emoji
from .. import loader, utils
import string, pickle, re
from telethon.tl.types import Channel
conf_default = {
'-s1':{ # СТИЛИ для действия
'1': [False, 'жирный', '', ''],
'2': [False, 'курсив', '', ''],
'3': [False, 'подчеркнутый', '', ''],
'4': [False, 'зачёркнутый', '', ''],
'5': [False, 'скрытый', '', ''],
},
'-s2':{ # СТИЛИ для "С репликой"
'1': [True, 'жирный', '', ''],
'2': [False, 'курсив', '', ''],
'3': [False, 'подчеркнутый', '', ''],
'4': [False, 'зачёркнуто', '', ''],
'5': [False, 'скрытый', '', ''],
},
'-s3':{ # СТИЛИ для реплики
'1': [False, 'жирный', '', ''],
'2': [False, 'курсив', '', ''],
'3': [False, 'подчеркнутый', '', ''],
'4': [False, 'зачёркнутый', '', ''],
'5': [False, 'скрытый', '', ''],
},
'-sE':{ # ЭМОДЗИ перед репликой
'1': [True, '💬'],
'2': [False, '💭'],
'3': [False, '🗯'],
'4': [False, '✉️'],
'5': [False, '🔊'],
'6': [False, '🏳️🌈']
},
'-sS':{ # РАЗРЫВ строки в реплике
'1': [True, 'пробел', ' '],
'2': [False, 'разрыв строки', '\n'],
'3': [False, 'точка + пробел', '. '],
'4': [False, 'запятая + пробел', ', ']}
}
@loader.tds
class RPMod(loader.Module):
"""Модуль RPMod."""
strings = {'name': 'RPMod'}
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", "rprezjim", False):
self.db.set("RPMod", "rprezjim", 1)
if not self.db.get('RPMod', 'rpnicks', False):
self.db.set('RPMod', 'rpnicks', {})
if not self.db.get('RPMod', 'rpcomands', False):
comands = {'чмок': 'чмокнул', 'лизь': 'лизнул', 'кусь': 'кусьнул', 'поцеловать': 'поцеловал', 'выебать': 'выебал', 'трахнуть': 'трахнул', 'выпороть': 'выпорол', 'шлепнуть': 'шлепнул', 'отлизать': 'отлизал у', 'прижать': 'прижал', 'погладить': 'погладил', 'да.': 'пизда', 'где.': 'в пизде', 'нет.': 'пидора ответ', 'бывает.': 'ну это пиздец конечно на самом деле', 'обнять': 'обнял'}
self.db.set('RPMod', 'rpcomands', comands)
if not self.db.get('RPMod', 'rpemoji', False):
self.db.set('RPMod', 'rpemoji', {'лизь': '👅'})
if not self.db.get('RPMod', 'useraccept', False):
self.db.set('RPMod', 'useraccept', {"chats": [], "users": []})
elif type(self.db.get('RPMod', 'useraccept')) == type([]):
self.db.set('RPMod', 'useraccept', {"chats": [], "users": self.db.get('RPMod', 'useraccept')})
if self.db.get("RPMod", "rpconfigurate", False): # ДЛЯ разных версий модуля.
self.db.set("RPMod", "rpconfigurate", self.merge_dict(conf_default, self.db.get("RPMod", "rpconfigurate")))
async def dobrpcmd(self, message):
"""Используй: .dobrp (команда) / (действие) / (эмодзи) чтобы добавить команду. Можно и без эмодзи."""
args = utils.get_args_raw(message)
dict_rp = self.db.get('RPMod', 'rpcomands')
try:
key_rp = str(args.split('/')[0]).strip()
value_rp = str(args.split('/', maxsplit=2)[1]).strip()
lenght_args = args.split('/')
count_emoji = 0
if len(lenght_args) >= 3:
emoji_rp = str(args.split('/', maxsplit=2)[2]).strip()
dict_emoji_rp = self.db.get('RPMod', 'rpemoji')
r = emoji_rp
lst = []
count_emoji = 1
for x in r:
if x in emoji.UNICODE_EMOJI['en'].keys(): lst.append(x)
if x.isalpha() or x.isspace() or x.isdigit() or x in string.punctuation:
await utils.answer(message, f"Были введены не только эмодзи(пробел тоже символ). ")
return
if len(lst) > 3:
await utils.answer(message, f"Было введено более 3 эмодзи.")
return
elif not emoji_rp or not emoji_rp.strip():
await utils.answer(message, f"Разделитель для эмодзи есть, а их нет? хм.")
return
key_len = [len(x) for x in key_rp.split()]
if len(dict_rp) >= 70:
await utils.answer(message, 'Достигнут лимит рп команд.')
elif not key_rp or not key_rp.strip():
await utils.answer(message, 'Вы не ввели название рп команды.')
elif not value_rp or not value_rp.strip():
await utils.answer(message, 'Вы не ввели действие для рп команды.')
elif int(len(key_len)) > 1:
await utils.answer(message, 'В качестве рп команды было введено больше одного слова.')
elif key_rp == 'all':
await utils.answer(message, 'Использовать \'all\' в качестве названия команды запрещено!')
elif count_emoji == 1:
dict_emoji_rp[key_rp] = emoji_rp
dict_rp[key_rp]= value_rp
self.db.set('RPMod', 'rpcomands', dict_rp)
self.db.set('RPMod', 'rpemoji', dict_emoji_rp)
await utils.answer(message, f'Команда \'{key_rp}\' успешно добавлена с эмодзи \'{emoji_rp}\'!')
else:
dict_rp[key_rp]= value_rp
self.db.set('RPMod', 'rpcomands', dict_rp)
await utils.answer(message, f'Команда \'{key_rp}\' успешно добавлена!')
except:
await utils.answer(message, 'Вы не ввели разделитель /, либо вовсе ничего не ввели.')
async def delrpcmd(self, message):
"""Используй: .delrp (команда) чтобы удалить команду.\n Используй: .delrp all чтобы удалить все команды."""
args = utils.get_args_raw(message)
dict_rp = self.db.get('RPMod', 'rpcomands')
dict_emoji_rp = self.db.get('RPMod', 'rpemoji')
key_rp = str(args)
count = 0
if key_rp == 'all':
dict_rp.clear()
dict_emoji_rp.clear()
self.db.set('RPMod', 'rpcomands', dict_rp)
self.db.set('RPMod', 'rpemoji', dict_emoji_rp)
await utils.answer(message, 'Список рп команд очищен.')
return
elif not key_rp or not key_rp.strip():
await utils.answer(message, 'Вы не ввели команду.')
else:
try:
if key_rp in dict_emoji_rp:
dict_rp.pop(key_rp)
dict_emoji_rp.pop(key_rp)
self.db.set('RPMod', 'rpcomands', dict_rp)
self.db.set('RPMod', 'rpemoji', dict_emoji_rp)
else:
dict_rp.pop(key_rp)
self.db.set('RPMod', 'rpcomands', dict_rp)
await utils.answer(message, f'Команда \'{key_rp}\' успешно удалена!')
except KeyError:
await utils.answer(message, 'Команда не найдена.')
async def rpmodcmd(self, message):
"""Используй: .rpmod чтобы включить/выключить RP режим.\nИспользуй: .rpmod toggle чтобы сменить режим на отправку или изменение смс."""
status = self.db.get("RPMod", "status")
rezjim = self.db.get("RPMod", "rprezjim")
args = utils.get_args_raw(message)
if not args:
if status == 1:
self.db.set("RPMod", "status", 2)
await utils.answer(message, "RP Режим выключен")
else:
self.db.set("RPMod", "status", 1)
await utils.answer(message, "RP Режим включен")
elif args.strip() == 'toggle':
if rezjim == 1:
self.db.set("RPMod", "rprezjim", 2)
await utils.answer(message, "RP Режим изменён на отправку смс.")
else:
self.db.set("RPMod", "rprezjim", 1)
await utils.answer(message, "RP Режим изменён на изменение смс.")
else:
await utils.answer(message, 'Что то не так.. ')
async def rplistcmd(self, message):
"""Используй: .rplist чтобы посмотреть список рп команд."""
com = self.db.get('RPMod', 'rpcomands')
emojies = self.db.get('RPMod', 'rpemoji')
l = len(com)
listComands = f'У вас рп команд: {l} из 70. '
if len(com) == 0:
await utils.answer(message, 'Увы, у вас нету рп команд. :(')
return
for i in com:
if i in emojies.keys():
listComands+=f'\n• {i} - {com[i]} | {emojies[i]}'
else:
listComands+=f'\n• {i} - {com[i]}'
await utils.answer(message, listComands)
async def rpnickcmd(self, message):
"""Используй: .rpnick (ник) чтобы сменить ник пользователю или себе. С аргументом -l вызовет все ники."""
args = utils.get_args_raw(message).strip()
reply = await message.get_reply_message()
nicks = self.db.get('RPMod', 'rpnicks')
if args == '-l':
str_nicks = '• ' + '\n •'.join(' --- '.join([f'{user_id}', f'{nick}']) for user_id, nick in nicks.items())
return await utils.answer(message, str_nicks)
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, f"Ник пользователя {str(user.id)} изменён на '{user.first_name}'")
lst = []
nick = ''
for x in args:
if x in emoji.UNICODE_EMOJI['en'].keys(): lst.append(x)
if x not in emoji.UNICODE_EMOJI['en'].keys(): nick+=x
if len(lst) > 3:
await utils.answer(message, f"Ник пользователя {str(user.id)} изменён на '{args}'")
elif len(lst) + len(nick) >= 45:
await utils.answer(message, f"Ник превышает лимит в 45 символов(возможно эмодзи имеют длину более 1 символа).")
else:
nicks[str(user.id)] = args
self.db.set('RPMod', 'rpnicks', nicks)
await utils.answer(message, f"Ник пользователя {str(user.id)} изменён на '{args}'")
async def rpbackcmd(self, message):
"""Бекап рп команд.\n .rpback для просмотра аргументов. """
args = utils.get_args_raw(message).strip()
comands = self.db.get('RPMod', 'rpcomands')
emojies = self.db.get('RPMod', 'rpemoji')
file_name = 'RPModBackUp.pickle'
id = message.to_id
reply = await message.get_reply_message()
if not args:
await utils.answer(message, 'Аргументы:\n-b -- сделать бекап.\n-r загрузить бекап.(используй с реплаем на файл)')
if args == '-b':
try:
await message.delete()
dict_all = { 'rp': comands, 'emj': emojies}
with open(file_name, 'wb') as f:
pickle.dump(dict_all, f)
await message.client.send_file(id, file_name)
except Exception as e:
await utils.answer(message, f"Ошибка:\n{e}")
elif args == '-r' and reply:
try:
if not reply.document:
await utils.answer(message, f"Это не файл.")
await reply.download_media(file_name)
with open(file_name, 'rb') as f:
data = pickle.load(f)
rp = data['rp']
emj = data['emj']
result_rp = dict(comands, **rp)
result_emj = dict(emojies, **emj)
self.db.set('RPMod', 'rpcomands', result_rp)
self.db.set('RPMod', 'rpemoji', result_emj)
await utils.answer(message, f"Команды обновлены!")
except Exception as e:
await utils.answer(message, f"Ошибка:\n{e}")
async def rpblockcmd(self, message):
"""Используй: .rpblock чтобы добавить/удалить исключение(использовать в нужном чате).\nИспользуй: .rpblock list чтобы просмотреть чаты в исключениях.\nИспользуй .rpblock (ид) чтобы удалить чат из исключений."""
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:
name = a.first_name
await utils.answer(message, f'Чат {name}[{a.id}] удален из исключений.')
else:
ex.append(a.id)
self.db.set("RPMod", "exlist", ex)
try:
name = a.title
except:
name = a.first_name
await utils.answer(message, f'Чат {name}[{a.id}] добавлен в исключения.')
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:
name = a.first_name
await utils.answer(message, f'Чат {name}({args}) удален из исключений.')
else:
try:
a = await message.client.get_entity(args)
except:
await utils.answer(message, 'Неверный ид.')
ex.append(args)
self.db.set("RPMod", "exlist", ex)
try:
name = a.title
except:
name = a.first_name
await utils.answer(message, f'Чат {name}[{a.id}] добавлен в исключения.')
elif args == 'list':
ex_len = len(ex)
if ex_len == 0:
await utils.answer(message, f'Список исключений пуст.')
return
sms = f' Чаты, которые есть в исключениях({ex_len}):'
for i in ex:
try:
a = await message.client.get_entity(i)
except:
await utils.answer(message, f'Неверный ид -- {a}')
return
try:
name = a.title
except:
name = a.first_name
sms+=f'\n• {name} --- {i}'
await utils.answer(message, sms)
else:
await utils.answer(message, 'Что то пошло не так..')
async def useracceptcmd(self, message):
""" Добавление/удаление пользователей/чатов, разрешенным использовать ваши команды.\n .useraccept {id/reply}\nДля добавления чата используй без реплая и аргументов."""
reply = await message.get_reply_message()
args = utils.get_args_raw(message)
userA = self.db.get('RPMod', 'useraccept')
if not reply and not args and message.is_group:
chat = message.chat
if chat.id not in userA["chats"]:
userA["chats"].append(chat.id)
return await utils.answer(message, f'Чату {chat.title}[{chat.id}] открыт доступ.')
else:
userA["chats"].remove(chat.id)
return await utils.answer(message, f'Чату {chat.title}[{chat.id}] закрыт доступ.')
elif args == '-l':
sms = 'Пользователи, у которых есть доступ к командам:'
for k, v in userA.items():
if k == 'chats':
sms+= f'\nЧатов:'
else:
sms+= f'\nПользователей:'
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• {user} --- {i}'
except:
sms+= f'\n• {i}'
await utils.answer(message, sms)
elif args or reply:
args = int(args) if args.isdigit() else reply.sender_id
if args in userA["users"]:
userA["users"].remove(args)
self.db.set('RPMod', 'useraccept', userA)
await utils.answer(message, f'Пользователю {args} был закрыт доступ.')
elif args in userA["chats"]:
userA["chats"].remove(args)
self.db.set('RPMod', 'useraccept', userA)
await utils.answer(message, f'Чату {args} был закрыт доступ.')
elif args not in userA["chats"] and type(await message.client.get_entity(args)) == Channel:
userA["chats"].append(args)
self.db.set('RPMod', 'useraccept', userA)
await utils.answer(message, f'Чату {args} был открыт доступ.')
else:
userA["users"].append(args)
self.db.set('RPMod', 'useraccept', userA)
await utils.answer(message, f'Пользователю {args} был открыт доступ.')
else:
await utils.answer(message, 'Что то не так..')
async def rpconfcmd(self, message):
"""Настройка шаблона для рп"""
conf = self.db.get("RPMod", "rpconfigurate", conf_default)
args = utils.get_args_raw(message)
if not args:
sms = '⚙️ Настройка шаблона для команды:\n'
s1 = '\n'.join([' | '.join([key, value[1], '✅' if value[0] else '❌']) for key, value in conf['-s1'].items()])
s2 = '\n'.join([' | '.join([key, value[1], '✅' if value[0] else '❌']) for key, value in conf['-s2'].items()])
s3 = '\n'.join([' | '.join([key, value[1], '✅' if value[0] else '❌']) for key, value in conf['-s3'].items()])
sE = '\n'.join([' | '.join([key, value[1], '✅' if value[0] else '❌']) for key, value in conf['-sE'].items()])
sS = '\n'.join([' | '.join([key, value[1], '✅' if value[0] else '❌']) for key, value in conf['-sS'].items()])
msg_text = f'⚙️ Настройка шаблона для команды:\n-s1 --- включить/выключить стиль для действия:\n{s1}\n-s2 --- аналогично для s1, но действует на текст "С репликой":\n{s2}\n-s3 --- аналогично для s2, но действует на саму реплику:\n{s3}\n-sE --- выбор эмодзи перед репликой:\n{sE}\n-sS --- выбор символа для разрыва строк в реплике:\n{sS}\n\nПример:\n.rpconf -s1 2'
return await utils.answer(message, msg_text)
args = args.split(' ')
if len(args) <= 1:
return await utils.answer(message, 'Было введено меньше двух аргументов.')
try:
if args[0] == '-s1' or args[0] == '-s2' or args[0] == '-s3':
if conf[args[0]][args[1]][0]:
conf[args[0]][args[1]][0] = False
else:
conf[args[0]][args[1]][0] = True
elif args[0] == '-sE' or args[0] == '-sS':
for i in conf[args[0]].keys():
conf[args[0]][i][0] = False
conf[args[0]][args[1]][0] = True
else:
return await utils.answer(message, 'Неизвестный аргумент.')
except:
return await utils.answer(message, 'Неверная цифра.')
self.db.set("RPMod", "rpconfigurate", conf)
await utils.answer(message, f'Конфигурация успешно изменена.')
async def watcher(self, message):
try:
status = self.db.get("RPMod", "status")
comand = self.db.get('RPMod', 'rpcomands')
rezjim = self.db.get('RPMod', 'rprezjim')
emojies = self.db.get('RPMod', 'rpemoji')
ex = self.db.get("RPMod", "exlist")
nicks = self.db.get('RPMod', 'rpnicks')
users_accept = self.db.get('RPMod', 'useraccept')
conf = self.db.get("RPMod", "rpconfigurate", conf_default)
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
args = message.text.lower()
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 comand.keys(): return
detail[1] = ' ' + detail[1]
user.first_name = nicks[str(user.id)] if str(user.id) in nicks else user.first_name
sE = ''.join([''.join([ value[1] if value[0] else '']) for key, value in conf['-sE'].items()])
s1 = [''.join([ value[2] if value[0] else '' for value in conf['-s1'].values()]), ''.join([ value[3] if value[0] else '' for value in dict(reversed(list(conf['-s1'].items()))).values()])]
s2 = [''.join([ value[2] if value[0] else '' for key, value in conf['-s2'].items()]), ''.join([ value[3] if value[0] else '' for value in dict(reversed(list(conf['-s2'].items()))).values()])]
s3 = [''.join([ value[2] if value[0] else '' for key, value in conf['-s3'].items()]), ''.join([ value[3] if value[0] else '' for value in dict(reversed(list(conf['-s3'].items()))).values()])]
sS = ''.join([''.join([ value[2] if value[0] else '']) for key, value in conf['-sS'].items()])
rpMessageSend = ''
if detail[0] in emojies.keys(): rpMessageSend += emojies[detail[0]] + ' | '
rpMessageSend += f"{nick} {s1[0]}{comand[detail[0]]}{s1[1]} {user.first_name}{detail[1]}"
if len(lines) >= 2: rpMessageSend += "\n{0} {1[0]}С репликой:{1[1]} {2[0]}{3}{2[1]}".format(sE, s2, s3, sS.join(lines[1:]))
if rezjim == 1:
return await utils.answer(message, rpMessageSend)
else:
return await message.respond(rpMessageSend)
except: pass
def merge_dict(self, d1, d2):
d_all = {**d1, **d2}
for key in d_all:
d_all[key] = {**d1[key], **d_all[key]}
return d_all