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,192 @@
# @Sekai_Yoneya
from .. import loader, utils
import datetime, time
from telethon import functions, types
@loader.tds
class AntiPMMod(loader.Module):
strings = {"name": "Anti-PM", "pm_off": "<b>Теперь вы принимаете сообщения от всех пользователей.</b>",
"pm_on": "<b>Вы перестали принимать сообщения от пользователей.</b>",
"pm_go_away": "Здравствуй! К сожалению, я не принимаю личные сообщения."
"\n\nСвяжитесь со мной в @sekai_pmbot, или ожидайте пока я одобрю вас.",
"pm_allowed": "<b>Я разрешил {} писать мне.</b>",
"pm_deny": "<b>Я запретил {} писать мне.</b>",
"blocked": "<b>{} был(-а) занесен(-а) в Черный Список.</b>",
"unblocked": "<b>{} удален(-а) из Черного Списка.</b>",
"addcontact": "<b>{} был(-а) добавлен(-а) в контакты.</b>",
"delcontact": "<b>{} был(-а) удален(-а) из контактов.</b>",
"who_to_allow": "<b>Кому разрешить писать в личку ?</b>",
"who_to_deny": "<b>Кому запретить писать в личку ?</b>",
"who_to_block": "<b>Укажите, кого блокировать.</b>",
"who_to_unblock": "<b>Укажите, кого разблокировать.</b>",
"who_to_contact": "<b>Укажите, кого добавить в контакт.</b>",
"who_to_delcontact": "<b>Укажите, кого удалить из контактов.</b>"}
def __init__(self):
self.me = None
async def client_ready(self, message, db):
self.db=db
self.client = client
self.me = await client.get_me(True)
async def pmcmd(self, message):
"""Используй: .pm : чтобы включить/отключить авто ответ на личные сообщения."""
pm = self.db.get("Anti-PM", "pm")
if pm is not True:
await utils.answer(message, self.strings["pm_off"])
self.db.set("Anti-PM", "pm", True)
else:
await utils.answer(message, self.strings["pm_on"])
self.db.set("Anti-PM", "pm", False)
async def allowcmd(self, message):
"""Используй: .allow чтобы разрешить этому пользователю писать вам в личку."""
try:
if message.is_private:
user = await message.client.get_entity(message.chat_id)
else:
return
except: return await message.edit("<b>Это не лс.</b>")
self.db.set("Anti-PM", "allowed", list(set(self.db.get("Anti-PM", "allowed", [])).union({user.id})))
await utils.answer(message, self.strings["pm_allowed"].format(user.first_name))
async def denycmd(self, message):
"""Используй: .deny чтобы запретить этому пользователю писать вам в личку."""
args = utils.get_args_raw(message)
reply = await message.get_reply_message()
if not args and not reply:
return await message.edit("<b>Нет аргументов или реплая.</b>")
try:
if message.is_private:
user = await message.client.get_entity(message.chat_id)
if args:
if args.isnumeric(): user = await message.client.get_entity(int(args))
else: user = await message.client.get_entity(args)
else: user = await message.client.get_entity(reply.sender_id)
except: return await message.edit("<b>Взлом жопы.</b>")
self.db.set("Anti-PM", "allowed", list(set(self.db.get("Anti-PM", "allowed", [])).difference({user.id})))
await utils.answer(message, self.strings["pm_deny"].format(user.first_name))
async def allowedcmd(self, message):
"""Используй: .allowed : чтобы посмотреть список пользователей которым вы разрешили писать в личку."""
await message.edit("ща покажу")
allowed = self.db.get("Anti-PM", "allowed", [])
number = 0
users = ""
try:
for _ in allowed:
number += 1
try:
user = await message.client.get_entity(int(_))
except: pass
if not user.deleted:
users += f"{number}. <a href=tg://user?id={user.id}>{user.first_name}</a> | [<code>{user.id}</code>]\n"
else:
users += f"{number} • Удалённый аккаунт ID: [<code>{user.id}</code>]\n"
await utils.answer(message, "<b>Список пользователей которым я разрешил писать в личку:</b>\n" + users)
except: return await message.edit("<b>Какой то айди из списка не правильный :/</b>")
async def blockcmd(self, message):
"""Используй: .block чтобы заблокировать этого пользователя."""
args = utils.get_args_raw(message)
reply = await message.get_reply_message()
if message.is_private:
user = await message.client.get_entity(message.chat_id)
else:
if reply:
user = await message.client.get_entity(reply.sender_id)
else:
user = await message.client.get_entity(int(args) if args.isnumeric() else args)
if not user:
await utils.answer(message, self.strings["who_to_block"])
return
await message.client(functions.contacts.BlockRequest(user))
await utils.answer(message, self.strings["blocked"].format(user.first_name))
async def unblockcmd(self, message):
"""Используй: .unblock чтобы разблокировать этого пользователя."""
args = utils.get_args_raw(message)
reply = await message.get_reply_message()
if message.is_private:
user = await message.client.get_entity(message.chat_id)
else:
if reply:
user = await message.client.get_entity(reply.sender_id)
else:
user = await message.client.get_entity(int(args) if args.isnumeric() else args)
if not user:
await utils.answer(message, self.strings["who_to_unblock"])
return
await message.client(functions.contacts.UnblockRequest(user))
await utils.answer(message, self.strings["unblocked"].format(user.first_name))
async def addcontcmd(self, message):
"""Используй: .addcont чтобы добавить пользователя в свои контакты."""
args = utils.get_args_raw(message)
reply = await message.get_reply_message()
if message.is_private:
user = await message.client.get_entity(message.chat_id)
else:
if reply:
user = await message.client.get_entity(reply.sender_id)
else:
user = await message.client.get_entity(int(args) if args.isnumeric() else args)
if not user:
await utils.answer(message, self.strings["who_to_contact"])
return
await message.client(functions.contacts.AddContactRequest(id=user.id, first_name=user.first_name, last_name=' ', phone='seen', add_phone_privacy_exception=False))
await utils.answer(message, self.strings["addcontact"].format(user.first_name))
async def delcontcmd(self, message):
"""Используй: .delcont чтобы удалить пользователя из своих контактов."""
args = utils.get_args_raw(message)
reply = await message.get_reply_message()
if message.is_private:
user = await message.client.get_entity(message.chat_id)
else:
if reply:
user = await message.client.get_entity(reply.sender_id)
else:
user = await message.client.get_entity(int(args) if args.isnumeric() else args)
if not user:
await utils.answer(message, self.strings["who_to_delcontact"])
return
await message.client(functions.contacts.DeleteContactsRequest(id=[user.id]))
await utils.answer(message, self.strings["delcontact"].format(user.first_name))
async def renamecmd(self, message):
args = utils.get_args_raw(message)
reply = await message.get_reply_message()
if not args:
return await message.edit("<b>Нету аргументов.</b>")
if not reply:
return await message.edit("<b>Где реплай?</b>")
else:
user = await message.client.get_entity(reply.sender_id)
try:
await message.client(functions.contacts.AddContactRequest(id=user.id,
first_name=args,
last_name=' ',
phone='мобила',
add_phone_privacy_exception=False))
await message.edit(f"<code>{user.id}</code> <b>переименован(-а) на</b> <code>{args}</code>")
except: return await message.edit("<b>Что то пошло не так...</b>")
async def watcher(self, message):
try:
user = await utils.get_user(message)
pm = self.db.get("Anti-PM", "pm")
if message.sender_id == (await message.client.get_me()).id: return
if pm is not True:
if message.is_private:
if not self.get_allowed(message.from_id):
if user.bot or user.verified:
return
await utils.answer(message, self.strings["pm_go_away"])
except: pass
def get_allowed(self, id):
return id in self.db.get("Anti-PM", "allowed", [])

View File

@@ -0,0 +1,90 @@
# @Sekai_Yoneya
from pydub import AudioSegment
from .. import loader, utils
from telethon import types
import io
def register(cb):
cb(AudioConverterMod())
class AudioConverterMod(loader.Module):
"""Конвертирование в разные форматы"""
strings = {'name': 'AudioConverter'}
def __init__(self):
self.name = self.strings['name']
self._me = None
self._ratelimit = []
async def client_ready(self, client, db):
self._db = db
self._client = client
self.me = await client.get_me()
async def tovoicecmd(self, message):
""".tovoice <reply to audio>
    Сконвертировать аудио в войс
"""
reply = await message.get_reply_message()
if not reply:
await message.edit("А где реплай?")
return
else:
try:
if reply.media.document.attributes[0].voice == True:
await message.edit("Это войс, а не аудиофайл!")
return
except:
await message.edit("Это не аудиофайл!")
return
await message.edit("[AudioConverter] Скачиваем...")
au = io.BytesIO()
await message.client.download_media(reply.media.document, au)
au.seek(0)
await message.edit("[AudioConverter] Делаем войс...")
audio = AudioSegment.from_file(au)
m = io.BytesIO()
m.name="voice.ogg"
audio.split_to_mono()
await message.edit("[AudioConverter] Экспортируем...")
dur = len(audio)/1000
audio.export(m, format="ogg", bitrate="64k", codec="libopus")
await message.edit("[AudioConverter] Отправляем...")
m.seek(0)
await message.client.send_file(message.to_id, m, reply_to=reply.id, voice_note=True, duration=dur)
await message.delete()
async def toformatcmd(self, message):
""".toformat [format] <reply to audio>
    Сконвертировать аудио/видео/войс в нужный формат
Поддерживаются mp3, m4a, ogg, mpeg, wav, oga
"""
frmts = ['ogg', 'mpeg', 'mp3', 'wav', 'oga', 'm4a', '3gp']
reply = await message.get_reply_message()
if not reply:
await message.edit("А где реплай?")
return
else:
try:
reply.media.document.attributes[0].duration
if utils.get_args_raw(message):
if utils.get_args_raw(message) not in frmts:
await message.edit(f"Формат {utils.get_args_raw(message)} для конвертирования не поддерживается!")
return
formatik = utils.get_args_raw(message)
else:
await message.edit("Укажите формат конвертирования")
return
except:
await message.edit("Это не аудиофайл!")
return
await message.edit("[Audio Converter] Скачиваем...")
au = io.BytesIO()
await message.client.download_media(reply.media.document, au)
au.seek(0)
await message.edit(f"[AudioConverter] Конвертируем в {formatik}...")
audio = AudioSegment.from_file(au)
m = io.BytesIO()
m.name="Converted_to." + formatik
audio.split_to_mono()
await message.edit("[AudioConverter] Экспортируем...")
audio.export(m, format=formatik)
await message.edit("[Audio Converter] Отправляем...")
m.seek(0)
await message.client.send_file(message.to_id, m, reply_to=reply.id, attributes=[types.DocumentAttributeAudio(duration = reply.document.attributes[0].duration, title=f"Converted to " + formatik, performer="@Sekai_Yoneya")])
await message.delete()

View File

