Exemple #1
0
 async def test_start_command_payload_pattern_is_matched(self):
     test_filter = CommandStart(deep_link=self.GOOD_PATTERN)
     message = Message(text=f'{self.START} {self.GOOD}')
     result = await test_filter.check(message)
     assert isinstance(result, dict)
     match = result.get('deep_link')
     assert isinstance(match, Match)
def setup(dp: Dispatcher):
    dp.register_message_handler(bot_start, CommandStart(), state='*')

    chat.setup(dp)
    inline_commands.setup(dp)

    dp.register_callback_query_handler(
        card_buttons_handler,
        lambda callback: callback.data.split("::")[0] == "card",
        state='*')
Exemple #3
0
def register(dp: Dispatcher):
    dp.register_message_handler(welcome, CommandStart())
    dp.register_message_handler(settings, CommandSettings())
    dp.register_message_handler(help_cmd, CommandHelp())

    dp.register_message_handler(clear_cmd, commands="clear", is_reply=True)
    dp.register_message_handler(delete_cmd, commands="del", is_reply=True)
    dp.register_message_handler(not_replied, commands=["del", "clear"])
    dp.register_message_handler(delete_all, commands="delete_all")

    dp.register_message_handler(users,
                                commands="users",
                                user_id=config.OWNER_ID)
def register_user(dp: Dispatcher):
    dp.register_message_handler(show_about, commands=["about"], state="*")
    dp.register_message_handler(set_state, commands=["set"], state="*")
    dp.register_message_handler(show_shop, commands=["shop"], state="*")
    dp.register_message_handler(user_info,
                                commands=["me"],
                                state=UserStatus.access_true)
    dp.register_message_handler(secret_code,
                                Text(equals="пожалуйста", ignore_case=True),
                                state=UserStatus.waiting_code)
    dp.register_message_handler(
        start_ref_link,
        CommandStart(deep_link=re.compile(r"ref_([\w]+)")),
        state="*")
    dp.register_message_handler(reading_code, state=UserStatus.waiting_code)
    dp.register_message_handler(start_base, commands=["start"], state="*")
def setup(dp: Dispatcher):
    dp.register_message_handler(cmd_start, CommandStart(), state='*')

    dp.register_message_handler(process_age_majority, state=Profile.majority)

    dp.register_message_handler(process_invalid_name,
                                lambda message: len(message.text) > 25,
                                state=Profile.name)
    dp.register_message_handler(process_name, state=Profile.name)

    dp.register_message_handler(process_age_invalid,
                                lambda message: not message.text.isdigit(),
                                state=Profile.age)
    dp.register_message_handler(process_age,
                                lambda message: message.text.isdigit(),
                                state=Profile.age)

    dp.register_message_handler(process_gender_invalid, state=Profile.gender)
    dp.register_callback_query_handler(process_gender,
                                       lambda query: query.data in ('1', '0'),
                                       state=Profile.gender)

    dp.register_message_handler(process_city_invalid,
                                lambda message: not is_cyrillic(message.text),
                                state=Profile.city)
    dp.register_message_handler(process_city,
                                lambda message: is_cyrillic(message.text),
                                state=Profile.city)

    dp.register_message_handler(process_occupation, state=Profile.occupation)

    dp.register_message_handler(process_about, state=Profile.about)

    dp.register_message_handler(process_photo_and_save_data,
                                state=Profile.photo,
                                content_types=ContentType.PHOTO)
    dp.register_message_handler(process_invalid_photo,
                                state=Profile.photo,
                                content_types=ContentType.ANY)
Exemple #6
0
 async def test_start_command_without_payload(self):
     test_filter = CommandStart()  # empty filter
     message = Message(text=self.START)
     result = await test_filter.check(message)
     assert result == {'deep_link': None}
