def create_confirm_user_menu(user: User):
    return botutils.create_menu({
        Locale.CONFIRM:
        f'{Messages.CONFIRM}:{user.telegram_id}',
        Locale.NOT_CONFIRM:
        f'{Messages.NOT_CONFIRM}:{user.telegram_id}',
        Locale.DELETE:
        f'{Messages.DELETE}:{user.telegram_id}'
    })
def ask_for_subscription_by_userid(user_id: str):
    keyboard = botutils.create_menu({
        Locale.CHARACTER_SUBCRIPTION:
        Messages.SUBSCRIBE,
        Locale.CHARACTER_UNSUBCRIPTION:
        Messages.UNSUBSCRIBE
    })

    question = Locale.CHARACTER_QUESTION_ABOUT_SUBCRIPTION
    bot.send_message(user_id, text=question, reply_markup=keyboard)
def send_check_menu(telegram_id: str):
    user = database.get_user(telegram_id)
    keyboard = {}

    for boss_mask in BossMasks.get_list():
        btn_text = botutils.format_boss_check_button_text(boss_mask, user)
        keyboard[btn_text] = f'{Messages.CHECK}:{boss_mask}'

    keyboard[Locale.GO_BACK] = Messages.MENU
    bot.send_message(telegram_id,
                     BossCheck.WILL_NOTIFY,
                     reply_markup=botutils.create_menu(keyboard))
def send_menu_by_user_world_bosses(user):
    menu = {
        Bosses.AZUREGOS: Bosses.AZUREGOS,
        Bosses.KAZZAK: Bosses.KAZZAK,
        Bosses.FERALAS: Bosses.FERALAS,
        Bosses.DUSKWOOD: Bosses.DUSKWOOD,
        Bosses.HINTERLANDS: Bosses.HINTERLANDS,
        Bosses.ASHENVALE: Bosses.ASHENVALE,
        Locale.GO_BACK: Messages.MENU

        #       BossCheck.BEGIN_CHECKING: BossCheck.BEGIN_CHECKING,
        #       BossCheck.CHECK_LIST:  BossCheck.CHECK_LIST
    }
    question = Locale.BOT_MENU_MESSAGE_BOSSES_DESCRIPTION
    bot.send_message(user.telegram_id,
                     text=question,
                     reply_markup=botutils.create_menu(menu))
def callback_worker(call):
    if call.data == Messages.MENU:
        send_menu(call)
    elif call.data == Messages.SUBSCRIBE:
        database.set_subscription(call.from_user.id, Database.USER_SUBSCRIBED)
        bot.send_message(call.from_user.id,
                         Locale.CHARACTER_SUCCESSFUL_SUBCRIPTION)
        send_menu(call)
    elif call.data == Messages.UNSUBSCRIBE:
        database.set_subscription(call.from_user.id,
                                  Database.USER_UNSUBSCRIBED)
        bot.send_message(call.from_user.id,
                         Locale.CHARACTER_SUCCESSFUL_UNSUBCRIPTION)
        send_menu(call)

#
    elif call.data == Messages.WORLD_BOSSES:
        send_menu_bosses(call)


#
    elif call.data in Bosses.getList():
        notify_all(call.data, call.from_user.id)
    elif call.data == BossCheck.BEGIN_CHECKING:
        send_check_menu(call.from_user.id)

    elif call.data == BossCheck.CHECK_LIST:
        text = ''
        for boss_mask in BossMasks.boss_list():
            text += f'{BossCheck.CHECK(boss_mask,database.get_users_by_mask(boss_mask))}\n\n'

        bot.send_message(call.from_user.id,
                         text,
                         parse_mode='markdown',
                         reply_markup=botutils.create_menu(
                             {Locale.GO_BACK: Messages.MENU}))

    elif call.data.startswith(Messages.CHECK):
        boss_mask = int(call.data.split(':')[1])
        if (boss_mask in [BossMasks.ALL, BossMasks.NONE]):
            database.update_user(call.from_user.id, Database.FIELD_BOSS_MASK,
                                 boss_mask)
        else:
            database.toggle_user_mask(boss_mask, call.from_user.id)
        send_check_menu(call.from_user.id)
def send_menu_by_user(user):
    menu = {
        Locale.BOT_MENU_MESSAGE_BOSSES: Messages.WORLD_BOSSES,
        BossCheck.BEGIN_CHECKING: BossCheck.BEGIN_CHECKING,
        BossCheck.CHECK_LIST: BossCheck.CHECK_LIST
    }

    if user.subscribed == Database.USER_SUBSCRIBED:
        menu[Locale.CHARACTER_UNSUBCRIPTION] = Messages.UNSUBSCRIBE
    else:
        menu[Locale.CHARACTER_SUBCRIPTION] = Messages.SUBSCRIBE

    if user.status >= Statuses.ADMIN:
        menu[Locale.BOT_ADMIN_MENU] = Messages.ADMIN

    question = Locale.BOT_MENU_MESSAGE
    bot.send_message(user.telegram_id,
                     text=question,
                     reply_markup=botutils.create_menu(menu))