@@ -0,0 +1,155 @@
# @Sekai_Yoneya
from pydub import AudioSegment, effects; from telethon import types; from .. import loader, utils; import math, requests, io; import numpy as np
@loader.tds
class AudioEditorMod(loader.Module):
"Модуль для работы со звуком(???)"
strings = {"name": "AudioEditor"}
async def basscmd(self, m):
""".bass [уровень bass'а 2-100 (Default 2)] <reply to audio>
BassBoost"""
args = utils.get_args_raw(m)
if not args: lvl = 2
else:
if args.isdigit() and (1<int(args)<101): lvl = int(args)
else: return await m.edit(f"[БассБуст] Укажи уровень от 2 до 100...")
audio = await get_audio(m, "BassBoost")
if not audio: return
sample_track = list(audio.audio.get_array_of_samples())
est_mean = np.mean(sample_track)
est_std = 3 * np.std(sample_track) / (math.sqrt(2))
bass_factor = int(round((est_std - est_mean) * 0.005))
attenuate_db = 0
filtered = audio.audio.low_pass_filter(bass_factor)
out = (audio.audio - attenuate_db).overlay(filtered + lvl)
await go_out(m, audio, out, audio.pref, f"{audio.pref} {lvl}lvl")
async def fvcmd(self, m):
""".fv [уровень шакала 2-100 (Default 25)] <reply to audio>
Шакалинг"""
args = utils.get_args_raw(m)
if not args: lvl = 25
else:
if args.isdigit() and (1<int(args)<101): lvl = int(args)
else: return await m.edit(f"[Шакал] Укажи уровень от 2 до 100...")
audio = await get_audio(m, "Шакал")
if not audio: return
out = audio.audio + lvl
await go_out(m, audio, out, audio.pref, f"{audio.pref} {lvl}lvl")
async def echoscmd(self, m):
""".echos <reply to audio>
    Эхо эффект"""
audio = await get_audio(m, "Эхо эффект")
if not audio: return
out = AudioSegment.empty()
n = 200
none = io.BytesIO()
out += audio.audio + AudioSegment.from_file(none)
for i in range(5):
echo = audio.audio - 10
out = out.overlay(audio.audio, n)
n += 200
await go_out(m, audio, out, audio.pref, audio.pref)
async def volupcmd(self, m):
""".volup <reply to audio>
    Увеличить громкость на 10dB"""
audio = await get_audio(m, "+10dB")
if not audio: return
out = audio.audio + 10
await go_out(m, audio, out, audio.pref, audio.pref)
async def voldwcmd(self, m):
""".voldw <reply to audio>
    Уменьшить громкость на 10dB"""
audio = await get_audio(m, "-10dB")
if not audio: return
out = audio.audio - 10
await go_out(m, audio, out, audio.pref, audio.pref)
async def revscmd(self, m):
""".revs <reply to audio>
    Развернуть аудио"""
audio = await get_audio(m, "Reverse")
if not audio: return
out = audio.audio.reverse()
await go_out(m, audio, out, audio.pref, audio.pref)
async def repscmd(self, m):
""".reps <reply to audio>
    Повторить аудио 2 раза подряд"""
audio = await get_audio(m, "Повтор")
if not audio: return
out = audio.audio*2
await go_out(m, audio, out, audio.pref, audio.pref)
async def slowscmd(self, m):
""".slows <reply to audio>
    Замедлить аудио 0.5x"""
audio = await get_audio(m, "Замедление")
if not audio: return
s2 = audio.audio._spawn(audio.audio.raw_data, overrides={"frame_rate": int(audio.audio.frame_rate * 0.5)})
out = s2.set_frame_rate(audio.audio.frame_rate)
await go_out(m, audio, out, audio.pref, audio.pref, audio.duration*2)
async def fastscmd(self, m):
""".fasts <reply to audio>
Ускорить аудио 1.5x"""
audio = await get_audio(m, "Ускорение")
if not audio: return
s2 = audio.audio._spawn(audio.audio.raw_data, overrides={"frame_rate": int(audio.audio.frame_rate * 1.5)})
out = s2.set_frame_rate(audio.audio.frame_rate)
await go_out(m, audio, out, audio.pref, audio.pref, round(audio.duration/2))
async def rightscmd(self, m):
""".rights <reply to audio>
    Весь звук в правый канал"""
audio = await get_audio(m, "Правый канал")
if not audio: return
out = effects.pan(audio.audio, +1.0)
await go_out(m, audio, out, audio.pref, audio.pref)
async def leftscmd(self, m):
""".lefts <reply to audio>
    Весь звук в левый канал"""
audio = await get_audio(m, "Левый канал")
if not audio: return
out = effects.pan(audio.audio, -1.0)
await go_out(m, audio, out, audio.pref, audio.pref)
async def normscmd(self, m):
""".norms <reply to audio>
    Нормализовать звук (Из тихого - нормальный)"""
audio = await get_audio(m, "Нормализация")
if not audio: return
out = effects.normalize(audio.audio)
await go_out(m, audio, out, audio.pref, audio.pref)
async def byrobertscmd(self, m):
'''.byroberts <reply to audio>
    Добавить в конец аудио "Directed by Robert B Weide"'''
audio = await get_audio(m, "Directed by...")
if not audio: return
out = audio.audio + AudioSegment.from_file(io.BytesIO(requests.get("https://raw.githubusercontent.com/Daniel3k00/files-for-modules/master/directed.mp3").content)).apply_gain(+8)
await go_out(m, audio, out, audio.pref, audio.pref)
def __init__(self):
self.name = self.strings['name']
self._me = None
self._ratelimit = []
async def client_ready(self, client, db):
self._db = db
self._client = client
self.me = await client.get_me()
async def get_audio(m, pref):
class audio_ae_class(): audio = None; duration = None; voice = None; pref = None; reply = None
reply = await m.get_reply_message()
if reply and reply.file and reply.file.mime_type.split("/")[0] == "audio":
ae = audio_ae_class()
ae.pref = pref
ae.reply = reply
ae.voice = reply.document.attributes[0].voice
ae.duration = reply.document.attributes[0].duration
await m.edit(f"[{pref}] Скачиваю...")
ae.audio = AudioSegment.from_file(io.BytesIO(await reply.download_media(bytes)))
await m.edit(f"[{pref}] Работаю...")
return ae
else: await m.edit(f"[{pref}] reply to audio..."); return None
async def go_out(m, audio, out, pref, title, fs=None):
o = io.BytesIO()
o.name = "audio." + ("ogg" if audio.voice else "mp3")
if audio.voice: out.split_to_mono()
await m.edit(f"[{pref}] Экспортирую...")
out.export(o, format="mp3" if audio.voice else "wav", bitrate="44100" if audio.voice else None, codec="u16le" if audio.voice else None)
o.seek(0)
await m.edit(f"[{pref}] Отправляю...")
await m.client.send_file(m.to_id, o, reply_to=audio.reply.id, voice_note=audio.voice, attributes=[types.DocumentAttributeAudio(duration = fs if fs else audio.duration, title=title, performer="@Sekai_Yoneya")] if not audio.voice else None)
await m.delete()

View File

@@ -0,0 +1,65 @@
# @Sekai_Yoneya
from .. import loader, utils
from telethon.tl.functions.contacts import BlockRequest
from telethon.tl.functions.messages import ReportSpamRequest
def register(cb):
cb(AutoBlackListMod())
class AutoBlackListMod(loader.Module):
"""Кидает всех неконтактов в ЧС."""
strings = {'name': 'AutoBlackList'}
async def client_ready(self, client, db):
self.db = db
async def autoblcmd(self, message):
"""Включить/выключить режим"""
args = utils.get_args_raw(message)
autobl = self.db.get("AutoBlackList", "status", False)
if args:
self.db.set("AutoBlackList", "status", True)
self.db.set("AutoBlackList", "message", str(args))
return await message.edit("<b>[AutoBlackList]</b> Активирован!")
if autobl == False:
self.db.set("AutoBlackList", "status", True)
self.db.set("AutoBlackList", "message", "<b>Привет! К сожалению, я не принимаю сообщения в личке от тех, кто находится не в контактах, поэтому ты был(-а) занесён(-а) в чёрный список!</b>")
return await message.edit("<b>[AutoBlackList Mode]</b> Активирован!")
self.db.set("AutoBlackList", "status", False)
return await message.edit("<b>[AutoBlackList Mode]</b> Деактивирован!")
async def autoblstatuscmd(self, message):
"""Проверить статус AutoBlackList"""
await message.edit(f"<b>[AutoBlackList - Status]</b>\n\n"
f"<b>Кидать в ЧС</b> - {self.db.get('AutoBlackList', 'status')}\n"
f"<b>Удалять чаты</b> - {self.db.get('AutoBlackList', 'delchat')}")
async def autodelchatcmd(self, message):
"""Автоматически удаляет диалог после того, как кинет в ЧС"""
autodel = self.db.get("AutoBlackList", "delchat", False)
if autodel == False:
self.db.set("AutoBlackList", "delchat", True)
return await message.edit("<b>[AutoBlackList Mode - DelChat]</b> Активирован!")
self.db.set("AutoBlackList", "delchat", False)
return await message.edit("<b>[AutoBlackList Mode - DelChat]</b> Деактивирован!")
async def watcher(self, message):
"""Вау, это watcher, я что-то смог из него сделать. Поздравьте меня)"""
try:
if message.sender_id == (await message.client.get_me()).id: return
if self.db.get("AutoBlackList", "status", True):
if message.is_private and message.sender_id != 777000:
user = await message.client.get_entity(message.chat_id)
if user.contact == False and user.bot == False:
await message.client.send_message(message.chat_id, (self.db.get("AutoBlackList", "message")))
await message.client(BlockRequest(message.chat_id))
await message.client(ReportSpamRequest(message.chat_id))
if self.db.get("AutoBlackList", "delchat") == True:
await message.client.delete_dialog(message.chat_id)
except (AttributeError, TypeError): pass

View File

@@ -0,0 +1,65 @@
# @Sekai_Yoneya
from .. import loader, utils
class BanMediaMod(loader.Module):
"""Модуль блокировки стикеров или гифок в чатах."""
strings = {"name": "BanMedia"}
async def client_ready(self, client, db):
self.db = db
async def banmediacmd(self, message):
"""Используй: .banmedia чтобы заблокировать стикер или гифку в чате. | аргументы «clear или clearall» (по желанию)"""
banned = self.db.get("BanMedia", "banned", {})
reply = await message.get_reply_message()
args = utils.get_args_raw(message)
chat = str(message.chat_id)
try:
if args == "clear":
banned.pop(chat)
self.db.set("BanMedia", "banned", banned)
return await message.edit("<b>Теперь все стикеры или гиф разрешены в этом чате.</b>")
except: return await message.edit("<b>Что то пошло по пизде :/</b>")
try:
if args == "clearall":
self.db.set("BanMedia", "banned", {})
return await message.edit("<b>Теперь все стикеры или гиф разрешены во всех чатах.</b>")
except: return await message.edit("<b>Что то пошло по пизде :/</b>")
if not reply:
return await message.edit("<b>Нету реплая.</b>")
elif not reply.media:
return await message.edit("<b>Это не файл.</b>")
try:
if reply.media:
docid = (reply.document).id
if chat not in banned:
banned.setdefault(chat, [])
if str(docid) not in banned[chat]:
banned[chat].append(str(docid))
self.db.set("BanMedia", "banned", banned)
await message.edit("<b>Теперь этот гиф или стикер запрещён в этом чате!</b>")
else:
banned[chat].remove(str(docid))
if len(banned[chat]) == 0:
banned.pop(chat)
self.db.set("BanMedia", "banned", banned)
await message.edit("<b>Теперь этот гиф или стикер разрешён в этом чате.</b>")
except: return await message.edit("<b>Что то пошло по пизде :/</b>")
async def watcher(self, message):
try:
banned = self.db.get("BanMedia", "banned", {})
chat = str(message.chat_id)
me = await message.client.get_me()
if chat not in str(banned):
return
r = banned[chat]
for i in r:
docid = (message.document).id
if docid == int(i):
if message.sender_id == me.id:
return
else:
await message.client.delete_messages(message.chat_id, message.id)
except: pass

