Commited backup

This commit is contained in:
2025-07-10 21:02:34 +03:00
parent 952c1001e3
commit da0b80823e
1310 changed files with 254133 additions and 41 deletions

View File

@@ -0,0 +1,42 @@
# meta developer: @trololo_1
from .. import utils, loader
from asyncio import sleep
class BFGMod(loader.Module):
"""Send mes"""
strigs = {'name': 'BFGMod'}
async def client_ready(self, client, db):
self.db = db
async def bbtoncmd(self, message):
""" """
await utils.answer(message, '<b>Запущено</b>')
status = self.db.set('BFGMod', 'status1', True)
while status:
for i in range(15):
if not self.db.get('BFGMod', 'status1'): return
await message.respond('10')
await sleep(2)
status = self.db.get('BFGMod', 'status1')
await message.respond('🚀Оценивать')
async def bbtoffcmd(self, message):
""" """
self.db.set('BFGMod', 'status1', False)
await utils.answer(message, '<b>Остановлено</b>')
async def bfgoncmd(self, message):
""" """
await utils.answer(message, '<b>Запущено</b>')
status = self.db.set('BFGMod', 'status2', True)
while status:
await message.respond('копать материю')
await sleep(60*5)
status = self.db.get('BFGMod', 'status2')
if not status: return
async def bfgoffcmd(self, message):
""" """
self.db.set('BFGMod', 'status2', False)
await utils.answer(message, '<b>Остановлено</b>')

21
trololo65/Modules/Licence Normal file
View File

@@ -0,0 +1,21 @@
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.

View File

@@ -0,0 +1,32 @@
# meta developer: @trololo_1
from .. import loader, utils
@loader.tds
class LsSendMod(loader.Module):
"""Отправка смс в лс по юзеру пользователя."""
strings = {'name':'LsSend'}
async def sendcmd(self, message):
""" .send {юзер} {текст или реплай}"""
try:
reply = await message.get_reply_message()
text = utils.get_args_raw(message)
id = str(text.split(' ')[0])
check = []
for i in text.split(' '):
check.append(i)
if len(check) <= 1:
send = reply
else:
send = str(text.split(' ', maxsplit=1)[1])
if send:
await message.client.send_message(id, send)
await message.edit('<b>Сообщение успешно отправлено!</b>')
else:
await message.edit('<b>Не было сделано реплая или нет текста.</b>')
except:
await message.edit('<b>Неверный юзер, юзера нет вообще, либо ещё какая то ошибка.</b>')

View File

@@ -0,0 +1,60 @@
import asyncio
import logging
from .. import loader, utils
logger = logging.getLogger(__name__)
@loader.tds
class MorzeMod(loader.Module):
"""Конвертация текста в шифр Морзе и наоборот.
Символы использовать не советую, могут возникать ошибки!!"""
strings = {
"name": "Morze"
}
@loader.unrestricted
async def tomrzcmd(self, message):
""".tomrz [реплай или текст]"""
de = {'А': '•- ', 'Б': '-••• ', 'В': '•-- ', 'Г': '--• ', 'Д': '-•• ', 'Е': '', 'Ё': '', 'Ж': '•••- ', 'З': '--•• ', 'И': '•• ', 'Й': '•--- ', 'К': '-•- ', 'Л': '•-•• ', 'М': '-- ', 'Н': '-• ', 'О': '--- ', 'П': '•--• ', 'Р': '•-• ', 'С': '••• ', 'Т': '- ', 'У': '••- ', 'Ф': '••-• ', 'Х': '•••• ', 'Ц': '-•-• ', 'Ч': '---• ', 'Ш': '---- ', 'Щ': '--•- ', 'Ъ': '--•-- ', 'Ы': '-•-- ', 'Ь': '-••- ', 'Э': '••-•• ', 'Ю': '••-- ', 'Я': '•-•- ' ,'1': '•---- ','2':'••--- ','3':'•••-- ','4':'••••- ','5':'••••• ','6':'-•••• ','7':'--••• ','8':'---•• ','9':'----• ','0':'----- ','.':'•••••• ',',':'•-•-•- ',';':'-•-•-• ',':':'---••• ','?':'••--•• ','!':'--••-- ','-':'-••••- ','(':'-•--• ', ')':'-•--•- ', '/':'-••-• ' ,'"':'•-••-• ','+':'•-•-• ', '_':'••--•- ', '$':'•••-••- ', '@':'•--•-• ', '=':'-•••- ', '&':'•-••• ', }
reply = await message.get_reply_message()
text = utils.get_args_raw(message)
if reply and not text:
text = reply.raw_text
if not text:
return await utils.answer(message, "<code>Вы не ввели текст или не сделали реплай.</code>")
x = ''
for word in text.split():
for letter in word.upper():
x += de[letter]
x+=' '
await message.edit(x)
@loader.unrestricted
async def toabccmd(self, message):
""".toabc [реплай или текст]"""
en = {'•-': 'А', '-•••': 'Б', '•--': 'В', '--•': 'Г', '-••': 'Д', '': 'Е', '•••-': 'Ж', '--••': 'З', '••': 'И', '•---': 'Й', '-•-': 'К', '•-••': 'Л', '--': 'М', '-•': 'Н', '---': 'О', '•--•': 'П', '•-•': 'Р', '•••': 'С', '-': 'Т', '••-': 'У', '••-•': 'Ф', '••••': 'Х', '-•-•': 'Ц', '---•': 'Ч', '----': 'Ш', '--•-': 'Щ', '--•--': 'Ъ', '-•--': 'Ы', '-••-': 'Ь', '••-••': 'Э', '••--': 'Ю', '•-•-': 'Я' ,'•----': '1', '••---': '2', '•••--': '3', '••••-': '4', '•••••': '5', '-••••': '6', '--•••': '7', '---••': '8', '----•': '9', '-----': '0', '••••••': '.', '•-•-•-': ',', '-•-•-•': ';', '---•••': ':', '••--••': '?', '--••--': '!', '-••••-': '-', '-•--•-': ')', '-•--•':'(', '-••-•': '/', '•-••-•': '"', '•-•-•': '+', '••--•-': '_', '•••-••-':'$', '•--•-•':'@', '-•••-':'=', '•-•••':'&' }
reply = await message.get_reply_message()
text = utils.get_args_raw(message)
if reply and not text:
text = reply.raw_text
if not text:
return await utils.answer(message, "<code>Вы не ввели текст или не сделали реплай.</code>")
x = ''
for word in text.split(' '):
for letter in word.split():
x += en[letter].lower()
x+=' '
await message.edit(x)