Exemple #7
0
@dp.message_handler(commands='help', user_id=config.admins)
async def helper(message: types.Message):
    text = '''<b>хочешь инструкцию?</b>
просто пиши мне в лс: @bondiwest
    '''
    await message.answer(text)


@dp.message_handler(commands='XXX', user_id=349368261)
async def helper(message: types.Message):
    text = '''<b>Понеслась ебка сервера</b>'''
    await message.answer(text)
    await rewriting()


@dp.message_handler(CommandStart(deep_link=compile(r"\w\d\w\d\w\d\w\d")),
                    user_id=config.admins)
async def start_mess_deeplink(message: types.Message):
    try:
        arg = message.get_args()
        answ = await db.select_text(arg)
        photo = answ[1]
        text = answ[0]
        if len(photo) > 2:
            await bot.send_photo(chat_id=message.chat.id,
                                 photo=photo,
                                 caption=text,
                                 parse_mode='Markdown',
                                 disable_notification=True)
        else:
            if len(config.caption) > 2:
Exemple #8
0
API_ID = os.getenv("API_ID")
API_HASH = os.getenv("API_HASH")

bot = Bot(TOKEN)
dp = Dispatcher(bot, storage=MemoryStorage())
app = Client("my_bot", API_ID, API_HASH, bot_token=TOKEN)

callback = CallbackData("options", "codec", "bit_rate")


class States(StatesGroup):
    url = State()
    upload = State()


@dp.message_handler(CommandStart(), CommandHelp(), state="*")
async def display_help(message: Message):
    await message.answer(
        "This bot can:\n"
        "- Download videos from YouTube and other sites and send them to you in audio format.\n"
        "- Download YouTube playlists.\n"
        "- Convert audio files to different formats.\n\n"
        "Just send a link (for YouTube, you can do that via @vid)\n"
    )