View File

@@ -0,0 +1,238 @@
# @Sekai_Yoneya
from .. import loader, utils
from os import remove
from telethon.tl.functions.channels import LeaveChannelRequest, InviteToChannelRequest
from telethon.errors import UserIdInvalidError, UserNotMutualContactError, UserPrivacyRestrictedError, BotGroupsBlockedError, ChannelPrivateError, YouBlockedUserError, MessageTooLongError, \
UserBlockedError, ChatAdminRequiredError, UserKickedError, InputUserDeactivatedError, ChatWriteForbiddenError, UserAlreadyParticipantError
from telethon.tl.types import ChannelParticipantCreator, ChannelParticipantsAdmins, PeerChat, ChannelParticipantsBots
from telethon.tl.functions.messages import AddChatUserRequest
@loader.tds
class ChatMod(loader.Module):
"""Чат модули"""
strings = {'name': 'ChatModule'}
async def useridcmd(self, message):
"""Команда .userid <@ или реплай> показывает ID выбранного пользователя."""
args = utils.get_args_raw(message)
reply = await message.get_reply_message()
try:
if args:
user = await message.client.get_entity(args if not args.isdigit() else int(args))
else:
user = await message.client.get_entity(reply.sender_id if reply else message.sender_id)
except ValueError:
user = await message.client.get_entity(message.sender_id)
await message.edit(f"<b>Имя:</b> <code>{user.first_name}</code>\n"
f"<b>ID:</b> <code>{user.id}</code>")
async def chatidcmd(self, message):
"""Команда .chatid показывает ID чата."""
if not message.is_private:
args = utils.get_args_raw(message)
to_chat = None
try:
if args:
to_chat = args if not args.isdigit() else int(args)
else:
to_chat = message.chat_id
except ValueError:
to_chat = message.chat_id
chat = await message.client.get_entity(to_chat)
await message.edit(f"<b>Название:</b> <code>{chat.title}</code>\n"
f"<b>ID</b>: <code>{chat.id}</code>")
else:
return await message.edit("<b>Это не чат!</b>")
async def invitecmd(self, message):
"""Используйте .invite <@ или реплай>, чтобы добавить пользователя в чат."""
if message.is_private:
return await message.edit("<b>Это не чат!</b>")
args = utils.get_args_raw(message)
reply = await message.get_reply_message()
if not args and not reply:
return await message.edit("<b>Нет аргументов или реплая.</b>")
try:
if args:
user = args if not args.isdigit() else int(args)
else:
user = reply.sender_id
user = await message.client.get_entity(user)
if not message.is_channel and message.is_group:
await message.client(AddChatUserRequest(chat_id=message.chat_id,
user_id=user.id,
fwd_limit=1000000))
else:
await message.client(InviteToChannelRequest(channel=message.chat_id,
users=[user.id]))
return await message.edit("<b>Пользователь приглашён успешно!</b>")
except ValueError:
m = "<b>Неверный @ или ID.</b>"
except UserIdInvalidError:
m = "<b>Неверный @ или ID.</b>"
except UserPrivacyRestrictedError:
m = "<b>Настройки приватности пользователя не позволяют пригласить его.</b>"
except UserNotMutualContactError:
m = "<b>Настройки приватности пользователя не позволяют пригласить его.</b>"
except ChatAdminRequiredError:
m = "<b>У меня нет прав.</b>"
except ChatWriteForbiddenError:
m = "<b>У меня нет прав.</b>"
except ChannelPrivateError:
m = "<b>У меня нет прав.</b>"
except UserKickedError:
m = "<b>Пользователь кикнут из чата, обратитесь к администраторам.</b>"
except BotGroupsBlockedError:
m = "<b>Бот заблокирован в чате, обратитесь к администраторам.</b>"
except UserBlockedError:
m = "<b>Пользователь заблокирован в чате, обратитесь к администраторам.</b>"
except InputUserDeactivatedError:
m = "<b>Аккаунт пользователя удалён.</b>"
except UserAlreadyParticipantError:
m = "<b>Пользователь уже в группе.</b>"
except YouBlockedUserError:
m = "<b>Вы заблокировали этого пользователя.</b>"
return await message.reply(m)
async def leavecmd(self, message):
"""Используйте команду .leave, чтобы выйти из чата."""
args = utils.get_args_raw(message)
if not message.is_private:
if args:
await message.edit(f"<b>До связи.\nПричина: {args}</b>")
else:
await message.edit("<b>До связи.</b>")
await message.client(LeaveChannelRequest(message.chat_id))
else:
return await message.edit("<b>Это не чат!</b>")
async def userscmd(self, message):
"""Команда .users <имя>; ничего выводит список всех пользователей в чате."""
if not message.is_private:
await message.edit("<b>Считаем...</b>")
args = utils.get_args_raw(message)
info = await message.client.get_entity(message.chat_id)
title = info.title or "этом чате"
if not args:
users = await message.client.get_participants(message.chat_id)
mentions = f"<b>Пользователей в \"{title}\": {len(users)}</b> \n"
else:
users = await message.client.get_participants(message.chat_id, search=f"{args}")
mentions = f'<b>В чате "{title}" найдено {len(users)} пользователей с именем {args}:</b> \n'
for user in users:
if not user.deleted:
mentions += f"\n• <a href =\"tg://user?id={user.id}\">{user.first_name}</a> | <code>{user.id}</code>"
else:
mentions += f"\n• Удалённый аккаунт <b>|</b> <code>{user.id}</code>"
try:
await message.edit(mentions)
except MessageTooLongError:
await message.edit("<b>Черт, слишком большой чат. Загружаю список пользователей в файл...</b>")
file = open("userslist.md", "w+")
file.write(mentions)
file.close()
await message.client.send_file(message.chat_id,
"userslist.md",
caption="<b>Пользователей в {}:</b>".format(title),
reply_to=message.id)
remove("userslist.md")
await message.delete()
else:
return await message.edit("<b>Это не чат!</b>")
async def adminscmd(self, message):
"""Команда .admins показывает список всех админов в чате."""
if not message.is_private:
await message.edit("<b>Считаем...</b>")
info = await message.client.get_entity(message.chat_id)
title = info.title or "this chat"
admins = await message.client.get_participants(message.chat_id, filter=ChannelParticipantsAdmins)
mentions = f"<b>Админов в \"{title}\": {len(admins)}</b>\n"
for user in admins:
admin = admins[admins.index((await message.client.get_entity(user.id)))].participant
if not admin:
if type(admin) == ChannelParticipantCreator:
rank = "creator"
else:
rank = "admin"
else:
rank = admin.rank or "admin"
if not user.deleted:
mentions += f"\n• <a href=\"tg://user?id={user.id}\">{user.first_name}</a> | {rank} | <code>{user.id}</code>"
else:
mentions += f"\n• Удалённый аккаунт <b>|</b> <code>{user.id}</code>"
try:
await message.edit(mentions)
except MessageTooLongError:
await message.edit("Черт, слишком много админов здесь. Загружаю список админов в файл...")
file = open("adminlist.md", "w+")
file.write(mentions)
file.close()
await message.client.send_file(message.chat_id,
"adminlist.md",
caption="<b>Админов в \"{}\":<b>".format(title),
reply_to=message.id)
remove("adminlist.md")
await message.delete()
else:
return await message.edit("<b>Это не чат!</b>")
async def botscmd(self, message):
"""Команда .bots показывает список всех ботов в чате."""
if not message.is_private:
await message.edit("<b>Считаем...</b>")
info = await message.client.get_entity(message.chat_id)
title = info.title if info.title else "this chat"
bots = await message.client.get_participants(message.to_id, filter=ChannelParticipantsBots)
mentions = f"<b>Ботов в \"{title}\": {len(bots)}</b>\n"
for user in bots:
if not user.deleted:
mentions += f"\n• <a href=\"tg://user?id={user.id}\">{user.first_name}</a> | <code>{user.id}</code>"
else:
mentions += f"\n• Удалённый бот <b>|</b> <code>{user.id}</code>"
try:
await message.edit(mentions, parse_mode="html")
except MessageTooLongError:
await message.edit("Черт, слишком много ботов здесь. Загружаю список ботов в файл...")
file = open("botlist.md", "w+")
file.write(mentions)
file.close()
await message.client.send_file(message.chat_id,
"botlist.md",
caption="<b>Ботов в \"{}\":</b>".format(title),
reply_to=message.id)
remove("botlist.md")
await message.delete()
else:
return await message.edit("<b>Это не чат!</b>")

View File

@@ -0,0 +1,37 @@
# @Sekai_Yoneya
from .. import loader
from telethon.tl.types import *
@loader.tds
class ChatStatisticMod(loader.Module):
"Статистика чата"
strings = {"name": "ChatStatistic"}
@loader.owner
async def statacmd(self, m):
await m.edit("<b>Считаем...</b>")
al = str((await m.client.get_messages(m.to_id, limit=0)).total)
ph = str((await m.client.get_messages(m.to_id, limit=0, filter=InputMessagesFilterPhotos())).total)
vi = str((await m.client.get_messages(m.to_id, limit=0, filter=InputMessagesFilterVideo())).total)
mu = str((await m.client.get_messages(m.to_id, limit=0, filter=InputMessagesFilterMusic())).total)
vo = str((await m.client.get_messages(m.to_id, limit=0, filter=InputMessagesFilterVoice())).total)
vv = str((await m.client.get_messages(m.to_id, limit=0, filter=InputMessagesFilterRoundVideo())).total)
do = str((await m.client.get_messages(m.to_id, limit=0, filter=InputMessagesFilterDocument())).total)
urls = str((await m.client.get_messages(m.to_id, limit=0, filter=InputMessagesFilterUrl())).total)
gifs = str((await m.client.get_messages(m.to_id, limit=0, filter=InputMessagesFilterGif())).total)
geos = str((await m.client.get_messages(m.to_id, limit=0, filter=InputMessagesFilterGeo())).total)
cont = str((await m.client.get_messages(m.to_id, limit=0, filter=InputMessagesFilterContacts())).total)
await m.edit(
("<b>✉️Всего сoообщений</b> {}\n" +
"<b>🖼️Фоток:</b> {}\n" +
"<b>📹Видосов:</b> {}\n" +
"<b>🎵Музыки:</b> {}\n" +
"<b>🎶Голосовых:</b> {}\n" +
"<b>🎥Кругляшков:</b> {}\n" +
"<b>📂Файлов:</b> {}\n" +
"<b>🔗Ссылок:</b> {}\n" +
"<b>🎞️Гифок:</b> {}\n" +
"<b>🗺️Координат:</b> {}\n" +
"<b>👭Контактов:</b> {}").format(al, ph, vi, mu, vo, vv, do, urls, gifs, geos, cont))

View File

@@ -0,0 +1,25 @@
# @Sekai_Yoneya
from .. import loader, utils
import re
from asyncio import sleep
@loader.tds
class DelTmMod(loader.Module):
strings = {"name": "Delete timer"}
"Удаляет сообщение через указанное время"
@loader.owner
async def deltmcmd(self, m):
".deltm <реплай> <секунды>"
reply = await m.get_reply_message()
if not reply:
return await m.edit("reply to message...")
a = re.compile(r"^\d+$")
t = utils.get_args_raw(m)
if a.match(t):
await m.delete()
await sleep(int(t))
await reply.delete()
else:
await m.edit("shit...")
return

View File