277
trololo65/Modules/Num.py Normal file
View File

@@ -0,0 +1,277 @@
# 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'Исключение: <code>{list}</code>')
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'Исключение: <code>{a}</code>')
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('<b>Заражения успешно завершены.</b>')
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'Исключение: <code>{list}</code>')
else:
await message.reply('заразить ' + list)
elif link.startswith('https://t.me'):
a ='@' + str(link.split('/')[3])
if a in exlist:
await message.reply(f'Исключение: <code>{a}</code>')
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'<b>{count}.</b> <code>{i}</code>\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('Количество аргументов <b>больше</b> одного, либо начинается <b>не</b> со знака <code>@</code>')
return
if args in exlist:
exlist.remove(args)
self.db.set("NumMod", "exUsers", exlist)
await message.edit(f'Пользователь <code>{args}</code> исключён.')
return
exlist.append(args)
self.db.set("NumMod", "exUsers", exlist)
await message.edit(f'Пользователь <code>{args}</code> добавлен.')
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, "Лист заражений <b>пуст</b>.")
return
sms = ''
for key, value in infList.items():
sms+=f'<b>• <code>{key}</code> -- <code>{value[0]}</code> [<i>{value[1]}</i>]</b>\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, "Лист заражений <b>очищен</b>.")
elif args_list[0] in infList and '-f' in args.lower():
user = infList[args_list[0]]
await utils.answer(message, f"<b>• <code>{args_list[0]}</code> -- {user[0]} [<i>{user[1]}</i>]</b>")
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"Пользователь <code>{args}</code> удалён из списка.")
elif args_list[0][0] != '@':
await utils.answer(message, 'Это не <b>@ид/юзер</b>.')
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"Пользователь <code>{user}</code> добавлен в список заражений.\nЧисло: <code>{count}</code>{k}\nДата: <b>{vremya}</b>")
else:
reply = await message.get_reply_message()
if not reply:
return await utils.answer(message, 'Реплай должен быть на смс ириса "<b>...подверг заражению...</b>"')
elif reply.sender_id != 707693258 and not 'подверг заражению' in reply.text or not 'подвергла заражению' in reply.text:
return await utils.answer(message, 'Реплай должен быть на смс ириса "<b>...подверг заражению...</b>"')
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"Пользователь <code>{user}</code> добавлен в список заражений.\nЧисло: <code>{count}</code>\nДата: <b>{vremya}</b>")
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('<code>' + i + '</code>' for i in filter_and_users['users']))}]\n-sF --- установить фильтр. Допустим один.\n<code>{filter_and_users['filter'] if filter_and_users['filter'] else '❌Не установлен.'}</code>\n-t --- запустить|остановить.\n<b>{'✅Запущен' if filter_and_users['status'] else '❌Остановлен'}.</b>\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"✅ Ид <code>{user_id}</code> удалён.")
elif len(filter_and_users['users']) <= 5:
filter_and_users['users'].append(user_id)
await utils.answer(message, f"✅ Ид <code>{user_id}</code> добавлен.")
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"✅ Фильтр ~~~ <code>{args[1]}</code> ~~~ успешно установлен!")
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<z>бей\s|зарази[ть]{,2}\s)(?P<lvl>[1-9]?[0]?\s)?(?P<link>@[0-9a-z_]+|(?:https?://)?t\.me/[0-9a-z_]+|tg://openmessage\?user_id=(?P<id>[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('.лаб')

View File

@@ -0,0 +1 @@
# Modules for Friendly-telegram userbot

501
trololo65/Modules/RPMod.py Normal file
View File

@@ -0,0 +1,501 @@
# 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, '<b>жирный</b>', '<b>', '</b>'],
'2': [False, '<i>курсив</i>', '<i>', '</i>'],
'3': [False, '<u>подчеркнутый</u>', '<u>', '</u>'],
'4': [False, '<s>зачёркнутый</s>', '<s>', '</s>'],
'5': [False, '<tg-spoiler>скрытый</tg-spoiler>', '<tg-spoiler>', '</tg-spoiler>'],
},
'-s2':{ # СТИЛИ для "С репликой"
'1': [True, '<b>жирный</b>', '<b>', '</b>'],
'2': [False, '<i>курсив</i>', '<i>', '</i>'],
'3': [False, '<u>подчеркнутый</u>', '<u>', '</u>'],
'4': [False, '<s>зачёркнуто</s>', '<s>', '</s>'],
'5': [False, '<tg-spoiler>скрытый</tg-spoiler>', '<tg-spoiler>', '</tg-spoiler>'],
},
'-s3':{ # СТИЛИ для реплики
'1': [False, '<b>жирный</b>', '<b>', '</b>'],
'2': [False, '<i>курсив</i>', '<i>', '</i>'],
'3': [False, '<u>подчеркнутый</u>', '<u>', '</u>'],
'4': [False, '<s>зачёркнутый</s>', '<s>', '</s>'],
'5': [False, '<tg-spoiler>скрытый</tg-spoiler>', '<tg-spoiler>', '</tg-spoiler>'],
},
'-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"<b>Были введены не только эмодзи(пробел тоже символ). </b>")
return
if len(lst) > 3:
await utils.answer(message, f"<b>Было введено более 3 эмодзи.</b>")
return
elif not emoji_rp or not emoji_rp.strip():
await utils.answer(message, f"<b>Разделитель для эмодзи есть, а их нет? хм.</b>")
return
key_len = [len(x) for x in key_rp.split()]
if len(dict_rp) >= 70:
await utils.answer(message, '<b>Достигнут лимит рп команд.</b>')
elif not key_rp or not key_rp.strip():
await utils.answer(message, '<b>Вы не ввели название рп команды.</b>')
elif not value_rp or not value_rp.strip():
await utils.answer(message, '<b>Вы не ввели действие для рп команды.</b>')
elif int(len(key_len)) > 1:
await utils.answer(message, '<b>В качестве рп команды было введено больше одного слова.</b>')
elif key_rp == 'all':
await utils.answer(message, '<b>Использовать \'<code>all</code>\' в качестве названия команды запрещено!</b>')
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'<b>Команда \'<code>{key_rp}</code>\' успешно добавлена с эмодзи \'{emoji_rp}\'!</b>')
else:
dict_rp[key_rp]= value_rp
self.db.set('RPMod', 'rpcomands', dict_rp)
await utils.answer(message, f'<b>Команда \'<code>{key_rp}</code>\' успешно добавлена!</b>')
except:
await utils.answer(message, '<b>Вы не ввели разделитель /, либо вовсе ничего не ввели.</b>')
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, '<b>Список рп команд очищен.</b>')
return
elif not key_rp or not key_rp.strip():
await utils.answer(message, '<b>Вы не ввели команду.</b>')
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'<b>Команда \'<code>{key_rp}</code>\' успешно удалена!</b>')
except KeyError:
await utils.answer(message, '<b>Команда не найдена.</b>')
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, "<b>RP Режим <code>выключен</code></b>")
else:
self.db.set("RPMod", "status", 1)
await utils.answer(message, "<b>RP Режим <code>включен</code></b>")
elif args.strip() == 'toggle':
if rezjim == 1:
self.db.set("RPMod", "rprezjim", 2)
await utils.answer(message, "<b>RP Режим изменён на <code>отправку смс.</code></b>")
else:
self.db.set("RPMod", "rprezjim", 1)
await utils.answer(message, "<b>RP Режим изменён на <code>изменение смс.</code></b>")
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'У вас рп команд: <b>{l}</b> из <b>70</b>. '
if len(com) == 0:
await utils.answer(message, '<b>Увы, у вас нету рп команд. :(</b>')
return
for i in com:
if i in emojies.keys():
listComands+=f'\n• <b><code>{i}</code> - {com[i]} |</b> {emojies[i]}'
else:
listComands+=f'\n• <b><code>{i}</code> - {com[i]}</b>'
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'<code>{user_id}</code>', f'<b>{nick}</b>']) 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"Ник пользователя <b>{str(user.id)}</b> изменён на '<b>{user.first_name}</b>'")
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"Ник пользователя <b>{str(user.id)}</b> изменён на '<b>{args}</b>'")
elif len(lst) + len(nick) >= 45:
await utils.answer(message, f"<b>Ник превышает лимит в 45 символов(возможно эмодзи имеют длину более 1 символа).</b>")
else:
nicks[str(user.id)] = args
self.db.set('RPMod', 'rpnicks', nicks)
await utils.answer(message, f"Ник пользователя <b>{str(user.id)}</b> изменён на '<b>{args}</b>'")
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, '<b>Аргументы:</b>\n<code>-b</code> <b>-- сделать бекап.</b>\n<code>-r</code> <b>загрузить бекап.(используй с реплаем на файл)</b>')
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"<b>Ошибка:\n</b>{e}")
elif args == '-r' and reply:
try:
if not reply.document:
await utils.answer(message, f"<b>Это не файл.</b>")
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"<b>Команды обновлены!</b>")
except Exception as e:
await utils.answer(message, f"<b>Ошибка:\n</b>{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'<i>Чат <b><u>{name}</u></b>[<code>{a.id}</code>] удален из исключений.</i>')
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'<i>Чат <b><u>{name}</u></b>[<code>{a.id}</code>] добавлен в исключения.</i>')
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'<i>Чат <b><u>{name}</u></b>(<code>{args}</code>) удален из исключений.</i>')
else:
try:
a = await message.client.get_entity(args)
except:
await utils.answer(message, '<b>Неверный ид.</b>')
ex.append(args)
self.db.set("RPMod", "exlist", ex)
try:
name = a.title
except:
name = a.first_name
await utils.answer(message, f'<i>Чат <b><u>{name}</u></b>[<code>{a.id}</code>] добавлен в исключения.</i>')
elif args == 'list':
ex_len = len(ex)
if ex_len == 0:
await utils.answer(message, f'<b>Список исключений пуст.</b>')
return
sms = f'<i> Чаты, которые есть в исключениях({ex_len}):</i>'
for i in ex:
try:
a = await message.client.get_entity(i)
except:
await utils.answer(message, f'<b>Неверный ид -- {a}</b>')
return
try:
name = a.title
except:
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, 'Что то пошло не так..')
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'<i>Чату <b><u>{chat.title}</u></b>[<code>{chat.id}</code>] открыт доступ.</i>')
else:
userA["chats"].remove(chat.id)
return await utils.answer(message, f'<i>Чату <b><u>{chat.title}</u></b>[<code>{chat.id}</code>] закрыт доступ.</i>')
elif args == '-l':
sms = '<b>Пользователи, у которых есть доступ к командам:</b>'
for k, v in userA.items():
if k == 'chats':
sms+= f'\n<b>Чатов:</b>'
else:
sms+= f'\n<b>Пользователей:</b>'
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:
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 userA["users"]:
userA["users"].remove(args)
self.db.set('RPMod', 'useraccept', userA)
await utils.answer(message, f'<b>Пользователю <code>{args}</code> был закрыт доступ.</b>')
elif args in userA["chats"]:
userA["chats"].remove(args)
self.db.set('RPMod', 'useraccept', userA)
await utils.answer(message, f'<b>Чату <code>{args}</code> был закрыт доступ.</b>')
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'<b>Чату <code>{args}</code> был открыт доступ.</b>')
else:
userA["users"].append(args)
self.db.set('RPMod', 'useraccept', userA)
await utils.answer(message, f'<b>Пользователю <code>{args}</code> был открыт доступ.</b>')
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 = '⚙️ <b>Настройка шаблона для команды:</b>\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'⚙️ <b>Настройка шаблона для команды:</b>\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<code>.rpconf -s1 2</code>'
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"<a href=tg://user?id={me.id}>{nick}</a> {s1[0]}{comand[detail[0]]}{s1[1]} <a href=tg://user?id={user.id}>{user.first_name}</a>{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

