Commited backup

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

View File

@@ -0,0 +1,68 @@
from pydub import AudioSegment
from .. import loader, utils
import io
import os
def register(cb):
cb(AudioShakalMod())
class AudioShakalMod(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
self.me = await client.get_me()
async def fvcmd(self, message):
"""<b>.fv <reply to voice/mp3/ogg/oga> [шакал_lvl(не обязательно, по умолчанию 100 (от 10 до 100))]
Сшакалить войс/mp3/ogg/oga</b>
"""
reply = await message.get_reply_message()
lvl = 0
if not reply:
await message.edit("<b>Ответь на аудио стоны, еблан</b>")
return
if utils.get_args_raw(message):
ar = utils.get_args_raw(message)
try:
int(ar)
if int(ar) >= 10 and int(ar) <= 100:
lvl = int(ar)
else:
await message.edit("<b>Укажите уровень долбоебизма от 10 до 100!</b>")
return
except Exception as exx:
await message.edit("<b>Неверный аргумент(ты уебок кста)!</b>")
return
else:
lvl = 100
await message.edit("<b>Ебем Стасяна... (прости Стасян)</b>\n Прощаю (с) Стасян")
sa = False
m = io.BytesIO()
fname = await message.client.download_media(message=reply.media)
if(fname.endswith(".oga") or fname.endswith(".ogg")):
audio = AudioSegment.from_file(fname, "ogg")
elif(fname.endswith(".mp3")):
sa = True
audio = AudioSegment.from_file(fname, "mp3")
else:
await message.edit("<b>Ты еблан? Я(.fv) не поддерживаю этот ёбаный файл! Только voice/mp3/ogg/oga!</b>")
os.remove(fname)
return
audio = audio + lvl
if(sa):
m.name = "Ты Шакал.mp3"
audio.export(m, format="mp3")
else:
m.name="voice.ogg"
audio.split_to_mono()
audio.export(m, format="ogg", codec="libopus", bitrate="64k")
m.seek(0)
if(sa):
await message.client.send_file(message.to_id, m, reply_to=reply.id)
else:
await message.client.send_file(message.to_id, m, reply_to=reply.id, voice_note=True)
await message.delete()
os.remove(fname)

File diff suppressed because one or more lines are too long

603
Fl1yd/FTG-Modules/admin.py Normal file
View File

@@ -0,0 +1,603 @@
# Admin Tools for Friendly-Telegram UserBot.
# Copyright (C) 2020 @Fl1yd, @AtiksX.
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
# ======================================================================
import io, logging, time
from .. import loader, utils, security
from PIL import Image
from telethon.errors import (ChatAdminRequiredError, UserAdminInvalidError, FloodWaitError, PhotoCropSizeSmallError)
from telethon.tl.types import (ChatAdminRights, ChatBannedRights)
from telethon.tl.functions.channels import (EditAdminRequest, EditBannedRequest, EditPhotoRequest, DeleteUserHistoryRequest)
from telethon.tl.functions.messages import EditChatAdminRequest
logger = logging.getLogger(__name__)
# ================== КОНСТАНТЫ ========================
PROMOTE_RIGHTS = ChatAdminRights(post_messages=True,
add_admins=None,
invite_users=True,
change_info=None,
ban_users=True,
delete_messages=True,
pin_messages=True,
edit_messages=True)
DEMOTE_RIGHTS = ChatAdminRights(post_messages=None,
add_admins=None,
invite_users=None,
change_info=None,
ban_users=None,
delete_messages=None,
pin_messages=None,
edit_messages=None)
UNMUTE_RIGHTS = ChatBannedRights(until_date=None,
view_messages=None,
send_messages=False,
send_media=False,
send_stickers=False,
send_gifs=False,
send_games=False,
send_inline=False,
embed_links=False)
BANNED_RIGHTS = ChatBannedRights(until_date=None,
view_messages=True,
send_messages=True,
send_media=True,
send_stickers=True,
send_gifs=True,
send_games=True,
send_inline=True,
embed_links=True)
UNBAN_RIGHTS = ChatBannedRights(until_date=None,
view_messages=None,
send_messages=None,
send_media=None,
send_stickers=None,
send_gifs=None,
send_games=None,
send_inline=None,
embed_links=None)
# =====================================================
def register(cb):
cb(AdminToolsMod())
class AdminToolsMod(loader.Module):
"""Администрирование чата"""
strings = {'name': 'AdminTools',
'no_reply': '<b>Нет реплая на картинку/стикер.</b>',
'not_pic': '<b>Это не картинка/стикер</b>',
'wait': '<b>Минуточку...</b>',
'pic_so_small': '<b>Картинка слишком маленькая, попробуйте другую.</b>',
'pic_changed': '<b>Картинка чата изменена.</b>',
'promote_none': '<b>Некого повышать.</b>',
'who': '<b>Кто это?</b>',
'not_admin': '<b>Я здесь не админ.</b>',
'promoted': '<b>{} повышен в правах администратора.\nРанг: {}</b>',
'wtf_is_it': '<b>Что это?</b>',
'this_isn`t_a_chat': '<b>Это не чат!</b>',
'demote_none': '<b>Некого понижать.</b>',
'demoted': '<b>{} понижен в правах администратора.</b>',
'pinning': '<b>Пин...</b>',
'pin_none': '<b>Ответь на сообщение чтобы закрепить его.</b>',
'unpinning': '<b>Анпин...</b>',
'unpin_none': '<b>Нечего откреплять.</b>',
'no_rights': '<b>У меня нет прав.</b>',
'pinned': '<b>Закреплено успешно!</b>',
'unpinned': '<b>Откреплено успешно!</b>',
'can`t_kick': '<b>Не могу кикнуть пользователя.</b>',
'kicking': '<b>Кик...</b>',
'kick_none': '<b>Некого кикать.</b>',
'kicked': '<b>{} кикнут из чата.</b>',
'kicked_for_reason': '<b>{} кикнут из чата.\nПричина: {}.</b>',
'banning': '<b>Бан...</b>',
'banned': '<b>{} забанен в чате.</b>',
'banned_for_reason': '<b>{} забанен в чате.\nПричина: {}</b>',
'ban_none': '<b>Некому давать бан.</b>',
'unban_none': '<b>Некого разбанить.</b>',
'unbanned': '<b>{} разбанен в чате.</b>',
'mute_none': '<b>Некому давать мут.</b>',
'muted': '<b>{} теперь в муте на </b>',
'no_args': '<b>Неверно указаны аргументы.</b>',
'unmute_none': '<b>Некого размутить.</b>',
'unmuted': '<b>{} теперь не в муте.</b>',
'no_reply': '<b>Нет реплая.</b>',
'deleting': '<b>Удаление...</b>',
'no_args_or_reply':'<b>Нет аргументов или реплая.</b>',
'deleted': '<b>Все сообщения от {} удалены.</b>',
'del_u_search': '<b>Поиск удалённых аккаунтов...</b>',
'del_u_kicking': '<b>Кик удалённых аккаунтов...\nОх~, я могу это сделать?!</b>'}
async def ecpcmd(self, gpic):
"""Команда .ecp изменяет картинку чата.\nИспользование: .ecp <реплай на картинку/стикер>."""
if gpic.chat:
try:
reply = await gpic.get_reply_message()
chat = await gpic.get_chat()
if not chat.admin_rights and not chat.creator:
return await utils.answer(gpic, self.strings('not_admin', gpic))
if reply:
pic = await check_media(gpic, reply)
if not pic:
return await utils.answer(gpic, self.strings('not_pic', gpic))
else:
return await utils.answer(gpic, self.strings('no_reply', gpic))
await utils.answer(gpic, self.strings('wait', gpic))
what = resizepic(pic)
if what:
try:
await gpic.client(EditPhotoRequest(gpic.chat_id, await gpic.client.upload_file(what)))
except PhotoCropSizeSmallError:
return await utils.answer(gpic, self.strings('pic_so_small', gpic))
await utils.answer(gpic, self.strings('pic_changed', gpic))
except ChatAdminRequiredError:
return await utils.answer(gpic, self.strings('no_rights', gpic))
else:
return await utils.answer(gpic, self.strings('this_isn`t_a_chat', gpic))
async def promotecmd(self, promt):
"""Команда .promote повышает пользователя в правах администратора.\nИспользование: .promote <@ или реплай> <ранг>."""
if promt.chat:
try:
args = utils.get_args_raw(promt).split(' ')
reply = await promt.get_reply_message()
rank = 'одмэн'
chat = await promt.get_chat()
if not chat.admin_rights and not chat.creator:
return await utils.answer(promt, self.strings('not_admin', promt))
if reply:
args = utils.get_args_raw(promt)
if args:
rank = args
else:
rank = rank
user = await utils.get_user(reply)
else:
user = await promt.client.get_entity(args[0])
if len(args) == 1:
rank = rank
elif len(args) >= 2:
rank = utils.get_args_raw(promt).split(' ', 1)[1]
try:
await promt.client(EditAdminRequest(promt.chat_id, user.id, PROMOTE_RIGHTS, rank))
except ChatAdminRequiredError:
return await utils.answer(promt, self.strings('no_rights', promt))
else:
return await utils.answer(promt, self.strings('promoted', promt).format(user.first_name, rank))
except ValueError:
return await utils.answer(promt, self.strings('no_args', promt))
else:
return await utils.answer(promt, self.strings('this_isn`t_a_chat', promt))
async def demotecmd(self, demt):
"""Команда .demote понижает пользователя в правах администратора.\nИспользование: .demote <@ или реплай>."""
if demt.chat:
try:
reply = await demt.get_reply_message()
chat = await demt.get_chat()
if not chat.admin_rights and not chat.creator:
return await utils.answer(demt, self.strings('not_admin', demt))
if reply:
user = await utils.get_user(await demt.get_reply_message())
else:
args = utils.get_args(demt)
if not args:
return await utils.answer(demt, self.strings('demote_none', demt))
user = await demt.client.get_entity(args[0])
if not user:
return await utils.answer(demt, self.strings('who', demt))
try:
if demt.is_channel:
await demt.client(EditAdminRequest(demt.chat_id, user.id, DEMOTE_RIGHTS, ""))
else:
await demt.client(EditChatAdminRequest(demt.chat_id, user.id, False))
except:
return await utils.answer(demt, self.strings('no_rights', demt))
else:
return await utils.answer(demt, self.strings('demoted', demt).format(user.first_name))
except:
return await utils.answer(demt, self.strings('wtf_is_it'))
else:
return await utils.answer(demt, self.strings('this_isn`t_a_chat', demt))
async def pincmd(self, pint):
"""Команда .pin закрепляет сообщение в чате.\nИспользование: .pin <реплай>."""
if pint.chat:
reply = await pint.get_reply_message()
if not reply:
return await utils.answer(pint, self.strings('pin_none', pint))
await utils.answer(pint, self.strings('pinning', pint))
try:
await pint.client.pin_message(pint.chat, message=reply.id, notify=False)
except ChatAdminRequiredError:
return await utils.answer(pint, self.strings('no_rights', pint))
await utils.answer(pint, self.strings('pinned', pint))
else:
await utils.answer(pint, self.strings('this_isn`t_a_chat', pint))
async def unpincmd(self, unpon):
"""Команда .unpin открепляет закрепленное сообщение в чате.\nИспользование: .unpin."""
if unpon.chat:
await utils.answer(unpon, self.strings('unpinning', unpon))
try:
await unpon.client.pin_message(unpon.chat, message=None, notify=None)
except ChatAdminRequiredError:
await utils.answer(unpon, self.strings('no_rights', unpon))
return
await utils.answer(unpon, self.strings('unpinned', unpon))
else:
await utils.answer(unpon, self.strings('this_isn`t_a_chat', unpon))
async def kickcmd(self, kock):
"""Команда .kick кикает пользователя.\nИспользование: .kick <@ или реплай>."""
if kock.chat:
try:
args = utils.get_args_raw(kock).split(' ')
reason = utils.get_args_raw(kock)
reply = await kock.get_reply_message()
chat = await kock.get_chat()
reason = False
if not chat.admin_rights and not chat.creator:
return await utils.answer(kock, self.strings('not_admin', kock))
if reply:
user = await utils.get_user(reply)
args = utils.get_args_raw(kock)
if args:
reason = args
else:
user = await kock.client.get_entity(args[0])
if args:
if len(args) == 1:
args = utils.get_args_raw(kock)
user = await kock.client.get_entity(args)
reason = False
elif len(args) >= 2:
reason = utils.get_args_raw(kock).split(' ', 1)[1]
try:
await utils.answer(kock, self.strings('kicking', kock))
await kock.client.kick_participant(kock.chat_id, user.id)
except ChatAdminRequiredError:
return await utils.answer(kock, self.strings('no_rights', kock))
else:
if reason:
return await utils.answer(kock, self.strings('kicked_for_reason', kock).format(user.first_name, reason))
if reason == False:
return await utils.answer(kock, self.strings('kicked', kock).format(user.first_name))
except ValueError:
return await utils.answer(kock, self.strings('no_args', kock))
else:
return await utils.answer(kock, self.strings('this_isn`t_a_chat', kock))
async def bancmd(self, bon):
"""Команда .ban даёт бан пользователю.\nИспользование: .ban <@ или реплай>."""
if bon.chat:
try:
args = utils.get_args_raw(bon).split(' ')
reason = utils.get_args_raw(bon)
reply = await bon.get_reply_message()
chat = await bon.get_chat()
reason = False
if not chat.admin_rights and not chat.creator:
return await utils.answer(bon, self.strings('not_admin', bon))
if reply:
user = await utils.get_user(reply)
args = utils.get_args_raw(bon)
if args:
reason = args
else:
user = await bon.client.get_entity(args[0])
if args:
if len(args) == 1:
args = utils.get_args_raw(bon)
user = await bon.client.get_entity(args)
reason = False
elif len(args) >= 2:
reason = utils.get_args_raw(bon).split(' ', 1)[1]
try:
await utils.answer(bon, self.strings('banning', bon))
await bon.client(EditBannedRequest(bon.chat_id, user.id, ChatBannedRights(until_date=None, view_messages=True)))
except ChatAdminRequiredError:
return await utils.answer(bon, self.strings('no_rights', bon))
except UserAdminInvalidError:
return await utils.answer(bon, self.strings('no_rights', bon))
if reason:
return await utils.answer(bon, self.strings('banned_for_reason', bon).format(user.first_name, reason))
if reason == False:
return await utils.answer(bon, self.strings('banned', bon).format(user.first_name))
except ValueError:
return await utils.answer(bon, self.strings('no_args', bon))
else:
return await utils.answer(bon, self.strings('this_isn`t_a_chat', bon))
async def unbancmd(self, unbon):
"""Команда .unban для разбана пользователя.\nИспользование: .unban <@ или реплай>."""
if unbon.chat:
reply = await unbon.get_reply_message()
chat = await unbon.get_chat()
if not chat.admin_rights and not chat.creator:
return await utils.answer(unbon, self.strings('not_admin', unbon))
if reply:
user = await utils.get_user(reply)
else:
args = utils.get_args(unbon)
if not args:
return await utils.answer(unbon, self.strings('unban_none', unbon))
user = await unbon.client.get_entity(args[0])
if not user:
return await utils.answer(unbon, self.strings('who', unbon))
logger.debug(user)
try:
await unbon.client(EditBannedRequest(unbon.chat_id, user.id, ChatBannedRights(until_date=None, view_messages=False)))
except:
return await utils.answer(unbon, self.strings('no_rights', unbon))
else:
return await utils.answer(unbon, self.strings('unbanned', unbon).format(user.first_name))
else:
return await utils.answer(unbon, self.strings('this_isn`t_a_chat', unbon))
async def mutecmd(self, mot):
"""Команда .mute даёт мут пользователю.\nИспользование: .mute <@ или реплай> <время (1m, 1h, 1d)>."""
if mot.chat:
try:
reply = await mot.get_reply_message()
chat = await mot.get_chat()
if not chat.admin_rights and not chat.creator:
return await utils.answer(mot, self.strings('not_admin', mot))
if reply:
user = await utils.get_user(reply)
else:
who = utils.get_args_raw(mot).split(' ')
user = await mot.client.get_entity(who[0])
if len(who) == 1:
timee = ChatBannedRights(until_date=True, send_messages=True)
await mot.client(EditBannedRequest(mot.chat_id, user.id, timee))
await mot.edit('<b>{} теперь в муте.</b>'.format(user.first_name))
return
if not user:
return await utils.answer(mot, self.strings('mute_none', mot))
if user:
tim = who[1]
if tim:
if len(tim) != 2:
return await utils.answer(mot, self.strings('no_args', mot))
num = ''
t = ''
for q in tim:
if q.isdigit():
num += q
else:
t += q
text = f'<b>{num}'
if t == 'm':
num = int(num) * 60
text += ' минут(-ы).</b>'
elif t == 'h':
num = int(num) * 3600
text += ' час(-а/-ов).</b>'
elif t == 'd':
num = int(num) * 86400
text += ' дня(-ей).</b>'
else:
return await utils.answer(mot, self.strings('no_args', mot))
timee = ChatBannedRights(until_date=time.time() + int(num), send_messages=True)
try:
await mot.client(EditBannedRequest(mot.chat_id, user.id, timee))
await utils.answer(mot, self.strings('muted', mot).format(utils.escape_html(user.first_name)) + text)
return
except:
await utils.answer(mot, self.strings('no_rights', mot))
else:
timee = ChatBannedRights(until_date=True, send_messages=True)
await mot.client(EditBannedRequest(mot.chat_id, user.id, timee))
await mot.edit('<b>{} теперь в муте.</b>'.format(user.first_name))
return
logger.debug(user)
tim = utils.get_args(mot)
if tim:
if len(tim[0]) < 2:
return await utils.answer(mot, self.strings('no_args', mot))
num = ''
t = ''
for q in tim[0]:
if q.isdigit():
num += q
else:
t += q
text = f'<b>{num}'
if t == 'm':
num = int(num) * 60
text += ' минут(-ы).</b>'
elif t == 'd':
num = int(num) * 86400
text += ' дня(-ей) .</b>'
elif t == 'h':
num = int(num) * 3600
text += ' час(-а/-ов).</b>'
else:
return await utils.answer(mot, self.strings('no_args', mot))
timee = ChatBannedRights(until_date=time.time() + int(num), send_messages=True)
try:
await mot.client(EditBannedRequest(mot.chat_id, user.id, timee))
await utils.answer(mot, self.strings('muted', mot).format(utils.escape_html(user.first_name)) + text)
return
except:
await utils.answer(mot, self.strings('no_rights', mot))
else:
timee = ChatBannedRights(until_date=True, send_messages=True)
await mot.client(EditBannedRequest(mot.chat_id, user.id, timee))
await mot.edit('<b>{} теперь в муте.</b>'.format(user.first_name))
return
except:
await utils.answer(mot, self.strings('mute_none', mot))
return
else:
await utils.answer(mot, self.strings('this_isn`t_a_chat', mot))
async def unmutecmd(self, unmot):
"""Команда .unmute для размута пользователя.\nИспользование: .unmute <@ или реплай>."""
if unmot.chat:
try:
reply = await unmot.get_reply_message()
chat = await unmot.get_chat()
if not chat.admin_rights and not chat.creator:
return await utils.answer(unmot, self.strings('not_admin', unmot))
if reply:
user = await utils.get_user(reply)
else:
args = utils.get_args(unmot)
if not args:
return await utils.answer(unmot, self.strings('unmute_none', unmot))
user = await unmot.client.get_entity(args[0])
if not user:
return await utils.answer(unmot, self.strings('who', unmot))
try:
await unmot.client(EditBannedRequest(unmot.chat_id, user.id, UNMUTE_RIGHTS))
except:
return await utils.answer(unmot, self.strings('not_admin', unmot))
else:
return await utils.answer(unmot, self.strings('unmuted', unmot).format(user.first_name))
except:
return await utils.answer(unmot, self.strings('wtf_is_it', unmot))
else:
return await utils.answer(unmot, self.strings('this_isn`t_a_chat', unmot))
async def delallmsgscmd(self, message):
"""Команда .delallmsgs удаляет все сообщения от пользователя.\nИспользование: .delallmsgs <@ или реплай>."""
try:
args = utils.get_args_raw(message)
reply = await message.get_reply_message()
if not args and not reply:
return await utils.answer(message, self.strings('no_args_or_reply', message))
await utils.answer(message, self.strings('deleting', message))
if args:
user = await message.client.get_entity(args)
if reply:
user = await utils.get_user(reply)
await message.client(DeleteUserHistoryRequest(message.to_id, user.id))
await message.client.send_message(message.to_id, self.strings('deleted', message).format(user.first_name))
await message.delete()
except ChatAdminRequiredError:
return await utils.answer(message, self.strings('no_rights', message))
async def deluserscmd(self, delus):
"""Команда .delusers показывает список всех удалённых аккаунтов в чате.\nИспользование: .delusers <clean>."""
if not delus.is_group:
await utils.answer(delus, self.strings('this_isn`t_a_chat', delus))
return
con = utils.get_args_raw(delus)
del_u = 0
del_status = '<b>Нет удалённых аккаунтов, чат очищен.</b>'
if con != "clean":
await utils.answer(delus, self.strings('del_u_search', delus))
async for user in delus.client.iter_participants(delus.chat_id):
if user.deleted:
del_u += 1
if del_u == 1:
del_status = f"<b>Найден {del_u} удаленный аккаунт в чате, очистите их с помощью </b><code>.delusers clean</code><b>.</b>"
if del_u > 0:
del_status = f"<b>Найдено {del_u} удаленных аккаунтов в чате, очистите их с помощью </b><code>.delusers clean</code><b>.</b>"
await delus.edit(del_status)
return
chat = await delus.get_chat()
if not chat.admin_rights and not chat.creator:
return await utils.answer(delus, self.strings('not_admin', delus))
await utils.answer(delus, self.strings('del_u_kicking', delus))
del_u = 0
del_a = 0
async for user in delus.client.iter_participants(delus.chat_id):
if user.deleted:
try:
await delus.client(EditBannedRequest(delus.chat_id, user.id, BANNED_RIGHTS))
except ChatAdminRequiredError:
return await utils.answer(delus, self.strings('no_rights', delus))
except UserAdminInvalidError:
del_u -= 1
del_a += 1
await delus.client(EditBannedRequest(delus.chat_id, user.id, UNBAN_RIGHTS))
del_u += 1
if del_u == 1:
del_status = f"<b>Кикнут {del_u} удалённый аккаунт.</b>"
if del_u > 0:
del_status = f"<b>Кикнуто {del_u} удалённых аккаунтов.</b>"
if del_a == 1:
del_status = f"<b>Кикнут {del_u} удалённый аккаунт.\n" \
f"{del_a} удалённый аккаунт админа не кикнут.</b>"
if del_a > 0:
del_status = f"<b>Кикнуто {del_u} удалённых аккаунтов.\n" \
f"{del_a} удалённых аккаунта админов не кикнуты.</b>"
await delus.edit(del_status)
def resizepic(reply):
im = Image.open(io.BytesIO(reply))
w, h = im.size
x = min(w, h)
x_ = (w-x)//2
y_ = (h-x)//2
_x = x_ + x
_y = y_ + x
im = im.crop(( x_, y_, _x, _y ))
out = io.BytesIO()
out.name = "outsuder.png"
im.save(out)
return out.getvalue()
async def check_media(message, reply):
if reply and reply.media:
if reply.photo:
data = reply.photo
elif reply.video:
data = reply.video
elif reply.document:
if reply.gif or reply.audio or reply.voice:
return None
data = reply.media.document
else:
return None
else:
return None
if not data or data is None:
return None
else:
data = await message.client.download_file(data, bytes)
try:
Image.open(io.BytesIO(data))
return data
except:
return None

View File

@@ -0,0 +1,885 @@
# Copyright (C) 2019 The Raphielscape Company LLC.
#
# Licensed under the Raphielscape Public License, Version 1.c (the "License");
# you may not use this file except in compliance with the License.
"""
Userbot module to help you manage a group
"""
from asyncio import sleep
from os import remove
from telethon.errors import (BadRequestError, ChatAdminRequiredError,
ImageProcessFailedError, PhotoCropSizeSmallError,
UserAdminInvalidError)
from telethon.errors.rpcerrorlist import (UserIdInvalidError,
MessageTooLongError)
from telethon.tl.functions.channels import (EditAdminRequest,
EditBannedRequest,
EditPhotoRequest)
from telethon.tl.functions.messages import UpdatePinnedMessageRequest
from telethon.tl.types import (PeerChat, PeerChannel,
ChannelParticipantsAdmins, ChatAdminRights,
ChatBannedRights, MessageEntityMentionName,
MessageMediaPhoto, ChannelParticipantsBots)
from userbot import BOTLOG, BOTLOG_CHATID, CMD_HELP, bot
from userbot.events import register
# =================== CONSTANT ===================
PP_TOO_SMOL = "`Картинка слишком маленькая`"
PP_ERROR = "`Сбой при обработке изображения`"
NO_ADMIN = "`Я не админ здесь!`"
NO_PERM = "`У меня нет достаточных разрешений!`"
NO_SQL = "`Запуск в режиме Non-SQL!`"
CHAT_PP_CHANGED = "`Картинка чата изменена`"
CHAT_PP_ERROR = "`Некоторые проблемы с обновлением рисунка,`" \
"`может быть потому что я не админ здесь,`" \
"`или не умею достаточных прав.`"
INVALID_MEDIA = "`Недействительное резрешение`"
BANNED_RIGHTS = ChatBannedRights(
until_date=None,
view_messages=True,
send_messages=True,
send_media=True,
send_stickers=True,
send_gifs=True,
send_games=True,
send_inline=True,
embed_links=True,
)
UNBAN_RIGHTS = ChatBannedRights(
until_date=None,
send_messages=None,
send_media=None,
send_stickers=None,
send_gifs=None,
send_games=None,
send_inline=None,
embed_links=None,
)
MUTE_RIGHTS = ChatBannedRights(until_date=None, send_messages=True)
UNMUTE_RIGHTS = ChatBannedRights(until_date=None, send_messages=False)
# ================================================
@register(outgoing=True, pattern="^\.setgpic$", groups_only=True)
async def set_group_photo(gpic):
""" Команда .setgpic изменяет картинку группы"""
if not gpic.is_group:
await gpic.edit("`Я не думаю, что это группа.`")
return
replymsg = await gpic.get_reply_message()
chat = await gpic.get_chat()
admin = chat.admin_rights
creator = chat.creator
photo = None
if not admin and not creator:
await gpic.edit(NO_ADMIN)
return
if replymsg and replymsg.media:
if isinstance(replymsg.media, MessageMediaPhoto):
photo = await gpic.client.download_media(message=replymsg.photo)
elif "image" in replymsg.media.document.mime_type.split('/'):
photo = await gpic.client.download_file(replymsg.media.document)
else:
await gpic.edit(INVALID_MEDIA)
if photo:
try:
await gpic.client(
EditPhotoRequest(gpic.chat_id, await
gpic.client.upload_file(photo)))
await gpic.edit(CHAT_PP_CHANGED)
except PhotoCropSizeSmallError:
await gpic.edit(PP_TOO_SMOL)
except ImageProcessFailedError:
await gpic.edit(PP_ERROR)
@register(outgoing=True, pattern="^\.promote(?: |$)(.*)", groups_only=True)
async def promote(promt):
"""Команда .promote повышает реплайнутого/тэгнутого пользователя"""
# Get targeted chat
chat = await promt.get_chat()
# Grab admin status or creator in a chat
admin = chat.admin_rights
creator = chat.creator
# If not admin and not creator, also return
if not admin and not creator:
await promt.edit(NO_ADMIN)
return
new_rights = ChatAdminRights(add_admins=False,
invite_users=True,
change_info=False,
ban_users=True,
delete_messages=True,
pin_messages=True)
await promt.edit("`Повышение...`")
user, rank = await get_user_from_event(promt)
if not rank:
# Just in case.
rank = "admeme"
if user:
pass
else:
return
# Try to promote if current user is admin or creator
try:
await promt.client(
EditAdminRequest(promt.chat_id, user.id, new_rights, rank))
await promt.edit("`Повышение успешно!`")
# If Telethon spit BadRequestError, assume
# we don't have Promote permission
except BadRequestError:
await promt.edit(NO_PERM)
return
# Announce to the logging group if we have promoted successfully
if BOTLOG:
await promt.client.send_message(
BOTLOG_CHATID, "#ПОВЫШЕНИЕ\n"
f"ПОЛЬЗОВАТЕЛЬ: [{user.first_name}](tg://user?id={user.id})\n"
f"ЧАТ: {promt.chat.title}(`{promt.chat_id}`)")
@register(outgoing=True, pattern="^\.demote(?: |$)(.*)", groups_only=True)
async def demote(dmod):
"""Команда .demote понижает реплайнутого/тэгнутого пользователя"""
# Admin right check
chat = await dmod.get_chat()
admin = chat.admin_rights
creator = chat.creator
if not admin and not creator:
await dmod.edit(NO_ADMIN)
return
# If passing, declare that we're going to demote
await dmod.edit("`Понижение...`")
rank = "admeme" # dummy rank, lol.
user = await get_user_from_event(dmod)
user = user[0]
if user:
pass
else:
return
# New rights after demotion
newrights = ChatAdminRights(add_admins=None,
invite_users=None,
change_info=None,
ban_users=None,
delete_messages=None,
pin_messages=None)
# Edit Admin Permission
try:
await dmod.client(
EditAdminRequest(dmod.chat_id, user.id, newrights, rank))
# If we catch BadRequestError from Telethon
# Assume we don't have permission to demote
except BadRequestError:
await dmod.edit(NO_PERM)
return
await dmod.edit("`Понижение успешно!`")
# Announce to the logging group if we have demoted successfully
if BOTLOG:
await dmod.client.send_message(
BOTLOG_CHATID, "#ПОНИЖЕНИЕ\n"
f"ПОЛЬЗОВАТЕЛЬ: [{user.first_name}](tg://user?id={user.id})\n"
f"ЧАТ: {dmod.chat.title}(`{dmod.chat_id}`)")
@register(outgoing=True, pattern="^\.ban(?: |$)(.*)", groups_only=True)
async def ban(bon):
"""Команда .ban банит реплайнутого/тэгнутого пользователя"""
# Here laying the sanity check
chat = await bon.get_chat()
admin = chat.admin_rights
creator = chat.creator
# Well
if not admin and not creator:
await bon.edit(NO_ADMIN)
return
user, reason = await get_user_from_event(bon)
if user:
pass
else:
return
# Announce that we're going to whack the pest
await bon.edit("`Ударить вредителя!`")
try:
await bon.client(EditBannedRequest(bon.chat_id, user.id,
BANNED_RIGHTS))
except BadRequestError:
await bon.edit(NO_PERM)
return
# Helps ban group join spammers more easily
try:
reply = await bon.get_reply_message()
if reply:
await reply.delete()
except BadRequestError:
await bon.edit(
"`У меня нет прав на удаление сообщений! Но он все равно забанен!`")
return
# Delete message and then tell that the command
# is done gracefully
# Shout out the ID, so that fedadmins can fban later
if reason:
await bon.edit(f"{user.first_name} забанен(-а)!!\
\nID: `{str(user.id)}`\
\nПричина: {reason}")
else:
await bon.edit(f"{user.first_name} забанен(-а)!!\
\nID: `{str(user.id)}`")
# Announce to the logging group if we have banned the person
# successfully!
if BOTLOG:
await bon.client.send_message(
BOTLOG_CHATID, "#БАН\n"
f"ПОЛЬЗОВАТЕЛЬ: [{user.first_name}](tg://user?id={user.id})\n"
f"ЧАТ: {bon.chat.title}(`{bon.chat_id}`)")
@register(outgoing=True, pattern="^\.unban(?: |$)(.*)", groups_only=True)
async def nothanos(unbon):
"""Команда .unban разбанит реплайнутого/тэгнутого пользователя"""
# Here laying the sanity check
chat = await unbon.get_chat()
admin = chat.admin_rights
creator = chat.creator
# Well
if not admin and not creator:
await unbon.edit(NO_ADMIN)
return
# If everything goes well...
await unbon.edit("`Разбан...`")
user = await get_user_from_event(unbon)
user = user[0]
if user:
pass
else:
return
try:
await unbon.client(
EditBannedRequest(unbon.chat_id, user.id, UNBAN_RIGHTS))
await unbon.edit("```Разбан успешен!```")
if BOTLOG:
await unbon.client.send_message(
BOTLOG_CHATID, "#РАЗБАН\n"
f"ПОЛЬЗОВАТЕЛЬ: [{user.first_name}](tg://user?id={user.id})\n"
f"ЧАТ: {unbon.chat.title}(`{unbon.chat_id}`)")
except UserIdInvalidError:
await unbon.edit("`Ох, моя логика разбана сломалась!`")
@register(outgoing=True, pattern="^\.mute(?: |$)(.*)", groups_only=True)
async def spider(spdr):
"""
Это функция в основном приглушает писки :)
"""
# Check if the function running under SQL mode
try:
from userbot.modules.sql_helper.spam_mute_sql import mute
except AttributeError:
await spdr.edit(NO_SQL)
return
# Admin or creator check
chat = await spdr.get_chat()
admin = chat.admin_rights
creator = chat.creator
# If not admin and not creator, return
if not admin and not creator:
await spdr.edit(NO_ADMIN)
return
user, reason = await get_user_from_event(spdr)
if user:
pass
else:
return
self_user = await spdr.client.get_me()
if user.id == self_user.id:
await spdr.edit(
"`Руки слишком коротки, я не могу заклеить себя скотчем...\n(ヘ・_・)ヘ┳━┳`")
return
# If everything goes well, do announcing and mute
await spdr.edit("`Достаю скотч!`")
if mute(spdr.chat_id, user.id) is False:
return await spdr.edit('`Ошибка! Пользователь возможно уже в муте.`')
else:
try:
await spdr.client(
EditBannedRequest(spdr.chat_id, user.id, MUTE_RIGHTS))
# Announce that the function is done
if reason:
await spdr.edit(f"`Безопасно заткнут скотчем!!!`\nПричина: {reason}")
else:
await spdr.edit("`Безопасно заткнут скотчем!!!`")
# Announce to logging group
if BOTLOG:
await spdr.client.send_message(
BOTLOG_CHATID, "#МУТ\n"
f"ПОЛЬЗОВАТЕЛЬ: [{user.first_name}](tg://user?id={user.id})\n"
f"ЧАТ: {spdr.chat.title}(`{spdr.chat_id}`)")
except UserIdInvalidError:
return await spdr.edit("`Ох, моя логика мута сломалась!`")
@register(outgoing=True, pattern="^\.unmute(?: |$)(.*)", groups_only=True)
async def unmoot(unmot):
"""Команда .unmute размутить реплайнутого/тэгнутого пользователя"""
# Admin or creator check
chat = await unmot.get_chat()
admin = chat.admin_rights
creator = chat.creator
# If not admin and not creator, return
if not admin and not creator:
await unmot.edit(NO_ADMIN)
return
# Check if the function running under SQL mode
try:
from userbot.modules.sql_helper.spam_mute_sql import unmute
except AttributeError:
await unmot.edit(NO_SQL)
return
# If admin or creator, inform the user and start unmuting
await unmot.edit('```Размут...```')
user = await get_user_from_event(unmot)
user = user[0]
if user:
pass
else:
return
if unmute(unmot.chat_id, user.id) is False:
return await unmot.edit("`Ошибка! Пользователь возможно уже размучен.`")
else:
try:
await unmot.client(
EditBannedRequest(unmot.chat_id, user.id, UNBAN_RIGHTS))
await unmot.edit("```Размут успешен```")
except UserIdInvalidError:
await unmot.edit("`Ох, моя логика размута сломалась!`")
return
if BOTLOG:
await unmot.client.send_message(
BOTLOG_CHATID, "#РАЗМУТ\n"
f"ПОЛЬЗОВАТЕЛЬ: [{user.first_name}](tg://user?id={user.id})\n"
f"ЧАТ: {unmot.chat.title}(`{unmot.chat_id}`)")
@register(incoming=True, disable_errors=True)
async def muter(moot):
"""Используется для удаления сообщений от людей в муте"""
try:
from userbot.modules.sql_helper.spam_mute_sql import is_muted
from userbot.modules.sql_helper.gmute_sql import is_gmuted
except AttributeError:
return
muted = is_muted(moot.chat_id)
gmuted = is_gmuted(moot.sender_id)
rights = ChatBannedRights(
until_date=None,
send_messages=True,
send_media=True,
send_stickers=True,
send_gifs=True,
send_games=True,
send_inline=True,
embed_links=True,
)
if muted:
for i in muted:
if str(i.sender) == str(moot.sender_id):
try:
await moot.delete()
await moot.client(
EditBannedRequest(moot.chat_id, moot.sender_id,
rights))
except (BadRequestError, UserAdminInvalidError,
ChatAdminRequiredError, UserIdInvalidError):
await moot.client.send_read_acknowledge(
moot.chat_id, moot.id)
if gmuted:
for i in gmuted:
if i.sender == str(moot.sender_id):
try:
await moot.delete()
except BadRequestError:
await moot.client.send_read_acknowledge(
moot.chat_id, moot.id)
@register(outgoing=True, pattern="^\.ungmute(?: |$)(.*)", groups_only=True)
async def ungmoot(un_gmute):
"""Команда .ungmute ungmutes the target in the userbot """
# Admin or creator check
chat = await un_gmute.get_chat()
admin = chat.admin_rights
creator = chat.creator
# If not admin and not creator, return
if not admin and not creator:
await un_gmute.edit(NO_ADMIN)
return
# Check if the function running under SQL mode
try:
from userbot.modules.sql_helper.gmute_sql import ungmute
except AttributeError:
await un_gmute.edit(NO_SQL)
return
user = await get_user_from_event(un_gmute)
user = user[0]
if user:
pass
else:
return
# If pass, inform and start ungmuting
await un_gmute.edit('```Ungmuting...```')
if ungmute(user.id) is False:
await un_gmute.edit("`Error! User probably not gmuted.`")
else:
# Inform about success
await un_gmute.edit("```Ungmuted Successfully```")
if BOTLOG:
await un_gmute.client.send_message(
BOTLOG_CHATID, "#UNGMUTE\n"
f"USER: [{user.first_name}](tg://user?id={user.id})\n"
f"CHAT: {un_gmute.chat.title}(`{un_gmute.chat_id}`)")
@register(outgoing=True, pattern="^\.gmute(?: |$)(.*)", groups_only=True)
async def gspider(gspdr):
""" For .gmute command, globally mutes the replied/tagged person """
# Admin or creator check
chat = await gspdr.get_chat()
admin = chat.admin_rights
creator = chat.creator
# If not admin and not creator, return
if not admin and not creator:
await gspdr.edit(NO_ADMIN)
return
# Check if the function running under SQL mode
try:
from userbot.modules.sql_helper.gmute_sql import gmute
except AttributeError:
await gspdr.edit(NO_SQL)
return
user, reason = await get_user_from_event(gspdr)
if user:
pass
else:
return
# If pass, inform and start gmuting
await gspdr.edit("`Grabs a huge, sticky duct tape!`")
if gmute(user.id) is False:
await gspdr.edit(
'`Error! User probably already gmuted.\nRe-rolls the tape.`')
else:
if reason:
await gspdr.edit(f"`Globally taped!`Reason: {reason}")
else:
await gspdr.edit("`Globally taped!`")
if BOTLOG:
await gspdr.client.send_message(
BOTLOG_CHATID, "#GMUTE\n"
f"USER: [{user.first_name}](tg://user?id={user.id})\n"
f"CHAT: {gspdr.chat.title}(`{gspdr.chat_id}`)")
@register(outgoing=True, pattern="^\.zombies(?: |$)(.*)", groups_only=True)
async def rm_deletedacc(show):
""" For .delusers command, list all the ghost/deleted accounts in a chat. """
if not show.is_group:
await show.edit("`I don't think this is a group.`")
return
con = show.pattern_match.group(1).lower()
del_u = 0
del_status = "`No deleted accounts found, Group is cleaned as Hell`"
if con != "clean":
await show.edit("`Searching for zombie accounts...`")
async for user in show.client.iter_participants(show.chat_id):
if user.deleted:
del_u += 1
await sleep(1)
if del_u > 0:
del_status = f"Found **{del_u}** deleted account(s) in this group,\
\nclean them by using `.zombies clean`"
await show.edit(del_status)
return
# Here laying the sanity check
chat = await show.get_chat()
admin = chat.admin_rights
creator = chat.creator
# Well
if not admin and not creator:
await show.edit("`I am not an admin here!`")
return
await show.edit("`Deleting deleted accounts...\nOh I can do that?!?!`")
del_u = 0
del_a = 0
async for user in show.client.iter_participants(show.chat_id):
if user.deleted:
try:
await show.client(
EditBannedRequest(show.chat_id, user.id, BANNED_RIGHTS))
except ChatAdminRequiredError:
await show.edit("`I don't have ban rights in this group`")
return
except UserAdminInvalidError:
del_u -= 1
del_a += 1
await show.client(
EditBannedRequest(show.chat_id, user.id, UNBAN_RIGHTS))
del_u += 1
if del_u > 0:
del_status = f"Cleaned **{del_u}** deleted account(s)"
if del_a > 0:
del_status = f"Cleaned **{del_u}** deleted account(s) \
\n**{del_a}** deleted admin accounts are not removed"
await show.edit(del_status)
await sleep(2)
await show.delete()
if BOTLOG:
await show.client.send_message(
BOTLOG_CHATID, "#CLEANUP\n"
f"Cleaned **{del_u}** deleted account(s) !!\
\nCHAT: {show.chat.title}(`{show.chat_id}`)")
@register(outgoing=True, pattern="^\.admins$", groups_only=True)
async def get_admin(show):
""" For .admins command, list all of the admins of the chat. """
info = await show.client.get_entity(show.chat_id)
title = info.title if info.title else "this chat"
mentions = f'<b>Admins in {title}:</b> \n'
try:
async for user in show.client.iter_participants(
show.chat_id, filter=ChannelParticipantsAdmins):
if not user.deleted:
link = f"<a href=\"tg://user?id={user.id}\">{user.first_name}</a>"
userid = f"<code>{user.id}</code>"
mentions += f"\n{link} {userid}"
else:
mentions += f"\nDeleted Account <code>{user.id}</code>"
except ChatAdminRequiredError as err:
mentions += " " + str(err) + "\n"
try:
await show.edit(mentions, parse_mode="html")
except MessageTooLongError:
await show.edit(
"Damn, too many admins here. Uploading admin list as file.")
file = open("adminlist.txt", "w+")
file.write(mentions)
file.close()
await show.client.send_file(
show.chat_id,
"adminlist.txt",
caption='Admins in {}'.format(title),
reply_to=show.id,
)
remove("adminlist.txt")
@register(outgoing=True, pattern="^\.bots$", groups_only=True)
async def get_bots(show):
""" For .bots command, list all of the bots of the chat. """
info = await show.client.get_entity(show.chat_id)
title = info.title if info.title else "this chat"
mentions = f'<b>Bots in {title}:</b>\n'
try:
if isinstance(show.to_id, PeerChat):
await show.edit("`I heard that only Supergroups can have bots.`")
return
else:
async for user in show.client.iter_participants(
show.chat_id, filter=ChannelParticipantsBots):
if not user.deleted:
link = f"<a href=\"tg://user?id={user.id}\">{user.first_name}</a>"
userid = f"<code>{user.id}</code>"
mentions += f"\n{link} {userid}"
else:
mentions += f"\nDeleted Bot <code>{user.id}</code>"
except ChatAdminRequiredError as err:
mentions += " " + str(err) + "\n"
try:
await show.edit(mentions, parse_mode="html")
except MessageTooLongError:
await show.edit(
"Damn, too many bots here. Uploading bots list as file.")
file = open("botlist.txt", "w+")
file.write(mentions)
file.close()
await show.client.send_file(
show.chat_id,
"botlist.txt",
caption='Bots in {}'.format(title),
reply_to=show.id,
)
remove("botlist.txt")
@register(outgoing=True, pattern="^\.pin(?: |$)(.*)", groups_only=True)
async def pin(msg):
""" For .pin command, pins the replied/tagged message on the top the chat. """
# Admin or creator check
chat = await msg.get_chat()
admin = chat.admin_rights
creator = chat.creator
# If not admin and not creator, return
if not admin and not creator:
await msg.edit(NO_ADMIN)
return
to_pin = msg.reply_to_msg_id
if not to_pin:
await msg.edit("`Reply to a message to pin it.`")
return
options = msg.pattern_match.group(1)
is_silent = True
if options.lower() == "loud":
is_silent = False
try:
await msg.client(
UpdatePinnedMessageRequest(msg.to_id, to_pin, is_silent))
except BadRequestError:
await msg.edit(NO_PERM)
return
await msg.edit("`Pinned Successfully!`")
user = await get_user_from_id(msg.from_id, msg)
if BOTLOG:
await msg.client.send_message(
BOTLOG_CHATID, "#PIN\n"
f"ADMIN: [{user.first_name}](tg://user?id={user.id})\n"
f"CHAT: {msg.chat.title}(`{msg.chat_id}`)\n"
f"LOUD: {not is_silent}")
@register(outgoing=True, pattern="^\.kick(?: |$)(.*)", groups_only=True)
async def kick(usr):
""" For .kick command, kicks the replied/tagged person from the group. """
# Admin or creator check
chat = await usr.get_chat()
admin = chat.admin_rights
creator = chat.creator
# If not admin and not creator, return
if not admin and not creator:
await usr.edit(NO_ADMIN)
return
user, reason = await get_user_from_event(usr)
if not user:
await usr.edit("`Couldn't fetch user.`")
return
await usr.edit("`Kicking...`")
try:
await usr.client.kick_participant(usr.chat_id, user.id)
await sleep(.5)
except Exception as e:
await usr.edit(NO_PERM)
return
if reason:
await usr.edit(
f"`Kicked` [{user.first_name}](tg://user?id={user.id})`!`\nReason: {reason}"
)
else:
await usr.edit(
f"`Kicked` [{user.first_name}](tg://user?id={user.id})`!`")
if BOTLOG:
await usr.client.send_message(
BOTLOG_CHATID, "#KICK\n"
f"USER: [{user.first_name}](tg://user?id={user.id})\n"
f"CHAT: {usr.chat.title}(`{usr.chat_id}`)\n")
@register(outgoing=True, pattern="^\.users ?(.*)", groups_only=True)
async def get_users(show):
""" For .users command, list all of the users in a chat. """
info = await show.client.get_entity(show.chat_id)
title = info.title if info.title else "this chat"
mentions = 'Users in {}: \n'.format(title)
try:
if not show.pattern_match.group(1):
async for user in show.client.iter_participants(show.chat_id):
if not user.deleted:
mentions += f"\n[{user.first_name}](tg://user?id={user.id}) `{user.id}`"
else:
mentions += f"\nDeleted Account `{user.id}`"
else:
searchq = show.pattern_match.group(1)
async for user in show.client.iter_participants(
show.chat_id, search=f'{searchq}'):
if not user.deleted:
mentions += f"\n[{user.first_name}](tg://user?id={user.id}) `{user.id}`"
else:
mentions += f"\nDeleted Account `{user.id}`"
except ChatAdminRequiredError as err:
mentions += " " + str(err) + "\n"
try:
await show.edit(mentions)
except MessageTooLongError:
await show.edit(
"Damn, this is a huge group. Uploading users lists as file.")
file = open("userslist.txt", "w+")
file.write(mentions)
file.close()
await show.client.send_file(
show.chat_id,
"userslist.txt",
caption='Users in {}'.format(title),
reply_to=show.id,
)
remove("userslist.txt")
async def get_user_from_event(event):
""" Get the user from argument or replied message. """
args = event.pattern_match.group(1).split(':', 1)
extra = None
if event.reply_to_msg_id and not len(args) == 2:
previous_message = await event.get_reply_message()
user_obj = await event.client.get_entity(previous_message.from_id)
extra = event.pattern_match.group(1)
elif len(args[0]) > 0:
user = args[0]
if len(args) == 2:
extra = args[1]
if user.isnumeric():
user = int(user)
if not user:
await event.edit("`Pass the user's username, id or reply!`")
return
if event.message.entities is not None:
probable_user_mention_entity = event.message.entities[0]
if isinstance(probable_user_mention_entity,
MessageEntityMentionName):
user_id = probable_user_mention_entity.user_id
user_obj = await event.client.get_entity(user_id)
return user_obj
try:
user_obj = await event.client.get_entity(user)
except (TypeError, ValueError) as err:
await event.edit(str(err))
return None
return user_obj, extra
async def get_user_from_id(user, event):
if isinstance(user, str):
user = int(user)
try:
user_obj = await event.client.get_entity(user)
except (TypeError, ValueError) as err:
await event.edit(str(err))
return None
return user_obj
CMD_HELP.update({
"admin":
".promote <username/userid> : <custom rank (optional)> (or) reply to a message with .promote <rank (optional)>\
\nUsage: Provides admin rights to the person in the chat.\
\n\n.demote <username/userid> (or) reply to a message with .demote\
\nUsage: Revokes the person's admin permissions in the chat.\
\n\n.ban <username/userid> : <reason (optional)> (or) reply to a message with .ban <reason (optional)>\
\nUsage: Bans the person off your chat.\
\n\n.unban <username/userid> (or) reply to a message with .unban\
\nUsage: Removes the ban from the person in the chat.\
\n\n.mute <username/userid> : <reason (optional)> reply to a message with .mute <reason (optional)>\
\nUsage: Mutes the person in the chat, works on admins too.\
\n\n.unmute <username/userid> (or) reply to a message with .unmute\
\nUsage: Removes the person from the muted list.\
\n\n.gmute <username/userid> : <reason (optional)> (or) reply to a message with .gmute <reason (optional)>\
\nUsage: Mutes the person in all groups you have in common with them.\
\n\n.ungmute <username/userid> (or) reply to a message with .ungmute\
\nUsage: Removes the person from the global mute list.\
\n\n.delusers\
\nUsage: Searches for deleted accounts in a group. Use .delusers clean to remove deleted accounts from the group.\
\n\n.admins\
\nUsage: Retrieves a list of admins in the chat.\
\n\n.bots\
\nUsage: Retrieves a list of bots in the chat.\
\n\n.users or .users <search query>\
\nUsage: Retrieves all (or queried) users in the chat.\
\n\n.setgpic <reply to image>\
\nUsage: Changes the group's display picture."
})

532
Fl1yd/FTG-Modules/arts.py Normal file
View File

@@ -0,0 +1,532 @@
import random
import logging
from .. import loader, utils
from random import randint, choice
logger = logging.getLogger(__name__)
def register(cb):
cb(ArtsMod())
class ArtsMod(loader.Module):
"""Юникод арты"""
strings = {'name': 'Arts'}
async def vjuhcmd(self, message):
"""Используй .vjuh <текст>."""
text = utils.get_args_raw(message)
if not text:
await message.edit('<b>Нет текста после команды :c</b>')
return
else:
vjuh = ("<code>.∧_∧\n"
"( ・ω・。)つ━☆・*。\n"
" ・゜ .\n"
"しーJ °。 *´¨)\n"
"´¸.·*´¨) ¸.·*¨)\n"
" (¸.·´ (¸'* ☆\n\n"
"Вжух и ты </code>" + f"<code>{text}</code>")
await message.edit(vjuh)
if text == "podpiska":
await message.edit("<code>.∧_∧\n"
"( ・ω・。)つ━☆・*。\n"
" ・゜ .\n"
"しーJ °。 *´¨)\n"
"´¸.·*´¨) ¸.·*¨)\n"
" (¸.·´ (¸'* ☆\n\n"
"Вжух и ты подпишешься -></code> @ftgmodulesbyfl1yd")
async def cowsaycmd(self, message):
"""Используй .cowsay <текст>."""
text = utils.get_args_raw(message)
if not text:
await message.edit('<b>Нет текста после команды :c</b>')
return
else:
cowsay = ("<code> "
f"< {text} >\n"
"\n"
" \ ^__^\n"
" \ (oo)\_______\n"
" (__)\ )\/\n"
" ||----w||\n"
" || ||</code>")
await message.edit(cowsay)
async def padayucmd(self, message):
"""Используй .padayu <текст>; ничего."""
text = utils.get_args_raw(message)
if not text:
text = ("ПАДАЮ")
padayu = ("┓┏┓┏┓┃\n"
"┛┗┛┗┛┃\n"
"┓┏┓┏┓┃\n"
"┛┗┛┗┛┃\n"
"┓┏┓┏┓┃\n"
"┛┗┛┗┛┃\n"
"┓┏┓┏┓┃\n"
f"┛┗┛┗┛┃ <b>{text}</b>!\n"
"┓┏┓┏┓┃ \○/\n"
"┛┗┛┗┛┃ /\n"
"┓┏┓┏┓┃ノ)\n"
"┛┗┛┗┛┃\n"
"┓┏┓┏┓┃\n"
"┛┗┛┗┛┃\n"
"┓┏┓┏┓┃\n"
"┛┗┛┗┛┃\n"
"┓┏┓┏┓┃\n"
"┛┗┛┗┛┃\n"
"┓┏┓┏┓┃\n"
"┛┗┛┗┛┃\n"
"┓┏┓┏┓┃\n"
"┛┗┛┗┛┃\n"
"┓┏┓┏┓┃\n"
"┛┗┛┗┛┃\n"
"┓┏┓┏┓┃\n"
"┛┗┛┗┛┃\n"
"┓┏┓┏┓┃\n"
"┛┗┛┗┛┃\n")
await message.edit(padayu)
else:
padayu = ("┓┏┓┏┓┃\n"
"┛┗┛┗┛┃\n"
"┓┏┓┏┓┃\n"
"┛┗┛┗┛┃\n"
"┓┏┓┏┓┃\n"
"┛┗┛┗┛┃\n"
"┓┏┓┏┓┃\n"
f"┛┗┛┗┛┃ <b>{text}</b>!\n"
"┓┏┓┏┓┃ \○/\n"
"┛┗┛┗┛┃ /\n"
"┓┏┓┏┓┃ノ)\n"
"┛┗┛┗┛┃\n"
"┓┏┓┏┓┃\n"
"┛┗┛┗┛┃\n"
"┓┏┓┏┓┃\n"
"┛┗┛┗┛┃\n"
"┓┏┓┏┓┃\n"
"┛┗┛┗┛┃\n"
"┓┏┓┏┓┃\n"
"┛┗┛┗┛┃\n"
"┓┏┓┏┓┃\n"
"┛┗┛┗┛┃\n"
"┓┏┓┏┓┃\n"
"┛┗┛┗┛┃\n"
"┓┏┓┏┓┃\n"
"┛┗┛┗┛┃\n"
"┓┏┓┏┓┃\n"
"┛┗┛┗┛┃\n")
await message.edit(padayu)
async def priletelcmd(self, message):
"""Используй .prilitel <текст>; ничего."""
text = utils.get_args_raw(message)
if not text:
text = ("Я ЛЮБЛЮ СОСАТЬ ХУИ, А ТЫ?!")
prilitel = ("▬▬▬.◙.▬▬▬\n"
" ═▂▄▄▓▄▄▂\n"
"◢◤ █▀▀████▄▄▄▄◢◤\n"
"█▄ █ █▄ ███▀▀▀▀▀▀▀╬\n"
"◥█████◤ прилетел сказать что-то важное...\n"
"══╩══╩═\n"
"╬═╬\n"
"╬═╬\n"
"╬═╬\n"
"╬═╬\n"
"╬═╬\n"
"╬═╬\n"
"╬═╬\n"
"╬═╬\n"
"╬═╬\n"
"╬═╬\n"
"╬═╬\n"
"╬═╬\n"
"╬═╬\n"
"╬═╬\n"
"╬═╬\n"
"╬═╬\n"
"╬═╬\n"
"╬═╬\n"
"╬═╬\n"
"╬═╬\n"
"╬═╬\n"
"╬═╬\n"
"╬═╬\n"
"╬═╬\n"
"╬═╬\n"
"╬═╬\n"
"╬═╬\n"
"╬═╬\n"
"╬═╬\n"
"╬═╬\n"
"╬═╬\n"
"╬═╬\n"
"╬═╬\n"
"╬═╬\n"
"╬═╬\n"
f"╬═╬☻/ - <b>{text}</b>\n"
"╬═╬/▌\n"
"╬═╬/ \ ")
await message.edit(prilitel)
else:
prilitel = ("▬▬▬.◙.▬▬▬\n"
" ═▂▄▄▓▄▄▂\n"
"◢◤ █▀▀████▄▄▄▄◢◤\n"
"█▄ █ █▄ ███▀▀▀▀▀▀▀╬\n"
"◥█████◤ прилетел сказать что-то важное...\n"
"══╩══╩═\n"
"╬═╬\n"
"╬═╬\n"
"╬═╬\n"
"╬═╬\n"
"╬═╬\n"
"╬═╬\n"
"╬═╬\n"
"╬═╬\n"
"╬═╬\n"
"╬═╬\n"
"╬═╬\n"
"╬═╬\n"
"╬═╬\n"
"╬═╬\n"
"╬═╬\n"
"╬═╬\n"
"╬═╬\n"
"╬═╬\n"
"╬═╬\n"
"╬═╬\n"
"╬═╬\n"
"╬═╬\n"
"╬═╬\n"
"╬═╬\n"
"╬═╬\n"
"╬═╬\n"
"╬═╬\n"
"╬═╬\n"
"╬═╬\n"
"╬═╬\n"
"╬═╬\n"
"╬═╬\n"
"╬═╬\n"
"╬═╬\n"
"╬═╬\n"
f"╬═╬☻/ - <b>{text}</b>\n"
"╬═╬/▌\n"
"╬═╬/ \ ")
await message.edit(prilitel)
async def huytebecmd(self, message):
"""Используй .huytebe <текст>; ничего."""
text = utils.get_args_raw(message)
if not text:
text = ("ХУЙ ТЕБЕ!")
huytebe = ("...............▄▄▄▄▄\n"
"..............▄▌░░░░▐▄\n"
"............▐░░░░░░░▌\n"
"....... ▄█▓░░░░░░▓█▄\n"
"....▄▀░░▐░░░░░░▌░▒▌\n"
".▐░░░░▐░░░░░░▌░░░▌\n"
"▐ ░░░░▐░░░░░░▌░░░▐\n"
"▐ ▒░░░ ▐░░░░░░▌░▒▒▐ \n"
"▐ ▒░░░░▐░░░░░░▌░▒▐\n"
"..▀▄▒▒▒▒▐░░░░░░▌▄▀\n"
"........ ▀▀▀ ▐░░░░░░▌\n"
".................▐░░░░░░▌\n"
".................▐░░░░░░▌\n"
".................▐░░░░░░▌\n"
".................▐░░░░░░▌\n"
"................▐▄▀▀▀▀▀▄▌\n"
"...............▐▒▒▒▒▒▒▒▒▌\n"
"...............▐▒▒▒▒▒▒▒▒▌\n"
"................▐▒▒▒▒▒▒▒▌\n"
"..................▀▌▒▀▒▐▀\n"
"\n"
f"<b>{text}</b>")
await message.edit(huytebe)
else:
huytebe = ("...............▄▄▄▄▄\n"
"..............▄▌░░░░▐▄\n"
"............▐░░░░░░░▌\n"
"....... ▄█▓░░░░░░▓█▄\n"
"....▄▀░░▐░░░░░░▌░▒▌\n"
".▐░░░░▐░░░░░░▌░░░▌\n"
"▐ ░░░░▐░░░░░░▌░░░▐\n"
"▐ ▒░░░ ▐░░░░░░▌░▒▒▐ \n"
"▐ ▒░░░░▐░░░░░░▌░▒▐\n"
"..▀▄▒▒▒▒▐░░░░░░▌▄▀\n"
"........ ▀▀▀ ▐░░░░░░▌\n"
".................▐░░░░░░▌\n"
".................▐░░░░░░▌\n"
".................▐░░░░░░▌\n"
".................▐░░░░░░▌\n"
"................▐▄▀▀▀▀▀▄▌\n"
"...............▐▒▒▒▒▒▒▒▒▌\n"
"...............▐▒▒▒▒▒▒▒▒▌\n"
"................▐▒▒▒▒▒▒▒▌\n"
"..................▀▌▒▀▒▐▀\n"
"\n"
f"<b>{text}</b>")
await message.edit(huytebe)
async def lolcmd(self, message):
"""Используй .lol."""
lol = ("┏━┓┈┈╭━━━━╮┏━┓┈┈\n"
"┃╱┃┈┈┃╱╭╮╱┃┃╱┃┈┈\n"
"┃╱┗━┓┃╱┃┃╱┃┃╱┗━┓\n"
"┃╱╱╱┃┃╱╰╯╱┃┃╱╱╱┃\n"
"┗━━━┛╰━━━━╯┗━━━┛\n")
await message.edit(lol)
async def fuckyoucmd(self, message):
"""Используй .fuckyou."""
fuckyou = ("┏━┳┳┳━┳┳┓\n"
"┃━┫┃┃┏┫━┫┏┓\n"
"┃┏┫┃┃┗┫┃┃┃┃\n"
"┗┛┗━┻━┻┻┛┃┃\n"
"┏┳┳━┳┳┳┓┏┫┣┳┓\n"
"┣┓┃┃┃┃┣┫┃┏┻┻┫\n"
"┃┃┃┃┃┃┃┃┣┻┫┃┃\n"
"┗━┻━┻━┻┛┗━━━┛\n")
await message.edit(fuckyou)
async def housecmd(self, message):
"""Используй .house."""
house = ("╯▅╰╱▔▔▔▔▔▔▔╲╯╯\n"
"▕▕╱╱╱╱╱╱╱╱╱╲╲╭╭\n"
"▕▕╱╱╱╱╱╱╱╱┛▂╲╲╭\n"
"╱▂▂▂▂▂▂╱╱┏▕╋▏╲╲\n"
"▔▏▂┗┓▂▕▔┛▂┏▔▂▕▔\n"
"▕▕╋▏▕╋▏▏▕┏▏▕╋▏▏\n"
"▕┓▔┗┓▔┏▏▕┗▏ ┓▔┏\n")
await message.edit(house)
async def hellocmd(self, message):
"""Используй .hello."""
hello = ("┈┏┓┏┳━┳┓┏┓┏━━┓┈\n"
"┈┃┃┃┃┏┛┃┃┃┃┏┓┃┈\n"
"┈┃┗┛┃┗┓┃┃┃┃┃┃┃┈\n"
"┈┃┏┓┃┏┛┃┃┃┃┃┃┃┈\n"
"┈┃┃┃┃┗┓┗┫┗┫╰╯┃┈\n"
"┈┗┛┗┻━┻━┻━┻━━┛┈\n")
await message.edit(hello)
async def coffeecmd(self, message):
"""Используй .coffee <текст>; ничего."""
text = utils.get_args_raw(message)
if not text:
text = ("Это тебе :з")
coffee = ("─▄▀─▄▀\n"
"──▀──▀\n"
"█▀▀▀▀▀█▄\n"
"█░░░░░█─█\n"
"▀▄▄▄▄▄▀▀\n\n"
f"<b>{text}</b>")
await message.edit(coffee)
else:
coffee = ("─▄▀─▄▀\n"
"──▀──▀\n"
"█▀▀▀▀▀█▄\n"
"█░░░░░█─█\n"
"▀▄▄▄▄▄▀▀\n\n"
f"<b>{text}</b>")
await message.edit(coffee)
async def tvcmd(self, message):
"""Используй .tv <текст>; ничего."""
text = utils.get_args_raw(message)
if not text:
text = ("ТЕЛЕВИЗОР ГОВОРИТ ЧТО ТЫ ДОЛБОЁБ!")
tv = ("░▀▄░░▄▀\n"
"▄▄▄██▄▄▄▄▄░▀█▀▐░▌\n"
"█▒░▒░▒░█▀█░░█░▐░▌\n"
"█░▒░▒░▒█▀█░░█░░█\n"
"█▄▄▄▄▄▄███══════\n\n"
f"<b>{text}</b>")
await message.edit(tv)
else:
tv = ("░▀▄░░▄▀\n"
"▄▄▄██▄▄▄▄▄░▀█▀▐░▌\n"
"█▒░▒░▒░█▀█░░█░▐░▌\n"
"█░▒░▒░▒█▀█░░█░░█\n"
"█▄▄▄▄▄▄███══════\n\n"
f"<b>{text}</b>")
await message.edit(tv)
async def grencmd(self, message):
"""Используй .gren <текст>; ничего."""
text = utils.get_args_raw(message)
if not text:
text = ("ВЗРЫВАЮ ТЕБЯ НАХУЙ!")
gren = ("─▄▀▀███═◯\n"
"▐▌▄▀▀█▀▀▄\n"
"█▐▌─────▐▌\n"
"█▐█▄───▄█▌\n"
"▀─▀██▄██▀\n\n"
f"<b>{text}</b>")
await message.edit(gren)
else:
gren = ("─▄▀▀███═◯\n"
"▐▌▄▀▀█▀▀▄\n"
"█▐▌─────▐▌\n"
"█▐█▄───▄█▌\n"
"▀─▀██▄██▀\n\n"
f"<b>{text}</b>")
await message.edit(gren)
async def bruhcmd(self, message):
"""Используй .bruh."""
bruh = ("╭━━╮╱╱╱╱╱╭╮\n"
"┃╭╮┃╱╱╱╱╱┃┃\n"
"┃╰╯╰┳━┳╮╭┫╰━╮\n"
"┃╭━╮┃╭┫┃┃┃╭╮┃\n"
"┃╰━╯┃┃┃╰╯┃┃┃┃\n"
"╰━━━┻╯╰━━┻╯╰╯\n")
await message.edit(bruh)
async def unocmd(self, message):
"""Используй .uno."""
uno = ("⣿⣿⣿⡿⠿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡇\n"
"⣿⣿⡟⡴⠛⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡇\n"
"⣿⡏⠴⠞⣼⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡇\n"
"⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡇\n"
"⣿⣿⣿⣿⣿⣿⣿⡏⠩⣭⣭⢹⣿⣿⣿⣿⡇\n"
"⣿⣿⣿⣿⣿⣿⠟⣵⣾⠟⠟⣼⣿⣿⣿⣿⡇\n"
"⣿⣿⣿⣿⣿⠿⠀⢛⣵⡆⣶⣿⣿⣿⣿⣿⡇\n"
"⣿⣿⣿⣿⡏⢸⣶⡿⢋⣴⣿⣿⣿⣿⣿⣿⡇\n"
"⣿⣿⣿⣿⣇⣈⣉⣉⣼⣿⣿⣿⣿⣿⣿⣿⡇\n"
"⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡇\n"
"⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⢣⠞⢺⣿⡇\n"
"⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⢡⡴⣣⣿⣿⡇\n"
"⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣶⣶⣿⣿⣿⡇")
await message.edit(uno)
async def huycmd(self, message):
"""Используй .huy <emoji>; ничего."""
emoji = utils.get_args_raw(message)
huy = ("🍆🍆\n"
"🍆🍆🍆\n"
" 🍆🍆🍆\n"
" 🍆🍆🍆\n"
" 🍆🍆🍆\n"
" 🍆🍆🍆\n"
" 🍆🍆🍆\n"
" 🍆🍆🍆\n"
" 🍆🍆🍆\n"
" 🍆🍆🍆\n"
" 🍆🍆🍆🍆\n"
" 🍆🍆🍆🍆🍆🍆\n"
" 🍆🍆🍆 🍆🍆🍆\n"
" 🍆🍆 🍆🍆")
if emoji:
huy = huy.replace('🍆', emoji)
await message.edit(huy)
async def impscmd(self, message):
"""Используй .imps <@ или реплай>."""
reply = await message.get_reply_message()
args = utils.get_args_raw(message)
if not args and not reply:
user = await message.client.get_me()
if reply:
user = await utils.get_user(await message.get_reply_message())
if args:
user = await message.client.get_entity(args)
imps = ['wasn`t the impostor', 'was the impostor']
imp = ("<code>.  。    •   ゚  . . 。\n"
"  .   .    .   .     。   。  .\n"
" .   。 ඞ 。  .  .  • .\n"
f"{user.first_name} {choice(imps)} 。  .\n"
f" {randint(1, 5)} impostor(s) remains.   .   .\n"
",    .  .   . • • 。.\n"
"。 •  .  ゚   •  ゚ . .  .</code>")
await message.edit(imp)
async def fcmd(self, message):
"""Используй .f"""
r = random.randint(0, 6)
logger.debug(r)
if r == 0:
await utils.answer(message, "┏━━━┓\n┃┏━━┛\n┃┗━━┓\n┃┏━━┛\n┃┃\n┗┛")
elif r == 1:
await utils.answer(message, "╭━━━╮\n┃╭━━╯\n┃╰━━╮\n┃╭━━╯\n┃┃\n╰╯")
elif r == 2:
await utils.answer(message,
"̫͍F̥̼F͈̫F͔̱F͓̤F̭̺F̙F͍͕F͚̩F̣̱F͖ͅF̣͙F̗͕F̦͚F̯͍ ̘͇F̰̹F̦̩F͙ͅF̙̹F̝͚ ̻F̥̙F ͙̹ ̩͔ ̘͈ ͍̭\n"
"̹̖F̲͔F̜ ̗͎F̭̰F̰̭F̼͍F̹̞F̱͉F͓͓F̬ ̼ͅF̤͔F̦͉Fм̟̙F̦̹F͚̠FF̪̝ ̩̗F͇͓F̟̙F͎͎F͉͚ ̥̟ ̙͚\n"
"̯̻F͓͈F̮͔F͉̫F͕̥ ͔̙ ̣ ͙г\n"
"̞̖F̝̗F͙͓F̟͓F̖̝ ̤͙\n"
"͔͓F̠F̖ͅF̰̹F ̠̟\n"
"͓͕F̹͙ ̲̩F̙̠F͇̯F̖̗ ̺ ̱͔ \n"
"̜͚F ̱̥F̥̝F̖̦F͇͔ ̜͓ ̪̹\n"
"̩̗F̬̟F̰F̙͇F F͉̖F̼ͅF̬͔F͇͖F̞̥F̙̺F̖̮ ̥̙F̜͔F̩̜F͎̣F̲̤F̪̙FF̰̫F̝̘ ̣̻F͙͎ ̜̱ ̠͈F̬̫ ̦̩ \n"
"͎͙F̘F͍̲ ̲ͅF͇͇F̜̥F͖͖F̪̟ ̤̩F̠̩F̬͕F̪ ̰̪F̫͍ ̺͓F͕̤F̰ͅ ̬̼F̮̼F ͎̯F͓̟F̻͔F̪F͈̭ ̠͓F̣̺ ̭F̮̩ ͖̣\n"
"̙F͎̞F̻ F͖͔F͕̮F̯͖FF̪͕F̫͚F̣̣ ̗̣F̩ ̫͍F̥F̗̮F̻̫F͍̺F̞͉F͚̩F͕̤ ͉̤FF̼͙ ͔͕ ͉ ͙\n"
"͍͙ F̯̬F̲̻F̥̟F̝̙ ̘\n"
"̦̝ ͔ ̝̬F̝͍F̖͚ F̥͚F̖͉ ̩͔ \n"
"͓̪F̝͉F̜ͅF̦ͅF͓͕ ̜̭\n"
"͖F ͎̩F̩͕F̻͖F̯̼ ̼̼ ̹͔\n"
"͍̱FF̹̥F̭͓F̦̺ ̖͎\n"
"̥̜F̞͎F̖̲F̦̹F̬̘ \n"
"̦̬F̺̭F͖̗F͕͍F̟͙ ͓͍")
elif r == 3:
await utils.answer(message, "🌕🌕🌕🌕🌕🌕🌕🌕🌕🌕🌕\n"
"🌕🌕🌕🌕🌕🌕🌕🌕🌕🌕🌕\n"
"🌕🌕🌗🌑🌑🌑🌑🌑🌓🌕🌕\n"
"🌕🌕🌗🌑🌑🌑🌑🌑🌕🌕🌕\n"
"🌕🌕🌗🌑🌓🌕🌕🌕🌕🌕🌕\n"
"🌕🌕🌗🌑🌓🌕🌕🌕🌕🌕🌕\n"
"🌕🌕🌗🌑🌑🌑🌑🌓🌕🌕🌕\n"
"🌕🌕🌗🌑🌑🌑🌑🌕🌕🌕🌕\n"
"🌕🌕🌗🌑🌓🌕🌕🌕🌕🌕🌕\n"
"🌕🌕🌗🌑🌓🌕🌕🌕🌕🌕🌕\n"
"🌕🌕🌗🌑🌓🌕🌕🌕🌕🌕🌕\n"
"🌕🌕🌕🌕🌕🌕🌕🌕🌕🌕🌕\n"
"🌕🌕🌕🌕🌕🌕🌕🌕🌕🌕🌕")
elif r == 4:
await utils.answer(message, "┏━━━┓╋╋╋╋╋╋╋╋╋╋╋┏━━━┓\n"
"┃┏━┓┃╋╋╋╋╋╋╋╋╋╋╋┃┏━━┛\n"
"┃┗━┛┣━┳━━┳━━┳━━┓┃┗━━┓\n"
"┃┏━━┫┏┫┃━┫━━┫━━┫┃┏━━┛\n"
"┃┃╋╋┃┃┃┃━╋━━┣━━┃┃┃\n"
"┗┛╋╋┗┛┗━━┻━━┻━━┛┗┛")
elif r == 5:
await utils.answer(message, "<code>FFFFFFFFFFFFFFFFFFFFFF\n"
"F::::::::::::::::::::F\n"
"F::::::::::::::::::::F\n"
"FF::::::FFFFFFFFF::::F\n"
" F:::::F FFFFFF\n"
" F:::::F\n"
" F::::::FFFFFFFFFF\n"
" F:::::::::::::::F\n"
" F:::::::::::::::F\n"
" F::::::FFFFFFFFFF\n"
" F:::::F\n"
" F:::::F\n"
"FF:::::::FF\n"
"F::::::::FF\n"
"F::::::::FF\n"
"FFFFFFFFFFF</code>")
else:
await utils.answer(message, "██████╗\n"
"██╔═══╝\n"
"████╗░░\n"
"██╔═╝░░\n"
"██║░░░░\n"
"╚═╝░░░░")

View File

@@ -0,0 +1,22 @@
from .. import loader, utils
import calendar
from datetime import date
def register(cb):
cb(CalendarMod())
class CalendarMod(loader.Module):
"""Календарь"""
strings = {"name": "Calendar"}
async def clndcmd(self, event):
""".clnd <год> <месяц> или ничего"""
args = utils.get_args(event)
y, m, d = [int(i) for i in str(date.today()).split("-")]
year = int(args[0]) if args and args[0].isdigit() else y
month = int(args[1]) if len(args) == 2 and args[1].isdigit() and int(args[1]) in range(1, 13) else m
calen = calendar.month(year, month)
if year == y and month == m:
calen = calen.replace(str(d), f'</code><strong>{d}</strong><code>')
await event.edit(f"<code>\u2060{calen}</code>")

View File

@@ -0,0 +1,28 @@
from .. import loader, utils
from random import choice as какаша
def register(cb):
cb(PicMod())
class PicMod(loader.Module):
"""Случайный картинка по аргументам из @pic."""
strings = {'name': 'Pic'}
async def piccmd(self, event):
try:
args = utils.get_args_raw(event)
if not args:
await event.edit('<b>Нет аргумента после команды.</b>')
return
await event.edit(f'<b>Лови {args}!</b>')
reslt=await event.client.inline_query('pic',args)
await reslt[reslt.index(какаша(reslt))].click(event.to_id)
except Exception as e:
await event.edit(str(e))
return

280
Fl1yd/FTG-Modules/chat.py Normal file
View File

@@ -0,0 +1,280 @@
# Chat Module for Friendly-Telegram UserBot.
# Copyright (C) 2020 @Fl1yd.
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
# ======================================================================
import logging
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.functions.users import GetFullUserRequest
from telethon.tl.types import (ChannelParticipantsAdmins, PeerChat, ChannelParticipantsBots)
from telethon.tl.functions.messages import AddChatUserRequest
def register(cb):
cb(ChatMod())
class ChatMod(loader.Module):
"""Чат модуль"""
strings = {'name': 'ChatModule'}
async def useridcmd(self, message):
"""Команда .userid <@ или реплай> показывает ID выбранного пользователя."""
if message.is_reply:
full = await message.client(GetFullUserRequest((await message.get_reply_message()).from_id))
else:
args = utils.get_args(message)
try:
full = await message.client(GetFullUserRequest(args[0]))
except:
full = await message.client(GetFullUserRequest(message.from_id))
info = (f"<b>Имя:</b> <code>{full.user.first_name}</code>\n"
f"<b>ID:</b> <code>{full.user.id}</code>")
await message.edit(info)
async def chatidcmd(self, message):
"""Команда .chatid показывает ID чата."""
args = utils.get_args_raw(message)
chatid = None
if args:
if args.isnumeric(): args = int(args)
try: chatid = await message.client.get_entity(args)
except: chatid = await message.client.get_entity(message.to_id)
else: chatid = await message.client.get_entity(message.to_id)
await message.edit(f"<b>Название:</b> <code>{chatid.title}</code>\n"
f"<b>ID</b>: <code>{chatid.id}</code>")
async def invitecmd(self, event):
"""Используйте .invite <@ или реплай>, чтобы добавить пользователя в чат."""
if event.fwd_from:
return
to_add_users = utils.get_args_raw(event)
reply = await event.get_reply_message()
if not to_add_users and not reply:
await event.edit("<b>Нет аргументов.</b>")
elif reply:
to_add_users = str(reply.from_id)
if to_add_users:
if not event.is_group and not event.is_channel:
return await event.edit("<b>Это не чат!</b>")
else:
if not event.is_channel and event.is_group:
# https://tl.telethon.dev/methods/messages/add_chat_user.html
for user_id in to_add_users.split(" "):
try:
userID = int(user_id)
except:
userID = user_id
try:
await event.client(AddChatUserRequest(chat_id=event.chat_id,
user_id=userID,
fwd_limit=1000000))
except ValueError:
return await event.reply("<b>Неверный @ или ID.</b>")
except UserIdInvalidError:
return await event.reply("<b>Неверный @ или ID.</b>")
except UserPrivacyRestrictedError:
return await event.reply("<b>Настройки приватности пользователя не позволяют пригласить его.</b>")
except UserNotMutualContactError:
return await event.reply("<b>Настройки приватности пользователя не позволяют пригласить его.</b>")
except ChatAdminRequiredError:
return await event.reply("<b>У меня нет прав.</b>")
except ChatWriteForbiddenError:
return await event.reply("<b>У меня нет прав.</b>")
except ChannelPrivateError:
return await event.reply("<b>У меня нет прав.</b>")
except UserKickedError:
return await event.reply("<b>Пользователь кикнут из чата, обратитесь к администраторам.</b>")
except BotGroupsBlockedError:
return await event.reply("<b>Бот заблокирован в чате, обратитесь к администраторам.</b>")
except UserBlockedError:
return await event.reply("<b>Пользователь заблокирован в чате, обратитесь к администраторам.</b>")
except InputUserDeactivatedError:
return await event.reply("<b>Аккаунт пользователя удалён.</b>")
except UserAlreadyParticipantError:
return await event.reply("<b>Пользователь уже в группе.</b>")
except YouBlockedUserError:
return await event.reply("<b>Вы заблокировали этого пользователя.</b>")
await event.edit("<b>Пользователь приглашён успешно!</b>")
else:
# https://tl.telethon.dev/methods/channels/invite_to_channel.html
for user_id in to_add_users.split(" "):
try: userID = int(user_id)
except: userID = user_id
try:
await event.client(InviteToChannelRequest(channel=event.chat_id,
users=[userID]))
except ValueError:
return await event.reply("<b>Неверный @ или ID.</b>")
except UserIdInvalidError:
return await event.reply("<b>Неверный @ или ID.</b>")
except UserPrivacyRestrictedError:
return await event.reply("<b>Настройки приватности пользователя не позволяют пригласить его.</b>")
except UserNotMutualContactError:
return await event.reply("<b>Настройки приватности пользователя не позволяют пригласить его.</b>")
except ChatAdminRequiredError:
return await event.reply("<b>У меня нет прав.</b>")
except ChatWriteForbiddenError:
return await event.reply("<b>У меня нет прав.</b>")
except ChannelPrivateError:
return await event.reply("<b>У меня нет прав.</b>")
except UserKickedError:
return await event.reply("<b>Пользователь кикнут из чата, обратитесь к администраторам.</b>")
except BotGroupsBlockedError:
return await event.reply("<b>Бот заблокирован в чате, обратитесь к администраторам.</b>")
except UserBlockedError:
return await event.reply("<b>Пользователь заблокирован в чате, обратитесь к администраторам.</b>")
except InputUserDeactivatedError:
return await event.reply("<b>Аккаунт пользователя удалён.</b>")
except UserAlreadyParticipantError:
return await event.reply("<b>Пользователь уже в группе.</b>")
except YouBlockedUserError:
return await event.reply("<b>Вы заблокировали этого пользователя.</b>")
await event.edit("<b>Пользователь приглашён успешно!</b>")
async def kickmecmd(self, leave):
"""Используйте команду .kickme, чтобы кикнуть себя из чата."""
args = utils.get_args_raw(leave)
try:
if args: await leave.edit(f"<b>До связи.\nПричина: {args}</b>")
else: await leave.edit("<b>До связи.</b>")
await leave.client(LeaveChannelRequest(leave.chat_id))
except: return await leave.edit("<b>Это не чат!</b>")
async def userscmd(self, message):
"""Команда .users <имя> выводит список всех пользователей в чате."""
if message.chat:
try:
await message.edit("<b>Считаем...</b>")
info = await message.client.get_entity(message.chat_id)
title = info.title if info.title else "this chat"
users = await message.client.get_participants(message.chat_id)
mentions = f'<b>Пользователей в "{title}": {len(users)}</b> \n'
if not utils.get_args_raw(message):
users = await message.client.get_participants(message.chat_id)
for user in users:
if not user.deleted:
mentions += f"\n• <a href =\"tg://user?id={user.id}\">{user.first_name}</a> <b>|</b> <code>{user.id}</code>"
else:
mentions += f"\n• Удалённый аккаунт <b>|</b> <code>{user.id}</code>"
else:
searchq = utils.get_args_raw(message)
users = await message.client.get_participants(message.chat_id, search=f"{searchq}")
mentions = f'<b>В чате "{title}" найдено {len(users)} пользователей с именем {searchq}:</b> \n'
for user in users:
if not user.deleted:
mentions += f"\n• <a href =\"tg://user?id={user.id}\">{user.first_name}</a> <b>|</b> <code>{user.id}</code>"
else:
mentions += f"\n• Удалённый аккаунт <b>|</b> <code>{user.id}</code>"
except ChatAdminRequiredError as err:
info = await message.client.get_entity(message.chat_id)
title = info.title if info.title else "this chat"
users = await message.client.get_participants(message.chat_id)
mentions = f'<b>Пользователей в "{title}": {len(users)}</b> \n'
mentions += " " + str(err) + "\n"
else:
await message.edit("<b>Это не чат!</b>")
return
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()
async def adminscmd(self, message):
"""Команда .admins показывает список всех админов в чате."""
if message.chat:
await message.edit("<b>Считаем...</b>")
info = await message.client.get_entity(message.chat_id)
title = info.title if info.title else "this chat"
admins = await message.client.get_participants(message.chat_id, filter=ChannelParticipantsAdmins)
mentions = f'<b>Админов в "{title}": {len(admins)}</b> \n'
for user in await message.client.get_participants(message.chat_id, filter=ChannelParticipantsAdmins):
if not user.deleted:
link = f"• <a href=\"tg://user?id={user.id}\">{user.first_name}</a>"
userid = f"<code>{user.id}</code>"
mentions += f"\n{link} <b>|</b> {userid}"
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("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:
await message.edit("<b>Я слышал, что только чаты могут иметь админов...</b>")
async def botscmd(self, message):
"""Команда .bots показывает список всех ботов в чате."""
if message.chat:
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'
try:
if isinstance(message.to_id, PeerChat):
await message.edit("<b>Я слышал, что только чаты могут иметь ботов...</b>")
return
else:
async for user in message.client.iter_participants(message.chat_id, filter=ChannelParticipantsBots):
if not user.deleted:
link = f"• <a href=\"tg://user?id={user.id}\">{user.first_name}</a>"
userid = f"<code>{user.id}</code>"
mentions += f"\n{link} <b>|</b> {userid}"
else:
mentions += f"\n• Удалённый бот <b>|</b> <code>{user.id}</code>"
except ChatAdminRequiredError as err:
mentions += " " + str(err) + "\n"
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:
await message.edit("<b>Я слышал, что только чаты могут иметь ботов...</b>")

View File

@@ -0,0 +1,177 @@
from .. import loader, utils
from telethon.tl.functions.channels import GetFullChannelRequest, GetParticipantsRequest
from telethon.tl.functions.messages import GetHistoryRequest
from telethon.tl.types import MessageActionChannelMigrateFrom, ChannelParticipantsAdmins, UserStatusOnline
from telethon.errors import (ChannelInvalidError, ChannelPrivateError, ChannelPublicGroupNaError)
from datetime import datetime
def register(cb):
cb(ChatInfoMod())
class ChatInfoMod(loader.Module):
"""Показывает информацию о чате."""
strings = {'name': 'ChatInfo'}
async def chatinfocmd(self, chatinfo):
"""Используй .chatinfo <айди чата>; ничего"""
if chatinfo.chat:
await chatinfo.edit("<b>Загрузка информации...</b>")
chat = await get_chatinfo(chatinfo)
caption = await fetch_info(chat, chatinfo)
try:
await chatinfo.client.send_message(chatinfo.to_id, str(caption), file=await chatinfo.client.download_profile_photo(chat.full_chat.id, "chatphoto.jpg"))
except Exception:
await chatinfo.edit(f"<b>Произошла непредвиденная ошибка.</b>")
await chatinfo.delete()
else:
await chatinfo.edit("<b>Это не чат!</b>")
async def get_chatinfo(event):
chat = utils.get_args_raw(event)
chat_info = None
if chat:
try:
chat = int(chat)
except ValueError:
pass
if not chat:
if event.reply_to_msg_id:
replied_msg = await event.get_reply_message()
if replied_msg.fwd_from and replied_msg.fwd_from.channel_id is not None:
chat = replied_msg.fwd_from.channel_id
else:
chat = event.chat_id
try:
chat_info = await event.client(GetFullChannelRequest(chat))
except:
try:
chat_info = await event.client(GetFullChannelRequest(chat))
except ChannelInvalidError:
await event.reply("<b>Недействительный канал/группа.</b>")
return None
except ChannelPrivateError:
await event.reply("<b>Этот канал/группа приватная, либо я заблокирован там.</b>")
return None
except ChannelPublicGroupNaError:
await event.reply("<b>Такой канал/группа не существует.</b>")
return None
except:
chat = event.input_chat
chat_info = await event.client(GetFullChannelRequest(chat))
return chat_info
return chat_info
async def fetch_info(chat, event):
chat_obj_info = await event.client.get_entity(chat.full_chat.id)
chat_title = chat_obj_info.title
try:
msg_info = await event.client(
GetHistoryRequest(peer=chat_obj_info.id, offset_id=0, offset_date=datetime(2010, 1, 1),
add_offset=-1, limit=1, max_id=0, min_id=0, hash=0))
except Exception:
msg_info = None
await event.edit("<b>Произошла непредвиденная ошибка.</b>")
first_msg_valid = True if msg_info and msg_info.messages and msg_info.messages[0].id == 1 else False
creator_valid = True if first_msg_valid and msg_info.users else False
creator_id = msg_info.users[0].id if creator_valid else None
creator_firstname = msg_info.users[0].first_name if creator_valid and msg_info.users[0].first_name is not None else "Удалённый аккаунт"
creator_username = msg_info.users[0].username if creator_valid and msg_info.users[0].username is not None else None
created = msg_info.messages[0].date if first_msg_valid else None
former_title = msg_info.messages[0].action.title if first_msg_valid and type(msg_info.messages[0].action) is MessageActionChannelMigrateFrom and msg_info.messages[0].action.title != chat_title else None
description = chat.full_chat.about
members = chat.full_chat.participants_count if hasattr(chat.full_chat, "participants_count") else chat_obj_info.participants_count
admins = chat.full_chat.admins_count if hasattr(chat.full_chat, "admins_count") else None
banned_users = chat.full_chat.kicked_count if hasattr(chat.full_chat, "kicked_count") else None
restrcited_users = chat.full_chat.banned_count if hasattr(chat.full_chat, "banned_count") else None
users_online = 0
async for i in event.client.iter_participants(event.chat_id):
if isinstance(i.status, UserStatusOnline):
users_online = users_online + 1
group_stickers = chat.full_chat.stickerset.title if hasattr(chat.full_chat, "stickerset") and chat.full_chat.stickerset else None
messages_viewable = msg_info.count if msg_info else None
messages_sent = chat.full_chat.read_inbox_max_id if hasattr(chat.full_chat, "read_inbox_max_id") else None
messages_sent_alt = chat.full_chat.read_outbox_max_id if hasattr(chat.full_chat, "read_outbox_max_id") else None
username = chat_obj_info.username if hasattr(chat_obj_info, "username") else None
bots_list = chat.full_chat.bot_info
bots = 0
slowmode = "Да" if hasattr(chat_obj_info, "slowmode_enabled") and chat_obj_info.slowmode_enabled else "Нет"
slowmode_time = chat.full_chat.slowmode_seconds if hasattr(chat_obj_info, "slowmode_enabled") and chat_obj_info.slowmode_enabled else None
restricted = "Да" if hasattr(chat_obj_info, "restricted") and chat_obj_info.restricted else "Нет"
verified = "Да" if hasattr(chat_obj_info, "verified") and chat_obj_info.verified else "Нет"
username = "@{}".format(username) if username else None
creator_username = "@{}".format(creator_username) if creator_username else None
if admins is None:
try:
participants_admins = await event.client(
GetParticipantsRequest(channel=chat.full_chat.id, filter=ChannelParticipantsAdmins(),
offset=0, limit=0, hash=0))
admins = participants_admins.count if participants_admins else None
except Exception:
await event.edit("<b>Произошла непредвиденная ошибка.</b>")
if bots_list:
for bot in bots_list:
bots += 1
caption = "<b>ИНФОРМАЦИЯ О ЧАТЕ:</b>\n\n"
caption += f"<b>ID:</b> {chat_obj_info.id}\n"
if chat_title is not None:
caption += f"<b>Название группы:</b> {chat_title}\n"
if former_title is not None:
caption += f"<b>Предыдущее название:</b> {former_title}\n"
if username is not None:
caption += f"<b>Тип группы:</b> Публичный\n"
caption += f"<b>Линк:</b> {username}\n"
else:
caption += f"<b>Тип группы:</b> Приватный\n"
if creator_username is not None:
caption += f"<b>Создатель:</b> <code>{creator_username}</code>\n"
elif creator_valid:
caption += f"<b>Создатель:</b> <code><a href=\"tg://user?id={creator_id}\">{creator_firstname}</a></code>\n"
if created is not None:
caption += f"<b>Создан:</b> {created.date().strftime('%b %d, %Y')} - {created.time()}\n"
else:
caption += f"<b>Создан:</b> {chat_obj_info.date.date().strftime('%b %d, %Y')} - {chat_obj_info.date.time()}\n"
if messages_viewable is not None:
caption += f"<b>Видимые сообщения:</b> {messages_viewable}\n"
if messages_sent:
caption += f"<b>Всего сообщений:</b> {messages_sent}\n"
elif messages_sent_alt:
caption += f"<b>Всего сообщений:</b> {messages_sent_alt}\n"
if members is not None:
caption += f"<b>Участников:</b> {members}\n"
if admins is not None:
caption += f"<b>Админов:</b> {admins}\n"
if bots_list:
caption += f"<b>Ботов:</b> {bots}\n"
if users_online:
caption += f"<b>Сейчас онлайн:</b> {users_online}\n"
if restrcited_users is not None:
caption += f"<b>Ограниченных пользователей:</b> {restrcited_users}\n"
if banned_users is not None:
caption += f"<b>Забаненных пользователей:</b> {banned_users}\n"
if group_stickers is not None:
caption += f"<b>Стикеры группы:</b> <a href=\"t.me/addstickers/{chat.full_chat.stickerset.short_name}\">{group_stickers}</a>\n"
caption += "\n"
caption += f"<b>Слоумод:</b> {slowmode}"
if hasattr(chat_obj_info, "slowmode_enabled") and chat_obj_info.slowmode_enabled:
caption += f", {slowmode_time} секунд\n"
else:
caption += "\n"
caption += f"<b>Ограничен:</b> {restricted}\n"
if chat_obj_info.restricted:
caption += f"> Платформа: {chat_obj_info.restriction_reason[0].platform}\n"
caption += f"> Причина: {chat_obj_info.restriction_reason[0].reason}\n"
caption += f"> Текст: {chat_obj_info.restriction_reason[0].text}\n\n"
else:
caption += ""
if hasattr(chat_obj_info, "scam") and chat_obj_info.scam:
caption += "<b>Скам</b>: да\n\n"
if hasattr(chat_obj_info, "verified"):
caption += f"<b>Верифицирован:</b> {verified}\n\n"
if description:
caption += f"<b>Описание:</b> \n\n<code>{description}</code>\n"
return caption

View File

@@ -0,0 +1,46 @@
import asyncio
from .. import loader
from telethon import events
from datetime import datetime
from telethon.tl.types import User, Chat, Channel
def register(cb):
cb(CountMod())
class CountMod(loader.Module):
"""Количество чатов."""
strings = {'name': 'Count'}
async def countcmd(self, message):
if message.fwd_from:
return
start = datetime.now()
users = 0
groups = 0
supergroups = 0
channels = 0
bots = 0
await message.edit("<b>Получаем информацию...</b>")
async for dlgs in message.client.iter_dialogs(limit=None):
if dlgs.is_user:
if dlgs.entity.bot:
bots += 1
else:
users += 1
elif dlgs.is_channel:
if dlgs.entity.broadcast:
channels += 1
else:
supergroups += 1
elif dlgs.is_group:
groups += 1
end = datetime.now()
ms = ((end - start)//1000).microseconds
await message.edit(f"<b>Подсчитано за</b> <code>{ms}</code> <b>мс.</b>\n"
f"<b>Количество моих чатов в Telegram:</b>\n"
f"<b>Пользователей:</b> <code>{users}</code>\n"
f"<b>Групп:</b> <code>{groups}</code>\n"
f"<b>Супер Групп:</b> <code>{supergroups}</code>\n"
f"<b>Каналов:</b> <code>{channels}</code>\n"
f"<b>Ботов:</b> <code>{bots}</code>")

View File

@@ -0,0 +1,50 @@
import json, requests
from .. import loader, utils
def register(cb):
cb(DictionaryMod())
class DictionaryMod(loader.Module):
"""Словарь."""
strings = {'name': 'Dictionary'}
async def meancmd(self, message):
"""Использование: .mean <слово>."""
args = utils.get_args_raw(message)
if not args:
return await message.edit('<b>Нет аргументов.</b>')
await message.edit('<b>Узнаем...</b>')
lang = None
alphabet = {"а","б","в","г","д","е","ё","ж","з","и","й","к","л","м","н","о",
"п","р","с","т","у","ф","х","ц","ч","ш","щ","ъ","ы","ь","э","ю","я"}
for char in args:
if char in alphabet:
lang = 'ru'
else:
lang = 'en'
r = requests.get(f'https://api.dictionaryapi.dev/api/v2/entries/{lang}/{args}')
js = json.loads(r.text)
df = ''
try:
for i in js[0]["meanings"][0]["definitions"]:
try:
df += (f'{i["definition"]} ')
except:
return
except:
await message.edit(f'◆ <b>{args}</b> - <i>Такого слова нет в словаре.</i>')
return
ex = ''
count = 0
mess = (f'<b>{js[0]["word"]}</b>, <i>{js[0]["meanings"][0]["partOfSpeech"]}</i>.\n\n'
f'◆ <b>Значение:</b> <i>{df}</i>\n')
try:
for i in js[0]["meanings"][0]["definitions"]:
count += 1
ex += f'\n<b>{count})</b> <i>{i["example"]}</i>'
alert = ''.join(ex)
except:
await message.edit(mess)
return
await message.edit(f'{mess}◆ <b>Примеры применения слова:</b> {alert}')

View File

@@ -0,0 +1,14 @@
from .. import loader
def register(cb):
cb(DontWorkMod())
class DontWorkMod(loader.Module):
"""Модуль не работает."""
strings = {'name': 'Don`t Work'}
async def dontworkcmd(self, message):
"""Используй .dontwork, чтобы понять, что модуль не работает."""
dontwork = '<b>Модуль не работает.</b>'
await message.edit(dontwork)

38
Fl1yd/FTG-Modules/fake.py Normal file
View File

@@ -0,0 +1,38 @@
from .. import loader, utils
from random import choice, randint
from asyncio import sleep
def register(cb):
cb(FakeActionsMod())
class FakeActionsMod(loader.Module):
"""Показывает фейковые действия."""
strings = {'name': 'Fake Actions'}
async def fakecmd(self, event):
"""Использование: .fake <действие>.\nСписок действий: typing, contact, game, location, record-audio, record-round, record-video, voice, round, video, photo, document.\nОтмена: .fake cancel"""
options = ['typing', 'contact', 'game', 'location', 'record-audio', 'record-round',
'record-video', 'voice', 'round', 'video', 'photo', 'document', 'cancel']
args = utils.get_args_raw(event).split()
if len(args) == 0:
fake_action = choice(options)
fake_time = randint(30, 60)
elif len(args) == 1:
try:
fake_action = str(args[0]).lower()
fake_time = randint(30, 60)
except ValueError:
fake_action = choice(options)
fake_time = int(args[0])
elif len(args) == 2:
fake_action = str(args[0]).lower()
fake_time = int(args[1])
else:
return await event.edit('Неправильный ввод.')
try:
await event.delete()
async with event.client.action(event.chat_id, fake_action):
await sleep(fake_time)
except BaseException:
return

113
Fl1yd/FTG-Modules/family.py Normal file
View File

@@ -0,0 +1,113 @@
# requires: pillow, pymorphy2
import logging
from .. import loader, utils
import telethon
import requests
from PIL import Image, ImageFont, ImageDraw
import pymorphy2
import io
from io import BytesIO
import random
logger = logging.getLogger(__name__)
def register(cb):
cb(FamilyMod())
@loader.tds
class FamilyMod(loader.Module):
"""Quote a message"""
strings = {"name": "Family"}
async def client_ready(self, client, db):
self.client = message.client
@loader.unrestricted
@loader.ratelimit
async def familycmd(self, message):
args = utils.get_args_raw(message)
reply = await message.get_reply_message()
if not reply:
await utils.answer(message, '<b>Нет Реплая.</b>')
return
if not args:
await utils.answer(message, '<b>Нет Текста.</b>')
return
pic = await check_media(message, reply)
if not pic:
await utils.answer(message, '<b>Нет Изображения.</b>')
return
await message.edit("Семья")
font = requests.get("https://github.com/KeyZenD/l/blob/master/bold.ttf?raw=true").content
family = makeFamily(pic, args, font)
await message.client.send_file(message.to_id, family, reply_to=reply)
await message.delete()
def place(background, image, cords, size):
overlay = Image.open(BytesIO(image))
overlay = overlay.resize((random.randint(size, size * 2), random.randint(size, size * 2)))
background.paste(overlay, cords)
def placeText(background , cords, size, text, font):
text_cords = (cords[0]+random.randint(0, size//2), cords[1]+random.randint(0, size//2))
draw = ImageDraw.Draw(background)
draw.text(text_cords, text, (0,0,0), font=ImageFont.truetype(io.BytesIO(font), random.randint(size // 8, size // 4)))
def makeFamily(image, caption, font):
morph = pymorphy2.MorphAnalyzer()
infl = morph.parse(caption)[0].inflect({'plur', 'gent'})
if not infl:
caption_mlt = caption
else:
caption_mlt = infl.word
canvas = Image.new('RGBA', (600, 600), "white")
draw = ImageDraw.Draw(canvas)
draw.text((120, 5), 'ахах семья ' + caption_mlt, (0,0,0), font=ImageFont.truetype(io.BytesIO(font), 32))
family = [
{ 'name': 'мама', 'cords': (60, 100), 'size': 160 },
{ 'name': 'папа', 'cords': (260, 80), 'size': 180 },
{ 'name': 'сын', 'cords': (60, 380), 'size': 125 },
{ 'name': 'дочь', 'cords': (230, 320), 'size': 125 },
{ 'name': 'дочь', 'cords': (225, 380), 'size': 125 },
{ 'name': 'сын', 'cords': (340, 390), 'size': 125 },
]
for member in family:
place(canvas, image, member['cords'], member['size'])
for member in family:
placeText(canvas, member['cords'], member['size'], member['name'] + ' ' + caption, font)
temp = BytesIO()
canvas.save(temp, format="png")
return temp.getvalue()
async def check_media(message, reply):
if reply and reply.media:
if reply.photo:
data = reply.photo
elif reply.document:
if reply.gif or reply.video or reply.audio or reply.voice:
return None
data = reply.media.document
else:
return None
else:
return None
if not data or data is None:
return None
else:
data = await message.client.download_file(data, bytes)
try:
Image.open(io.BytesIO(data))
return data
except:
return None

View File

@@ -0,0 +1,33 @@
from .. import loader, utils
from telethon import events
from telethon.errors.rpcerrorlist import YouBlockedUserError
def register(cb):
cb(OmonBotMod())
class OmonBotMod(loader.Module):
"""Омон бот."""
strings = {'name': 'FreeOmonBot'}
async def omoncmd(self, message):
"""Используй .omon <реплай на пикчу>."""
chat = "@FreeOmonBot"
reply = await message.get_reply_message()
if not reply:
await message.edit("<b>Нет реплая.</b>")
return
await message.edit("<b>Минуточку...</b>")
async with message.client.conversation(chat) as conv:
try:
response = conv.wait_event(events.NewMessage(incoming=True, from_users=775654752))
await message.client.send_message(chat, reply)
response = await response
except YouBlockedUserError:
await message.edit("<b>Разблокируй @FreeOmonBot</b>")
return
if response.text:
pass
if response.media:
await message.client.send_file(message.to_id, response.media)
await message.delete()

View File

@@ -0,0 +1,40 @@
from .. import loader, utils
from telethon.tl.functions.messages import GetCommonChatsRequest
from telethon.tl.functions.users import GetFullUserRequest
def register(cb):
cb(GetCommonChatsMod())
class GetCommonChatsMod(loader.Module):
"""Общие чаты с пользователем."""
strings = {'name': 'GetCommonChats'}
async def commoncmd(self, message):
"""Используй .common <@ или реплай>, чтобы узнать общие чаты с пользователем."""
args = utils.get_args_raw(message)
reply = await message.get_reply_message()
if not args and not reply:
return await message.edit('<b>Нет аргументов или реплая.</b>')
await message.edit('<b>Считаем...</b>')
try:
if args:
if args.isnumeric():
user = int(args)
user = await message.client.get_entity(user)
else:
user = await message.client.get_entity(args)
else:
user = await utils.get_user(reply)
except ValueError:
return await message.edit('<b>Не удалось найти пользователя.</b>')
msg = f'<b>Общие чаты с {user.first_name}:</b>\n'
user = await message.client(GetFullUserRequest(user.id))
comm = await message.client(GetCommonChatsRequest(user_id=user.user.id, max_id=0, limit=100))
count = 0
m = ''
for chat in comm.chats:
m += f'\n• <a href="tg://resolve?domain={chat.username}">{chat.title}</a> <b>|</b> <code>{chat.id}</code>'
count += 1
msg = f'<b>Общие чаты с {user.user.first_name}: {count}</b>\n'
await message.edit(f'{msg} {m}')

View File

@@ -0,0 +1,35 @@
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>')

34
Fl1yd/FTG-Modules/gsbl.py Normal file
View File

@@ -0,0 +1,34 @@
import io
import os
from .. import loader
from PIL import Image
from gsbl.stick_bug import StickBug
def register(cb):
cb(GSBLMod())
class GSBLMod(loader.Module):
"""Фановый, мемный модуль."""
strings = {'name': 'Get-Stick-Bugged-Lol'}
async def gsblcmd(self, event):
"""Используй .gsbl <реплай на картинку/стикер>."""
try:
reply = await event.get_reply_message()
if not reply:
return await event.edit("Нет реплая на картинку/стикер.")
await event.edit("Минуточку...")
im = io.BytesIO()
await event.edit("Скачиваю...")
await event.client.download_file(reply, im)
await event.edit("Обрабатываю...")
im = Image.open(im)
sb = StickBug(im)
sb.save_video("get_stick_bugged_lol.mp4")
await event.edit("Отправляю...")
await event.client.send_file(event.to_id, open("get_stick_bugged_lol.mp4", "rb"), reply_to=reply)
os.remove("get_stick_bugged_lol.mp4")
await event.delete()
except:
return await event.edit("Это не картинка/стикер.")

View File

@@ -0,0 +1,17 @@
from .. import loader
from asyncio import sleep
@loader.tds
class HeartsMod(loader.Module):
strings = {"name": "Heart's"}
@loader.owner
async def lheartscmd(self, message):
for _ in range(10):
for lheart in ['', '️🧡', '💛', '💚', '💙', '💜', '🤎', '🖤', '🤍']:
await message.edit(lheart)
await sleep(3)
async def sheartscmd(self, message):
for _ in range(10):
for sheart in ['', '️🧡', '💛', '💚', '💙', '💜', '🤎', '🖤', '🤍']:
await message.edit(sheart)
await sleep(0.3)

View File

@@ -0,0 +1,38 @@
from .. import loader, utils
from telethon.tl.functions.users import GetFullUserRequest
def register(cb):
cb(HiddenTagMod())
class HiddenTagMod(loader.Module):
"""Скрытно тегнуть пользователя."""
strings = {'name': 'HiddenTag'}
async def tagcmd(self, message):
"""Использование: .tag <@> <текст (по желанию)>."""
args = utils.get_args_raw(message).split(' ')
reply = await message.get_reply_message()
user = None
tag = None
try:
if len(args) == 1:
args = utils.get_args_raw(message)
if args.isnumeric():
user = int(args)
user = await message.client.get_entity(user)
else:
user = await message.client.get_entity(args)
tag = 'говно залупное\n пашет.'
elif len(args) >= 2:
if args[0].isnumeric():
user = int(args[0])
user = await message.client.get_entity(user)
else:
user = await message.client.get_entity(args[0])
tag = utils.get_args_raw(message).split(' ', 1)[1]
except:
return await message.edit("Не удалось найти пользователя.")
await message.delete()
user = await message.client(GetFullUserRequest(user.id))
await message.client.send_message(message.to_id, f'{tag} <a href="tg://user?id={user.user.id}">\u2060</a>', reply_to=reply.id if reply else None)

View File

@@ -0,0 +1,30 @@
import requests, io
from .. import loader, utils
def register(cb):
cb(HiddenUrlMod())
class HiddenUrlMod(loader.Module):
"""Скрывает ссылку под невидимый текст."""
strings = {'name': 'HiddenUrl'}
async def hidecmd(self, message):
"""Используй .hide <url> <текст или реплай на медиа>."""
args = utils.get_args_raw(message)
reply = await message.get_reply_message()
if args or reply:
await message.edit("Минуточку...")
if reply:
if reply.media:
file = io.BytesIO(await message.client.download_file(reply.media))
file.name = reply.file.name if reply.file.name else reply.file.id + reply.file.ext
try: x0at = requests.post('https://x0.at', files={'file': file})
except ConnectionError as e: return await message.edit(str(e))
await message.client.send_message(message.to_id, f'{args} <a href="{x0at.text}">\u2060</a>')
else: return await message.edit("Это не реплай на медиа.")
else:
try: await message.client.send_message(message.to_id, f"{args.split(' ', 1)[1]} <a href=\"{args.split()[0]}\">\u2060</a>")
except Exception as e: await message.client.send_message(message.to_id, f'<a href="{args}">\u2060</a>')
await message.delete()
else: return await message.edit("Нет аргументов или реплая на медиа.")

View File

@@ -0,0 +1,137 @@
import io
import requests
from .. import loader, utils
from random import choice, randint
from PIL import Image, ImageDraw, ImageFont
def register(cb):
cb(ImpMod())
class ImpMod(loader.Module):
"""Among Us"""
strings = {'name': 'Impostor?'}
async def impcmd(self, message):
"""Используй: .imp <@ или текст или реплай>."""
try:
background = requests.get(f"https://fl1yd.ml/modules/stuff/impostor{randint(1,22)}.png").content
font = requests.get("https://fl1yd.ml/modules/stuff/font2.ttf").content
await message.edit("Минуточку...")
reply = await message.get_reply_message()
args = utils.get_args_raw(message)
imps = ['wasn`t the impostor', 'was the impostor']
if not args and not reply:
user = await message.client.get_me()
text = (f"{user.first_name} {choice(imps)}.\n"
f"{randint(1, 2)} impostor(s) remain.")
if reply:
user = await utils.get_user(await message.get_reply_message())
text = (f"{user.first_name} {choice(imps)}.\n"
f"{randint(1, 2)} impostor(s) remain.")
if args:
user = await message.client.get_entity(args)
text = (f"{user.first_name} {choice(imps)}.\n"
f"{randint(1, 2)} impostor(s) remain.")
font = io.BytesIO(font)
font = ImageFont.truetype(font, 30)
image = Image.new("RGBA", (1, 1), (0, 0, 0, 0))
draw = ImageDraw.Draw(image)
w, h = draw.multiline_textsize(text=text, font=font)
image = Image.open(io.BytesIO(background))
x, y = image.size
draw = ImageDraw.Draw(image)
draw.multiline_text(((x - w) // 2, (y - h) // 2), text=text, font=font, fill="white", align="center")
output = io.BytesIO()
output.name = "impostor.png"
image.save(output, "png")
output.seek(0)
await message.client.send_file(message.to_id, output, reply_to=reply)
await message.delete()
except:
text = args
font = io.BytesIO(font)
font = ImageFont.truetype(font, 30)
image = Image.new("RGBA", (1, 1), (0, 0, 0, 0))
draw = ImageDraw.Draw(image)
w, h = draw.multiline_textsize(text=text, font=font)
image = Image.open(io.BytesIO(background))
x, y = image.size
draw = ImageDraw.Draw(image)
draw.multiline_text(((x - w) // 2, (y - h) // 2), text=text, font=font, fill="white", align="center")
output = io.BytesIO()
output.name = "impostor.png"
image.save(output, "png")
output.seek(0)
await message.client.send_file(message.to_id, output, reply_to=reply)
await message.delete()
async def ruimpcmd(self, message):
"""Используй: .ruimp <@ или текст или реплай>."""
try:
background = requests.get(f"https://fl1yd.ml/modules/stuff/impostor{randint(1,22)}.png").content
font = requests.get("https://fl1yd.ml/modules/stuff/font2.ttf").content
await message.edit("Минуточку...")
reply = await message.get_reply_message()
args = utils.get_args_raw(message)
imps = ['не был предателем', 'оказался одним из предалатей']
remain = randint(1, 2)
if remain == 1:
if not args and not reply:
user = await message.client.get_me()
text = (f"{user.first_name} {choice(imps)}.\n"
"1 предатель остался.")
if reply:
user = await utils.get_user(await message.get_reply_message())
text = (f"{user.first_name} {choice(imps)}.\n"
"1 предатель остался.")
if args:
user = await message.client.get_entity(args)
text = (f"{user.first_name} {choice(imps)}.\n"
"1 предатель остался.")
else:
if not args and not reply:
user = await message.client.get_me()
text = (f"{user.first_name} {choice(imps)}.\n"
"2 предателя осталось.")
if reply:
user = await utils.get_user(await message.get_reply_message())
text = (f"{user.first_name} {choice(imps)}.\n"
"2 предателя осталось.")
if args:
user = await message.client.get_entity(args)
text = (f"{user.first_name} {choice(imps)}.\n"
"2 предателя осталось.")
font = io.BytesIO(font)
font = ImageFont.truetype(font, 30)
image = Image.new("RGBA", (1, 1), (0, 0, 0, 0))
draw = ImageDraw.Draw(image)
w, h = draw.multiline_textsize(text=text, font=font)
image = Image.open(io.BytesIO(background))
x, y = image.size
draw = ImageDraw.Draw(image)
draw.multiline_text(((x - w) // 2, (y - h) // 2), text=text, font=font, fill="white", align="center")
output = io.BytesIO()
output.name = "impostor.png"
image.save(output, "png")
output.seek(0)
await message.client.send_file(message.to_id, output, reply_to=reply)
await message.delete()
except:
text = args
font = io.BytesIO(font)
font = ImageFont.truetype(font, 30)
image = Image.new("RGBA", (1, 1), (0, 0, 0, 0))
draw = ImageDraw.Draw(image)
w, h = draw.multiline_textsize(text=text, font=font)
image = Image.open(io.BytesIO(background))
x, y = image.size
draw = ImageDraw.Draw(image)
draw.multiline_text(((x - w) // 2, (y - h) // 2), text=text, font=font, fill="white", align="center")
output = io.BytesIO()
output.name = "impostor.png"
image.save(output, "png")
output.seek(0)
await message.client.send_file(message.to_id, output, reply_to=reply)
await message.delete()

View File

@@ -0,0 +1,54 @@
from .. import loader, utils
from telethon import events
from telethon.errors.rpcerrorlist import YouBlockedUserError
from asyncio.exceptions import TimeoutError
def register(cb):
cb(KKTextMod())
class KKTextMod(loader.Module):
"""K&K Text by @ktxtBot"""
strings = {'name': 'K&K Text'}
async def kktcmd(self, message):
"""Используйте .kkt <текст или реплай>."""
try:
text = utils.get_args_raw(message)
reply = await message.get_reply_message()
chat = "@ktxtBot"
if not text and not reply:
await message.edit("<b>Нет текста или реплая.</b>")
return
if text:
await message.edit("<b>Минуточку...</b>")
async with message.client.conversation(chat) as conv:
try:
response = conv.wait_event(events.NewMessage(incoming=True, from_users=700914652))
await message.client.send_message(chat, text)
response = await response
except YouBlockedUserError:
await message.reply("<b>Разблокируй бота @ktxtBot.</b>")
return
if not response.text:
await message.edit("<Бот ответил не текстовым форматом, попробуйте ещё раз.</b>")
return
await message.delete()
await message.client.send_message(message.to_id, response.text)
if reply:
await message.edit("<b>Минуточку...</b>")
async with message.client.conversation(chat) as conv:
try:
response = conv.wait_event(events.NewMessage(incoming=True, from_users=700914652))
await message.client.send_message(chat, reply)
response = await response
except YouBlockedUserError:
await message.reply("<b>Разблокируй бота @ktxtBot.</b>")
return
if not response.text:
await message.edit("<Бот ответил не текстовым форматом, попробуйте ещё раз.</b>")
return
await message.delete()
await message.client.send_message(message.to_id, response.text)
except TimeoutError:
return await message.edit("<b>Истекло время ожидания. Либо бот сдох, либо текст слишком большой, и бот не отвечает.</b>")

View File

@@ -0,0 +1,35 @@
from .. import loader
from asyncio import sleep
import random
def register(cb):
cb(KickRandomMod())
class KickRandomMod(loader.Module):
"""Кик рандом."""
strings = {'name': 'KickRandom'}
async def kickrandcmd(self, event):
"""Используй .kickrand, чтобы кикнуть случайного пользователя (может кикнуть вас)."""
if event.chat:
chat = await event.get_chat()
admin = chat.admin_rights
creator = chat.creator
if not admin and not creator:
await event.edit('<b>Я здесь не админ.</b>')
return
user = random.choice([i for i in await event.client.get_participants(event.to_id)])
await event.edit('<b>Кому-то сейчас не повезёт...</b>')
await sleep(3)
try:
await event.client.kick_participant(event.chat_id, user.id)
await sleep(0.5)
except:
await event.edit('<b>У меня нет достаточных прав :с</b>')
return
await event.edit(f"<b>Рандом выбрал <a href=\"tg://user?id={user.id}\">{user.first_name}</a>, и он кикнут!</b>")
else:
await event.edit('<b>Это не чат!</b>')

View File

@@ -0,0 +1,46 @@
import os
from .. import loader, utils
def register(cb):
cb(MediaCutterMod())
class MediaCutterMod(loader.Module):
"""Обрезать медиа."""
strings = {'name': 'MediaCutter'}
async def cutcmd(self, event):
"""Используй .cut <начало(сек):конец(сек)> <реплай на аудио/видео/гиф>."""
args = utils.get_args_raw(event).split(':')
reply = await event.get_reply_message()
if not reply or not reply.media:
return await event.edit('Нет реплая на медиа.')
if reply.media:
if args:
if len(args) == 2:
try:
await event.edit('Скачиваем...')
smth = reply.file.ext
await event.client.download_media(reply.media, f'uncutted{smth}')
if not args[0]:
await event.edit(f'Обрезаем с 0 сек. по {args[1]} сек....')
os.system(f'ffmpeg -i uncutted{smth} -ss 0 -to {args[1]} -c copy cutted{smth} -y')
elif not args[1]:
end = reply.media.document.attributes[0].duration
await event.edit(f'Обрезаем с {args[0]} сек. по {end} сек....')
os.system(f'ffmpeg -i uncutted{smth} -ss {args[0]} -to {end} -c copy cutted{smth} -y')
else:
await event.edit(f'Обрезаем с {args[0]} сек. по {args[1]} сек....')
os.system(f'ffmpeg -i uncutted{smth} -ss {args[0]} -to {args[1]} -c copy cutted{smth} -y')
await event.edit('Отправляем...')
await event.client.send_file(event.to_id, f'cutted{smth}', reply_to=reply.id)
os.system('rm -rf uncutted* cutted*')
await event.delete()
except:
await event.edit('Этот файл не поддерживается.')
os.system('rm -rf uncutted* cutted*')
return
else:
return await event.edit('Неверно указаны аргументы.')
else:
return await event.edit('Нет аргументов')

View File

@@ -0,0 +1,91 @@
import logging
import inspect
from telethon.tl.functions.channels import JoinChannelRequest
from .. import loader, utils, main, security
logger = logging.getLogger(__name__)
@loader.tds
class HelpMod(loader.Module):
"""Описание этого модуля."""
strings = {'name': 'CustomHelp',
'bad_module': '<b>Указано неверное название модуля.</b>',
'single_mod_header': '<b>Справка к</b> <u>{}</u>:\n',
'single_cmd': '\n➜ <code><u>{}</u></code>\n',
'undoc_cmd': 'Для этой команды нет описания.\n',
'all_header': '<b>Список из {} доступных модулей:</b>\n',
'mod_tmpl': '\n➜ <b>{}</b>',
'first_cmd_tmpl': ': <code>{}</code>',
'cmd_tmpl': ', <code>{}</code>',
'joined': '<b>Уже вступил в <a href="https://t.me/ftgmodulesbyfl1yd">канал</a> авторских модулей</b>',
'join': '<b>Вступить в <a href="https://t.me/ftgmodulesbyfl1yd">канал</a> авторских модулей</b>'}
@loader.unrestricted
async def helpcmd(self, message):
""".help <название модуля>."""
args = utils.get_args_raw(message)
if args:
module = None
for mod in self.allmodules.modules:
if mod.strings('name', message).lower() == args.lower():
module = mod
if module is None:
await utils.answer(message, self.strings('bad_module', message))
return
try:
name = module.strings('name', message)
except KeyError:
name = getattr(module, 'name', 'ERROR')
reply = self.strings('single_mod_header', message).format(utils.escape_html(name),
utils.escape_html((self.db.get(main.__name__,
'command_prefix',
False) or '.')[0]))
if module.__doc__:
reply += '\n' + '\n'.join('' + t for t in utils.escape_html(inspect.getdoc(module)).split('\n'))
else:
logger.warning('У модуля %s отсутствует описание!', module)
commands = {name: func for name, func in module.commands.items()
if await self.allmodules.check_security(message, func)}
for name, fun in commands.items():
reply += self.strings('single_cmd', message).format(name)
if fun.__doc__:
reply += utils.escape_html('\n'.join(' ' + t for t in inspect.getdoc(fun).split('\n')))
else:
reply += self.strings('undoc_cmd', message)
else:
count = 0
for i in self.allmodules.modules:
if len(i.commands) != 0:
count += 1
reply = self.strings('all_header', message).format(count)
for mod in self.allmodules.modules:
try:
name = mod.strings('name', message)
except KeyError:
name = getattr(mod, 'name', 'ERROR')
reply += self.strings('mod_tmpl', message).format(name)
first = True
commands = [name for name, func in mod.commands.items()
if await self.allmodules.check_security(message, func)]
for cmd in commands:
if first:
reply += self.strings('first_cmd_tmpl', message).format(cmd)
first = False
else:
reply += self.strings('cmd_tmpl', message).format(cmd)
reply += '</code>'
await utils.answer(message, reply)
@loader.unrestricted
async def supportcmd(self, message):
"""Вступить в канал авторских модулей."""
if not self.is_bot and await self.allmodules.check_security(message, security.OWNER | security.SUDO):
await self.client(JoinChannelRequest('https://t.me/ftgmodulesbyfl1yd'))
await utils.answer(message, self.strings('joined', message))
else:
await utils.answer(message, self.strings('join', message))
async def client_ready(self, client, db):
self.client = client
self.is_bot = await client.is_bot()
self.db = db

View File

@@ -0,0 +1,45 @@
from .. import loader, utils
from telethon import events
from telethon.errors.rpcerrorlist import YouBlockedUserError
def register(cb):
cb(NedoQuotesMod())
class NedoQuotesMod(loader.Module):
"""Генератор всратых цитат by @ShittyQuoteBot"""
strings = {'name': 'NedoQuotes'}
async def nqcmd(self, message):
"""Используй: .nq <текст или реплай>."""
chat = "@ShittyQuoteBot"
text = utils.get_args_raw(message)
reply = await message.get_reply_message()
if not text and not reply:
await message.edit("<b>Нет текста или реплая.</b>")
return
await message.edit("<b>Минуточку...</b>")
async with message.client.conversation(chat) as conv:
if text:
try:
response = conv.wait_event(events.NewMessage(incoming=True, from_users=1389323591))
await message.client.send_message(chat, text)
response = await response
except YouBlockedUserError:
await message.edit("<b>Разблокируй @ShittyQuoteBot</b>")
return
else:
try:
user = await utils.get_user(reply)
response = conv.wait_event(events.NewMessage(incoming=True, from_users=1389323591))
await message.client.send_message(chat, f"{reply.raw_text} (с) {user.first_name}")
response = await response
except YouBlockedUserError:
await message.edit("<b>Разблокируй @ShittyQuoteBot</b>")
return
if response.text:
await message.client.send_message(message.to_id, f"<b> {response.text}</b>")
await message.delete()
if response.media:
await message.client.send_file(message.to_id, response.media, reply_to=reply.id if reply else None)
await message.delete()

View File

@@ -0,0 +1,16 @@
from .. import loader, utils
def register(cb):
cb(NowPlayMod())
class NowPlayMod(loader.Module):
"""Что сейчас играет."""
strings = {'name': 'NowPlay'}
async def npcmd(self, message):
"""Скидывает то, что сейчас играет."""
await message.edit('Минуточку...')
np = await message.client.inline_query('nowplaybot', '')
await message.client.send_file(message.to_id, np[0].result.document)
await message.delete()

View File

@@ -0,0 +1,65 @@
import os
from .. import loader, utils
from telethon import functions
def register(cb):
cb(OnAvaMod())
class OnAvaMod(loader.Module):
"""Гифку/видео/стикер на аву."""
strings = {'name': 'OnAva'}
async def onavacmd(self, message):
"""Установить на аву гифку/видео/стикер.\nИспользование: .onava <реплай>."""
try:
reply = await message.get_reply_message()
if reply:
await message.edit("Скачиваем...")
if reply.video:
await message.client.download_media(reply.media, "ava.mp4")
await message.edit("Конвертируем...")
os.system("ffmpeg -i ava.mp4 -c copy -an gifavaa.mp4 -y")
os.system("ffmpeg -i gifavaa.mp4 -vf scale=360:360 gifava.mp4 -y")
else:
await message.client.download_media(reply.media, "tgs.tgs")
await message.edit("Конвертируем...")
os.system("lottie_convert.py tgs.tgs tgs.gif; mv tgs.gif gifava.mp4")
else:
return await message.edit("Нет реплая на гиф/анимированный стикер/видеосообщение.")
await message.edit("Устанавливаем аву...")
await message.client(functions.photos.UploadProfilePhotoRequest(video=await message.client.upload_file("gifava.mp4"), video_start_ts=0.0))
await message.edit("Ава установлена.")
os.system("rm -rf ava.mp4 gifava.mp4 gifavaa.mp4 tgs.tgs tgs.gif")
except:
await message.edit("Произошла непредвиденная ошибка.")
os.system("rm -rf ava.mp4 gifava.mp4 gifavaa.mp4 tgs.tgs tgs.gif")
return
async def togifcmd(self, message):
"""Сделать из медиа гифку.\nИспользование: .togif <реплай>."""
try:
await message.edit("Скачиваем...")
reply = await message.get_reply_message()
if reply:
if reply.video:
await message.client.download_media(reply.media, "inputfile.mp4")
await message.edit("Конвертируем...")
os.system("ffmpeg -i inputfile.mp4 -vcodec copy -an outputfile.mp4")
await message.edit("Отправляем...")
await message.client.send_file(message.to_id, "outputfile.mp4")
elif reply.file.ext == ".tgs":
await message.client.download_media(reply.media, f"tgs.tgs")
await message.edit("Конвертируем...")
os.system("lottie_convert.py tgs.tgs tgs.gif")
await message.edit("Отправляем...")
await message.client.send_file(message.to_id, "tgs.gif", reply_to=reply.id)
else: return await message.edit("Этот файл не поддерживается.")
await message.delete()
os.system("rm -rf inputfile.mp4 outputfile.mp4 tgs.tgs tgs.gif")
else: return await message.edit("Нет реплая на видео/гиф/стикр.")
except:
await message.edit("Произошла непредвиденная ошибка.")
os.system("rm -rf inputfile.mp4 outputfile.mp4 tgs.tgs tgs.gif")
return

View File

@@ -0,0 +1,21 @@
from .. import loader
from telethon.tl.functions.channels import GetAdminedPublicChannelsRequest
def register(cb):
cb(OwnershipsMod())
class OwnershipsMod(loader.Module):
"""Посмотреть свои владения."""
strings = {'name': 'Ownerships'}
async def owncmd(self, message):
"""Команда .own выводит список владений открытых чатов/каналов. """
await message.edit('<b>Считаем...</b>')
result = await message.client(GetAdminedPublicChannelsRequest())
msg = ""
count = 0
for obj in result.chats:
count += 1
msg += f'\n• <a href="tg://resolve?domain={obj.username}">{obj.title}</a> <b>|</b> <code>{obj.id}</code>'
await message.edit(f'<b>Мои владения: {count}</b>\n {msg}')

194
Fl1yd/FTG-Modules/quotes.py Normal file
View File

@@ -0,0 +1,194 @@
import logging
from .. import loader, utils
import telethon
import requests, io, PIL
from telethon.tl.types import (MessageEntityBold, MessageEntityItalic,
MessageEntityMention, MessageEntityTextUrl,
MessageEntityCode, MessageEntityMentionName,
MessageEntityHashtag, MessageEntityCashtag,
MessageEntityBotCommand, MessageEntityUrl,
MessageEntityStrike, MessageEntityUnderline,
MessageEntityPhone, ChannelParticipantsAdmins,
ChannelParticipantCreator, ChannelParticipantAdmin,
User, Channel)
logger = logging.getLogger(__name__)
def register(cb):
cb(QuotesMod())
@loader.tds
class QuotesMod(loader.Module):
"""Quote a message"""
strings = {"name": "Quotes"}
async def client_ready(self, client, db):
self.client = message.client
@loader.unrestricted
@loader.ratelimit
async def quotecmd(self, message):
args = utils.get_args_raw(message)
reply = await message.get_reply_message()
if not reply:
await utils.answer(message, '<b>Нет реплая</b>')
return
await message.edit("<b>Обработка...</b>")
if not args or not args.isdigit():
count = 1
else:
count = int(args.strip()) +1
msgs = []
cur = reply.id
cyr = cur + count
while cur != cyr:
msg = await message.client.get_messages(message.to_id, ids=cur)
if msg:
msgs.append(msg)
cur += 1
messages = []
avatars = {}
for reply in msgs:
text = reply.raw_text
entities = parse_entities(reply)
if reply.fwd_from:
id = reply.fwd_from.from_id or reply.fwd_from.channel_id
if not id:
id = 1234567890
name = reply.fwd_from.from_name
pfp = None
else:
sender = await message.client.get_entity(id)
name = (sender.first_name + ("" if not sender.last_name else " "+sender.last_name)) if type(sender) == User else sender.title
pfp = avatars.get(id, None)
if not pfp:
pfp = await message.client.download_profile_photo(sender.id, bytes)
if pfp:
pfp = 'https://telegra.ph'+requests.post('https://telegra.ph/upload', files={'file': ('file', pfp, None)}).json()[0]['src']
avatars[id] = pfp
else:
id = reply.from_id
sender = await message.client.get_entity(id)
name = (sender.first_name + ("" if not sender.last_name else " "+sender.last_name)) if type(sender) == User else sender.title
pfp = avatars.get(id, None)
if not pfp:
pfp = await message.client.download_profile_photo(reply.from_id, bytes)
if pfp:
pfp = 'https://telegra.ph'+requests.post('https://telegra.ph/upload', files={'file': ('file', pfp, None)}).json()[0]['src']
avatars[id] = pfp
image = await check_media(message, reply)
rreply = await reply.get_reply_message()
if rreply:
rtext = rreply.raw_text
rsender = rreply.sender
rname = (rsender.first_name + ("" if not rsender.last_name else " "+rsender.last_name)) if type(rsender) == User else rsender.title
rreply = {'author': rname, 'text': rtext}
admintitle = ""
if message.chat:
admins = await message.client.get_participants(message.to_id, filter=ChannelParticipantsAdmins)
if reply.sender in admins:
admin = admins[admins.index(reply.sender)].participant
admintitle = admin.rank if admin else ""
if not admintitle:
if type(admin) == ChannelParticipantCreator:
admintitle = "creator"
else:
admintitle = "admin"
messages.append({
"text": text,
"picture": image,
"reply": rreply,
"entities": entities,
"author": {
"id": id,
"name": name,
"adminTitle": admintitle,
"picture": pfp
}
})
data = {"messages": messages,
"maxWidth": 550,
"scaleFactor": 5,
"squareAvatar": False,
"textColor": "white",
"replyLineColor": "white",
"adminTitleColor": "#969ba0",
"messageBorderRadius": 10,
"pictureBorderRadius": 8,
"backgroundColor": "#162330"
}
await message.edit("<b>О б р а б о т к а . . .</b>")
r = requests.post("https://mishase.me/quote", json=data)
output = r.content
out = io.BytesIO()
out.name = "quote.webp"
PIL.Image.open(io.BytesIO(output)).save(out, "WEBP")
out.seek(0)
await message.client.send_file(message.to_id, out, reply_to=reply)
await message.delete()
def parse_entities(reply):
entities = []
if not reply.entities:
return []
for entity in reply.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
async def check_media(message, reply):
if reply and reply.media:
if reply.photo:
data = reply.photo
elif reply.document:
if reply.gif or reply.video or reply.audio or reply.voice:
return None
data = reply.media.document
else:
return None
else:
return None
if not data or data is None:
return None
else:
data = await message.client.download_file(data, bytes)
img = io.BytesIO()
img.name = "img.png"
try:
PIL.Image.open(io.BytesIO(data)).save(img, "PNG")
link = 'https://telegra.ph'+requests.post('https://telegra.ph/upload', files={'file': ('file', img.getvalue(), "image/png")}).json()[0]['src']
return link
except:
return None

View File

@@ -0,0 +1,56 @@
import os
from .. import loader, utils
from asyncio import sleep
def register(cb):
cb(ReplyDownloaderMod())
class ReplyDownloaderMod(loader.Module):
"""Скачать файлом реплай."""
strings = {'name': 'Reply Downloader'}
async def dlrcmd(self, message):
"""Команда .dlr <реплай на файл> <название (по желанию)> скачивает файл, либо сохраняет текст в файл на который был сделан реплай."""
name = utils.get_args_raw(message)
reply = await message.get_reply_message()
if reply:
await message.edit('Скачиваем...')
if reply.text:
text = reply.text
fname = f'{name or message.id+reply.id}.txt'
file = open(fname, 'w')
file.write(text)
file.close()
await message.edit(f'Файл сохранён как: <code>{fname}</code>.\n\nВы можете отправить его в этот чат с помощью команды <code>.ulf {fname}</code>.')
else:
ext = reply.file.ext
fname = f'{name or message.id+reply.id}{ext}'
await message.client.download_media(reply, fname)
await message.edit(f'Этот файл сохранён как: <code>{fname}</code>.\n\nВы можете отправить его в этот чат с помощью команды <code>.ulf {fname}</code>.')
else:
return await message.edit('Нет реплая.')
async def ulfcmd(self, message):
"""Команда .ulf <d>* <название файла> отправляет файл в чат.\n* - удалить файл после отправки."""
name = utils.get_args_raw(message)
d = False
if('d ' in name):
d = True
if name:
try:
name = name.replace('d ', '')
await message.edit(f'Отправляем <code>{name}</code>...')
if d == True:
await message.client.send_file(message.to_id, f'{name}')
await message.edit(f'Отправляем <code>{name}</code>... Успешно!\nУдаляем <code>{name}</code>...')
os.remove(name)
await message.edit(f'Отправляем <code>{name}</code>... Успешно!\nУдаляем <code>{name}</code>... Успешно!')
await sleep(0.5)
else:
await message.client.send_file(message.to_id, name)
except:
return await message.edit('Такой файл не существует.')
await message.delete()
else:
return await message.edit('Нет аргументов.')

View File

@@ -0,0 +1,19 @@
from .. import loader, utils
from telethon import functions
def register(cb):
cb(ReportMod())
class ReportMod(loader.Module):
"""Репорт"""
strings = {"name": "Report"}
async def reportcmd(self, message):
"""Репорт пользователя за спам."""
reply = await message.get_reply_message()
if reply:
await message.client(functions.messages.ReportSpamRequest(peer=reply.sender.id))
await message.edit("<b>Ты получил репорт за спам!</b>")
else:
return await message.edit("<b>Кого я должен зарепортить?</b>")

View File

@@ -0,0 +1,23 @@
from .. import loader, utils
from telethon.errors import MessageEmptyError
def register(cb):
cb(ReverseMod())
class ReverseMod(loader.Module):
"""Реверс текста."""
strings = {'name': 'Reverse'}
async def revcmd(self, message):
"""Используй .rev <текст или реплай>."""
try:
text = utils.get_args_raw(message)
reply = await message.get_reply_message()
if not text and not reply:
return await message.edit("Нет текста или реплая.")
if reply:
return await message.edit(f"{reply.raw_text}"[::-1])
if text:
return await message.edit(f"{text}"[::-1])
except MessageEmptyError:
return await message.edit("Это не текст.")

View File

@@ -0,0 +1,22 @@
from .. import loader, utils
def register(cb):
cb(SearchMod())
class SearchMod(loader.Module):
"""Поиск контента на канале @ftgmodulesbyfl1yd"""
strings = {'name': 'SearchModules'}
async def searchcmd(self, message):
"""Используй .search <название>"""
try:
title = utils.get_args_raw(message)
if not title:
await message.edit("<b>Нет текста после команды.</b>")
else:
chat = message.input_chat
await [i async for i in message.client.iter_messages("ftgmodulesbyfl1yd", search=title)][0].forward_to(chat)
await message.delete()
except:
await message.edit("<b>Не удалось найти контент.</b>")

82
Fl1yd/FTG-Modules/spam.py Normal file
View File

@@ -0,0 +1,82 @@
from .. import loader, utils
from asyncio import sleep, gather
def register(cb):
cb(SpamMod())
class SpamMod(loader.Module):
"""Спам модуль"""
strings = {'name': 'Spam'}
async def spamcmd(self, message):
"""Обычный спам. Используй .spam <кол-во:int> <текст или реплай>."""
try:
await message.delete()
args = utils.get_args(message)
count = int(args[0].strip())
reply = await message.get_reply_message()
if reply:
if reply.media:
for _ in range(count):
await message.client.send_file(message.to_id, reply.media)
return
else:
for _ in range(count):
await message.client.send_message(message.to_id, reply)
else:
message.message = " ".join(args[1:])
for _ in range(count):
await gather(*[message.respond(message)])
except: return await message.client.send_message(message.to_id, '.spam <кол-во:int> <текст или реплай>.')
async def cspamcmd(self, message):
"""Спам символами. Используй .cspam <текст или реплай>."""
await message.delete()
reply = await message.get_reply_message()
if reply:
msg = reply.text
else:
msg = utils.get_args_raw(message)
msg = msg.replace(' ', '')
for m in msg:
await message.respond(m)
async def wspamcmd(self, message):
"""Спам словами. Используй .wspam <текст или реплай>."""
await message.delete()
reply = await message.get_reply_message()
if reply:
msg = reply.text
else:
msg = utils.get_args_raw(message)
msg = msg.split()
for m in msg:
await message.respond(m)
async def delayspamcmd(self, message):
"""Спам с задержкой. Используй .delayspam <время:int> <кол-во:int> <текст или реплай>."""
try:
await message.delete()
args = utils.get_args_raw(message)
reply = await message.get_reply_message()
time = int(args.split(' ', 2)[0])
count = int(args.split(' ', 2)[1])
if reply:
if reply.media:
for _ in range(count):
await message.client.send_file(message.to_id, reply.media, reply_to=reply.id)
await sleep(time)
else:
for _ in range(count):
await reply.reply(args.split(' ', 2)[2])
await sleep(time)
else:
spammsg = args.split(' ', 2)[2]
for _ in range(count):
await message.respond(spammsg)
await sleep(time)
except: return await message.client.send_message(message.to_id, '.delayspam <время:int> <кол-во:int> <текст или реплай>')

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

View File

@@ -0,0 +1,34 @@
import logging
from .. import loader, utils
logger = logging.getLogger(__name__)
def register(cb):
cb(TagAllMod())
def chunks(lst, n):
for i in range(0, len(lst), n):
yield lst[i:i + n]
class TagAllMod(loader.Module):
"""Тэгает всех в чате."""
strings = {"name":"TagAll"}
def __init__(self):
self.config = loader.ModuleConfig("DEFAULT_MENTION_MESSAGE", "говно залупное\n пашет.", "Default message of mentions")
self.name = self.strings["name"]
async def client_ready(self, client, db):
self.client = client
async def tagallcmd(self, message):
"""Используй .tagall <текст (по желанию)>."""
arg = utils.get_args_raw(message)
logger.error(message)
notifies = []
async for user in self.client.iter_participants(message.to_id):
notifies.append("<a href=\"tg://user?id="+ str(user.id) +"\">\u206c\u206f</a>")
chunkss = list(chunks(notifies, 5))
logger.error(chunkss)
await message.delete()
for chunk in chunkss:
await self.client.send_message(message.to_id, (self.config["DEFAULT_MENTION_MESSAGE"] if not arg else arg) + '\u206c\u206f'.join(chunk))

View File

@@ -0,0 +1,122 @@
from .. import loader, utils
import io
import requests
from textwrap import wrap
from PIL import Image, ImageDraw, ImageFont
def register(cb):
cb(TextOnPhotoMod())
class TextOnPhotoMod(loader.Module):
strings = {'name': 'TextOnPhoto'}
async def bottomcmd(self, message):
"""Используй: .bottom {реплай на картинку/стикер} <white/black>;ничего <текст>."""
cols = {'white': 1, 'whit': 1, 'whi': 1, 'wh': 1, 'w': 1,
'black': 2, 'blac': 2, 'bla': 2, 'bl': 2, 'b': 2}
col = 1
reply = await message.get_reply_message()
txt = utils.get_args_raw(message)
await message.edit("подождем...")
if txt in cols:
col = cols[txt]
txt = None
if not txt:
txt = "я лошара."
if not reply:
await message.edit("нет реплая на картинку/стикер.")
return
if txt.split(" ")[0] in cols:
col = cols[txt.split(" ")[0]]
txt = " ".join(txt.split(" ")[1:])
img = await phedit(reply, txt, 1, col)
output = io.BytesIO()
output.name = "клоун.png"
img.save(output, "png")
output.seek(0)
await message.client.send_file(message.to_id, output, reply_to=reply)
await message.delete()
async def topcmd(self, message):
"""Используй: .top {реплай на картинку/стикер} <white/black>;ничего <текст>."""
cols = {'white': 1, 'whit': 1, 'whi': 1, 'wh': 1, 'w': 1,
'black': 2, 'blac': 2, 'bla': 2, 'bl': 2, 'b': 2}
col = 1
reply = await message.get_reply_message()
txt = utils.get_args_raw(message)
await message.edit("подождем...")
if txt in cols:
col = cols[txt]
txt = None
if not txt:
txt = "я лошара."
if not reply:
await message.edit("нет реплая на картинку/стикер.")
return
if txt.split(" ")[0] in cols:
col = cols[txt.split(" ")[0]]
txt = " ".join(txt.split(" ")[1:])
img = await phedit(reply, txt, 2, col)
output = io.BytesIO()
output.name = "клоун.png"
img.save(output, "png")
output.seek(0)
await message.client.send_file(message.to_id, output, reply_to=reply)
await message.delete()
async def centercmd(self, message):
"""Используй: .center {реплай на картинку/стикер} <white/black>;ничего <текст>."""
cols = {'white': 1, 'whit': 1, 'whi': 1, 'wh': 1, 'w': 1,
'black': 2, 'blac': 2, 'bla': 2, 'bl': 2, 'b': 2}
col = 1
reply = await message.get_reply_message()
txt = utils.get_args_raw(message)
await message.edit("подождем...")
if txt in cols:
col = cols[txt]
txt = None
if not txt:
txt = "я лошара."
if not reply:
await message.edit("нет реплая на картинку/стикер.")
return
if txt.split(" ")[0] in cols:
col = cols[txt.split(" ")[0]]
txt = " ".join(txt.split(" ")[1:])
img = await phedit(reply, txt, 3, col)
output = io.BytesIO()
output.name = "клоун.png"
img.save(output, "png")
output.seek(0)
await message.client.send_file(message.to_id, output, reply_to=reply)
await message.delete()
async def phedit(reply, txt, align, clr):
bytes_font = requests.get("https://github.com/Fl1yd/FTG-modules/blob/master/stuff/font3.ttf?raw=true").content
bytes_back = await reply.download_media(bytes)
font = io.BytesIO(bytes_font)
font = ImageFont.truetype(font, 72)
img = Image.open(io.BytesIO(bytes_back))
W, H = img.size
txt = txt.replace("\n", "𓃐")
text = "\n".join(wrap(txt, 30))
t = text
t = t.replace("𓃐", "\n")
draw = ImageDraw.Draw(img)
w, h = draw.multiline_textsize(t, font=font)
imtext = Image.new("RGBA", (w + 20, h + 20), (0, 0, 0, 0))
draw = ImageDraw.Draw(imtext)
if clr == 2:
draw.multiline_text((10, 10), t, (0, 0, 0), font=font, align='center')
else:
draw.multiline_text((10, 10), t, (255, 255, 255), font=font, align='center')
imtext.thumbnail((W, H))
w, h = imtext.size
if align == 1:
img.paste(imtext, ((W - w) // 2, (H - h) // 1), imtext)
if align == 2:
img.paste(imtext, ((W - w) // 2, (H - h) // 15), imtext)
if align == 3:
img.paste(imtext, ((W - w) // 2, (H - h) // 2), imtext)
return img

View File

@@ -0,0 +1,28 @@
from .. import loader, utils
def register(cb):
cb(UploaderMod())
class UploaderMod(loader.Module):
"""Загрузчик на fl1yd.ml"""
strings = {'name': 'Uploader'}
async def mulcmd(self, message):
"""Загрузить модуль на сервер."""
name = utils.get_args_raw(message)
reply = await message.get_reply_message()
fname = f'{name or reply.file.name}'
await message.client.download_media(reply, f'/var/www/html/modules/{fname}')
await message.edit(f'Модуль был сохранён как: <code>{fname}</code>.\n\n'
f'Вы можете его загрузить: <code>.dlmod https://fl1yd.ml/modules/{fname}</code>')
async def fulcmd(self, message):
"""Загрузить файл на сервер."""
name = utils.get_args_raw(message)
reply = await message.get_reply_message()
ext = reply.file.ext
fname = f'{name or message.id+reply.id}{ext}'
await message.client.download_media(reply, f'/var/www/html/files/{fname}')
await message.edit(f'Сохранено как: <code>https://fl1yd.ml/files/{fname}</code>')

View File

@@ -0,0 +1,17 @@
import os
from .. import loader, utils
def register(cb):
cb(URLShortenerMod())
class URLShortenerMod(loader.Module):
"""Сократитель ссылок"""
strings = {'name': 'URLShortener'}
async def lgtcmd(self, message):
"""Сократить ссылку с помощью сервиса verylegit.link"""
args = utils.get_args_raw(message)
if not args: return await message.edit("Нет аргументов.")
link = os.popen(f"curl verylegit.link/sketchify -d long_url={args}").read()
await message.edit(f"Ссылка:\n> {link}")

View File

@@ -0,0 +1,47 @@
import os
from .. import loader, utils
from telethon.errors.rpcerrorlist import UsernameOccupiedError
from telethon.tl.functions.account import UpdateProfileRequest, UpdateUsernameRequest
def register(cb):
cb(UserDataMod())
class UserDataMod(loader.Module):
"""Модуль может изменить ваши данные в Telegram"""
strings = {'name': 'UserData'}
async def namecmd(self, message):
"""Команда .name изменит ваше имя."""
args = utils.get_args_raw(message).split('/')
if not args:
return await message.edit('Нет аргументов.')
if len(args) == 1:
firstname = args[0]
lastname = ' '
elif len(args) == 2:
firstname = args[0]
lastname = args[1]
await message.client(UpdateProfileRequest(first_name=firstname, last_name=lastname))
await message.edit('Имя изменено успешно!')
async def biocmd(self, message):
"""Команда .bio изменит ваше био."""
args = utils.get_args_raw(message)
if not args:
return await message.edit('Нет аргументов.')
await message.client(UpdateProfileRequest(about=args))
await message.edit('Био изменено успешно!')
async def usernamecmd(self, message):
"""Команда .username изменит ваше био."""
args = utils.get_args_raw(message)
if not args:
return await message.edit('Нет аргументов.')
try:
await message.client(UpdateUsernameRequest(args))
await message.edit('Юзернейм изменен успешно!')
except UsernameOccupiedError:
await message.edit('Такой юзернейм уже занят!')

View File

@@ -0,0 +1,47 @@
import os
from .. import loader, utils
from telethon.errors.rpcerrorlist import UsernameOccupiedError
from telethon.tl.functions.account import UpdateProfileRequest, UpdateUsernameRequest
def register(cb):
cb(UserDataMod())
class UserDataMod(loader.Module):
"""This module can change your Telegram profile."""
strings = {'name': 'UserData'}
async def namecmd(self, message):
"""For .name command, change your first/second name."""
args = utils.get_args_raw(message).split('/')
if len(args) == 0:
return await message.edit('No any args.')
if len(args) == 1:
firstname = args[0]
lastname = ' '
elif len(args) == 2:
firstname = args[0]
lastname = args[1]
await message.client(UpdateProfileRequest(first_name=firstname, last_name=lastname))
await message.edit('Name is changed successfully!')
async def biocmd(self, message):
"""For .bio command, set a new bio for your profile."""
args = utils.get_args_raw(message)
if not args:
return await message.edit('No any args.')
await message.client(UpdateProfileRequest(about=args))
await message.edit('Successfully edited Bio!')
async def usernamecmd(self, message):
"""For .username command, set a new username."""
args = utils.get_args_raw(message)
if not args:
return await message.edit('No any args.')
try:
await message.client(UpdateUsernameRequest(args))
await message.edit('Your username was successfully changed!')
except UsernameOccupiedError:
await message.edit('This username is already taken!')

View File

@@ -0,0 +1,90 @@
from .. import loader, utils
from telethon import events
from telethon.errors.rpcerrorlist import YouBlockedUserError
import io
from io import BytesIO
from PIL import Image
def register(cb):
cb(VsratoMemesMod())
class VsratoMemesMod(loader.Module):
"""Всратые мемы."""
strings = {'name': 'Всратые мемы'}
async def wolfcmd(self, event):
""""Используй .wolf."""
chat = "@neuroakelabot"
await event.edit("<b>Минуточку...</b>")
async with event.client.conversation(chat) as conv:
try:
response = conv.wait_event(events.NewMessage(incoming=True, from_users=979556006))
await event.client.send_message(chat, "Дай мне мем, Акела")
response = await response
except YouBlockedUserError:
await event.edit("<b>Разблокируй @neuroakelabot</b>")
return
await event.client.send_file(event.to_id, response.media)
await event.delete()
async def vsratocmd(self, event):
"""Используй .vsrato <реплай на пикчу>."""
reply = await event.get_reply_message()
if not reply:
await event.edit("<b>Нет реплая на пикчу.</b>")
return
else:
pic = await check_media(event, reply)
if not pic:
await utils.answer(event, "<b>Это не изображение.</b>")
return
chat = '@vsratoslavbot'
await event.edit("<b>Минуточку...</b>")
async with event.client.conversation(chat) as conv:
try:
medias = kekw(pic)
await event.client.send_file(chat, medias)
response = conv.wait_event(events.NewMessage(incoming=True, from_users=1066090937))
response = await response
if response.media:
lol = await response.media
else:
response = conv.wait_event(events.NewMessage(incoming=True, from_users=1066090937))
response = await response
except YouBlockedUserError:
await event.reply("<b>Разблокируй @vsratoslavbot.</b>")
return
await event.client.send_file(event.to_id, response.media, reply_to=await event.get_reply_message())
event.delete()
async def check_media(message, reply):
if reply and reply.media:
if reply.photo:
data = reply.photo
elif reply.document:
if reply.gif or reply.video or reply.audio or reply.voice:
return None
data = reply.media.document
else:
return None
else:
return None
if not data or data is None:
return None
else:
data = await message.client.download_file(data, bytes)
try:
Image.open(io.BytesIO(data))
return data
except:
return None
def kekw(reply):
scrrrra = Image.open(BytesIO(reply))
out = io.BytesIO()
out.name = "outsider.png"
scrrrra.save(out)
return out.getvalue()

View File

@@ -0,0 +1,26 @@
import requests
from .. import loader, utils
def register(cb):
cb(WeatherMod())
class WeatherMod(loader.Module):
"""Погода с сайта wttr.in"""
strings = {'name': 'Weather'}
async def pwcmd(self, message):
""""Кидает погоду картинкой.\nИспользование: .pw <город>; ничего."""
args = utils.get_args_raw(message).replace(' ', '+')
await message.edit("Узнаем погоду...")
city = requests.get(f"https://wttr.in/{args if args != None else ''}.png").content
await message.client.send_file(message.to_id, city)
await message.delete()
async def awcmd(self, message):
"""Кидает погоду ascii-артом.\nИспользование: .aw <город>; ничего."""
city = utils.get_args_raw(message)
await message.edit("Узнаем погоду...")
r = requests.get(f"https://wttr.in/{city if city != None else ''}?0?q?T&lang=ru")
await message.edit(f"<code>Город: {r.text}</code>")

127
Fl1yd/FTG-Modules/whois.py Normal file
View File

@@ -0,0 +1,127 @@
# Major change by @Fl1yd
#
# Channel: @ftgmodulesbyfl1yd
# ============================
import os
from .. import loader, utils
from telethon.tl.functions.photos import GetUserPhotosRequest
from telethon.tl.functions.users import GetFullUserRequest
from telethon.tl.types import MessageEntityMentionName
def register(cb):
cb(WhoIsMod())
class WhoIsMod(loader.Module):
"""Получает информацию о пользователе в Телеграме (включая вас!)."""
strings = {'name': 'WhoIs'}
async def whoiscmd(self, whos):
"""Используй .whois <@ или реплай>; ничего"""
await whos.edit("<b>Получаю информацию о пользователе...</b>")
replied_user = await get_user(whos)
try:
photo, caption = await fetch_info(replied_user, whos)
except AttributeError:
whos.edit("<b>Не могу найти информацию об этом пользователе.</b>")
return
message_id_to_reply = whos.reply_to_msg_id
if not message_id_to_reply:
message_id_to_reply = None
try:
await whos.client.send_file(whos.chat_id, photo, caption=caption,
link_preview=False, force_document=False,
reply_to=message_id_to_reply, parse_mode="html")
if not photo.startswith("http"):
os.remove(photo)
await whos.delete()
except TypeError:
await whos.edit(caption, parse_mode="html")
async def get_user(event):
"""Получение информации о пользователе с реплая или аргумента."""
if event.reply_to_msg_id and not utils.get_args_raw(event):
previous_message = await event.get_reply_message()
replied_user = await event.client(GetFullUserRequest(previous_message.from_id))
else:
user = utils.get_args_raw(event)
if user.isnumeric():
user = int(user)
if not user:
self_user = await event.client.get_me()
user = self_user.id
if event.entities is not None:
probable_user_mention_entity = event.entities[0]
if isinstance(probable_user_mention_entity, MessageEntityMentionName):
user_id = probable_user_mention_entity.user_id
replied_user = await event.client(GetFullUserRequest(user_id))
return replied_user
try:
user_object = await event.client.get_entity(user)
replied_user = await event.client(GetFullUserRequest(user_object.id))
except:
self_user = await event.client.get_me()
user = self_user.id
user_object = await event.client.get_entity(user)
replied_user = await event.client(GetFullUserRequest(user_object.id))
return replied_user
return replied_user
async def fetch_info(replied_user, event):
"""Подробная информация о пользователе."""
replied_user_profile_photos = await event.client(GetUserPhotosRequest(user_id=replied_user.user.id,
offset=42, max_id=0, limit=80))
replied_user_profile_photos_count = "Пользователю нужна помощь с загрузкой аватарки."
try:
replied_user_profile_photos_count = replied_user_profile_photos.count
except AttributeError as e:
pass
user_id = replied_user.user.id
first_name = replied_user.user.first_name
last_name = replied_user.user.last_name
common_chat = replied_user.common_chats_count
username = replied_user.user.username
user_bio = replied_user.about
is_bot = replied_user.user.bot
if is_bot == False:
is_bot = "Нет"
else:
is_bot = "Да"
restricted = replied_user.user.restricted
if restricted == False:
restricted = "Нет"
else:
restricted = "Да"
verified = replied_user.user.verified
if verified == False:
verified = "Нет"
else:
verified = "Да"
photo = await event.client.download_profile_photo(user_id, str(user_id) + ".jpg", download_big=True)
first_name = first_name.replace("\u2060", "") if first_name else "Пользователь не указал имя."
last_name = last_name.replace("\u2060", "") if last_name else "Пользователь не указал фамилию."
username = "@{}".format(username) if username else "У пользователя нет юзернейма."
user_bio = "У пользователя нет информации о себе." if not user_bio else user_bio
caption = "<b>ИНФОРМАЦИЯ О ПОЛЬЗОВАТЕЛЕ:</b>\n\n"
caption += f"<b>Имя:</b> {first_name}\n"
caption += f"<b>Фамилия:</b> {last_name}\n"
caption += f"<b>Юзернейм:</b> {username}\n"
caption += f"<b>ID:</b> <code>{user_id}</code>\n"
caption += f"<b>Бот:</b> {is_bot}\n"
caption += f"<b>Ограничен:</b> {restricted}\n"
caption += f"<b>Верифицирован:</b> {verified}\n\n"
caption += f"<b>О себе:</b> \n<code>{user_bio}</code>\n\n"
caption += f"<b>Кол-во аватарок в профиле:</b> {replied_user_profile_photos_count}\n"
caption += f"<b>Общие чаты:</b> {common_chat}\n"
caption += f"<b>Пермалинк:</b> "
caption += f"<a href=\"tg://user?id={user_id}\">клик</a>"
return photo, caption

177
Fl1yd/FTG-Modules/wwtaf.py Normal file
View File

@@ -0,0 +1,177 @@
import io
from .. import loader, utils
from requests import get
from telethon import types
def register(cb):
cb(WWTaFMod())
class WWTaFMod(loader.Module):
"""Модуль для работы с текстом или файлами."""
strings = {'name': 'WWTaF'}
async def filecmd(self, event):
"""Получить файл по ссылке.\nИспользование: .file <ссылка или реплай на ссылку>."""
try:
text = utils.get_args_raw(event)
reply = await event.get_reply_message()
if text:
urll = text.split()
for url in urll:
if "://" in url:
break
text = get(url).text
file = io.BytesIO(bytes(text, "utf-8"))
file.name = url.split("/")[-1]
file.seek(0)
await event.client.send_file(event.to_id, file)
await event.delete()
if reply:
urll = reply.raw_text.split()
for url in urll:
if "://" in url:
break
text = get(url).text
file = io.BytesIO(bytes(text, "utf-8"))
file.name = url.split("/")[-1]
file.seek(0)
await event.client.send_file(event.to_id, file, reply_to=reply)
await event.delete()
if not text and not reply:
await event.edit("<b>Нет текста или реплая.</b>")
except:
await event.edit("<b>Возможно вы забыли добавить \"http://\" перед ссылкой.</b>")
return
async def tabfixcmd(self, event):
"""Используй .tabfix <реплай или файл с текстом .tabfix>."""
await event.delete()
try:
reply = await event.get_reply_message()
text = await event.client.download_file(reply, bytes)
text = str(text, "utf-8")
tabs = text.count("\t")
text = text.replace("\t", " "*4)
file = io.BytesIO(bytes(text, "utf-8"))
filename = reply.media.document.attributes[-1].file_name
file.name = "TabsFixed_"+filename
file.seek(0)
await event.client.send_file(event.to_id, file, caption=f"<b>Заменено: {tabs} табов.</b>")
except:
await event.edit("<b>Нет реплая на файл.</b>")
async def text2txtcmd(self, event):
"""Переносит текст в файл .txt.\nИспользуй: .text2txt <текст или реплай>."""
await event.delete()
text = utils.get_args_raw(event)
reply = await event.get_reply_message()
if text:
await event.client.send_file(event.to_id, text.encode(),
attributes=[types.DocumentAttributeFilename(file_name="text2txt.txt")])
if reply:
await event.client.send_file(event.to_id, reply.raw_text.encode(),
attributes=[types.DocumentAttributeFilename(file_name="text2txt.txt")])
if not text and not reply:
await event.edit("<b>Нет текста или реплая.</b>")
async def text2pycmd(self, event):
"""Переносит текст в файл .py.\nИспользуй: .text2py <текст или реплай>."""
await event.delete()
text = utils.get_args_raw(event)
reply = await event.get_reply_message()
if text:
await event.client.send_file(event.to_id, text.encode(),
attributes=[types.DocumentAttributeFilename(file_name="text2py.py")])
if reply:
await event.client.send_file(event.to_id, reply.raw_text.encode(),
attributes=[types.DocumentAttributeFilename(file_name="text2py.py")])
if not text and not reply:
await event.edit("<b>Нет текста или реплая.</b>")
async def boldcmd(self, message):
"""Сделать текст жирным.\nИспользуй: .bold <текст или реплай>."""
text = utils.get_args_raw(message)
reply = await message.get_reply_message()
if text:
await message.edit(f"<b>{text}</b>")
if reply:
if message.from_id != reply.from_id:
await message.edit(f"<b>{reply.raw_text}</b>")
else:
await message.delete()
await reply.edit(f"<b>{reply.raw_text}</b>")
async def italiccmd(self, message):
"""Сделать текст курсивным.\nИспользуй: .italic <текст или реплай>."""
text = utils.get_args_raw(message)
reply = await message.get_reply_message()
if text:
await message.edit(f"<i>{text}</i>")
if reply:
if message.from_id != reply.from_id:
await message.edit(f"<i>{reply.raw_text}</i>")
else:
await message.delete()
await reply.edit(f"<i>{reply.raw_text}</i>")
async def underlinecmd(self, message):
"""Сделать текст подчеркнутым.\nИспользуй: .underline <текст или реплай>."""
text = utils.get_args_raw(message)
reply = await message.get_reply_message()
if text:
await message.edit(f"<u>{text}</u>")
if reply:
if message.from_id != reply.from_id:
await message.edit(f"<u>{reply.raw_text}</u>")
else:
await message.delete()
await reply.edit(f"<u>{reply.raw_text}</u>")
async def monocmd(self, message):
"""Сделать текст моноширинным.\nИспользуй: .mono <текст или реплай>."""
text = utils.get_args_raw(message)
reply = await message.get_reply_message()
if text:
await message.edit(f"<code>{text}</code>")
if reply:
if message.from_id != reply.from_id:
await message.edit(f"<code>{reply.raw_text}</code>")
else:
await message.delete()
await reply.edit(f"<code>{reply.raw_text}</code>")
async def crosscmd(self, message):
"""Сделать текст зачеркнутым.\nИспользуй: .cross <текст или реплай>."""
text = utils.get_args_raw(message)
reply = await message.get_reply_message()
if text:
await message.edit(f"<s>{text}</s>")
if reply:
if message.from_id != reply.from_id:
await message.edit(f"<s>{reply.raw_text}</s>")
else:
await message.delete()
await reply.edit(f"<s>{reply.raw_text}</s>")
async def entercmd(self, message):
"""Перенос строки после каждого слова.\nИспользуй: .enter <текст или реплай>."""
text = utils.get_args_raw(message)
reply = await message.get_reply_message()
if text:
await message.respond("\n".join(text.split(' ')))
if reply:
await message.edit("\n".join(reply.text.split(' ')))
await message.delete()

View File

@@ -0,0 +1,158 @@
from .. import loader, utils
import requests
from PIL import Image
from PIL import ImageFont
from PIL import ImageDraw
import io
from textwrap import wrap
def register(cb):
cb(ZapomniZabudSoglMod())
class ZapomniZabudSoglMod(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
self.me = await client.get_me()
async def zapcmd(self, message):
""".zap <текст или реплай>"""
ufr = requests.get("https://fl1yd.ml/modules/stuff/font.ttf")
f = ufr.content
reply = await message.get_reply_message()
txet = utils.get_args_raw(message)
if not txet:
if not reply:
await message.edit("text?")
else:
txt = reply.raw_text
else:
txt = utils.get_args_raw(message)
await message.edit("<b>Извиняюсь...</b>")
pic = requests.get("https://fl1yd.ml/modules/stuff/man.jpg")
pic.raw.decode_content = True
img = Image.open(io.BytesIO(pic.content)).convert("RGB")
black = Image.new("RGBA", img.size, (0, 0, 0, 100))
img.paste(black, (0, 0), black)
W, H = img.size
txt = txt.replace("\n", "𓃐")
text = "\n".join(wrap(txt, 40))
t = "Запомните твари:\n" +text
t = t.replace("𓃐","\n")
draw = ImageDraw.Draw(img)
font = ImageFont.truetype(io.BytesIO(f), 32, encoding='UTF-8')
w, h = draw.multiline_textsize(t, font=font)
imtext = Image.new("RGBA", (w+20, h+20), (0, 0,0,0))
draw = ImageDraw.Draw(imtext)
draw.multiline_text((10, 10),t,(255,255,255),font=font, align='center')
imtext.thumbnail((W, H))
w, h = imtext.size
img.paste(imtext, ((W-w)//2,(H-h)//2), imtext)
out = io.BytesIO()
out.name = "out.jpg"
img.save(out)
out.seek(0)
await message.client.send_file(message.to_id, out, reply_to=reply)
await message.delete()
async def zabcmd(self, message):
""".zab <текст или реплай>"""
ufr = requests.get("https://fl1yd.ml/modules/stuff/font.ttf")
f = ufr.content
reply = await message.get_reply_message()
txet = utils.get_args_raw(message)
if not txet:
if not reply:
await message.edit("text?")
else:
txt = reply.raw_text
else:
txt = utils.get_args_raw(message)
await message.edit("<b>Извиняюсь...</b>")
pic = requests.get("https://fl1yd.ml/modules/stuff/man.jpg")
pic.raw.decode_content = True
img = Image.open(io.BytesIO(pic.content)).convert("RGB")
black = Image.new("RGBA", img.size, (0, 0, 0, 100))
img.paste(black, (0, 0), black)
W, H = img.size
txt = txt.replace("\n", "𓃐")
text = "\n".join(wrap(txt, 40))
t = "Забудьте твари:\n" + text
t = t.replace("𓃐", "\n")
draw = ImageDraw.Draw(img)
font = ImageFont.truetype(io.BytesIO(f), 32, encoding='UTF-8')
w, h = draw.multiline_textsize(t, font=font)
imtext = Image.new("RGBA", (w + 20, h + 20), (0, 0, 0, 0))
draw = ImageDraw.Draw(imtext)
draw.multiline_text((10, 10), t, (255, 255, 255), font=font, align='center')
imtext.thumbnail((W, H))
w, h = imtext.size
img.paste(imtext, ((W - w) // 2, (H - h) // 2), imtext)
out = io.BytesIO()
out.name = "out.jpg"
img.save(out)
out.seek(0)
await message.client.send_file(message.to_id, out, reply_to=reply)
await message.delete()
async def soglcmd(self, message):
""".sogl <текст или реплай>"""
ufr = requests.get("https://fl1yd.ml/modules/stuff/font.ttf")
f = ufr.content
reply = await message.get_reply_message()
txet = utils.get_args_raw(message)
if not txet:
if not reply:
await message.edit("text?")
else:
txt = reply.raw_text
else:
txt = utils.get_args_raw(message)
await message.edit("<b>Извиняюсь...</b>")
pic = requests.get("https://fl1yd.ml/modules/stuff/shrek.jpg")
pic.raw.decode_content = True
img = Image.open(io.BytesIO(pic.content)).convert("RGB")
black = Image.new("RGBA", img.size, (0, 0, 0, 100))
img.paste(black, (0, 0), black)
W, H = img.size
txt = txt.replace("\n", "𓃐")
text = "\n".join(wrap(txt, 40))
t = "Согласен, " + text
t = t.replace("𓃐", "\n")
draw = ImageDraw.Draw(img)
font = ImageFont.truetype(io.BytesIO(f), 28, encoding='UTF-8')
w, h = draw.multiline_textsize(t, font=font)
imtext = Image.new("RGBA", (w + 20, h + 20), (0, 0, 0, 0))
draw = ImageDraw.Draw(imtext)
draw.multiline_text((10, 10), t, (255, 255, 255), font=font, align='center')
imtext.thumbnail((W, H))
w, h = imtext.size
img.paste(imtext, ((W - w) // 2, (H - h) // 2), imtext)
out = io.BytesIO()
out.name = "out.jpg"
img.save(out)
out.seek(0)
await message.client.send_file(message.to_id, out, reply_to=reply)
await message.delete()