@@ -0,0 +1,81 @@
# by @Sekai_Yoneya
from asyncio import sleep
import random
from telethon import functions
from userbot.events import register
from telethon.errors.rpcerrorlist import YouBlockedUserError
from telethon import events
from .. import loader, utils
def register(cb):
cb(FrazesMod())
class FrazesMod(loader.Module):
"""Госу, пикапы, подкаты."""
strings = {'name': 'Фразы'}
def init(self):
self.name = self.strings['name']
self._me = None
self._ratelimit = []
async def client_ready(self, client, db):
self._db = db
self._client = client
async def gosucmd(self, event):
"""Выебать чью-то мамку"""
chat = '@yoneyabs_bot'
async with event.client.conversation(chat) as conv:
try:
response = conv.wait_event(events.NewMessage(incoming=True, from_users= 1705701465 ))
await event.client.send_message(chat, '/gosu')
response = await response
except YouBlockedUserError:
await event.edit('<code>Разблокируй @YoneyaBS_bot</code>')
return
await event.edit(response.text)
async def client_ready(self, client, db):
self._db = db
self._client = client
async def pikapcmd(self, event):
"""Пикап"""
chat = '@yoneyabs_bot'
async with event.client.conversation(chat) as conv:
try:
response = conv.wait_event(events.NewMessage(incoming=True, from_users= 1705701465 ))
await event.client.send_message(chat, '/pikap')
response = await response
except YouBlockedUserError:
await event.edit('<code>Разблокируй @YoneyaBS_bot</code>')
return
await event.edit(response.text)
async def podkatcmd(self, event):
"""Подкат"""
chat = '@yoneyabs_bot'
async with event.client.conversation(chat) as conv:
try:
response = conv.wait_event(events.NewMessage(incoming=True, from_users= 1705701465 ))
await event.client.send_message(chat, '/podkat')
response = await response
except YouBlockedUserError:
await event.edit('<code>Разблокируй @YoneyaBS_bot</code>')
return
await event.edit(response.text)
async def ayfcmd(self, event):
"""АУФ!!!"""
chat = '@yoneyabs_bot'
async with event.client.conversation(chat) as conv:
try:
response = conv.wait_event(events.NewMessage(incoming=True, from_users= 1705701465 ))
await event.client.send_message(chat, '/ayf')
response = await response
except YouBlockedUserError:
await event.edit('<code>Разблокируй @YoneyaBS_bot</code>')
return
await event.edit(response.text)

View File

@@ -0,0 +1,37 @@
# @Sekai_Yoneya
from .. import loader, utils
from telethon.tl.functions.messages import CreateChatRequest, ExportChatInviteRequest, DeleteChatUserRequest
from telethon.tl.functions.channels import CreateChannelRequest
from telethon.errors import UserRestrictedError
def register(cb):
cb(GroupCreatorMod())
class GroupCreatorMod(loader.Module):
"""Создать чат или канал."""
strings = {'name': 'GroupCreator'}
async def createcmd(self, message):
"""Используй .create <g|s|c> <название>, чтобы создать группу, супергруппу или канал."""
args = utils.get_args_raw(message).split(' ')
try:
title = utils.get_args_raw(message).split(" ", 1)[1]
if 'g' in args[0]:
r = await message.client(CreateChatRequest(users=['missrose_bot'], title=title))
created_chat = r.chats[0].id
await message.client(DeleteChatUserRequest(chat_id=created_chat, user_id='@missrose_bot'))
elif 's' in args[0]:
r = await message.client(CreateChannelRequest(title=title, about='', megagroup=True))
elif 'c' in args[0]:
r = await message.client(CreateChannelRequest(title=title, about='', megagroup=False))
created_chat = r.chats[0].id
result = await message.client(ExportChatInviteRequest(peer=created_chat))
await message.edit(f'<b>Группа \"{title}\" создана.\nЛинк: {result.link}.</b>')
except IndexError:
return await message.edit('<b>Неверно указаны аргументы.</b>')
except UnboundLocalError:
return await message.edit('<b>Неверно указаны аргументы.</b>')
except UserRestrictedError:
return await message.edit('<b>У вас спамбан, вы не можете создавать каналы или группы.</b>')

View File

@@ -0,0 +1,146 @@
# @Sekai_Yoneya
from telethon import events
from telethon.errors.rpcerrorlist import YouBlockedUserError
from .. import loader, utils
def register(cb):
cb(leomatchMod())
class leomatchMod(loader.Module):
"""Леонардо Дайвинчик"""
strings = {'name': 'Leo'}
def init(self):
self.name = self.strings['name']
self._me = None
self._ratelimit = []
async def client_ready(self, client, db):
self._db = db
self._client = client
self.me = await client.get_me()
async def dizcmd(self, event):
"""Дизлайкнуть пользователь."""
user_msg = """{}""".format(utils.get_args_raw(event))
global text
text = False
if event.fwd_from:
return
self_mess = True
if not user_msg:
return
chat = '@leomatchbot'
async with event.client.conversation(chat) as conv:
try:
response = conv.wait_event(events.NewMessage(incoming=True,
from_users= 1234060895))
await event.client.send_message(chat, '👎')
response = await response
except YouBlockedUserError:
await event.reply('<code>Разблокируй @leomatchbot</code>')
return
await event.delete()
yoneya = response.text
await event.client.send_file(event.to_id, response.media, caption=yoneya)
async def likecmd(self, event):
"""Лайкнуть пользователь."""
user_msg = """{}""".format(utils.get_args_raw(event))
global text
text = False
if event.fwd_from:
return
self_mess = True
if not user_msg:
return
chat = '@leomatchbot'
async with event.client.conversation(chat) as conv:
try:
response = conv.wait_event(events.NewMessage(incoming=True,
from_users= 1234060895))
await event.client.send_message(chat, '❤️')
response = await response
except YouBlockedUserError:
await event.reply('<code>Разблокируй @leomatchbot</code>')
return
await event.delete()
yoneya = response.text
await event.client.send_file(event.to_id, response.media, caption=yoneya)
async def spackcmd(self, event):
"""Не нужен мне ваш стикерпак."""
user_msg = """{}""".format(utils.get_args_raw(event))
global text
text = False
if event.fwd_from:
return
self_mess = True
if not user_msg:
return
chat = '@leomatchbot'
async with event.client.conversation(chat) as conv:
try:
response = conv.wait_event(events.NewMessage(incoming=True,
from_users= 1234060895))
await event.client.send_message(chat, 'В другой раз')
response = await response
except YouBlockedUserError:
await event.reply('<code>Разблокируй @leomatchbot</code>')
return
await event.delete()
yoneya = response.text
await event.client.send_file(event.to_id, response.media, caption=yoneya)
async def ttcmd(self, event):
"""Не нужен мне ваш тик ток."""
user_msg = """{}""".format(utils.get_args_raw(event))
global text
text = False
if event.fwd_from:
return
self_mess = True
if not user_msg:
return
chat = '@leomatchbot'
async with event.client.conversation(chat) as conv:
try:
response = conv.wait_event(events.NewMessage(incoming=True,
from_users= 1234060895))
await event.client.send_message(chat, 'Продолжить просмотр анкет')
response = await response
except YouBlockedUserError:
await event.reply('<code>Разблокируй @leomatchbot</code>')
return
await event.delete()
yoneya = response.text
await event.client.send_file(event.to_id, response.media, caption=yoneya)
async def unafkcmd(self, event):
"""Выйти из АФК и смотреть анкеты."""
user_msg = """{}""".format(utils.get_args_raw(event))
global text
text = False
if event.fwd_from:
return
self_mess = True
if not user_msg:
return
chat = '@leomatchbot'
async with event.client.conversation(chat) as conv:
try:
response = conv.wait_event(events.NewMessage(incoming=True,
from_users= 1234060895))
await event.client.send_message(chat, '1 🚀')
response = await response
except YouBlockedUserError:
await event.reply('<code>Разблокируй @leomatchbot</code>')
return
await event.delete()
yoneya = response.text
await event.client.send_file(event.to_id, response.media, caption=yoneya)

View File

@@ -0,0 +1,56 @@
# @Sekai_Yoneya
from .. import loader, utils
@loader.tds
class MyRepMod(loader.Module):
"""Модуль с вашей репутацией"""
strings={"name":"Репутация"}
async def client_ready(self, message, db):
self.db=db
self.db.set("MyRep", "repstatus", True)
async def repcmd(self, message):
"""Включить режим репутаций."""
repstatus = self.db.get("MyRep", "repstatus")
if repstatus is not True:
self.db.set("MyRep", "repstatus", True)
await message.edit(f"<b>[MyRepMod] ✅Режим репутаций включен!</b>")
else:
self.db.set("MyRep", "repstatus", False)
await message.edit(f"<b>[MyRepMod] ❌Режим репутаций выключен!</b>")
async def myrepcmd(self, message):
"""Посмотреть свою репутацию. Используй: .myrep clear (очистка репутации)."""
args = utils.get_args_raw(message)
if args == "clear":
self.db.set("MyRep", "my_repa", 0)
return await message.edit("<b>[MyRepMod] 🔁Моя Репутация очищена.</b>")
myrep = self.db.get("MyRep", "my_repa")
repstatus = self.db.get("MyRep", "repstatus")
if repstatus is not False:
msg_repstatus = "[<i>✅Включен.</i>]"
else:
msg_repstatus = "[<i>❌Выключен.</i>]"
await message.edit(f"♻️ <b>[</b><i>Репутация</i><b>]</b> ♻️\n<b>Статус режима: </b>{msg_repstatus}<b>\nКол-во: <i>{myrep}</i>.</b>")
async def watcher(self, message):
try:
number = self.db.get("MyRep", "my_repa", 0)
repstatus = self.db.get("MyRep", "repstatus")
if message.mentioned:
if repstatus is not False:
if message.text == "+":
number += 1
self.db.set("MyRep", "my_repa", number)
await message.reply(f"<b>Ты повысил мою репутацию!\nНовое значение: {number}.</b>")
if message.text == "+2":
number += 2
self.db.set("MyRep", "my_repa", number)
await message.reply(f"<b>Ты повысил мою репутацию!\nНовое значение: {number}.</b>")
elif message.text == "-":
total = int(number) - 1
self.db.set("MyRep", "my_repa", total)
await message.reply(f"<b>Ты понизил мою репутацию!\nНовое значение: {total}.</b>")
except: pass

View File

@@ -0,0 +1,30 @@
# @Sekai_Yoneya
from .. import loader
from asyncio import sleep
@loader.tds
class EternalOnlineMod(loader.Module):
"""Вечный онлайн, который будет читать сообщения в чатах."""
strings = {'name': 'Online'}
async def client_ready(self, client, db):
self.db = db
async def onlinecmd(self, message):
"""Включить вечный онлайн"""
if not self.db.get("Eternal Online", "status"):
self.db.set("Eternal Online", "status", True)
await message.edit("<b>Вечный онлайн включен</b>")
while self.db.get("Eternal Online", "status"):
msg = await message.client.send_message("me", "Telegram best messenger! 🤩")
await msg.delete()
await sleep(1000)
else:
self.db.set("Eternal Online", "status", False)
await message.edit("<b>Вечный онлайн выключен</b>")
async def watcher(self, message):
if self.db.get("Eternal Online", "status"):
await message.client.send_read_acknowledge(message.chat_id, clear_mentions=True)

View File