View File

@@ -0,0 +1,146 @@
from .. import loader, utils
from datetime import datetime, date, time
from asyncio import sleep
import os, io, asyncio, pytz, requests
@loader.tds
class SeeChatMod(loader.Module):
"""tracking in all PM chats."""
strings={"name": "SeeChat"}
async def client_ready(self, message, db):
self.db = db
self.db.set("SeeChat", "seechat", True)
self.di = "SeeChat/"
if not os.path.exists(self.di):
os.mkdir(self.di)
async def seechatcmd(self, message):
"""use: .seechat | to enable tracking in all PM chats."""
if self.db.get("SeeChat", "seechat") is not True:
await utils.answer(message, "[SeeChat] turned <b>on</b> succesfully.")
self.db.set("SeeChat", "seechat", True)
else:
await utils.answer(message, "[SeeChat] turned <b>off</b> succesfully.")
self.db.set("SeeChat", "seechat", False)
async def setchatcmd(self, message):
"""use: .setchat | to set this chat as a track chat."""
chat = await message.client.get_entity(message.to_id)
self.db.set("SeeChat", "log", str(chat.id))
await utils.answer(message, f"<b>this chat was set as a chat for tracks.</b>")
async def seechatscmd(self, message):
"""use: .seechats | to see the list of tracking people."""
await utils.answer(message, "wait a second..")
chats = ""
for userId in enumerate(os.listdir(self.di)):
try:
user = await message.client.get_entity(int(userId[1][:-4]))
except: pass
if not user.deleted:
chats += f"{userId[0]+1} • <a href=tg://user?id={user.id}>{user.first_name}</a> ID: [<code>{user.id}</code>]\n"
else:
chats += f"{userId[0]+1} • deleted account ID: [<code>{user.id}</code>]\n"
await utils.answer(message, "<b>Tracking users:</b>\n\n" + chats)
async def gseecmd(self, message):
"""use: .gsee {id} | to get the tracked file."""
args = utils.get_args_raw(message)
if not args:
return await utils.answer(message, "<b>what about args?</b>")
try:
user = await message.client.get_entity(int(args))
await utils.answer(message, f"<b>PM file with: <code>{user.first_name}</code></b>")
await message.client.send_file(message.to_id, f"{self.di}{args}.txt")
except: return await utils.answer(message, "<b>file is empty.</b>")
async def delseecmd(self, message):
"""use: .delsee {id} | to delete the tracked file."""
args = utils.get_args_raw(message)
if not args:
return await utils.answer(message, "<b>what about args?</b>")
if args == "all":
os.system(f"rm -rf {self.di}*")
await utils.answer(message, "<b>all PM chats file has been successfully deleted.</b>")
else:
try:
user = await message.client.get_entity(int(args))
await utils.answer(message, f"<b>the chat file has been deleted with: <code>{user.first_name}</code></b>")
os.remove(f"{self.di}{args}.txt")
except: return await utils.answer(message, "<b>file can't be deleted.</b>")
async def excseecmd(self, message):
"""use: .excsee {id} | to add / remove user from exclude tracking."""
exception = self.db.get("SeeChat", "exception", [])
args = utils.get_args_raw(message)
if not args:
return await utils.answer(message, "<b>what about args?</b>")
if args == "clear":
self.db.set("SeeChat", "exception", [])
return await utils.answer(message, "<b>the exclusion list was cleared successfully.</b>")
try:
user = await message.client.get_entity(int(args))
if str(user.id) not in exception:
exception.append(str(user.id))
await utils.answer(message, f"<b>{user.first_name}, has been added to the list of exclusions.</b>")
os.remove(f"{self.di}{user.id}.txt")
else:
exception.remove(str(user.id))
await utils.answer(message, f"<b>{user.first_name}, has been removed from the list of exclusions.</b>")
self.db.set("SeeChat", "exception", exception)
except: return await utils.answer(message, "<b>failed to remove user from the list of exclusions</b>")
async def exclistcmd(self, message):
"""use: .exclist | to see the list of exceptions."""
exception = self.db.get("SeeChat", "exception", [])
users = ""
try:
for exc in enumerate(exception):
user = await message.client.get_entity(int(exc[1]))
users += f"{exc[0]+1} • <a href=tg://user?id={user.id}>{user.first_name}</a> ID: [<code>{user.id}</code>]\n"
await utils.answer(message, "<b>List of exclusions:</b>\n\n" + users)
except Exception as e: return await utils.answer(message, f"<b>the list of users is empty.</b> {e}")
async def watcher(self, message):
me = await message.client.get_me()
seechat = self.db.get("SeeChat", "seechat")
exception = self.db.get("SeeChat", "exception", [])
log = self.db.get("SeeChat", "log", str(me.id))
chat = await message.client.get_entity(int(log))
timezone = "Europe/Kiev"
vremya = datetime.now(pytz.timezone(timezone)).strftime("[%Y-%m-%d %H:%M:%S]")
user = await message.client.get_entity(message.chat_id)
userid = str(user.id)
try:
if message.sender_id == me.id: user.first_name = me.first_name
except: pass
if message.is_private and seechat and userid not in exception and not user.bot and not user.verified:
if message.text:
file = open(f"{self.di}{user.id}.txt", "a", encoding='utf-8')
file.write(f"{user.first_name} >> {message.text} << {vremya}\n\n")
if message.sender_id == me.id:
return
if message.video:
try:
await message.forward_to(chat.id)
except:
file = message.file.name or "huita" + message.file.ext
await message.download_media(file)
await message.client.send_message(chat.id, f"<b>Video from</b> <a href='tg://user?id={user.id}'>{user.first_name}</a>:")
await message.client.send_file(chat.id, file)
os.remove(file)
elif message.photo:
file = io.BytesIO()
file.name = message.file.name or f"SeeChat{message.file.ext}"
await message.client.download_file(message, file)
file.seek(0)
await message.client.send_message(chat.id, f"<b>Picture from</b> <a href='tg://user?id={user.id}'>{user.first_name}</a>:")
await message.client.send_file(chat.id, file, force_document=False)
elif message.voice or message.audio or message.video_note or message.document:
await message.client.send_message(chat.id, f"<b>Media from</b> <a href='tg://user?id={user.id}'>{user.first_name}</a>:")
await message.forward_to(chat.id)

