mirror of
https://github.com/MuRuLOSE/limoka.git
synced 2026-06-16 14:34:17 +02:00
Commited backup
This commit is contained in:
192
SekaiYoneya/Friendly-telegram/Anti-PM.py
Normal file
192
SekaiYoneya/Friendly-telegram/Anti-PM.py
Normal 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", [])
|
||||
90
SekaiYoneya/Friendly-telegram/AudioConverter.py
Normal file
90
SekaiYoneya/Friendly-telegram/AudioConverter.py
Normal 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()
|
||||
155
SekaiYoneya/Friendly-telegram/AudioEditor.py
Normal file
155
SekaiYoneya/Friendly-telegram/AudioEditor.py
Normal 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()
|
||||
65
SekaiYoneya/Friendly-telegram/AutoBlackList.py
Normal file
65
SekaiYoneya/Friendly-telegram/AutoBlackList.py
Normal 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
|
||||
65
SekaiYoneya/Friendly-telegram/BanMedia.py
Normal file
65
SekaiYoneya/Friendly-telegram/BanMedia.py
Normal 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
|
||||
238
SekaiYoneya/Friendly-telegram/ChatModule.py
Normal file
238
SekaiYoneya/Friendly-telegram/ChatModule.py
Normal 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>")
|
||||
37
SekaiYoneya/Friendly-telegram/ChatStats.py
Normal file
37
SekaiYoneya/Friendly-telegram/ChatStats.py
Normal 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))
|
||||
25
SekaiYoneya/Friendly-telegram/DeleteTimer.py
Normal file
25
SekaiYoneya/Friendly-telegram/DeleteTimer.py
Normal 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
|
||||
81
SekaiYoneya/Friendly-telegram/Frazes.py
Normal file
81
SekaiYoneya/Friendly-telegram/Frazes.py
Normal 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)
|
||||
37
SekaiYoneya/Friendly-telegram/GroupCreator.py
Normal file
37
SekaiYoneya/Friendly-telegram/GroupCreator.py
Normal 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>')
|
||||
146
SekaiYoneya/Friendly-telegram/Leo.py
Normal file
146
SekaiYoneya/Friendly-telegram/Leo.py
Normal 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)
|
||||
|
||||
56
SekaiYoneya/Friendly-telegram/MyRep.py
Normal file
56
SekaiYoneya/Friendly-telegram/MyRep.py
Normal 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
|
||||
30
SekaiYoneya/Friendly-telegram/Online.py
Normal file
30
SekaiYoneya/Friendly-telegram/Online.py
Normal 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)
|
||||
17
SekaiYoneya/Friendly-telegram/Pic.py
Normal file
17
SekaiYoneya/Friendly-telegram/Pic.py
Normal 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)
|
||||
46
SekaiYoneya/Friendly-telegram/Pinger.py
Normal file
46
SekaiYoneya/Friendly-telegram/Pinger.py
Normal 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()
|
||||
803
SekaiYoneya/Friendly-telegram/Quotes.py
Normal file
803
SekaiYoneya/Friendly-telegram/Quotes.py
Normal 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
|
||||
25
SekaiYoneya/Friendly-telegram/RenameCont.py
Normal file
25
SekaiYoneya/Friendly-telegram/RenameCont.py
Normal 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>")
|
||||
24
SekaiYoneya/Friendly-telegram/SearchMusic.py
Normal file
24
SekaiYoneya/Friendly-telegram/SearchMusic.py
Normal 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>")
|
||||
56
SekaiYoneya/Friendly-telegram/SendPhotos.py
Normal file
56
SekaiYoneya/Friendly-telegram/SendPhotos.py
Normal 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
|
||||
22
SekaiYoneya/Friendly-telegram/Sender.py
Normal file
22
SekaiYoneya/Friendly-telegram/Sender.py
Normal 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] Сообщение отправлено!")
|
||||
116
SekaiYoneya/Friendly-telegram/SpamBot.py
Normal file
116
SekaiYoneya/Friendly-telegram/SpamBot.py
Normal 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)
|
||||
22
SekaiYoneya/Friendly-telegram/TikTok.py
Normal file
22
SekaiYoneya/Friendly-telegram/TikTok.py
Normal 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()
|
||||
136
SekaiYoneya/Friendly-telegram/WelcomeLeft.py
Normal file
136
SekaiYoneya/Friendly-telegram/WelcomeLeft.py
Normal 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
|
||||
74
SekaiYoneya/Friendly-telegram/Whois.py
Normal file
74
SekaiYoneya/Friendly-telegram/Whois.py
Normal 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
|
||||
49
SekaiYoneya/Friendly-telegram/kickall-addusers.py
Normal file
49
SekaiYoneya/Friendly-telegram/kickall-addusers.py
Normal 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)
|
||||
4
SekaiYoneya/Friendly-telegram/mygirl.sh
Normal file
4
SekaiYoneya/Friendly-telegram/mygirl.sh
Normal file
@@ -0,0 +1,4 @@
|
||||
echo "1. ❤️ | UserBot | Ксюша > запуск"
|
||||
cd /home/Lichnoe_tm
|
||||
cd friendly-telegram
|
||||
screen -AmdS -r python3 -m friendly-telegram --no-web
|
||||
5
SekaiYoneya/Friendly-telegram/userbot.sh
Normal file
5
SekaiYoneya/Friendly-telegram/userbot.sh
Normal 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 "Ожидайте! Боты будут запущены в течении минуты!"
|
||||
43
SekaiYoneya/Friendly-telegram/x0-Uploader.py
Normal file
43
SekaiYoneya/Friendly-telegram/x0-Uploader.py
Normal 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)
|
||||
|
||||
1
SekaiYoneya/modules/README.md
Normal file
1
SekaiYoneya/modules/README.md
Normal file
@@ -0,0 +1 @@
|
||||
# modules
|
||||
Reference in New Issue
Block a user