@@ -0,0 +1,17 @@
# @Sekai_Yoneya
from .. import loader
from random import choice as Yoneya
def register(cb):
cb(PicPhotosMod())
class PicPhotosMod(loader.Module):
"""Фотографии из @pic."""
strings = {'name': 'Pic'}
async def gowcmd(self, event):
await event.edit('<b>Бог Войны!</b>')
reslt=await event.client.inline_query('pic',Yoneya(['Кратос убил Зевса']))
await reslt[reslt.index(Yoneya(reslt))].click(event.to_id)

View File

@@ -0,0 +1,46 @@
# @Sekai_Yoneya
from telethon import events
from telethon.errors.rpcerrorlist import YouBlockedUserError
from .. import loader, utils
from datetime import datetime
def register(cb):
cb(PingerMod())
class PingerMod(loader.Module):
"""более точный пинг"""
strings = {'name': 'Pinger'}
def init(self):
self.name = self.strings['name']
self._me = None
self._ratelimit = []
async def client_ready(self, client, db):
self._db = db
self._client = client
self.me = await client.get_me()
async def pingcmd(self, message):
"""пингует"""
a = 5
r = utils.get_args(message)
if r and r[0].isdigit():
a = int(r[0])
ping_msg = []
ping_data = []
for _ in range(a):
start = datetime.now()
msg = await message.client.send_message("me", "ping")
end = datetime.now()
duration = (end - start).microseconds / 1000
ping_data.append(duration)
ping_msg.append(msg)
ping = sum(ping_data) / len(ping_data)
await message.edit(f"<b>[Я тебя люблю ❤️] > </b><code>{str(ping)[0:5]}ms</code>")
for i in ping_msg:
await i.delete()

View File

