|  | @@ -1,291 +1,291 @@
 | 
	
		
			
				|  |  | -from random import uniform
 | 
	
		
			
				|  |  | -from asyncio import sleep
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -from tortoise.contrib.postgres.functions import Random
 | 
	
		
			
				|  |  | -from telethon.utils import get_input_document
 | 
	
		
			
				|  |  | -from telethon.tl.functions.stickers import (
 | 
	
		
			
				|  |  | -    CreateStickerSetRequest,
 | 
	
		
			
				|  |  | -    AddStickerToSetRequest,
 | 
	
		
			
				|  |  | -)
 | 
	
		
			
				|  |  | -from telethon.tl.functions.messages import UploadMediaRequest, GetStickerSetRequest
 | 
	
		
			
				|  |  | -from telethon.tl.types import (
 | 
	
		
			
				|  |  | -    InputStickerSetID,
 | 
	
		
			
				|  |  | -    InputStickerSetShortName,
 | 
	
		
			
				|  |  | -    InputStickerSetItem,
 | 
	
		
			
				|  |  | -    InputMediaUploadedDocument,
 | 
	
		
			
				|  |  | -    InputPeerSelf,
 | 
	
		
			
				|  |  | -)
 | 
	
		
			
				|  |  | -from tortoise.expressions import F
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -from models import (
 | 
	
		
			
				|  |  | -    Action,
 | 
	
		
			
				|  |  | -    Gif,
 | 
	
		
			
				|  |  | -    StickerPack,
 | 
	
		
			
				|  |  | -    Admin,
 | 
	
		
			
				|  |  | -    BirthDay,
 | 
	
		
			
				|  |  | -    VPNServer,
 | 
	
		
			
				|  |  | -    AllowedChat,
 | 
	
		
			
				|  |  | -    MarkovChat,
 | 
	
		
			
				|  |  | -)
 | 
	
		
			
				|  |  | -from utils import is_valid_name, is_valid_ip
 | 
	
		
			
				|  |  | -from config import config
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -async def is_admin(bot, user):
 | 
	
		
			
				|  |  | -    admin = await bot.get_entity(config.ADMIN)
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    if user.id == admin.id:
 | 
	
		
			
				|  |  | -        return True
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    admin = await Admin.filter(user_id=user.id)
 | 
	
		
			
				|  |  | -    if admin:
 | 
	
		
			
				|  |  | -        return True
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    return False
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -async def add_admin(user):
 | 
	
		
			
				|  |  | -    await Admin(user_id=user.id).save()
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -async def delete_admin(user):
 | 
	
		
			
				|  |  | -    admin = await Admin.filter(user_id=user.id).first()
 | 
	
		
			
				|  |  | -    if not admin:
 | 
	
		
			
				|  |  | -        raise IndexError
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    await admin.delete()
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -async def create_action(name, template, kind):
 | 
	
		
			
				|  |  | -    if not is_valid_name(name):
 | 
	
		
			
				|  |  | -        raise SyntaxError
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    await Action(name=name, template=template, kind=kind).save()
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -async def find_action(name):
 | 
	
		
			
				|  |  | -    if not is_valid_name(name):
 | 
	
		
			
				|  |  | -        raise SyntaxError
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    return await Action.filter(name=name).first()
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -async def delete_action(name):
 | 
	
		
			
				|  |  | -    action = await find_action(name)
 | 
	
		
			
				|  |  | -    if not action:
 | 
	
		
			
				|  |  | -        raise NameError
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    gifs = await action.gifs.all()
 | 
	
		
			
				|  |  | -    for gif in gifs:
 | 
	
		
			
				|  |  | -        await gif.delete()
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    await action.delete()
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -async def add_gif(action, file_id):
 | 
	
		
			
				|  |  | -    await Gif(action=action, file_id=file_id).save()
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -async def get_random_gif(action):
 | 
	
		
			
				|  |  | -    return await action.gifs.all().annotate(order=Random()).order_by("order").first()
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -async def create_new_pack(bot, sticker):
 | 
	
		
			
				|  |  | -    last_pack = await StickerPack.all().order_by("-id").first()
 | 
	
		
			
				|  |  | -    set_id = last_pack.id + 1 if last_pack else 1
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    user = await bot.get_entity(config.USER)
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    me = await bot.get_me()
 | 
	
		
			
				|  |  | -    bot_username = me.username
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    pack = await bot(
 | 
	
		
			
				|  |  | -        CreateStickerSetRequest(
 | 
	
		
			
				|  |  | -            user_id=user.id,
 | 
	
		
			
				|  |  | -            title=f"Messages #{set_id}.",
 | 
	
		
			
				|  |  | -            short_name=f"messages{set_id}_by_{bot_username}",
 | 
	
		
			
				|  |  | -            stickers=[sticker],
 | 
	
		
			
				|  |  | -        )
 | 
	
		
			
				|  |  | -    )
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    sid = pack.set.id
 | 
	
		
			
				|  |  | -    hash = pack.set.access_hash
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    await StickerPack(short_name=pack.set.short_name, sid=sid, hash=hash).save()
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    return pack
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -async def get_current_pack(bot):
 | 
	
		
			
				|  |  | -    pack = await StickerPack.all().order_by("-id").first()
 | 
	
		
			
				|  |  | -    if not pack or pack.stickers_count >= 119:
 | 
	
		
			
				|  |  | -        return None
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    return pack
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -async def add_sticker(bot, file, emoji):
 | 
	
		
			
				|  |  | -    file = await bot.upload_file(file)
 | 
	
		
			
				|  |  | -    file = InputMediaUploadedDocument(file, "image/png", [])
 | 
	
		
			
				|  |  | -    file = await bot(UploadMediaRequest(InputPeerSelf(), file))
 | 
	
		
			
				|  |  | -    file = get_input_document(file)
 | 
	
		
			
				|  |  | -    sticker = InputStickerSetItem(document=file, emoji=emoji)
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    pack = await get_current_pack(bot)
 | 
	
		
			
				|  |  | -    if not pack:
 | 
	
		
			
				|  |  | -        pack = await create_new_pack(bot, sticker)
 | 
	
		
			
				|  |  | -    else:
 | 
	
		
			
				|  |  | -        await StickerPack.filter(id=pack.id).update(
 | 
	
		
			
				|  |  | -            stickers_count=F("stickers_count") + 1
 | 
	
		
			
				|  |  | -        )
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        pack = await bot(
 | 
	
		
			
				|  |  | -            AddStickerToSetRequest(
 | 
	
		
			
				|  |  | -                stickerset=InputStickerSetID(id=pack.sid, access_hash=pack.hash),
 | 
	
		
			
				|  |  | -                sticker=sticker,
 | 
	
		
			
				|  |  | -            )
 | 
	
		
			
				|  |  | -        )
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    return get_input_document(pack.documents[-1])
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -async def get_birthdays(peer_id):
 | 
	
		
			
				|  |  | -    return await BirthDay.filter(peer_id=peer_id).all()
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -async def add_or_update_birthday(peer_id, user, date):
 | 
	
		
			
				|  |  | -    birthday = await BirthDay.filter(peer_id=peer_id, user_id=user.id).first()
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    if birthday:
 | 
	
		
			
				|  |  | -        await BirthDay.filter(id=birthday.id).update(date=date)
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        return False
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    await BirthDay(peer_id=peer_id, user_id=user.id, date=date).save()
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    return True
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -async def get_all_birthdays():
 | 
	
		
			
				|  |  | -    return await BirthDay.all()
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -async def add_server(name, ip):
 | 
	
		
			
				|  |  | -    if not is_valid_ip(ip):
 | 
	
		
			
				|  |  | -        raise ValueError
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    await VPNServer(name=name, ip=ip).save()
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -async def add_server(name, ip):
 | 
	
		
			
				|  |  | -    if not is_valid_name(name):
 | 
	
		
			
				|  |  | -        raise SyntaxError
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    if not is_valid_ip(ip):
 | 
	
		
			
				|  |  | -        raise ValueError
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    await VPNServer(name=name, ip=ip).save()
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -async def delete_server(name):
 | 
	
		
			
				|  |  | -    if not is_valid_name(name):
 | 
	
		
			
				|  |  | -        raise SyntaxError
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    server = await VPNServer.filter(name=name).first()
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    if not server:
 | 
	
		
			
				|  |  | -        raise IndexError
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    await server.delete()
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -async def list_servers():
 | 
	
		
			
				|  |  | -    servers = await VPNServer.all()
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    if not servers:
 | 
	
		
			
				|  |  | -        return "*пусто*"
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    return ", ".join(map(lambda server: server.name, servers))
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -async def get_server_ip(name):
 | 
	
		
			
				|  |  | -    if not is_valid_name(name):
 | 
	
		
			
				|  |  | -        raise SyntaxError
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    server = await VPNServer.filter(name=name).first()
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    if not server:
 | 
	
		
			
				|  |  | -        raise IndexError
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    return server.ip
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -async def add_allowed(peer_id):
 | 
	
		
			
				|  |  | -    await AllowedChat(peer_id=peer_id).save()
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -async def delete_allowed(peer_id):
 | 
	
		
			
				|  |  | -    chat = await AllowedChat.filter(peer_id=peer_id).first()
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    if not chat:
 | 
	
		
			
				|  |  | -        raise IndexError
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    await chat.delete()
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -async def is_allowed(peer_id):
 | 
	
		
			
				|  |  | -    return await AllowedChat.filter(peer_id=peer_id).exists()
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -async def is_markov_enabled(peer_id):
 | 
	
		
			
				|  |  | -    return await MarkovChat.filter(peer_id=peer_id).exists()
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -async def enable_markov(peer_id):
 | 
	
		
			
				|  |  | -    await MarkovChat(peer_id=peer_id).save()
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -async def set_markov_options(peer_id, **options):
 | 
	
		
			
				|  |  | -    chat = await MarkovChat.filter(peer_id=peer_id).first()
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    if not chat:
 | 
	
		
			
				|  |  | -        raise IndexError
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    await MarkovChat.filter(id=chat.id).update(**options)
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -async def get_markov_option(peer_id, option):
 | 
	
		
			
				|  |  | -    chat = await MarkovChat.filter(peer_id=peer_id).first()
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    if not chat:
 | 
	
		
			
				|  |  | -        raise IndexError
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    return getattr(chat, option)
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -async def disable_markov(peer_id):
 | 
	
		
			
				|  |  | -    chat = await MarkovChat.filter(peer_id=peer_id).first()
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    if not chat:
 | 
	
		
			
				|  |  | -        raise IndexError
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    await chat.delete()
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -async def list_markov_chats():
 | 
	
		
			
				|  |  | -    return await MarkovChat.all()
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -async def markov_say(bot, peer_id, reply_to=None):
 | 
	
		
			
				|  |  | -    if not bot.markov.is_ready:
 | 
	
		
			
				|  |  | -        return
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    text = bot.markov.generate()
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    async with bot.action(peer_id, "typing"):
 | 
	
		
			
				|  |  | -        amount = 0
 | 
	
		
			
				|  |  | -        for _ in range(len(text)):
 | 
	
		
			
				|  |  | -            amount += round(uniform(0.05, 0.2), 2)
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        await sleep(min(amount, 8))
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | +from random import uniform
 | 
	
		
			
				|  |  | +from asyncio import sleep
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +from tortoise.contrib.postgres.functions import Random
 | 
	
		
			
				|  |  | +from telethon.utils import get_input_document
 | 
	
		
			
				|  |  | +from telethon.tl.functions.stickers import (
 | 
	
		
			
				|  |  | +    CreateStickerSetRequest,
 | 
	
		
			
				|  |  | +    AddStickerToSetRequest,
 | 
	
		
			
				|  |  | +)
 | 
	
		
			
				|  |  | +from telethon.tl.functions.messages import UploadMediaRequest, GetStickerSetRequest
 | 
	
		
			
				|  |  | +from telethon.tl.types import (
 | 
	
		
			
				|  |  | +    InputStickerSetID,
 | 
	
		
			
				|  |  | +    InputStickerSetShortName,
 | 
	
		
			
				|  |  | +    InputStickerSetItem,
 | 
	
		
			
				|  |  | +    InputMediaUploadedDocument,
 | 
	
		
			
				|  |  | +    InputPeerSelf,
 | 
	
		
			
				|  |  | +)
 | 
	
		
			
				|  |  | +from tortoise.expressions import F
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +from models import (
 | 
	
		
			
				|  |  | +    Action,
 | 
	
		
			
				|  |  | +    Gif,
 | 
	
		
			
				|  |  | +    StickerPack,
 | 
	
		
			
				|  |  | +    Admin,
 | 
	
		
			
				|  |  | +    BirthDay,
 | 
	
		
			
				|  |  | +    VPNServer,
 | 
	
		
			
				|  |  | +    AllowedChat,
 | 
	
		
			
				|  |  | +    MarkovChat,
 | 
	
		
			
				|  |  | +)
 | 
	
		
			
				|  |  | +from utils import is_valid_name, is_valid_ip
 | 
	
		
			
				|  |  | +from config import config
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +async def is_admin(bot, user):
 | 
	
		
			
				|  |  | +    admin = await bot.get_entity(config.ADMIN)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    if user.id == admin.id:
 | 
	
		
			
				|  |  | +        return True
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    admin = await Admin.filter(user_id=user.id)
 | 
	
		
			
				|  |  | +    if admin:
 | 
	
		
			
				|  |  | +        return True
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    return False
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +async def add_admin(user):
 | 
	
		
			
				|  |  | +    await Admin(user_id=user.id).save()
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +async def delete_admin(user):
 | 
	
		
			
				|  |  | +    admin = await Admin.filter(user_id=user.id).first()
 | 
	
		
			
				|  |  | +    if not admin:
 | 
	
		
			
				|  |  | +        raise IndexError
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    await admin.delete()
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +async def create_action(name, template, kind):
 | 
	
		
			
				|  |  | +    if not is_valid_name(name):
 | 
	
		
			
				|  |  | +        raise SyntaxError
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    await Action(name=name, template=template, kind=kind).save()
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +async def find_action(name):
 | 
	
		
			
				|  |  | +    if not is_valid_name(name):
 | 
	
		
			
				|  |  | +        raise SyntaxError
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    return await Action.filter(name=name).first()
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +async def delete_action(name):
 | 
	
		
			
				|  |  | +    action = await find_action(name)
 | 
	
		
			
				|  |  | +    if not action:
 | 
	
		
			
				|  |  | +        raise NameError
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    gifs = await action.gifs.all()
 | 
	
		
			
				|  |  | +    for gif in gifs:
 | 
	
		
			
				|  |  | +        await gif.delete()
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    await action.delete()
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +async def add_gif(action, file_id):
 | 
	
		
			
				|  |  | +    await Gif(action=action, file_id=file_id).save()
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +async def get_random_gif(action):
 | 
	
		
			
				|  |  | +    return await action.gifs.all().annotate(order=Random()).order_by("order").first()
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +async def create_new_pack(bot, sticker):
 | 
	
		
			
				|  |  | +    last_pack = await StickerPack.all().order_by("-id").first()
 | 
	
		
			
				|  |  | +    set_id = last_pack.id + 1 if last_pack else 1
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    user = await bot.get_entity(config.USER)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    me = await bot.get_me()
 | 
	
		
			
				|  |  | +    bot_username = me.username
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    pack = await bot(
 | 
	
		
			
				|  |  | +        CreateStickerSetRequest(
 | 
	
		
			
				|  |  | +            user_id=user.id,
 | 
	
		
			
				|  |  | +            title=f"Messages #{set_id}.",
 | 
	
		
			
				|  |  | +            short_name=f"messages{set_id}_by_{bot_username}",
 | 
	
		
			
				|  |  | +            stickers=[sticker],
 | 
	
		
			
				|  |  | +        )
 | 
	
		
			
				|  |  | +    )
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    sid = pack.set.id
 | 
	
		
			
				|  |  | +    hash = pack.set.access_hash
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    await StickerPack(short_name=pack.set.short_name, sid=sid, hash=hash).save()
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    return pack
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +async def get_current_pack(bot):
 | 
	
		
			
				|  |  | +    pack = await StickerPack.all().order_by("-id").first()
 | 
	
		
			
				|  |  | +    if not pack or pack.stickers_count >= 119:
 | 
	
		
			
				|  |  | +        return None
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    return pack
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +async def add_sticker(bot, file, emoji):
 | 
	
		
			
				|  |  | +    file = await bot.upload_file(file)
 | 
	
		
			
				|  |  | +    file = InputMediaUploadedDocument(file, "image/png", [])
 | 
	
		
			
				|  |  | +    file = await bot(UploadMediaRequest(InputPeerSelf(), file))
 | 
	
		
			
				|  |  | +    file = get_input_document(file)
 | 
	
		
			
				|  |  | +    sticker = InputStickerSetItem(document=file, emoji=emoji)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    pack = await get_current_pack(bot)
 | 
	
		
			
				|  |  | +    if not pack:
 | 
	
		
			
				|  |  | +        pack = await create_new_pack(bot, sticker)
 | 
	
		
			
				|  |  | +    else:
 | 
	
		
			
				|  |  | +        await StickerPack.filter(id=pack.id).update(
 | 
	
		
			
				|  |  | +            stickers_count=F("stickers_count") + 1
 | 
	
		
			
				|  |  | +        )
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        pack = await bot(
 | 
	
		
			
				|  |  | +            AddStickerToSetRequest(
 | 
	
		
			
				|  |  | +                stickerset=InputStickerSetID(id=pack.sid, access_hash=pack.hash),
 | 
	
		
			
				|  |  | +                sticker=sticker,
 | 
	
		
			
				|  |  | +            )
 | 
	
		
			
				|  |  | +        )
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    return get_input_document(pack.documents[-1])
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +async def get_birthdays(peer_id):
 | 
	
		
			
				|  |  | +    return await BirthDay.filter(peer_id=peer_id).all()
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +async def add_or_update_birthday(peer_id, user, date):
 | 
	
		
			
				|  |  | +    birthday = await BirthDay.filter(peer_id=peer_id, user_id=user.id).first()
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    if birthday:
 | 
	
		
			
				|  |  | +        await BirthDay.filter(id=birthday.id).update(date=date)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        return False
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    await BirthDay(peer_id=peer_id, user_id=user.id, date=date).save()
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    return True
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +async def get_all_birthdays():
 | 
	
		
			
				|  |  | +    return await BirthDay.all()
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +async def add_server(name, ip):
 | 
	
		
			
				|  |  | +    if not is_valid_ip(ip):
 | 
	
		
			
				|  |  | +        raise ValueError
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    await VPNServer(name=name, ip=ip).save()
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +async def add_server(name, ip):
 | 
	
		
			
				|  |  | +    if not is_valid_name(name):
 | 
	
		
			
				|  |  | +        raise SyntaxError
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    if not is_valid_ip(ip):
 | 
	
		
			
				|  |  | +        raise ValueError
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    await VPNServer(name=name, ip=ip).save()
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +async def delete_server(name):
 | 
	
		
			
				|  |  | +    if not is_valid_name(name):
 | 
	
		
			
				|  |  | +        raise SyntaxError
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    server = await VPNServer.filter(name=name).first()
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    if not server:
 | 
	
		
			
				|  |  | +        raise IndexError
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    await server.delete()
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +async def list_servers():
 | 
	
		
			
				|  |  | +    servers = await VPNServer.all()
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    if not servers:
 | 
	
		
			
				|  |  | +        return "*пусто*"
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    return ", ".join(map(lambda server: server.name, servers))
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +async def get_server_ip(name):
 | 
	
		
			
				|  |  | +    if not is_valid_name(name):
 | 
	
		
			
				|  |  | +        raise SyntaxError
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    server = await VPNServer.filter(name=name).first()
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    if not server:
 | 
	
		
			
				|  |  | +        raise IndexError
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    return server.ip
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +async def add_allowed(peer_id):
 | 
	
		
			
				|  |  | +    await AllowedChat(peer_id=peer_id).save()
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +async def delete_allowed(peer_id):
 | 
	
		
			
				|  |  | +    chat = await AllowedChat.filter(peer_id=peer_id).first()
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    if not chat:
 | 
	
		
			
				|  |  | +        raise IndexError
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    await chat.delete()
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +async def is_allowed(peer_id):
 | 
	
		
			
				|  |  | +    return await AllowedChat.filter(peer_id=peer_id).exists()
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +async def is_markov_enabled(peer_id):
 | 
	
		
			
				|  |  | +    return await MarkovChat.filter(peer_id=peer_id).exists()
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +async def enable_markov(peer_id):
 | 
	
		
			
				|  |  | +    await MarkovChat(peer_id=peer_id).save()
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +async def set_markov_options(peer_id, **options):
 | 
	
		
			
				|  |  | +    chat = await MarkovChat.filter(peer_id=peer_id).first()
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    if not chat:
 | 
	
		
			
				|  |  | +        raise IndexError
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    await MarkovChat.filter(id=chat.id).update(**options)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +async def get_markov_option(peer_id, option):
 | 
	
		
			
				|  |  | +    chat = await MarkovChat.filter(peer_id=peer_id).first()
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    if not chat:
 | 
	
		
			
				|  |  | +        raise IndexError
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    return getattr(chat, option)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +async def disable_markov(peer_id):
 | 
	
		
			
				|  |  | +    chat = await MarkovChat.filter(peer_id=peer_id).first()
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    if not chat:
 | 
	
		
			
				|  |  | +        raise IndexError
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    await chat.delete()
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +async def list_markov_chats():
 | 
	
		
			
				|  |  | +    return await MarkovChat.all()
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +async def markov_say(bot, peer_id, reply_to=None, init_state=None):
 | 
	
		
			
				|  |  | +    if not bot.markov.is_ready:
 | 
	
		
			
				|  |  | +        return
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    text = bot.markov.generate(init_state)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    async with bot.action(peer_id, "typing"):
 | 
	
		
			
				|  |  | +        amount = 0
 | 
	
		
			
				|  |  | +        for _ in range(len(text)):
 | 
	
		
			
				|  |  | +            amount += round(uniform(0.05, 0.2), 2)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        await sleep(min(amount, 8))
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |      await bot.send_message(peer_id, message=text, reply_to=reply_to)
 |