Commited backup
68
Fl1yd/FTG-Modules/AudioShakal.py
Normal 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)
|
||||
80
Fl1yd/FTG-Modules/SpeedRead.py
Normal file
603
Fl1yd/FTG-Modules/admin.py
Normal 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
|
||||
885
Fl1yd/FTG-Modules/adminfull.py
Normal 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
@@ -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"
|
||||
"╚═╝░░░░")
|
||||
22
Fl1yd/FTG-Modules/calendar.py
Normal 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>")
|
||||
28
Fl1yd/FTG-Modules/catchargs.py
Normal 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
@@ -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>")
|
||||
177
Fl1yd/FTG-Modules/chatinfo.py
Normal 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
|
||||
46
Fl1yd/FTG-Modules/count.py
Normal 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>")
|
||||
50
Fl1yd/FTG-Modules/dictionary.py
Normal 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}')
|
||||
14
Fl1yd/FTG-Modules/don`t_work.py
Normal 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
@@ -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
@@ -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
|
||||
|
||||
33
Fl1yd/FTG-Modules/freeomonbot.py
Normal 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()
|
||||
40
Fl1yd/FTG-Modules/getcommonchats.py
Normal 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}')
|
||||
35
Fl1yd/FTG-Modules/groupcreator.py
Normal 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
@@ -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("Это не картинка/стикер.")
|
||||
17
Fl1yd/FTG-Modules/hearts.py
Normal 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)
|
||||
38
Fl1yd/FTG-Modules/hiddentag.py
Normal 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)
|
||||
30
Fl1yd/FTG-Modules/hiddenurl.py
Normal 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("Нет аргументов или реплая на медиа.")
|
||||
137
Fl1yd/FTG-Modules/impostor.py
Normal 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()
|
||||
54
Fl1yd/FTG-Modules/k&ktext.py
Normal 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>")
|
||||
35
Fl1yd/FTG-Modules/kick_random.py
Normal 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>')
|
||||
46
Fl1yd/FTG-Modules/mediacutter.py
Normal 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('Нет аргументов')
|
||||
91
Fl1yd/FTG-Modules/myhelp.py
Normal 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
|
||||
45
Fl1yd/FTG-Modules/nedoquotes.py
Normal 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()
|
||||
16
Fl1yd/FTG-Modules/nowplay.py
Normal 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()
|
||||
65
Fl1yd/FTG-Modules/onava.py
Normal 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
|
||||
21
Fl1yd/FTG-Modules/ownerships.py
Normal 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
@@ -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
|
||||
|
||||
56
Fl1yd/FTG-Modules/replydownloader.py
Normal 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('Нет аргументов.')
|
||||
19
Fl1yd/FTG-Modules/report.py
Normal 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>")
|
||||
23
Fl1yd/FTG-Modules/reverse.py
Normal 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("Это не текст.")
|
||||
22
Fl1yd/FTG-Modules/searchmodules.py
Normal 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
@@ -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> <текст или реплай>')
|
||||
BIN
Fl1yd/FTG-Modules/stuff/font.ttf
Normal file
BIN
Fl1yd/FTG-Modules/stuff/font2.ttf
Normal file
BIN
Fl1yd/FTG-Modules/stuff/font3.ttf
Normal file
BIN
Fl1yd/FTG-Modules/stuff/impostor.png
Normal file
|
After Width: | Height: | Size: 42 KiB |
BIN
Fl1yd/FTG-Modules/stuff/impostor1.png
Normal file
|
After Width: | Height: | Size: 42 KiB |
BIN
Fl1yd/FTG-Modules/stuff/impostor10.png
Normal file
|
After Width: | Height: | Size: 48 KiB |
BIN
Fl1yd/FTG-Modules/stuff/impostor11.png
Normal file
|
After Width: | Height: | Size: 40 KiB |
BIN
Fl1yd/FTG-Modules/stuff/impostor12.png
Normal file
|
After Width: | Height: | Size: 42 KiB |
BIN
Fl1yd/FTG-Modules/stuff/impostor13.png
Normal file
|
After Width: | Height: | Size: 40 KiB |
BIN
Fl1yd/FTG-Modules/stuff/impostor14.png
Normal file
|
After Width: | Height: | Size: 42 KiB |
BIN
Fl1yd/FTG-Modules/stuff/impostor15.png
Normal file
|
After Width: | Height: | Size: 43 KiB |
BIN
Fl1yd/FTG-Modules/stuff/impostor16.png
Normal file
|
After Width: | Height: | Size: 42 KiB |
BIN
Fl1yd/FTG-Modules/stuff/impostor17.png
Normal file
|
After Width: | Height: | Size: 38 KiB |
BIN
Fl1yd/FTG-Modules/stuff/impostor18.png
Normal file
|
After Width: | Height: | Size: 40 KiB |
BIN
Fl1yd/FTG-Modules/stuff/impostor19.png
Normal file
|
After Width: | Height: | Size: 42 KiB |
BIN
Fl1yd/FTG-Modules/stuff/impostor2.png
Normal file
|
After Width: | Height: | Size: 45 KiB |
BIN
Fl1yd/FTG-Modules/stuff/impostor20.png
Normal file
|
After Width: | Height: | Size: 39 KiB |
BIN
Fl1yd/FTG-Modules/stuff/impostor21.png
Normal file
|
After Width: | Height: | Size: 45 KiB |
BIN
Fl1yd/FTG-Modules/stuff/impostor22.png
Normal file
|
After Width: | Height: | Size: 42 KiB |
BIN
Fl1yd/FTG-Modules/stuff/impostor3.png
Normal file
|
After Width: | Height: | Size: 44 KiB |
BIN
Fl1yd/FTG-Modules/stuff/impostor4.png
Normal file
|
After Width: | Height: | Size: 43 KiB |
BIN
Fl1yd/FTG-Modules/stuff/impostor5.png
Normal file
|
After Width: | Height: | Size: 37 KiB |
BIN
Fl1yd/FTG-Modules/stuff/impostor6.png
Normal file
|
After Width: | Height: | Size: 42 KiB |
BIN
Fl1yd/FTG-Modules/stuff/impostor7.png
Normal file
|
After Width: | Height: | Size: 43 KiB |
BIN
Fl1yd/FTG-Modules/stuff/impostor8.png
Normal file
|
After Width: | Height: | Size: 45 KiB |
BIN
Fl1yd/FTG-Modules/stuff/impostor9.png
Normal file
|
After Width: | Height: | Size: 43 KiB |
BIN
Fl1yd/FTG-Modules/stuff/man.jpg
Normal file
|
After Width: | Height: | Size: 60 KiB |
BIN
Fl1yd/FTG-Modules/stuff/shrek.jpg
Normal file
|
After Width: | Height: | Size: 40 KiB |
34
Fl1yd/FTG-Modules/tagall.py
Normal 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))
|
||||
122
Fl1yd/FTG-Modules/textonphoto.py
Normal 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
|
||||
28
Fl1yd/FTG-Modules/uploader.py
Normal 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>')
|
||||
17
Fl1yd/FTG-Modules/urlshortener.py
Normal 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}")
|
||||
47
Fl1yd/FTG-Modules/userdata.py
Normal 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('Такой юзернейм уже занят!')
|
||||
47
Fl1yd/FTG-Modules/userdataen.py
Normal 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!')
|
||||
90
Fl1yd/FTG-Modules/vsratomemes.py
Normal 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()
|
||||
26
Fl1yd/FTG-Modules/weather.py
Normal 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
@@ -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
@@ -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()
|
||||
158
Fl1yd/FTG-Modules/zapomni_zabud_sogl.py
Normal 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()
|
||||