@@ -0,0 +1,803 @@
# @Sekai_Yoneya
import hashlib
import io
import json
import logging
import os
import PIL
import requests
import telethon
from telethon.tl.types import (MessageEntityBold, MessageEntityItalic,
MessageEntityMention, MessageEntityTextUrl,
MessageEntityCode, MessageEntityMentionName,
MessageEntityHashtag, MessageEntityCashtag,
MessageEntityBotCommand, MessageEntityUrl,
MessageEntityStrike, MessageEntityUnderline,
MessageEntityPhone, ChannelParticipantsAdmins,
ChannelParticipantCreator,
PeerChannel,
User, PeerUser,
MessageMediaUnsupported)
from .. import loader, utils
logger = logging.getLogger(__name__)
BUILD_ID = "b890541d-be52-4b9d-8ced-f5359d9d7109" # None to disable autoupdates
MODULE_PATH = "https://quotes.mishase.dev/f/module.py"
@loader.tds
class QuotesMod(loader.Module):
"""Quotes a message"""
strings = {
"name": "Quotes",
"silent_processing_cfg_doc": ("Process quote "
"silently(mostly"
" w/o editing)"),
"module_endpoint_cfg_doc": "Module endpoint URL",
"quote_limit_cfg_doc": "Limit for messages per quote",
"max_width_cfg_doc": "Maximum quote width in pixels",
"scale_factor_cfg_doc": "Quote quality (up to 5.5)",
"square_avatar_cfg_doc": "Square avatar in quote",
"text_color_cfg_doc": "Color of text in quote",
"reply_line_color_cfg_doc": "Reply line color",
"reply_thumb_radius_cfg_doc": ("Reply media thumbnail "
"radius in pixels"),
"admintitle_color_cfg_doc": "Admin title color",
"message_radius_cfg_doc": "Message radius in px",
"picture_radius_cfg_doc": "Media picture radius in px",
"background_color_cfg_doc": "Quote background color",
"quote_limit_reached": ("The maximum number "
"of messages in "
"multiquote - {}."),
"fq_incorrect_args": ("<b>Args incorrect.</b> \"@$username (ID)"
"$text\" or \"$reply $text\""),
"updating": "<b>Updating...</b>",
"update_error": "<b>Update error</b>",
"processing": "<b>Processing...</b>",
"unreachable_error": "<b>API Host is unreachable now. Please try again later.</b>",
"server_error": "<b>API Error occured :)</b>",
"no_reply": "<b>You didn't reply to a message.</b>",
"creator": "Owner",
"admin": "Admin",
"channel": "Channel",
"media_type_photo": "Photo",
"media_type_video": "📹Video",
"media_type_videomessage": "📹Video message",
"media_type_voice": "🎵Voice message",
"media_type_audio": "🎧Music: {} - {}",
"media_type_contact": "👤Contact: {}",
"media_type_poll": "📊Poll: ",
"media_type_quiz": "📊Quiz: ",
"media_type_location": "📍Location",
"media_type_gif": "🖼GIF",
"media_type_sticker": "Sticker",
"media_type_file": "💾File",
"dice_type_dice": "Dice",
"dice_type_dart": "Dart",
"ball_thrown": "Ball thrown",
"ball_kicked": "Ball kicked",
"dart_thrown": "Dart thrown",
"dart_almostthere": "almost there!",
"dart_missed": "missed!",
"dart_bullseye": "bullseye!"
}
def __init__(self):
self.config = loader.ModuleConfig("SILENT_PROCESSING", False,
lambda: self.strings["silent_processing_cfg_doc"],
"QUOTE_MESSAGES_LIMIT", 15,
lambda: self.strings["quote_limit_cfg_doc"],
"MAX_WIDTH", 384,
lambda: self.strings["max_width_cfg_doc"],
"SCALE_FACTOR", 5,
lambda: self.strings["scale_factor_cfg_doc"],
"SQUARE_AVATAR", False,
lambda: self.strings["square_avatar_cfg_doc"],
"TEXT_COLOR", "white",
lambda: self.strings["text_color_cfg_doc"],
"REPLY_LINE_COLOR", "white",
lambda: self.strings["reply_line_color_cfg_doc"],
"REPLY_THUMB_BORDER_RADIUS", 2,
lambda: self.strings["reply_thumb_radius_cfg_doc"],
"ADMINTITLE_COLOR", "#969ba0",
lambda: self.strings["admintitle_color_cfg_doc"],
"MESSAGE_BORDER_RADIUS", 10,
lambda: self.strings["message_radius_cfg_doc"],
"PICTURE_BORDER_RADIUS", 8,
lambda: self.strings["picture_radius_cfg_doc"],
"BACKGROUND_COLOR", "#162330",
lambda: self.strings["background_color_cfg_doc"])
async def client_ready(self, client, db):
self.client = client
@loader.unrestricted
@loader.ratelimit
async def mquotecmd(self, message):
await self.quotecmd(message)
@loader.unrestricted
@loader.ratelimit
async def quotecmd(self, message):
""".quote <reply> - quote a message"""
if not self.config["SILENT_PROCESSING"]:
mmm = await utils.answer(
message,
self.strings(
"processing",
message
)
)
args = utils.get_args_raw(message)
reply = await message.get_reply_message()
if not reply:
return await utils.answer(
mmm,
self.strings("no_reply", message)
)
if not args or not args.isdigit():
count = 1
else:
count = int(args.strip())
if count <= 0:
count = 1
if count > self.config["QUOTE_MESSAGES_LIMIT"]:
return await utils.answer(
mmm,
self.strings(
"quote_limit_reached",
message
).format(
self.config["QUOTE_MESSAGES_LIMIT"]
)
)
messages = list()
messages_client = list()
media_files = dict()
current_message = reply.id
end_message = current_message + count
while current_message != end_message:
msg = await self.client.get_messages(
message.to_id,
ids=current_message
)
if msg:
messages_client.append(msg)
current_message += 1
for msg in messages_client:
text = msg.raw_text
markdown = await get_markdown(msg)
admintitle = str()
if isinstance(msg.to_id, PeerChannel) and msg.fwd_from:
user = msg.forward.chat
else:
user = await msg.get_sender()
if msg.fwd_from:
if msg.fwd_from.saved_from_peer:
if isinstance(msg.fwd_from.saved_from_peer, PeerUser):
user_id = msg.fwd_from.saved_from_peer.user_id
elif isinstance(msg.fwd_from.saved_from_peer, PeerChannel):
user_id = msg.fwd_from.saved_from_peer.channel_id
else:
user_id = None
elif isinstance(msg.fwd_from.from_id, PeerChannel):
user_id = msg.fwd_from.from_id.channel_id
elif isinstance(msg.fwd_from.from_id, PeerUser):
user_id = msg.fwd_from.from_id.user_id
else:
user_id = None
if not user_id:
name = msg.fwd_from.from_name
user_id = int(hashlib.shake_256(name.encode("utf-8")).hexdigest(6), 16)
pfp = None
else:
sender = await self.client.get_entity(user_id)
name = telethon.utils.get_display_name(sender)
pfp = media_files.get(
"@av{}".format(str(user_id).lstrip("-")),
None
)
if msg.fwd_from.saved_from_peer:
profile_photo_url = msg.forward.chat
elif msg.fwd_from.from_name:
name = msg.fwd_from.from_name
profile_photo_url = None
elif msg.forward.sender:
name = telethon.utils. \
get_display_name(msg.forward.sender)
profile_photo_url = msg.forward.sender.id
elif msg.forward.chat:
profile_photo_url = user
if msg.fwd_from is not None and msg.fwd_from.post_author is not None:
name += f" ({msg.fwd_from.post_author})"
if not pfp:
pfp = await self.client \
.download_profile_photo(profile_photo_url, "mishase_cache/")
if pfp:
media_files[
"@av{}".format(str(user_id).lstrip("-"))
] = pfp
else:
user_id = msg.sender_id if \
msg.sender_id != 1087968824 \
else message.chat_id
if not message.chat or (user_id != message.chat_id or isinstance(message.chat, User)):
sender = await self.client.get_entity(user_id)
name = telethon.utils.get_display_name(sender)
pfp = media_files.get(
"@av{}".format(str(user_id).lstrip("-")),
None
)
if not pfp:
pfp = await self.client \
.download_profile_photo(msg.sender_id, "mishase_cache/")
if pfp:
media_files[
"@av{}".format(str(user_id).lstrip("-"))
] = pfp
else:
name = message.chat.title
try:
dl_chat_pfp = await self.client \
.download_profile_photo(user_id, "mishase_cache/")
no_pfp = False
except Exception as e:
logger.error(e, exc_info=True)
no_pfp = True
if no_pfp is False:
media_files[
"@av{}".format(str(user_id).lstrip("-"))
] = dl_chat_pfp
media_files = await check_media(self.client, msg, media_files, False)
message_reply = await msg.get_reply_message()
if message_reply:
reply_text = message_reply.raw_text
media_caption = await get_media_caption(message_reply)
if media_caption != "":
if not reply_text:
reply_text = media_caption
else:
reply_text = "{} \"{}\"".format(
media_caption,
reply_text
)
if message_reply.fwd_from:
if message_reply.forward.chat:
reply_sender = message_reply.forward.chat
reply_name = telethon.utils.get_display_name(
reply_sender
)
media_files = await check_media(
self.client,
message_reply,
media_files,
True
)
reply_message = {
"author": reply_name,
"text": reply_text,
}
if "@mediareply{}".format(message_reply.id) in media_files:
reply_message["thumbnail"] = {
"file": "@mediareply{}".format(message_reply.id)
}
elif message_reply.fwd_from.sender_id:
reply_sender = message_reply.fwd_from.sender_id
reply_user = await self.client.get_entity(reply_sender)
reply_name = telethon.utils.get_display_name(
reply_user
)
media_files = await check_media(
self.client,
message_reply,
media_files,
True
)
reply_message = {
"author": reply_name,
"text": reply_text,
}
if "@mediareply{}".format(message_reply.id) in media_files:
reply_message["thumbnail"] = {
"file": "@mediareply{}".format(message_reply.id)
}
else:
media_files = await check_media(
self.client,
message_reply,
media_files,
True
)
reply_message = {
"author": message_reply.fwd_from.from_name,
"text": reply_text,
}
if "@mediareply" in media_files:
reply_message["thumbnail"] = {
"file": "@mediareply"
}
elif message_reply.sender_id:
reply_sender = message_reply.sender
reply_name = telethon.utils.get_display_name(reply_sender)
media_files = await check_media(
self.client,
message_reply,
media_files,
True
)
reply_message = {
"author": reply_name,
"text": reply_text
}
if "@mediareply{}".format(message_reply.id) in media_files:
reply_message["thumbnail"] = {
"file": "@mediareply{}".format(message_reply.id)
}
else:
reply_name = message.chat
media_files = await check_media(
self.client,
message_reply,
media_files,
True
)
reply_message = {
"author": reply_name,
"text": reply_text
}
if "@mediareply{}".format(message_reply.id) in media_files:
reply_message["thumbnail"] = {
"file": "@mediareply{}".format(message_reply.id)
}
else:
reply_message = None
if message.chat:
if msg.sender_id and not msg.fwd_from:
admins = await self.client \
.get_participants(message.to_id, filter=ChannelParticipantsAdmins)
if msg.sender in admins:
admin = admins[admins.index(msg.sender)].participant
if not admin:
admintitle = " "
else:
admintitle = admin.rank
if not admintitle:
if type(admin) == ChannelParticipantCreator:
admintitle = self.strings(
"creator",
message
)
else:
admintitle = self.strings(
"admin",
message
)
elif msg.fwd_from.saved_from_peer:
admintitle = self.strings(
"channel",
message
)
elif msg.fwd_from.from_id:
admintitle = self.strings(
"channel",
message
)
else:
admintitle = reply.post_author if \
reply.post_author else " "
message_to_append = {
"text": text,
"reply": reply_message,
"entities": markdown,
"author": {
"id": str(user_id).lstrip("-"),
"name": name,
"adminTitle": admintitle
}
}
if f'@av{str(user_id).lstrip("-")}' in media_files:
message_to_append["author"]["picture"] = {
"file": f'@av{str(user_id).lstrip("-")}'
}
if "@media{}".format(msg.id) in media_files:
message_to_append["picture"] = {
"file": "@media{}".format(msg.id)
}
messages.append(message_to_append)
data = {
"messages": messages,
"maxWidth": self.config["MAX_WIDTH"],
"scaleFactor": self.config["SCALE_FACTOR"],
"squareAvatar": self.config["SQUARE_AVATAR"],
"textColor": self.config["TEXT_COLOR"],
"replyLineColor": self.config["REPLY_LINE_COLOR"],
"adminTitleColor": self.config["ADMINTITLE_COLOR"],
"messageBorderRadius": self.config["MESSAGE_BORDER_RADIUS"],
"replyThumbnailBorderRadius": self.config["REPLY_THUMB_BORDER_RADIUS"],
"pictureBorderRadius": self.config["PICTURE_BORDER_RADIUS"],
"backgroundColor": self.config["BACKGROUND_COLOR"],
}
files = []
for file in media_files.keys():
files.append(
(
"files",
(
file,
open(
media_files[file],
"rb"
),
"image/jpg"
)
)
)
if not files:
files.append(
(
"files",
(
"file",
bytearray(),
"text/text"
)
)
)
try:
req = await utils.run_sync(
requests.post,
"https://quotes.mishase.dev/create",
data={"data": json.dumps(data), "moduleBuild": BUILD_ID},
files=files,
timeout=100
)
except (requests.ConnectionError, requests.exceptions.Timeout):
await clean_files()
return await utils.answer(
mmm,
self.strings("unreachable_error", message)
)
except:
pass
await clean_files()
if req.status_code >= 520:
return await utils.answer(
mmm,
self.strings("unreachable_error", message)
)
if req.status_code >= 500:
return await utils.answer(
mmm,
self.strings("server_error", message)
)
if req.status_code == 418:
if not self.config["SILENT_PROCESSING"]:
await utils.answer(mmm, self.strings("updating", message))
if await update(self.allmodules.modules, message):
return await self.allmodules.commands["quote"](message)
else:
return await utils.answer(mmm, self.strings("update_error", message))
image = io.BytesIO()
image.name = "quote.webp"
try:
PIL.Image.open(io.BytesIO(req.content)).save(image, "WEBP")
image.seek(0)
return await utils.answer(mmm, image)
except Exception as e:
logger.error(e, exc_info=True)
return await utils.answer(
mmm,
self.strings(
"server_error",
message
)
)
@loader.unrestricted
@loader.ratelimit
async def fquotecmd(self, message):
""".fquote @<username> <text> or <reply> <text> - fake quote"""
if not self.config["SILENT_PROCESSING"]:
mmm = await utils.answer(
message,
self.strings(
"processing",
message
)
)
args = utils.get_args_raw(message)
reply = await message.get_reply_message()
spl_args = args.split(maxsplit=1)
if len(spl_args) == 2 and (spl_args[0].startswith('@') or spl_args[0].isdigit()):
user = spl_args[0][1:] if spl_args[0].startswith('@') else int(spl_args[0])
text = spl_args[1]
elif reply:
user = reply.sender_id
text = " ".join(spl_args)
else:
await utils.answer(
mmm,
self.strings(
"fq_incorrect_args",
message
)
)
return
try:
user = await self.client.get_entity(user)
name = telethon.utils.get_display_name(user)
avatar = await self.client.download_profile_photo(user.id, "mishase_cache/") if not str(user).isdigit() else \
await self.client.download_profile_photo(user, "mishase_cache/")
except:
await utils.answer(
mmm,
self.strings(
"fq_incorrect_args",
message
)
)
return
files = []
msg = {
"text": text,
"reply": None,
"entities": [],
"author": {
"id": str(user.id) if not str(user).isdigit() else str(user),
"name": name,
"adminTitle": ' ',
}
}
if avatar:
msg['author']['picture'] = {'file': f'@av{str(user.id).lstrip("-")}'}
files.append(("files", (
f'@av{str(user.id if not str(user).isdigit() else user).lstrip("-")}', open(avatar, "rb"),
"image/jpg")))
else:
files.append(("files", ("file", bytearray(), "text/text")))
data = {
"messages": [msg],
"maxWidth": self.config["MAX_WIDTH"],
"scaleFactor": self.config["SCALE_FACTOR"],
"squareAvatar": self.config["SQUARE_AVATAR"],
"textColor": self.config["TEXT_COLOR"],
"replyLineColor": self.config["REPLY_LINE_COLOR"],
"adminTitleColor": self.config["ADMINTITLE_COLOR"],
"messageBorderRadius": self.config["MESSAGE_BORDER_RADIUS"],
"replyThumbnailBorderRadius": self.config["REPLY_THUMB_BORDER_RADIUS"],
"pictureBorderRadius": self.config["PICTURE_BORDER_RADIUS"],
"backgroundColor": self.config["BACKGROUND_COLOR"],
}
try:
req = await utils.run_sync(
requests.post,
"https://quotes.mishase.dev/create",
data={"data": json.dumps(data), "moduleBuild": BUILD_ID},
files=files,
timeout=100
)
except (requests.ConnectionError, requests.exceptions.Timeout):
await clean_files()
return await utils.answer(
mmm,
self.strings("unreachable_error", message)
)
await clean_files()
if req.status_code >= 520:
return await utils.answer(
mmm,
self.strings("unreachable_error", message)
)
if req.status_code >= 500:
return await utils.answer(
mmm,
self.strings("server_error", message)
)
if req.status_code == 418:
if not self.config["SILENT_PROCESSING"]:
await utils.answer(mmm, self.strings("updating", message))
if await update(self.allmodules.modules, message):
return await self.allmodules.commands["quote"](message)
else:
return await utils.answer(mmm, self.strings("update_error", message))
image = io.BytesIO()
image.name = "fquote.webp"
try:
PIL.Image.open(io.BytesIO(req.content)).save(image, "WEBP")
image.seek(0)
return await utils.answer(mmm, image)
except Exception as e:
logger.error(e, exc_info=True)
return await utils.answer(
mmm,
self.strings(
"server_error",
message
)
)
async def clean_files():
return os.system("rm -rf mishase_cache/*")
async def update(modules, message, url=MODULE_PATH):
loader = next(filter(lambda x: "LoaderMod" == x.__class__.__name__, modules))
try:
if await loader.download_and_install(url, message):
loader._db.set(__name__, "loaded_modules",
list(set(loader._db.get(__name__, "loaded_modules", [])).union([url])))
return True
else:
return False
except Exception as e:
logger.error(e, exc_info=True)
return False
async def check_media(client, reply, media_files: dict, is_reply: bool):
allowed_exts = [".png", ".webp", ".jpg", ".jpeg", ".tgs", ".mp4"]
if reply and reply.media:
if reply.photo:
data = reply.photo
elif reply.document:
if reply.audio or reply.voice:
return media_files
elif reply.file.ext not in allowed_exts:
return media_files
data = reply.media.document
else:
return media_files
else:
return media_files
if not data or data is None:
return media_files
else:
if reply.file.ext == ".tgs":
if not is_reply:
data = await client.download_media(data, "mishase_cache/")
new = data + ".png"
os.system(f"lottie_convert.py \"{data}\" \"{new}\" --frame 5")
data = new
else:
data = await client.download_media(data, thumb=-1)
elif reply.file.ext == ".mp4":
data = await client.download_media(data, thumb=-1)
else:
data = await client.download_media(data, "mishase_cache/")
if not is_reply:
media_files["@media{}".format(reply.id)] = data
else:
media_files["@mediareply{}".format(reply.id)] = data
return media_files
async def get_media_caption(reply_message):
if reply_message and reply_message.media:
if type(reply_message.media) == MessageMediaUnsupported:
return "Unsupported message media"
if reply_message.photo:
return mQuotesMod.strings["media_type_photo"]
dice = False
try:
dice = True if reply_message.dice else False
except AttributeError:
try:
dice = True if type(reply_message.media) == telethon.tl.types.MessageMediaDice else False
except AttributeError:
pass
if dice:
dice_type = ""
dice_text = reply_message.media.value
if reply_message.media.emoticon == "🎲":
dice_type = mQuotesMod.strings["dice_type_dice"]
return "{} {}: {}".format(reply_message.media.emoticon, dice_type, dice_text)
elif reply_message.media.emoticon == "🎯":
if dice_text == 1:
dice_text = mQuotesMod.strings["dart_missed"]
elif dice_text == 5:
dice_text = mQuotesMod.strings["dart_almostthere"]
elif dice_text == 6:
dice_text = mQuotesMod.strings["dart_bullseye"]
else:
return "{} {}".format(reply_message.media.emoticon, mQuotesMod.strings["dart_thrown"])
dice_type = mQuotesMod.strings["dice_type_dart"]
return "{} {}: {}".format(reply_message.media.emoticon, dice_type, dice_text)
elif reply_message.media.emoticon == "🏀":
return "{} {}".format(reply_message.media.emoticon, mQuotesMod.strings["ball_thrown"])
elif reply_message.media.emoticon == b"\xe2\x9a\xbd".decode():
return "{} {}".format(reply_message.media.emoticon, mQuotesMod.strings["ball_kicked"])
else:
return "Unsupported dice type ({}): {}" \
.format(reply_message.media.emoticon, reply_message.media.value)
elif reply_message.poll:
if reply_message.poll.poll.quiz:
return mQuotesMod.strings["media_type_quiz"] + reply_message.poll.poll.question
else:
return mQuotesMod.strings["media_type_poll"] + reply_message.poll.poll.question
elif reply_message.geo:
return mQuotesMod.strings["media_type_location"]
elif reply_message.contact:
name = reply_message.contact.first_name + reply_message.contact.last_name
return mQuotesMod.strings["media_type_contact"].format(
name
)
elif reply_message.document:
if reply_message.gif:
return mQuotesMod.strings["media_type_gif"]
elif reply_message.video:
if reply_message.video.attributes[0].round_message:
return mQuotesMod.strings["media_type_videomessage"]
else:
return mQuotesMod.strings["media_type_video"]
elif reply_message.audio:
return mQuotesMod.strings["media_type_audio"].format(
reply_message.audio.attributes[0].performer,
reply_message.audio.attributes[0].title
)
elif reply_message.voice:
return mQuotesMod.strings["media_type_voice"]
elif reply_message.sticker:
emoji = reply_message.file.emoji
caption = "{} {}".format(
emoji,
mQuotesMod.strings["media_type_sticker"]
) if emoji \
else mQuotesMod.strings["media_type_sticker"]
return caption
elif reply_message.file:
try:
file_name = reply_message.file.name
file_size = await humanize(
reply_message.file.size
)
return "{} {} ({})".format(
mQuotesMod.strings["media_type_file"],
file_name,
file_size
)
except Exception:
return mQuotesMod.strings["media_type_file"]
else:
return ""
else:
return ""
return ""
async def humanize(num: float, suffix: str = "B") -> str:
for unit in ["", "Ki", "Mi", "Gi", "Ti", "Pi", "Ei", "Zi"]:
if abs(num) < 1024.0:
return "%3.1f%s%s" % (num, unit, suffix)
num /= 1024.0
return "%.1f%s%s" % (num, "Yi", suffix)
async def get_markdown(message):
entities = []
if not message.entities:
return []
for entity in message.entities:
entity_type = type(entity)
start = entity.offset
end = entity.length
if entity_type is MessageEntityBold:
etype = "bold"
elif entity_type is MessageEntityItalic:
etype = "italic"
elif entity_type in [MessageEntityUrl, MessageEntityPhone]:
etype = "url"
elif entity_type is MessageEntityCode:
etype = "monospace"
elif entity_type is MessageEntityStrike:
etype = "strikethrough"
elif entity_type is MessageEntityUnderline:
etype = "underline"
elif entity_type in [MessageEntityMention, MessageEntityTextUrl, MessageEntityMentionName, MessageEntityHashtag,
MessageEntityCashtag, MessageEntityBotCommand]:
etype = "bluetext"
entities.append({"type": etype, "offset": start, "length": end})
return entities