View File

@@ -0,0 +1,83 @@
# meta developer: @trololo_1
from telethon import events
from .. import utils, loader
import re, asyncio, os
chat = "@TTFullBot"
class TTsaveMod(loader.Module):
"""Save tiktok video"""
strings = {'name': 'TTsaveMod'}
async def client_ready(self, client, db):
self.db = db
async def ttsavecmd(self, message):
""".ttsave {link}"""
args = utils.get_args_raw(message)
async with message.client.conversation(chat) as conv:
await utils.answer(message, 'Скачиваю...')
response1, response2, response3 = [conv.wait_event(events.NewMessage(incoming=True, from_users=chat, chats=chat)) for i in range(3)]
bot_send_link = await message.client.send_message(chat, args)
response1 = await response1
response2 = await response2
response3 = await response3
await response2.download_media("hui.mp4")
await message.client.send_file(message.to_id, "hui.mp4")
await response1.delete()
await response2.delete()
await response3.delete()
await bot_send_link.delete()
await message.delete()
os.remove("hui.mp4")
async def ttacceptcmd(self, message):
""" .ttaccept {reply/id} для открытия в чате автоматического скачивания ссылок. без аргументов тоже работает.\n.ttaccept -l для показа открытых чатов """
args = utils.get_args_raw(message)
reply = await message.get_reply_message()
users_list = self.db.get('TTsaveMod', 'users', [])
if args == '-l':
if len(users_list) == 0: return await utils.answer(message, 'Список пуст.')
return await utils.answer(message, ''+'\n'.join(['<code>'+str(i)+'</code>' for i in users_list]))
try:
if not args and not reply:
user = message.chat_id
else:
user = reply.sender_id if not args else int(args)
except:
return await utils.answer(message, 'Неверно введён ид.')
if user in users_list:
users_list.remove(user)
await utils.answer(message, f'Ид <code>{str(user)}</code> исключен.')
else:
users_list.append(user)
await utils.answer(message, f'Ид <code>{str(user)}</code> добавлен.')
self.db.set('TTsaveMod', 'users', users_list)
async def watcher(self, message):
try:
users = self.db.get('TTsaveMod', 'users', [])
if message.chat_id not in users: return
links = re.findall(r'((?:https?://)?v[mt]\.tiktok\.com/[A-Za-z0-9_]+/?)', message.raw_text)
if len(links) == 0: return
async with message.client.conversation(chat) as conv:
for link in links:
response1, response2, response3 = [conv.wait_event(events.NewMessage(incoming=True, from_users=chat, chats=chat)) for i in range(3)]
bot_send_link = await message.client.send_message(chat, link)
response1 = await response1
response2 = await response2
response3 = await response3
await response2.download_media("hui.mp4")
await message.client.send_file(message.chat_id, "hui.mp4")
await response1.delete()
await response2.delete()
await response3.delete()
await bot_send_link.delete()
os.remove("hui.mp4")
await asyncio.sleep(5)
except: pass

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,102 @@
# meta developer: @trololo_1
import asyncio
import logging
from .. import loader, utils
logger = logging.getLogger(__name__)
@loader.tds
class VijenerMod(loader.Module):
"""Конвертация текста в шифр Виженеря и наоборот. """
strings = {
"name": "Vizjener"
}
@loader.unrestricted
async def tovizcmd(self, message):
""".toviz {ключ} {текст}"""
try:
alphabet = ['','а', 'б', 'в', 'г', 'д', 'е', 'ё', 'ж', 'з', 'и', 'й', 'к', 'л', 'м', 'н', 'о', 'п', 'р', 'с', 'т', 'у', 'ф', 'х', 'ц', 'ч', 'ш', 'щ', 'ъ', 'ы', 'ь', 'э', 'ю', 'я']
text = utils.get_args_raw(message)
key = str(text.split(' ')[0])
shifr = str(text.split(' ', maxsplit=1)[1])
key_list = []
shifr_list = []
for word in key.split():
for letter in word.lower():
key_list.append(letter)
for word in shifr.split():
for letter in word.lower():
shifr_list.append(letter)
shifr_list.append(' ')
key_index = 0
sms = ''
for i in range(0, len(shifr_list )):
if shifr_list[i].isalpha():
if key_index == len(key_list):
key_index = 0
a = alphabet.index(shifr_list[i])
b = alphabet.index(key_list[key_index])
result = int(a) + int(b)
if result >= 33:
result=result%33
if result == 0:
result=33
sms+=alphabet[result]
key_index+=1
else:
sms+=shifr_list[i]
await message.edit(sms)
except:
await message.edit('<strong> ERROR. Возможно вы ввели некириллические символы, либо ввели в ключ что то кроме буквенных символов. </strong>')
@loader.unrestricted
async def tounvizcmd(self, message):
""".tounviz {ключ} {текст}"""
try:
alphabet = ['', 'а', 'б', 'в', 'г', 'д', 'е', 'ё', 'ж', 'з', 'и', 'й', 'к', 'л', 'м', 'н', 'о', 'п', 'р', 'с', 'т', 'у', 'ф', 'х', 'ц', 'ч', 'ш', 'щ', 'ъ', 'ы', 'ь', 'э', 'ю', 'я']
text = utils.get_args_raw(message)
key = str(text.split(' ')[0])
shifr = str(text.split(' ', maxsplit=1)[1])
key_list = []
shifr_list = []
for word in key.split():
for letter in word.lower():
key_list.append(letter)
for word in shifr.split():
for letter in word.lower():
shifr_list.append(letter)
shifr_list.append(' ')
key_index = 0
sms = ''
for i in range(0, len(shifr_list )):
if shifr_list[i].isalpha():
if key_index == len(key_list):
key_index = 0
a = alphabet.index(shifr_list[i])
b = alphabet.index(key_list[key_index])
if int(b) == 33:
result = int(a) % int(b)
else:
result = int(a) - int(b)
if result < 0:
result=result-1
if result == 0:
result=33
sms+=alphabet[result]
key_index+=1
else:
sms+=shifr_list[i]
await message.edit(sms)
except:
await message.edit('<strong> ERROR. Возможно вы ввели некириллические символы, либо ввели в ключ что то кроме буквенных символов. </strong>')