def handle_admin_click(call):
    if call.data == Messages.ADMIN:
        menu = {
            Admin.ALL_USERS: f'{Messages.ALL_USERS}:0',
            Admin.ALL_GUILDS: Messages.ALL_GUILDS,
            Admin.ALL_PENDING_USERS: Messages.ALL_PENDING_USERS,
            Admin.ALL_BANNED_USERS: Messages.ALL_BANNED_USERS,
            Admin.ALL_ADMINS: Messages.ALL_ADMINS,
            Admin.CHANGE_USER_STATUS: Messages.CHANGE_USER_STATUS,
            Admin.ADD_GUILD: Messages.ADD_GUILD,
            Admin.MESSAGE_TO_ALL_TITLE: Messages.MESSAGE_TO_ALL,
            Locale.GO_BACK: Messages.MENU
        }

        question = Locale.BOT_ADMIN_MENU
        bot.send_message(call.from_user.id,
                         text=question,
                         reply_markup=botutils.create_menu(menu))

    elif call.data.startswith(Messages.ALL_USERS):
        page = int(call.data.split(':')[1])
        page_count = ceil(database.get_users_count() / Database.PAGE_SIZE)
        users = database.get_users_page(page)

        keyboard = botutils.create_page_menu(page, page_count)

        bot.send_message(chat_id=call.from_user.id,
                         text=botutils.format_users_as_table(users),
                         parse_mode='Markdown',
                         reply_markup=keyboard)

    elif call.data == Messages.ALL_GUILDS:
        guilds = database.get_all_guilds()
        bot.send_message(chat_id=call.from_user.id,
                         text=botutils.format_guilds_as_table(guilds),
                         parse_mode='Markdown')

    elif call.data == Messages.ALL_PENDING_USERS:
        pending_users = database.get_all_pending_users()
        if len(pending_users) == 0:
            bot.send_message(call.from_user.id, Admin.USERS_EMPTY)
        else:
            bot.send_message(
                chat_id=call.from_user.id,
                text=botutils.format_users_as_table(pending_users),
                parse_mode='Markdown')

    elif call.data == Messages.ALL_BANNED_USERS:
        banned_users = database.get_all_banned_users()
        if len(banned_users) == 0:
            bot.send_message(call.from_user.id, Admin.USERS_EMPTY)
        else:
            bot.send_message(chat_id=call.from_user.id,
                             text=botutils.format_users_as_table(banned_users),
                             parse_mode='Markdown')

    elif call.data == Messages.ALL_ADMINS:
        all_admins = database.get_all_admins()
        if len(all_admins) == 0:
            bot.send_message(call.from_user.id, Admin.USERS_EMPTY)
        else:
            bot.send_message(chat_id=call.from_user.id,
                             text=botutils.format_users_as_table(all_admins),
                             parse_mode='Markdown')

    elif call.data == Messages.ADD_GUILD:
        user = database.get_user(call.from_user.id)
        if user.status in [Statuses.SUPERVISOR]:
            bot.send_message(call.from_user.id, Locale.GUILD_NAME)
            bot.register_next_step_handler_by_chat_id(call.from_user.id,
                                                      add_guild)
        else:
            bot.send_message(call.from_user.id, Admin.NO_PERMITTIONS)

    elif call.data == Messages.MESSAGE_TO_ALL:
        bot.send_message(call.from_user.id, Admin.MESSAGE_TEXT)
        bot.register_next_step_handler_by_chat_id(call.from_user.id,
                                                  message_to_subscribed_users)

    elif call.data == Messages.CHANGE_USER_STATUS:
        bot.send_message(call.from_user.id, Admin.SELECT_USER_STATUS_BY_ID)
        bot.register_next_step_handler_by_chat_id(call.from_user.id,
                                                  user_id_exists)

    elif call.data.startswith(Messages.ADD_ADMIN):
        user_id = call.data.split(':')[1]
        database.update_user(user_id, Database.FIELD_STATUS, Statuses.ADMIN)
        bot.send_message(user_id, Admin.CHANGE_USER_STATUS_BY_ID_ADD_ADMIN)
        bot.send_message(call.from_user.id,
                         Admin.CHANGE_USER_STATUS_BY_ID_SUCCESSFUL)
        notify_all_admins(call.from_user.id, user_id)

    elif call.data.startswith(Messages.CONFIRM):
        user_id = call.data.split(':')[1]
        database.update_user(user_id, Database.FIELD_STATUS, Statuses.ACTIVE)
        bot.send_message(user_id, Locale.CHARACTER_REG_SUCCESSFUL)
        ask_for_subscription_by_userid(user_id)
        bot.send_message(call.from_user.id,
                         Admin.CHANGE_USER_STATUS_BY_ID_SUCCESSFUL)
        notify_all_admins(call.from_user.id, user_id)

    elif call.data.startswith(Messages.NOT_CONFIRM):
        user_id = call.data.split(':')[1]
        database.update_user(user_id, Database.FIELD_STATUS, Statuses.BANNED)
        bot.send_message(user_id, Locale.CHARACTER_REG_BANNED)
        bot.send_message(call.from_user.id,
                         Admin.CHANGE_USER_STATUS_BY_ID_SUCCESSFUL)
        notify_all_admins(call.from_user.id, user_id)

    elif call.data.startswith(Messages.DELETE):
        user_id = call.data.split(':')[1]
        notify_all_admins_about_delete(call.from_user.id, user_id)
        database.remove_user(user_id)
        bot.send_message(user_id, Locale.CHARACTER_REG_FAILED)

    elif call.data == Messages.ADMIN:
        database.set_subscription(call.from_user.id,
                                  Database.DB_USER_SUBSCRIBED)
        bot.send_message(call.from_user.id,
                         Locale.CHARACTER_SUCCESSFUL_SUBCRIPTION)

    else:
        callback_worker(call)