View File

@@ -0,0 +1,25 @@
from .. import loader, utils
from telethon import functions
@loader.tds
class RenameMod(loader.Module):
"""Переиминовать или добавить в контакт."""
strings={"name": "Rename"}
async def renamecmd(self, message):
args = utils.get_args_raw(message)
reply = await message.get_reply_message()
if not args:
return await message.edit("<b>Нету аргументов.</b>")
if not reply:
return await message.edit("<b>Где реплай?</b>")
else:
user = await message.client.get_entity(reply.sender_id)
try:
await message.client(functions.contacts.AddContactRequest(id=user.id,
first_name=args,
last_name=' ',
phone='мобила',
add_phone_privacy_exception=False))
await message.edit(f"<code>{user.id}</code> <b>переименован(-а) на</b> <code>{args}</code>")
except: return await message.edit("<b>Что то пошло не так...</b>")

View File

@@ -0,0 +1,24 @@
# @Sekai_Yoneya
from .. import loader, utils
@loader.tds
class SearchMusicMod(loader.Module):
"""
Модуль SearchMusic - поиск музыки
Работает через бота @lybot
"""
strings = {"name": "SearchMusic"}
async def smcmd(self, message):
"""Используй: .sm «название» чтобы найти музыку по названию."""
args = utils.get_args_raw(message)
reply = await message.get_reply_message()
if not args:
return await message.edit("<b>Нету аргументов.</b>")
try:
await message.edit("<b>Загрузка...</b>")
music = await message.client.inline_query('lybot', args)
await message.delete()
await message.client.send_file(message.to_id, music[0].result.document, reply_to=reply.id if reply else None)
except: return await message.client.send_message(message.chat_id, f"<b>Музыка с названием <code>{args}</code> не найдена.</b>")

View File

@@ -0,0 +1,56 @@
# @Sekai_Yoneya
import logging
from .. import loader, utils
logger = logging.getLogger(__name__)
class GetPPMod(loader.Module):
"""Description for module"""
strings = {"name": "SendPhotos"}
async def client_ready(self, client, db):
self.client = client
self.db = db
async def potocmd(self, message):
"""Кинуть фоточки"""
id = utils.get_args_raw(message)
user = await message.get_reply_message()
chat = message.input_chat
if user:
photos = await self.client.get_profile_photos(user.sender)
u = True
else:
photos = await self.client.get_profile_photos(chat)
u = False
if id.strip() == "":
if len(photos) > 0:
await self.client.send_file(message.chat_id, photos)
else:
try:
if u is True:
photo = await self.client.download_profile_photo(user.sender)
else:
photo = await self.client.download_profile_photo(message.input_chat)
await self.client.send_file(message.chat_id, photo)
except:
await message.edit("<code>У него нету фоток.</code>")
return
else:
try:
id = int(id)
if id <= 0:
await message.edit("<code>Введенный вами ID номер не действителен. </code>")
return
except:
await message.edit("<code>ID number you entered is invalid</code>")
return
if int(id) <= (len(photos)):
send_photos = await self.client.download_media(photos[id - 1])
await self.client.send_file(message.chat_id, send_photos)
else:
await message.edit("<code>Фото с таким индефикатором не найдено!</code>")
return

View File

@@ -0,0 +1,22 @@
# @Sekai_Yoneya
from .. import loader, utils
import re
from telethon.errors import ChannelInvalidError
@loader.tds
class SenderMod(loader.Module):
strings = {'name': 'Sender'}
@loader.owner
async def sndcmd(self, m):
""".snd <канал/чат/id> <reply>
Отправить сообщение в чат/канал(без авторства)
"""
args = utils.get_args_raw(m)
reply = await m.get_reply_message()
if not args: return await m.edit("[Sender] Укажите канал/чат")
try: this = await m.client.get_input_entity(int(args) if re.match(r'-{0,1}\d+', args) else args)
except ChannelInvalidError as e: return await m.edit("[Sender] Такого канала/чата не существует!")
except Exception as e: return await m.edit("[Sender] Неизвестная мне ошибка:\n"+" ".join(e.args))
ok = await m.client.send_message(this, reply)
await m.edit("[Sender] Сообщение отправлено!")

View File

@@ -0,0 +1,116 @@
# @Sekai_Yoneya
from asyncio import sleep
import random
from telethon import functions
from userbot.events import register
from telethon.errors.rpcerrorlist import YouBlockedUserError
from telethon import events
from .. import loader, utils
def register(cb):
cb(SpamBotMod())
class SpamBotMod(loader.Module):
"""Показывает ваши ограничения."""
strings = {'name': 'SpamBot'}
def init(self):
self.name = self.strings['name']
self._me = None
self._ratelimit = []
async def client_ready(self, client, db):
self._db = db
self._client = client
async def spambotcmd(self, event):
"""Смотреть статус ограничений."""
chat = '@spambot'
async with event.client.conversation(chat) as conv:
try:
response = conv.wait_event(events.NewMessage(incoming=True, from_users= 178220800 ))
await event.client.send_message(chat, '/start')
response = await response
except YouBlockedUserError:
await event.edit('<code>Разблокируй @spambot</code>')
return
await event.edit(response.text)
async def thankbotcmd(self, event):
"""Написать 'хорошо, спасибо', когда есть инлайн."""
chat = '@spambot'
async with event.client.conversation(chat) as conv:
try:
response = conv.wait_event(events.NewMessage(incoming=True, from_users= 178220800 ))
await event.client.send_message(chat, 'Хорошо, спасибо')
response = await response
except YouBlockedUserError:
await event.edit('<code>Разблокируй @spambot</code>')
return
await event.edit(response.text)
async def okbotcmd(self, event):
"""Написать 'Ок', когда есть инлайн."""
chat = '@spambot'
async with event.client.conversation(chat) as conv:
try:
response = conv.wait_event(events.NewMessage(incoming=True, from_users= 178220800 ))
await event.client.send_message(chat, 'ОК')
response = await response
except YouBlockedUserError:
await event.edit('<code>Разблокируй @spambot</code>')
return
await event.edit(response.text)
async def whatbotcmd(self, event):
"""Спросить, почему на Вас могли жаловаться, когда есть инлайн."""
chat = '@spambot'
async with event.client.conversation(chat) as conv:
try:
response = conv.wait_event(events.NewMessage(incoming=True, from_users= 178220800 ))
await event.client.send_message(chat, 'Почему на меня могли жаловаться?')
response = await response
except YouBlockedUserError:
await event.edit('<code>Разблокируй @spambot</code>')
return
await event.edit(response.text)
async def plsbotcmd(self, event):
"""Попросить снять Вам ограничения, когда есть инлайн."""
chat = '@spambot'
async with event.client.conversation(chat) as conv:
try:
response = conv.wait_event(events.NewMessage(incoming=True, from_users= 178220800 ))
await event.client.send_message(chat, 'Признаю свою вину, снимите ограничения')
response = await response
except YouBlockedUserError:
await event.edit('<code>Разблокируй @spambot</code>')
return
await event.edit(response.text)
async def ponspsbotcmd(self, event):
"""Написать 'Понятно, спасибо', когда есть инлайн."""
chat = '@spambot'
async with event.client.conversation(chat) as conv:
try:
response = conv.wait_event(events.NewMessage(incoming=True, from_users= 178220800 ))
await event.client.send_message(chat, 'Понятно, спасибо')
response = await response
except YouBlockedUserError:
await event.edit('<code>Разблокируй @spambot</code>')
return
await event.edit(response.text)
async def infobotcmd(self, event):
"""Узнать больше о спаме, когда есть инлайн."""
chat = '@spambot'
async with event.client.conversation(chat) as conv:
try:
response = conv.wait_event(events.NewMessage(incoming=True, from_users= 178220800 ))
await event.client.send_message(chat, 'Хочу узнать больше')
response = await response
except YouBlockedUserError:
await event.edit('<code>Разблокируй @spambot</code>')
return
await event.edit(response.text)

View File

@@ -0,0 +1,22 @@
# @Sekai_Yoney
from .. import loader, utils
def register(cb):
cb(TikTokMod())
class TikTokMod(loader.Module):
"""Качаем видео без водяного знака в Тик Ток."""
strings = {'name': 'TikTok'}
async def tikcmd(self, message):
""".tik ссылка на видео."""
await utils.answer(message, 'Ща...')
args = utils.get_args_raw(message)
if not args:
await utils.answer(message, "А где ссылка?")
return
r = await message.client.inline_query('tikdobot', args)
await message.client.send_file(message.to_id, r[1].result.content.url)
await message.delete()

View File