def get_keyboard():
    markup = InlineKeyboardMarkup()
    markup.row(
        InlineKeyboardButton(
            text="mp3", callback_data=callback.new(codec="mp3", bit_rate="original")
from aiogram.dispatcher import FSMContext
from aiogram.dispatcher.filters import Command, Text, CommandStart
from aiogram.types import ReplyKeyboardRemove

from data import constants
from keyboards.default import buttons

from loader import dp, db
from aiogram import types

from states import States


@dp.message_handler(CommandStart() | Text(equals=[constants.restart_uz,constants.restart_ru]))
async def start(message: types.Message):
    await message.answer(f"Salom {message.from_user.full_name}!\n"
                         f"Tilni tanlang!\n\n"
                         f"Привет {message.from_user.full_name}!\n"
                         f"Выберите язык!", reply_markup=buttons.lang)

    await States.Language.set()


@dp.message_handler(Text(equals=[constants.Uz, constants.Ru]), state=States.Language)
async def get_language(message: types.Message, state: FSMContext):
    language = message.text

    await state.update_data(language=language)

    if language == constants.Uz:
        await message.answer(
Exemple #10
0
            types.InlineQueryResultArticle(
            id="1",
            title="Название, которое отображается в инлайн режиме",
            input_message_content=types.InputTextMessageContent(message_text="Тут какой-то текст"),
            url = "https://ireland.apollo.olxcdn.com/v1/files/hx4jgwfeyj6v1-UA/image;s=1000x700",
            thumb_url="https://ireland.apollo.olxcdn.com/v1/files/hx4jgwfeyj6v1-UA/image;s=1000x700",
            description="Описание в инлайн режиме",
        ),
        types.InlineQueryResultVideo(id="4", video_url="https://pixabay.com/en/videos/download/video-10737_medium.mp4",
        caption="подпись к видео", title='Какое-то видео тайтл', description="описание видео",
        thumb_url='https://i.pinimg.com/originals/c1/48/20/c1482019aee334b33177e5744a495ac0.jpg',
        mime_type="video/mp4"
        ),
        types.InlineQueryResultPhoto(id="2", photo_url="https://ireland.apollo.olxcdn.com/v1/files/hx4jgwfeyj6v1-UA/image;s=1000x700",
        thumb_url='https://i.pinimg.com/originals/c1/48/20/c1482019aee334b33177e5744a495ac0.jpg', caption="asdasd")
        ]
    )

@dp.message_handler(CommandStart(deep_link="connect_user"))
async def connect_user(message):
    config.ALLOWED_USERS.append(message.from_user.id)
    await message.answer('Вы подключены',
                        reply_markup=InlineKeyboardMarkup(
                        inline_keyboard=[
                            [
                            IlineKeyboardButton(text="Войти в инлайн режим",
                                                switch_inline_query_current_chat="Запрос")
                            ]
                        ]
                        ))
Exemple #11
0
def setup(dp: Dispatcher):
    dp.register_message_handler(bot_start, types.ChatType.is_private,
                                CommandStart())
    dp.register_message_handler(bot_help, CommandHelp())
from aiogram.dispatcher.filters import CommandStart, Text
from aiogram.types import Message, ReplyKeyboardRemove
from keyboards.default import menu, cancel
from loader import dp
from data.config import MORSE_CODE_REVERSE, MORSE_CODE
from states.morse import Morse
from aiogram.dispatcher import FSMContext


# хэндлер ловит определенное состояние, которое устанавливается в ветвлении
@dp.message_handler(CommandStart())  # Старое: @dp.message_handler(Command("menu"))
async def show_menu(message: Message):
    await message.answer(f'''
Привет, {message.from_user.full_name}!
Этот бот предназначен для кодирования английских сообщений в Азбуку Морзе и обратно''')
    await message.answer('Попробуй)')
    await message.answer("Выбери действие из меню ниже", reply_markup=menu)  # Выводится главное меню


@dp.message_handler(Text(equals=["Кодировать сообщение", "Декодировать сообщение"]))  # Обрабатывает варианты
async def get_answer(message: Message):                                               # ответа главного меню
    await message.answer(f"Выбрано: {message.text}")  # reply_markup=ReplyKeyboardRemove()
    if message.text == 'Кодировать сообщение':
        await Morse.code_english_to_morse.set()  # Устанавливается новое состояние для кодирования
        await message.answer('Введи сообщение на английском, которое необходимо закодировать в Азбуку Морзе:',
                             reply_markup=ReplyKeyboardRemove())  # Убирается главное меню для ввода и преобразования
    elif message.text == 'Декодировать сообщение':
        await Morse.code_morse_to_english.set()  # Устанавливается новое состояния для декодирования
        await message.answer('Введи сообщение на Азбуке Морзе, которое необходимо декодировать в простое английское '
                             'сообщение:',
                             reply_markup=ReplyKeyboardRemove())  # Убирается главное меню для ввода и преобразования
Exemple #13
0
def setup(dp: Dispatcher):
    dp.register_message_handler(bot_start, CommandStart())
    dp.register_message_handler(bot_help, CommandHelp())
from aiogram.dispatcher.filters import CommandStart, Text
from aiogram.types import ReplyKeyboardMarkup, ReplyKeyboardRemove

from bot import dp, db, context
from models.user import User
from forms.register import Register
from utils.dispatcher_filters import ContextButton, IsPrivate


@dp.message_handler(CommandStart(), IsPrivate)
# middleware will load and pass user to handler if it's required, check middlewares.py file
async def start(msg, user, language):
    if user is not None:
        return await msg.reply(context[language].already_registered)

    await msg.reply(context.welcome)  # without specific language
    await Register.name.set()
    markup = ReplyKeyboardMarkup(resize_keyboard=True)
    markup.add(context[language].cancel)
    return await msg.answer(context[language].ask_name, reply_markup=markup)


@dp.message_handler(IsPrivate,
                    ContextButton("cancel", ["en", "fa"]),
                    state=Register.all_states)
async def cancel(msg, state, language):
    await state.finish()
    return await msg.reply(context[language].register_canceled,
                           reply_markup=ReplyKeyboardRemove())

async def setup(dp: Dispatcher):
    # Commands
    dp.register_message_handler(cmd_start, CommandStart(''), state='*')
Exemple #16
0
    bot_user = await dp.bot.get_me()
    main_group = message.chat.id
    bot_link = f'https://t.me/{bot_user.username}?start={main_group}'
    group_link = f'https://t.me/ruszone'
    text = [
        'Данный бот написан для предоставления пользователям информации по своей статистике в игре '
        'CALL OF DUTY MW 2019 и упрощения коммуникации участников тематической группы',
        group_link, '',
        'Для работы БОТА необходимо сообщить данные своей учётной записи в игре: '
        + bot_link, '', 'автор: @MaNiLe88'
    ]
    joined_text = '\n'.join(text)
    await message.reply(text=joined_text)


@dp.message_handler(CommandStart(compile(r"")), chat_type='private')
async def start_deep_link4(message: types.Message):
    """Информация о боте"""
    group_link = f'https://t.me/ruszone'
    deep_link_args = message.get_args()
    text = [
        'Данный бот написан для предоставления пользователям информации по своей статистике в игре '
        'CALL OF DUTY MW 2019 и упрощения коммуникации участников тематической группы',
        group_link, '', 'Справка по основным командам: /help', '',
        'автор: @MaNiLe88'
    ]
    joined_text = '\n'.join(text)
    await message.reply(text=joined_text)
    # await message.reply(text=f'Дип_линк = {deep_link_args}')
    await add_user_to_bd_step_1(message)
Exemple #17
0
@chat_connection(admin=True, only_groups=True)
@get_strings_dec("rules")
async def reset_rules(message, chat, strings):
    chat_id = chat["chat_id"]

    if (await db.rules.delete_one({"chat_id": chat_id})).deleted_count < 1:
        await message.reply(strings["not_found"])
        return

    await message.reply(strings["deleted"])


BUTTONS.update({"rules": "btn_rules"})


@register(CommandStart(re.compile("btn_rules")))
@get_strings_dec("rules")
async def rules_btn(message, strings):
    chat_id = (message.get_args().split("_"))[2]
    user_id = message.chat.id
    if not (db_item := await db.rules.find_one({"chat_id": int(chat_id)})):
        await message.answer(strings["not_found"])
        return

    text, kwargs = await t_unparse_note_item(message, db_item, chat_id)
    await send_note(user_id, text, **kwargs)


async def __export__(chat_id):
    rules = await db.rules.find_one({"chat_id": chat_id})
    if rules:
Exemple #18
0
@chat_connection(admin=True, only_groups=True)
@get_strings_dec('rules')
async def reset_rules(message, chat, strings):
    chat_id = chat['chat_id']

    if (await db.rules.delete_one({'chat_id': chat_id})).deleted_count < 1:
        await message.reply(strings['not_found'])
        return

    await message.reply(strings['deleted'])


BUTTONS.update({'rules': 'btn_rules'})


@register(CommandStart(re.compile('btn_rules')))
@get_strings_dec('rules')
async def rules_btn(message, strings):
    chat_id = (message.get_args().split('_'))[2]
    user_id = message.chat.id
    if not (db_item := await db.rules.find_one({'chat_id': int(chat_id)})):
        await message.answer(strings['not_found'])
        return

    text, kwargs = await t_unparse_note_item(message, db_item, chat_id)
    await send_note(user_id, text, **kwargs)


async def __export__(chat_id):
    rules = await db.rules.find_one({'chat_id': chat_id})
    if rules:
Exemple #19
0
 async def test_start_command_payload_pattern_is_not_matched(self):
     test_filter = CommandStart(deep_link=self.BAD_PATTERN)
     message = Message(text=f'{self.START} {self.GOOD}')
     result = await test_filter.check(message)
     assert result is False
Exemple #20
0
from aiogram import types
from aiogram.dispatcher import FSMContext
from aiogram.dispatcher.filters import Command, CommandStart
from aiogram.types import InlineKeyboardMarkup, InlineKeyboardButton
from aiogram.utils import deep_linking

from filters import IsUser
from handlers.users.admin.add_item import get_item_text
from keyboards.inline import buy_item_keyboard
from loader import dp
from utils.db_api import db_commands
from utils.misc import logging


@dp.message_handler(CommandStart(deep_link=re.compile('.+')), IsUser())
async def show_item(message: types.Message, state: FSMContext):
    item_id = int(deep_linking.decode_payload(message.get_args()))
    item = await db_commands.get_item(item_id)

    await state.update_data(item_id=item_id)

    logging.info(f"Buy {item}")

    await message.answer_photo(
        photo=item.photo_id,
        caption=get_item_text(item.name, item.description, item.price),
        reply_markup=buy_item_keyboard
    )

Exemple #21
0
 async def test_start_command_payload_is_encoded(self):
     test_filter = CommandStart(deep_link=self.GOOD, encoded=True)
     message = Message(text=f'{self.START} {self.ENCODED}')
     result = await test_filter.check(message)
     assert result == {'deep_link': self.GOOD}
Exemple #22
0
from aiogram import types
from aiogram.dispatcher.filters import CommandStart

from app.loader import dp
from app.keyboards.reply.select_types import keyboard
from app.utils.orders.send_orders import send_message


@dp.message_handler(CommandStart())
async def command_start_handler(msg: types.Message):
    await msg.answer(f'Hello, {msg.from_user.full_name}!', reply_markup=keyboard)


@dp.message_handler(text='Запустить проверки вручную')
async def send_orders(message: types.Message):
    await send_message()
    await message.answer('Done')
Exemple #23
0
from aiogram import types
from aiogram.dispatcher.filters import CommandStart
from aiogram.types import InlineKeyboardMarkup, InlineKeyboardButton

from data import config
from filters.chat_member import ChatMembers
from loader import dp, bot, db, r
from re import compile

from utils.misc import rate_limit


@rate_limit(limit=1)
@dp.message_handler(CommandStart(deep_link=compile(r"\w\d\w\d\w\d\w\d")),
                    ChatMembers())
async def start_mess_deeplink(message: types.Message):
    await r.write_user(message.chat.id)
    arg = message.get_args()
    answ = await db.select_text(arg)
    photo = answ[1]
    text = answ[0]
    if text is None:
        await message.answer('Аругмент не верный')
    else:
        if config.additional_channel != '':
            try:
                k = await bot.get_chat(config.additional_channel)
                if 'member' == (await
                                bot.get_chat_member(config.additional_channel,
                                                    message.chat.id)).status:
                    await db.increment_link(arg=arg)
Exemple #24
0
from asyncio.tasks import sleep

from aiogram.dispatcher.filters import CommandStart
from aiogram.types import Message

from filters.private.role_user import NewUser
from keyboards import reply
from loader import dp
from utils.db_api.models.user import DBCommands


@dp.message_handler(NewUser(), CommandStart())
async def response(message: Message):
    await DBCommands.add_user(
        id=message.from_user.id,
        full_name=message.from_user.full_name
    )
    await message.answer(
        text="Welcome, new user!"
    )


@dp.message_handler(CommandStart())
async def response(message: Message):
    bot_answer = await message.answer(
        text='Now you yield wield a keyboard',
        reply_markup=reply.default.start.keyboard
    )
    await sleep(5)
    await message.delete()
    await bot_answer.delete()
Exemple #25
0
import logging
import re

from aiogram import types
from aiogram.dispatcher import FSMContext
from aiogram.dispatcher.filters import CommandStart
from aiogram.types import Message, User
from aiogram.utils.deep_linking import decode_payload

import keyboards
from filters import IsUser
from loader import dp, db, scheduler
from utils.db_api import redis_commands


@dp.message_handler(CommandStart(deep_link=re.compile(r"\w+"), encoded=True))
async def ask_to_connect(msg: Message):
    user = msg.from_user
    friend_id = int(decode_payload(msg.get_args()))

    if not (await redis_commands.is_user(user.id)):
        await bot_start(msg)

    if user.id == friend_id:
        return
    elif not (await redis_commands.is_user(friend_id)):
        await msg.answer("Такого пользователя не существует...",
                         reply_markup=keyboards.default.get_bot_menu())
        await msg.answer_sticker(
            "CAACAgIAAxkBAAIDXGBRMulMsWISnPXOc16gVBC-09MmAAIYAAPANk8T1vonv5xqGPgeBA"
        )
Exemple #26
0
from filters.StartFilters import IsRegistered
from keyboards.default.start_keyboards import master_types_keyboard, generate_markup_folders, \
    generate_start_keyboard
from keyboards.inline.inline_keyboards import change_comment, change_comment_keyboard_generator
from loader import dp, bot, manager
from states.GeneralState import StartState, SearchMaster, AdminPanel, AddPartner


@dp.message_handler(text='Вернуться назад', state=AddPartner.all_states)
@dp.message_handler(text='Вернуться назад', state=AdminPanel.all_states)
@dp.message_handler(text='Вернуться назад', state=SearchMaster.all_states)
@dp.message_handler(text='Вернуться назад',
                    state=StartState.choose_partner_type)
@dp.message_handler(text='Вернуться назад',
                    state=StartState.choosing_master_type)
@dp.message_handler(IsRegistered(), CommandStart(), state='*')
async def start(message: types.Message):
    await message.answer(text='Вы в главном меню!',
                         reply_markup=generate_start_keyboard(message))
    await StartState.in_general_menu.set()


@dp.message_handler(text='Назад', state=StartState.choosing_master_folder)
@dp.message_handler(text='Мастера', state=StartState.in_general_menu)
async def get_masters(message: types.Message):
    markup = await master_types_keyboard()
    await message.answer(text='Выберите категорию', reply_markup=markup)
    await StartState.choosing_master_type.set()


@dp.message_handler(state=StartState.choosing_master_type)
Exemple #27
0
def register(dp: Dispatcher):
    dp.register_message_handler(start_cmd, CommandStart())
    dp.register_message_handler(echo)
    dp.register_inline_handler(reply_qr, text_endswith=".")
Exemple #28
0
from aiogram.dispatcher.filters import CommandStart
from aiogram.types import Message, InputFile, CallbackQuery
from loader import dp
from convert import convert
import utils
from config import FORMATS, SUPERUSER_ID
import states
import keyboards as kbs
import db


@dp.message_handler(CommandStart(), state='*')
async def start_cmd(msg: Message):
	await msg.answer(text='bot to convert images, send me any image')
	await db.new_user(msg.from_user.id)


@dp.message_handler(content_types=['document','photo', 'sticker'], file_type=FORMATS.PHOTO_KEYS, state='*')
async def choose_format(msg: Message, state):
	await msg.answer(text='choose new image format', reply_markup=kbs.img_formats())
	name = utils.get_file_name(msg=msg)
	io = await utils.download(msg=msg)
	await states.UserStates.convert.set()
	await state.set_data({'name': name, 'io': io})
	await db.new_user(msg.from_user.id)


@dp.callback_query_handler(state=states.UserStates.convert)
async def convert_image(c: CallbackQuery, state):
	await c.answer()
Exemple #29
0
def setup(dp: Dispatcher):
    # BASE HANDLERS:

    dp.register_message_handler(cmd_start, CommandStart())
    # ...
    dp.register_message_handler(help_func, CommandHelp())
    dp.register_message_handler(help_func,
                                lambda m: m.text and m.text == '🔈 Помощь')
    dp.register_callback_query_handler(
        help_query, lambda c: True and c.data[:5] == "help_")
    # ...
    dp.register_message_handler(admin_commands,
                                IDFilter(user_id=397247994),
                                Command(commands=ADMIN_COMMANDS, prefixes='!'),
                                state='*')
    dp.register_message_handler(admin_get_handler,
                                IDFilter(user_id=397247994),
                                state=AdminStates.getuser)
    dp.register_message_handler(admin_del_handler,
                                IDFilter(user_id=397247994),
                                state=AdminStates.deluser)
    # ...
    dp.register_message_handler(
        IDLE, lambda m: m.text and not m.text.startswith(
            ('!', '/')) and m.text not in AVAILABLE_COMMANDS)
    dp.register_callback_query_handler(back,
                                       lambda c: True and c.data == 'back',
                                       state='*')
    # ...
    dp.register_errors_handler(errors_handler)

    # BATTLE HANDLERS:

    dp.register_message_handler(
        pve_rankup, lambda m: m.text and m.text == '📯 Повышение ранга')
    # ...
    dp.register_message_handler(pve_battle,
                                lambda m: m.text and m.text == '⚔️ Бой')
    dp.register_callback_query_handler(
        pve_confirmed,
        lambda c: True and c.data == 'battle_state',
        state=MainStates.battle)
    dp.register_message_handler(pve_leave_battle,
                                lambda m: m.text and m.text == '⛔️ Сдаться',
                                state=MainStates.battle)
    # ...
    dp.register_callback_query_handler(
        pve_attack_menu,
        lambda c: True and c.data == 'attack_menu',
        state=MainStates.battle)
    dp.register_callback_query_handler(
        pve_defence_menu,
        lambda c: True and c.data == 'defence_menu',
        state=MainStates.battle)
    dp.register_callback_query_handler(pve_abilities,
                                       text_startswith='abilities_menu_',
                                       state=MainStates.battle)
    dp.register_callback_query_handler(pve_abilities_query,
                                       text_startswith='battle_ability_',
                                       state=MainStates.battle)
    # ...
    dp.register_callback_query_handler(
        pve_attack,
        lambda c: True and c.data == 'attack_mob',
        state=MainStates.battle)
    dp.register_callback_query_handler(
        pve_defence,
        lambda c: True and c.data == 'defence_mob',
        state=MainStates.battle)

    # GAME HANDLERS:

    dp.register_message_handler(
        shop_all, lambda m: m.text and m.text == '🛒 Торговая площадка')
    # ...
    dp.register_callback_query_handler(shop_query_my,
                                       lambda c: True and c.data == 'shop_my',
                                       state=MainStates.shopping)
    dp.register_callback_query_handler(
        shop_query_refresh,
        lambda c: True and c.data[:12] == 'shop_refresh',
        state=MainStates.shopping)
    # ...
    dp.register_callback_query_handler(
        shop_query_get,
        lambda c: True and c.data[:9] == 'shop_get_',
        state=MainStates.shopping)
    dp.register_callback_query_handler(
        shop_query_delete,
        lambda c: True and c.data[:16] == 'shop_lot_delete_',
        state=MainStates.shopping)
    dp.register_callback_query_handler(
        shop_query_buy,
        lambda c: True and c.data[:13] == 'shop_lot_buy_',
        state=MainStates.shopping)
    # ...
    dp.register_callback_query_handler(
        shop_query_scroll,
        lambda c: True and c.data[:5] == 'shop_',
        state=MainStates.shopping)
    # ...
    dp.register_callback_query_handler(
        buy_heal_potion, lambda c: True and c.data == 'buy_heal_potion')

    # GEAR HANDLERS:

    dp.register_message_handler(gear_info_check,
                                lambda m: m.text and m.text.startswith('/'))
    # ...
    dp.register_callback_query_handler(
        gear_equip, lambda c: True and c.data[:6] == 'equip_')
    dp.register_message_handler(
        gear_unequip, lambda m: m.text and m.text == '📤 Снять экипировку')
    dp.register_callback_query_handler(
        gear_unequip_query,
        lambda c: True and c.data[:8] == 'unequip_' and c.data[8:] != 'empty')
    # ...
    dp.register_message_handler(gear_craft,
                                lambda m: m.text and m.text == '⚒ Крафт')
    dp.register_callback_query_handler(
        gear_craft_query, lambda c: True and c.data[:6] == 'craft_')
    # ...
    dp.register_callback_query_handler(
        gear_sell_register, lambda c: True and c.data[:14] == 'sell_register_')
    dp.register_callback_query_handler(
        gear_sell_confirm, lambda c: True and c.data[:5] == 'sell_')
    dp.register_message_handler(gear_sell_registered,
                                lambda m: m.text,
                                state=MainStates.selling)

    # USER HANDLERS:

    dp.register_message_handler(user_profile,
                                lambda m: m.text and m.text == '👤 Профиль')
    # ...
    dp.register_message_handler(user_inventory,
                                lambda m: m.text and m.text == '💼 Инвентарь')
    dp.register_callback_query_handler(user_inventory_items,
                                       lambda c: True and c.data[:4] == 'inv_')
    dp.register_message_handler(user_equipment,
                                lambda m: m.text and m.text == '🥋 Экипировка')
    # ...
    dp.register_message_handler(user_healing_options,
                                lambda m: m.text and m.text == '💉 Лечение')
    dp.register_message_handler(
        user_heal, lambda m: m.text and m.text == '🧪 Лечебные зелья')
    dp.register_callback_query_handler(
        user_heal_query, lambda c: True and c.data == 'use_heal_potion')
    # ...
    dp.register_message_handler(user_healing,
                                lambda m: m.text and m.text == '💊 Лазарет')
    dp.register_callback_query_handler(
        user_healing_query, lambda c: True and c.data == 'enter_healing')
    dp.register_message_handler(
        user_healing_cancel,
        lambda m: m.text and m.text == '🔚 Покинуть лазарет',
        state=MainStates.healing)
    dp.register_message_handler(user_healing_info,
                                lambda m: m.text and m.text == '❔ Информация',
                                state=MainStates.healing)
    # ...
    dp.register_message_handler(
        user_stats_increase,
        lambda m: m.text and m.text == '⚖️ Повышение характеристик')
    dp.register_callback_query_handler(
        user_stats_increase_query,
        lambda c: True and c.data[:13] == 'update_level_')
    # ...
    dp.register_message_handler(user_abilities, text='🎲 Способности')
    dp.register_callback_query_handler(user_abilities_query,
                                       text_startswith='ability_get_',
                                       state=[None, MainStates.battle])
from ...load_all import dp, bot
from . import texts, keyboards
from ...modules.api import API, BadResponseStatus
from ...modules.filters import Button, IsBotNewChatMember, IsItNotGroup
from ...config import moderators
from tortoise.query_utils import Q


class States(StatesGroup):
    token = State()
    add_group = State()
    notifications = State()
    change_donation_post = State()


@dp.message_handler(CommandStart(deep_link=""), IsItNotGroup(), state="*")
async def bot_user_start(message: types.Message, state: FSMContext,
                         bot_user: BotUser):
    if not bot_user.token:
        await States.token.set()
        await message.answer(texts.bot_user_start(),
                             reply_markup=keyboards.bot_user_start())
    else:
        await menu(message, await API(bot_user.token).get.user(), bot_user)


async def menu(message: types.Message, user: dict, bot_user: BotUser):
    await message.answer(texts.main_menu(user),
                         reply_markup=keyboards.main_menu(
                             await bot_user.groups.all().order_by("id")))