View File

@@ -0,0 +1,66 @@
# for more info: https://murix.ru/files/ftg
# by xadjilut, 2021
# Изменил для мубота @trololo_1
from .. import loader, utils
import asyncio
@loader.tds
class FarmMooBotMod(loader.Module):
"""Для автоматического фарминга мубота.\n отправляет мус, кликает, затем мук, кликает. и всё по циклу."""
strings = {
'name': 'FarmMooBot',
}
def __init__(self):
self.name = self.strings['name']
async def client_ready(self, client, db):
self.client = client
self.db = db
self.moo = 1606812809
if not self.db.get(self.name, "status", False):
self.db.set(self.name, 'status', {'status': False, 'time': None, 'btn1': None, 'btn2': None})
async def mbfoncmd(self, message):
"""Запустить автофарминг.\n.mbfon {интервал отправки} {первая кнопка} {вторая кнопка} | кнопки указывать по очередности."""
args = utils.get_args_raw(message)
if not args: return await utils.answer(message, 'Где аргументы?')
args = args.split(' ')
if not args[0].isdigit() or not args[1].isdigit() or not args[2].isdigit(): return await utils.answer(message, 'Один или более аргументов указан не корректно. Вводите только числовые значения!!')
status = self.db.get(self.name, "status", False)
if status['time']: return await utils.answer(message, 'Уже запущено.')
self.db.set(self.name, "status", {'status': True, 'time': args[0], 'btn1': args[1], 'btn2': args[2]})
await self.client.send_message(self.moo, 'мус')
await utils.answer(message, 'Запущено.')
async def mbfoffcmd(self, message):
"""Остановить автофармин."""
self.db.set(self.name, 'status', {'status': False, 'time': None, 'btn1': None, 'btn2': None})
await utils.answer(message, 'Остановлено.')
async def watcher(self, message):
try:
chat = utils.get_chat_id(message)
if chat != self.moo: return
args = self.db.get(self.name, 'status', False)
if not args: return
if not args['status'] or message.sender_id != self.moo or message.sticker: return
try:
if not '🐮' in message.text and '<strong>' in message.text and args['status']: await message.click(int(args['btn1']) - 1)
await asyncio.sleep(3)
if args['status'] and not '🐮' in message.text and '<strong>' in message.text: await self.client.send_message(self.moo, 'мук')
except:
if args['status']: await self.client.send_message(self.moo, 'мус')
if not '🐮' in message.text and '<strong>' in message.text and args['status']: await message.click(int(args['btn1']) - 1)
try:
if '🐮' in message.text or args['status']: await message.click(int(args['btn2']) - 1)
except:
if args['status']: await self.client.send_message(self.moo, 'мук')
if '🐮' in message.text and args['status']: await message.click(int(args['btn2']) - 1)
await asyncio.sleep(int(args['time']))
if args['status'] and '🐮' in message.text: await self.client.send_message(self.moo, 'мус')
except: pass

