# meta developer: @trololo_1
from .. import loader, utils
import asyncio, pytz, re, telethon
from telethon.tl.types import MessageEntityTextUrl
import json as JSON
from datetime import datetime, date, time
class NumMod(loader.Module):
"Заражает по реплаю."
strings={"name": "NumMod"}
async def client_ready(self, client, db):
self.db = db
if not self.db.get("NumMod", "exUsers", False):
self.db.set("NumMod", "exUsers", [])
if not self.db.get("NumMod", "infList", False):
self.db.set("NumMod", "infList", {})
async def numcmd(self, message):
".num [arg] [arg] [arg]....\nВ качестве аргументов используй числа. или первые символы строки."
reply = await message.get_reply_message()
a = reply.text
exlist = self.db.get("NumMod", "exUsers")
count_st = 0
count_hf = 0
if not reply:
await message.edit('Нет реплая.')
return
args = utils.get_args_raw(message)
list_args=[]
if not args:
await message.edit('Нет аргументов')
return
for i in args.split(' '):
if '-' in i:
ot_do = i.split('-')
try:
for x in range(int(ot_do[0]),int(ot_do[1])+1):
list_args.append(str(x))
except:
await message.respond('Используй правильно функцию "от-до"')
return
else:
list_args.append(i)
lis = a.splitlines()
for start in list_args:
for x in lis:
if x.lower().startswith(str(start.lower())):
count_st = 1
if 'href="' in x:
count_hf = 1
b=x.find('href="')+6
c=x.find('">')
link = x[b:c]
if link.startswith('tg'):
list = '@' + link.split('=')[1]
if list in exlist:
await message.reply(f'Исключение: {list}')
else:
await message.reply(f'заразить {list}')
break
elif link.startswith('https://t.me'):
a ='@' + str(link.split('/')[3])
if a in exlist:
await message.reply(f'Исключение: {a}')
else:
await message.reply(f'заразить {a}')
break
else:
await message.reply('что за хуета?')
break
await asyncio.sleep(3)
if not count_st:
await message.edit('Не найдено ни одного совпадения в начале строк с аргументами.')
elif not count_hf:
await message.edit('Не найдено ни одной ссылки.')
elif len(list_args) >= 3:
await message.respond('Заражения успешно завершены.')
async def zarcmd(self, message):
"Заражает всех по реплаю."
reply = await message.get_reply_message()
exlist = self.db.get("NumMod", "exUsers")
if not reply:
await message.edit('Нет реплая.')
return
json = JSON.loads(reply.to_json())
for i in range(0, len(reply.entities) ):
try:
link = json["entities"][i]["url"]
if link.startswith('tg'):
list = '@' + link.split('=')[1]
if list in exlist:
await message.reply(f'Исключение: {list}')
else:
await message.reply('заразить ' + list)
elif link.startswith('https://t.me'):
a ='@' + str(link.split('/')[3])
if a in exlist:
await message.reply(f'Исключение: {a}')
else:
await message.reply(f'заразить {a}')
else:
await message.reply('что за хуета?')
except:
await message.reply("заразить " + reply.raw_text[json["entities"][i]["offset"]:json["entities"][i]["offset"]+json["entities"][i]["length"]] )
await asyncio.sleep(3)
await message.delete()
async def exnumcmd(self, message):
"Добавляет исключения в модуль.\nИспользуй: .exnum {@user/@id}"
args = utils.get_args_raw(message)
exlistGet = self.db.get("NumMod", "exUsers")
exlist = exlistGet.copy()
if not args:
if len(exlist) < 1:
await message.edit('Список исключений пуст.')
return
exsms = ''
count = 0
for i in exlist:
count+=1
exsms+=f'{count}. {i}\n'
message = await utils.answer(message, exsms)
return
if args == 'clear':
exlist.clear()
self.db.set("NumMod", "exUsers", exlist)
await message.edit('Список исключений очистен.')
return
if len(args.split(' ')) > 1 or args[0] != '@':
await message.edit('Количество аргументов больше одного, либо начинается не со знака @')
return
if args in exlist:
exlist.remove(args)
self.db.set("NumMod", "exUsers", exlist)
await message.edit(f'Пользователь {args} исключён.')
return
exlist.append(args)
self.db.set("NumMod", "exUsers", exlist)
await message.edit(f'Пользователь {args} добавлен.')
async def zarlistcmd(self, message):
""" Лист ваших заражений.\n.zarlist {@id/user} {count} {args}\nДля удаления: .zarlist {@id/user}\nАргументы:\n-k -- добавить букву k(тысяч) к числу.\n-f -- поиск по ид'у/юзеру.\n-r -- добавлению в список по реплаю."""
args = utils.get_args_raw(message)
infList = self.db.get("NumMod", "infList")
timezone = "Europe/Kiev"
vremya = datetime.now(pytz.timezone(timezone)).strftime("%d.%m")
try:
args_list = args.split(' ')
except:
pass
if not args:
if not infList:
await utils.answer(message, "Лист заражений пуст.")
return
sms = ''
for key, value in infList.items():
sms+=f'• {key} -- {value[0]} [{value[1]}]\n'
await utils.answer(message, sms)
return
if not '-r' in args.lower():
if args_list[0] == "clear":
infList.clear()
self.db.set("NumMod", "infList", infList)
await utils.answer(message, "Лист заражений очищен.")
elif args_list[0] in infList and '-f' in args.lower():
user = infList[args_list[0]]
await utils.answer(message, f"• {args_list[0]} -- {user[0]} [{user[1]}]")
elif len(args_list) == 1 and args_list[0] in infList:
infList.pop(args_list[0])
self.db.set("NumMod", "infList", infList)
await utils.answer(message, f"Пользователь {args} удалён из списка.")
elif args_list[0][0] != '@':
await utils.answer(message, 'Это не @ид/юзер.')
else:
try:
user, count = str(args_list[0]), float(args_list[1])
except:
await utils.answer(message, "Данные были введены не корректно")
return
k = ''
if '-k' in args.lower():
k+='k'
infList[user] = [str(count)+k, vremya]
self.db.set("NumMod", "infList", infList)
await utils.answer(message, f"Пользователь {user} добавлен в список заражений.\nЧисло: {count}{k}\nДата: {vremya}")
else:
reply = await message.get_reply_message()
if not reply:
return await utils.answer(message, 'Реплай должен быть на смс ириса "...подверг заражению..."')
elif reply.sender_id != 707693258 and not 'подверг заражению' in reply.text or not 'подвергла заражению' in reply.text:
return await utils.answer(message, 'Реплай должен быть на смс ириса "...подверг заражению..."')
else: #☣
text = reply.text
x = text.index('☣')+4
count = text[x:].split(' ', maxsplit=1)[0]
x = text.index('user?id=') + 8
user = '@' + text[x:].split('"', maxsplit=1)[0]
infList[user] = [str(count), vremya]
self.db.set("NumMod", "infList", infList)
await utils.answer(message, f"Пользователь {user} добавлен в список заражений.\nЧисло: {count}\nДата: {vremya}")
async def numfiltercmd(self, message):
""" .numfilter {args1} {args2 OR reply} \nВызови команду, чтобы просмотреть аргументы."""
args = utils.get_args_raw(message)
reply = await message.get_reply_message()
filter_and_users = self.db.get("NumMod", "numfilter", {'users': [], 'filter': None, 'status': False})
if not args:
return await utils.answer(message, f"-sU --- добавить|удалить юзеров(не больше 5), на которых будет триггериться фильтр(ид|реплай).\n[{', '.join(list('' + i + '' for i in filter_and_users['users']))}]\n-sF --- установить фильтр. Допустим один.\n{filter_and_users['filter'] if filter_and_users['filter'] else '❌Не установлен.'}\n-t --- запустить|остановить.\n{'✅Запущен' if filter_and_users['status'] else '❌Остановлен'}.\n\nРаботает так:\n[фильтр] (бей|зарази[ть]) (1-10) ((@id|user)|link(даже полный линк ид'а))\n[фильтр] лечись|вакцин[ау]|купи[ть] вакцину\n[фильтр] жертвы|покажи жертв\n[фильтр] лаба?|покажи лабу?\nИгнор регистра!!")
args = args.split(' ', maxsplit=1)
if len(args) == 1 and not reply and args[0] != '-t':
return await utils.answer(message, '❌ Нет 2 аргумента и реплая.')
elif args[0] == '-sU':
try:
user_id = args[1]
if not user_id.isdigit():
return await utils.answer(message, 'Это не ид.')
except:
user_id = str(reply.sender_id)
if user_id in filter_and_users['users']:
filter_and_users['users'].remove(user_id)
await utils.answer(message, f"✅ Ид {user_id} удалён.")
elif len(filter_and_users['users']) <= 5:
filter_and_users['users'].append(user_id)
await utils.answer(message, f"✅ Ид {user_id} добавлен.")
else:
return await utils.answer(message, '❌ Превышен лимит в 5 юзеров.')
return self.db.set("NumMod", "numfilter", filter_and_users)
elif args[0] == '-sF':
try:
filter_and_users['filter'] = args[1].lower().strip()
self.db.set("NumMod", "numfilter", filter_and_users)
return await utils.answer(message, f"✅ Фильтр ~~~ {args[1]} ~~~ успешно установлен!")
except:
return await utils.answer(message, "Где 2 аргумент❓")
elif args[0] == '-t':
if filter_and_users['status']:
filter_and_users['status'] = False
self.db.set("NumMod", "numfilter", filter_and_users)
return await utils.answer(message, "❌ Фильтр остановлен.")
else:
filter_and_users['status'] = True
self.db.set("NumMod", "numfilter", filter_and_users)
return await utils.answer(message, "✅ Фильтр запущен.")
else:
return await utils.answer(message, "❌ Неизвестный аргумент.")
async def watcher(self, message):
if not isinstance(message, telethon.tl.types.Message): return
filter_and_users = self.db.get("NumMod", "numfilter", {'users': [], 'filter': None, 'status': False})
user_id = str(message.sender_id)
if not filter_and_users['filter'] or not filter_and_users['status'] or user_id not in filter_and_users['users'] or message.is_private: return
text = message.raw_text.lower()
if not text.startswith(filter_and_users['filter']): return
send_mes = re.search(r"(?Pбей\s|зарази[ть]{,2}\s)(?P[1-9]?[0]?\s)?(?P@[0-9a-z_]+|(?:https?://)?t\.me/[0-9a-z_]+|tg://openmessage\?user_id=(?P[0-9]+))", text)
if send_mes:
send_mes = send_mes.groupdict()
send_mes['link'], send_mes['id'] = '@'+send_mes['id'] if send_mes['id'] else send_mes['link'], ''
send_mes['z'] = 'заразить '
send_mes['lvl'] = send_mes['lvl'] if send_mes['lvl'] else ''
mes = ''.join(send_mes.values())
return await message.respond(mes)
send_mes = re.search(r"лечись|вакцин[ау]|купи[ть]{,2} вакцину", text)
if send_mes:
return await message.respond('.купить вакцину')
send_mes = re.search(r"жертвы|покажи жертв", text)
if send_mes:
return await message.respond('.мои жертвы')
send_mes = re.search(r"лаба?|покажи лабу?", text)
if send_mes:
return await message.respond('.лаб')