@@ -0,0 +1,136 @@
# Sekai_Yoneya
from .. import loader, utils
@loader.tds
class WelcomeLeftMod(loader.Module):
"""Вход и выход пользователей в чате."""
strings = {'name': 'Welcome & Left'}
async def client_ready(self, client, db):
self.db = db
self.client = client
async def welcomecmd(self, message):
"""Включить/выключить приветствие новых пользователей в чате. Используй: .welcome <clearall (по желанию)>."""
welcome = self.db.get("Welcome", "welcome", {})
chatid = str(message.chat_id)
args = utils.get_args_raw(message)
if args == "clearall":
self.db.set("Welcome", "welcome", {})
return await message.edit("<b>[Welcome]</b> Все настройки модуля сброшены.")
if chatid in welcome:
welcome.pop(chatid)
self.db.set("Welcome", "welcome", welcome)
return await message.edit("<b>[Welcome]</b> Отключено!")
welcome.setdefault(chatid, {})
welcome[chatid].setdefault("message", "Добро пожаловать в чат!")
welcome[chatid].setdefault("is_reply", False)
self.db.set("Welcome", "welcome", welcome)
await message.edit("<b>[Welcome]</b> Включено!")
async def setwelcomecmd(self, message):
"""Установить приветствие новых пользователей в чате.\nИспользуй: .setwelcome <текст (можно использовать {name}; {chat})>; ничего."""
welcome = self.db.get("Welcome", "welcome", {})
args = utils.get_args_raw(message)
reply = await message.get_reply_message()
chatid = str(message.chat_id)
chat = await message.client.get_entity(int(chatid))
try:
if not args and not reply:
return await message.edit(f'<b>[Welcome] Приветствие новых пользователей в "{chat.title}":</b>\n\n'
f'<b>Статус:</b> Включено.\n'
f'<b>Приветствие:</b> {welcome[chatid]["message"]}\n\n'
f'<b>~ Установить новое приветствие можно с помощью команды:</b> .setwelcome <текст>.')
else:
if reply:
welcome[chatid]["message"] = reply.id
welcome[chatid]["is_reply"] = True
else:
welcome[chatid]["message"] = args
welcome[chatid]["is_reply"] = False
self.db.set("Welcome", "welcome", welcome)
return await message.edit("<b>[Welcome] Новое приветствие установлено успешно!</b>")
except KeyError: return await message.edit(f'<b>[Welcome] Приветствие новых пользователей в "{chat.title}":</b>\n\n'
f'<b>Статус:</b> Отключено')
async def watcher(self, message):
"""Интересно, почему он именно watcher называется... 🤔"""
try:
welcome = self.db.get("Welcome", "welcome", {})
chatid = str(message.chat_id)
if chatid not in welcome: return
if message.user_joined or message.user_added:
user = await message.get_user()
chat = await message.get_chat()
if welcome[chatid]["is_reply"] == False:
return await message.reply((welcome[chatid]["message"]).format(name=user.first_name, chat=chat.title))
msg = await self.client.get_messages(int(chatid), ids=welcome[chatid]["message"])
await message.reply(msg)
except: pass
async def leftcmd(self, message):
"""Включить/выключить выход пользователей из чата. Используй: .left <clearall (по желанию)>."""
left = self.db.get("Left", "left", {})
chatid = str(message.chat_id)
args = utils.get_args_raw(message)
if args == "clearall":
self.db.set("Left", "left", {})
return await message.edit("<b>[Left]</b> Все настройки модуля сброшены.")
if chatid in left:
left.pop(chatid)
self.db.set("Left", "left", left)
return await message.edit("<b>[Left]</b> Отключено!")
left.setdefault(chatid, {})
left[chatid].setdefault("message", "Пока👋")
left[chatid].setdefault("is_reply", False)
self.db.set("Left", "left", left)
await message.edit("<b>[Left]</b> Включен!")
async def setleftcmd(self, message):
"""Установить новое сообщение при выходе из чата пользователей.\nИспользуй: .setleft <текст (можно использовать {name}; {chat})>; ничего."""
left = self.db.get("Left", "left", {})
args = utils.get_args_raw(message)
reply = await message.get_reply_message()
chatid = str(message.chat_id)
chat = await message.client.get_entity(int(chatid))
try:
if not args and not reply:
return await message.edit(f'<b>[Left] Выход пользователей в "{chat.title}":</b>\n\n'
f'<b>Статус:</b> Включено.\n'
f'<b>Текст:</b> {left[chatid]["message"]}\n\n'
f'<b>~ Установить новый текст можно с помощью команды:</b> .setleft <текст>.')
else:
if reply:
left[chatid]["message"] = reply.id
left[chatid]["is_reply"] = True
else:
left[chatid]["message"] = args
left[chatid]["is_reply"] = False
self.db.set("Left", "left", left)
return await message.edit("<b>[Left] Новый текст установлен успешно!</b>")
except KeyError: return await message.edit(f'<b>[Left] в "{chat.title}":</b>\n\n'
f'<b>Статус:</b> Отключено')
async def watcher(self, message):
try:
left = self.db.get("Left", "left", {})
chatid = str(message.chat_id)
if chatid not in left: return
if message.user_left or message.user_kicked:
user = await message.get_user()
chat = await message.get_chat()
if left[chatid]["is_reply"] == False:
return await message.reply((left[chatid]["message"]).format(name=user.first_name, chat=chat.title))
msg = await self.client.get_messages(int(chatid), ids=left[chatid]["message"])
await message.reply(msg)
except: pass

View File

@@ -0,0 +1,74 @@
# @Sekai_Yoneya
import os
from .. import loader, utils
from telethon.tl.functions.photos import GetUserPhotosRequest
from telethon.tl.functions.users import GetFullUserRequest
@loader.tds
class WhoIsMod(loader.Module):
"""Получает информацию о пользователе."""
strings = {'name': 'Whois'}
async def whoiscmd(self, message):
"""Используй .whois <@ или реплай>; ничего"""
args = utils.get_args_raw(message)
reply = await message.get_reply_message()
await message.edit("<b>Получаю информацию о пользователе...</b>")
try:
if args:
user = await message.client.get_entity(args if not args.isdigit() else int(args))
else:
user = await message.client.get_entity(reply.sender_id)
except:
user = await message.client.get_me()
user = await message.client(GetFullUserRequest(user.id))
photo, caption = await get_info(user, message)
await message.client.send_file(message.chat_id, photo if photo else None, caption=caption,
link_preview=False, reply_to=reply.id if reply else None)
os.remove(photo)
await message.delete()
async def get_info(user, message):
"""Подробная информация о пользователе."""
uuser = user.user
user_photos = await message.client(GetUserPhotosRequest(user_id=uuser.id,
offset=42, max_id=0, limit=100))
user_photos_count = "У пользователя нет аватарки."
try:
user_photos_count = user_photos.count
except:
pass
user_id = uuser.id
first_name = uuser.first_name or "Пользователь не указал имя."
last_name = uuser.last_name or "Пользователь не указал фамилию."
username = uuser.username or "У пользователя нет юзернейма."
user_bio = user.about or "У пользователя нет информации о себе."
common_chat = user.common_chats_count
is_bot = "Да" if uuser.bot else "Нет"
restricted = "Да" if uuser.restricted else "Нет"
verified = "Да" if uuser.verified else "Нет"
photo = await message.client.download_profile_photo(user_id, str(user_id) + ".jpg", download_big=True)
caption = (f"<b>ИНФОРМАЦИЯ О ПОЛЬЗОВАТЕЛЕ:</b>\n\n"
f"<b>Имя:</b> {first_name}\n"
f"<b>Фамилия:</b> {last_name}\n"
f"<b>Юзернейм:</b> @{username}\n"
f"<b>ID:</b> <code>{user_id}</code>\n"
f"<b>Бот:</b> {is_bot}\n"
f"<b>Ограничен:</b> {restricted}\n"
f"<b>Верифицирован:</b> {verified}\n\n"
f"<b>О себе:</b> \n<code>{user_bio}</code>\n\n"
f"<b>Кол-во аватарок в профиле:</b> {user_photos_count}\n"
f"<b>Общие чаты:</b> {common_chat}\n"
f"<b>Пермалинк:</b> <a href=\"tg://user?id={user_id}\">клик</a>")
return photo, caption

View File

@@ -0,0 +1,49 @@
# @Sekai_Yoneya
from telethon import events
from telethon import functions
import asyncio
from telethon import errors
from .. import loader, utils
class addmembersMod(loader.Module):
strings = {"name":"kickall & addusers"}
async def adduserscmd(self, event):
"""Добавляет людей с чата в чат."""
if len(event.text.split()) == 2:
idschannelgroup = event.text.split(" ", maxsplit=1)[1]
user = [i async for i in event.client.iter_participants(event.to_id.channel_id)]
await event.edit(f"<b>{len(user)} пользователей будет приглашено из чата {event.to_id.channel_id} в чат/канал {idschannelgroup}</b>")
for u in user:
try:
try:
if u.bot == False:
await event.client(functions.channels.InviteToChannelRequest(idschannelgroup, [u.id]))
await asyncio.sleep(1)
else:
pass
except:
pass
except errors.FloodWaitError as e:
print('Flood for', e.seconds)
else:
await event.edit(f"<b>Куда приглашать будем?</b>")
async def kickallcmd(self, event):
"""Удаляет всех пользователей из чата."""
user = [i async for i in event.client.iter_participants(event.to_id.channel_id)]
await event.edit(f"<b>{len(user)} пользователей будет кикнуто из чата {event.to_id.channel_id}</b>")
for u in user:
try:
try:
if u.is_self != True:
await event.client.kick_participant(event.chat_id, u.id)
await asyncio.sleep(1)
else:
pass
except:
pass
except errors.FloodWaitError as e:
print('Flood for', e.seconds)

View File

@@ -0,0 +1,4 @@
echo "1. ❤️ | UserBot | Ксюша > запуск"
cd /home/Lichnoe_tm
cd friendly-telegram
screen -AmdS -r python3 -m friendly-telegram --no-web

View File

@@ -0,0 +1,5 @@
echo "1. UserBot | Sekai_Yoneya > запуск..."
cd /home/Sekai_Yoneya/friendly-telegram/ && screen -AmdS -r python3.9 -m friendly-telegram --no-web
echo "2. UserBot | @FORKANI > запуск..."
cd /home/FORKANI/friendly-telegram/ && screen -AmdS -r python3.9 -m friendly-telegram --no-web
echo "Ожидайте! Боты будут запущены в течении минуты!"

View File

@@ -0,0 +1,43 @@
# @Sekai_Yoneya
from .. import loader, utils # pylint: disable=relative-beyond-top-level
import logging
from requests import post
import io
logger = logging.getLogger(__name__)
@loader.tds
class x0Mod(loader.Module):
"""Uploader"""
strings = {
"name": "x0 Uploader"
}
async def client_ready(self, client, db):
self.client = client
@loader.sudo
async def x0cmd(self, message):
await message.edit("<b>Uploading...</b>")
reply = await message.get_reply_message()
if not reply:
await message.edit("<b>Reply to message!</b>")
return
media = reply.media
if not media:
file = io.BytesIO(bytes(reply.raw_text, "utf-8"))
file.name = "txt.txt"
else:
file = io.BytesIO(await self.client.download_file(media))
file.name = reply.file.name if reply.file.name else reply.file.id+reply.file.ext
try:
x0at = post('https://x0.at', files={'file': file})
except ConnectionError as e:
await message.edit(ste(e))
return
url = x0at.text
output = f'<a href="{url}">URL: </a><code>{url}</code>'
await message.edit(output)

View File

@@ -0,0 +1 @@
# modules