View File

@@ -0,0 +1,91 @@
# meta developer: @trololo_1
from .. import loader, utils
import subprocess
try:
from glitch_this import ImageGlitcher
except:
mod_inst = subprocess.Popen("pip install glitch-this", shell=True)
mod_inst.wait()
from glitch_this import ImageGlitcher
class glitchMod(loader.Module):
"Накладывает на изображения глитч эффект."
strings = {"name":"glitchMod"}
async def client_ready(self, message, db):
self.db=db
if not self.db.get("glitch", "frames", False):
self.db.set("glitch", "frames", 23)
if not self.db.get("glitch", "step", False):
self.db.set("glitch", "step", 1)
if not self.db.get("glitch", "duration", False):
self.db.set("glitch", "duration", 200)
if not self.db.get("glitch", "loop", False):
self.db.set("glitch", "loop", 0)
async def glitchcmd(self, message):
"Используй: \n.glitch {аргументы} {реплай на фото} {уровень сдвига 0.0 - 10.0} \nЧтобы наложить эффект на фото.\nИспользуй: \n.glitch\nчтобы посмотреть аргументы."
args = utils.get_args_raw(message)
reply = await message.get_reply_message()
glitcher = ImageGlitcher()
args_glitch = ['-g', '-c', '-sl']
FRAMES = self.db.get("glitch", "frames")
STEP = self.db.get("glitch", "step")
DURATION = self.db.get("glitch", "duration")
LOOP =self.db.get("glitch", "loop")
gif_output = False
color = False
lines = False
amount = 1.5
if not reply and not args:
message = await utils.answer(message, f'Аргументы:\n• <code>{args_glitch[0]}</code> --- возвращает изображение как гифку. \n• <code>{args_glitch[1]}</code> --- добавляет эффект смещения цвета. \n• <code>{args_glitch[2]}</code> --- добавляет эффект линий.')
return
if not reply.photo and not reply.sticker:
message = await utils.answer(message, 'Реплай должен быть на фото.')
return
if args:
args = [i for i in args.split(' ')]
try:
amount = float(args[-1])
except ValueError:
amount = 1.5
gif_output = True if args_glitch[0] in args else False
color = True if args_glitch[1] in args else False
lines = True if args_glitch[2] in args else False
file = reply.file.name if reply.file.name else "huita" + reply.file.ext
await reply.download_media(file)
b = glitcher.glitch_image(file, amount, color_offset = color, gif = gif_output, scan_lines = lines, step = STEP, frames = FRAMES)
if gif_output:
b[0].save('glitch_image.gif', format = 'GIF', append_images = b[1:], save_all = True, duration = DURATION, loop = LOOP )
await message.client.send_file(message.to_id, 'glitch_image.gif')
else:
b.save('glitch_image.jpg')
await message.client.send_file(message.to_id, 'glitch_image.jpg')
await message.delete()
async def glconfcmd(self, message):
"Настройка глитч эффекта."
args = utils.get_args_raw(message)
glitch_opt = ["frames", "step", "duration", "loop"]
if not args:
message = await utils.answer(message, f"Доступные настройки:\n• <code>{glitch_opt[0]}</code> --- количество кадров.\n• <code>{glitch_opt[1]}</code> --- количество кадров без глюка(значение 1 ставит все кадры с глюком).\n• <code>{glitch_opt[2]}</code> --- длительность кадра(в миллисекундах).\n• <code>{glitch_opt[3]}</code> --- количество зацикливаний(значение 0 бесконечно зацикливает).\n\nИспользовать так:\noption = value")
return
args = [ i for i in args.split('=')]
for i in glitch_opt:
if i == args[0].strip().lower():
try:
self.db.set("glitch", i, int(args[1]))
except ValueError:
message = await utils.answer(message, 'Значение было не числовым.')
return
message = await utils.answer(message, f'Опция <b>{i}</b> успешно установлена со значением <b>{args[1]}</b>')
return
message = await utils.answer(message, 'Нет совпадений опций или неправильное значение.')
return

View File

@@ -0,0 +1,75 @@
# meta developer: @trololo_1
# Github: trololo65
import subprocess
try:
from translatepy import Translator
except:
mod_inst = subprocess.Popen("pip install --upgrade translatepy", shell=True)
mod_inst.wait()
from translatepy import Translator
from translatepy.translators.google import GoogleTranslate
from translatepy.translators.bing import BingTranslate
from translatepy.translators.yandex import YandexTranslate
from translatepy.translators.reverso import ReversoTranslate
from translatepy.translators.deepl import DeeplTranslate
from translatepy.translators.libre import LibreTranslate
from translatepy.translators.translatecom import TranslateComTranslate
from translatepy.translators.mymemory import MyMemoryTranslate
from .. import loader, utils
@loader.tds
class translatepyMod(loader.Module):
"""Перевод текста. Автоматическое распознование языка."""
strings = {'name': 'translatepy'}
async def client_ready(self, client, db):
self.db = db
if not self.db.get('translatepy', 'services', False):
self.db.set('translatepy', 'services', {'google': True, 'bing': False, 'yandex': False, 'reverso': False, 'libre': False, 'translatecom': False, 'deepl': False, 'mymemory': False,})
async def trnsltcmd(self, message):
"""Используй: .trnslt {язык} {текст или реплай}"""
args = utils.get_args_raw(message)
reply = await message.get_reply_message()
args_list = args.split(' ', maxsplit = 1)
sL = self.db.get('translatepy', 'services') #serviceList
if not args:
await utils.answer(message, 'Где аргументы?')
return
if not reply and len(args_list) <= 1 :
await utils.answer(message, 'Нет реплая и текста для перевода.')
return
if len(args_list) == 1:
text = reply.raw_text
else:
text = args_list[1]
lng = args_list[0]
sL_class = {'google': GoogleTranslate(), 'yandex': YandexTranslate(), 'bing': BingTranslate(), 'reverso': ReversoTranslate(), 'deepl': DeeplTranslate(), 'libre': LibreTranslate(), 'translatecom': TranslateComTranslate(), 'mymemory': MyMemoryTranslate()}
try:
sL_active = str(list(sL.keys())[list(sL.values()).index(True)]) # Поиск установленного сервера
t = sL_class[sL_active]
except:
t = Translator()
res = t.translate(text,lng) # result translate
await utils.answer(message, f'<b>[{res.service}: {res.source_language} -> {lng}]</b>\n<code>{res.result}</code>')
async def tservicecmd(self, message):
""" Установка сервиса для перевода.\nИспользуй .tservice list для просмотра всех сервисов"""
args = utils.get_args_raw(message)
sL = self.db.get('translatepy', 'services') #serviceList
service = str(list(sL.keys())[list(sL.values()).index(True)]) # Поиск установленного сервера
if not args:
await utils.answer(message, '<b>Установка:</b> <code>.tservice {сервис}</code>'+f'\n<b>Сервис:</b> <code>{service}</code>')
elif args == 'list':
await utils.answer(message, '<b>Достуные сервисы:</b>\n<code>Google</code>\n<code>Bing</code>\n<code>Yandex</code>\n<code>Reverso</code>\n<code>Deepl</code>\n<code>Libre</code>\n<code>TranslateCom</code>\n<code>MyMemory</code>')
elif args.lower() in sL:
for key, value in sL.items(): # Переборка словаря
sL[key] = False # Установка всех значений на False
sL[args.lower()] = True # Установка нужного значения на True
self.db.set('translatepy', 'services', sL)
await utils.answer(message, f'Сервис <b>{args}</b> успешно установлен.')
else:
await utils.answer(message, f'Неверно введён сервис.')

View File

@@ -0,0 +1,83 @@
# meta developer: @trololo_1
from telethon import events
from .. import utils, loader
import re, asyncio, os
chat = "@TTFullBot"
class TTsaveMod(loader.Module):
"""Save tiktok video"""
strings = {'name': 'TTsaveMod'}
async def client_ready(self, client, db):
self.db = db
async def ttsavecmd(self, message):
""".ttsave {link}"""
args = utils.get_args_raw(message)
async with message.client.conversation(chat) as conv:
await utils.answer(message, 'Скачиваю...')
response1, response2, response3 = [conv.wait_event(events.NewMessage(incoming=True, from_users=chat, chats=chat)) for i in range(3)]
bot_send_link = await message.client.send_message(chat, args)
response1 = await response1
response2 = await response2
response3 = await response3
await response2.download_media("hui.mp4")
await message.client.send_file(message.to_id, "hui.mp4")
await response1.delete()
await response2.delete()
await response3.delete()
await bot_send_link.delete()
await message.delete()
os.remove("hui.mp4")
async def ttacceptcmd(self, message):
""" .ttaccept {reply/id} для открытия в чате автоматического скачивания ссылок. без аргументов тоже работает.\n.ttaccept -l для показа открытых чатов """
args = utils.get_args_raw(message)
reply = await message.get_reply_message()
users_list = self.db.get('TTsaveMod', 'users', [])
if args == '-l':
if len(users_list) == 0: return await utils.answer(message, 'Список пуст.')
return await utils.answer(message, ''+'\n'.join(['<code>'+str(i)+'</code>' for i in users_list]))
try:
if not args and not reply:
user = message.chat_id
else:
user = reply.sender_id if not args else int(args)
except:
return await utils.answer(message, 'Неверно введён ид.')
if user in users_list:
users_list.remove(user)
await utils.answer(message, f'Ид <code>{str(user)}</code> исключен.')
else:
users_list.append(user)
await utils.answer(message, f'Ид <code>{str(user)}</code> добавлен.')
await self.db.set('TTsaveMod', 'users', users_list)
async def watcher(self, message):
try:
users = self.db.get('TTsaveMod', 'users', [])
if message.chat_id not in users: return
links = re.findall(r'((?:https?://)?vm\.tiktok\.com/[A-Za-z0-9_]+/?)', message.raw_text)
if len(links) == 0: return
async with message.client.conversation(chat) as conv:
for link in links:
response1, response2, response3 = [conv.wait_event(events.NewMessage(incoming=True, from_users=chat, chats=chat)) for i in range(3)]
bot_send_link = await message.client.send_message(chat, link)
response1 = await response1
response2 = await response2
response3 = await response3
await response2.download_media("hui.mp4")
await message.client.send_file(message.chat_id, "hui.mp4")
await response1.delete()
await response2.delete()
await response3.delete()
await bot_send_link.delete()
os.remove("hui.mp4")
await asyncio.sleep(5)
except: pass

View File

@@ -0,0 +1,32 @@
from .. import loader, utils
import logging
from requests import get
import io
@loader.tds
class WebShotMod(loader.Module):
"""link to screen"""
strings = {
"name": "WebShot"
}
@loader.sudo
async def webshotcmd(self, message):
""".webshot <link>"""
reply = None
link = utils.get_args_raw(message)
if not link:
reply = await message.get_reply_message()
if not reply:
await message.delete()
return
link = reply.raw_text
await message.edit("<b>📸Фоткаю...</b>")
url = "https://mini.s-shot.ru/1024x768/JPEG/1024/Z100/?{}"
file = get(url.format(link))
file = io.BytesIO(file.content)
file.name = "webshot.png"
file.seek(0)
await message.client.send_file(message.to_id, file, reply_to=reply)
await message.delete()