Пример #1
0
async def edit_mentioned_person_in_bd(message: types.Message,
                                      state: FSMContext):
    logger.info(
        f'Хэндлер edit_person запущен пользователем с id {message.from_user.id} '
        f'({message.from_user.full_name}, {message.from_user.username})')
    await types.ChatActions.typing()
    await OrderEditUser.step_0.set()  # Устанавливаем состояние step_0
    cod_user: Person
    # находим кол-во упомянутых пользователей
    persons = mentioned_user_list(message)
    print('Кол-во идентифицированных упомянутых пользователей: ', len(persons))
    # если 0, то или cod_user - это вы, или прерываем хендлер
    db = DB()
    if len(persons) == 0:
        update_tg_account(message.from_user)
        if db.is_tg_account_exists(message.from_user.id) is False:
            await message.answer(
                str(message.from_user.first_name) +
                ", для выполнения данной команды вы должны зарегистрироваться."
                +
                "\nДля регистрации напишите боту в ПРИВАТНОМ ЧАТЕ команду: /add_me"
            )
            return
        else:
            tg_account = db.get_tg_account(tg_id=message.from_user.id)
            cod_user = db.get_person_by_tg_account(tg_account=tg_account)
        logger.info(
            f'В тексте сообщения не найдено упоминаний людей, ранее зарегистрированных в базе данных.'
        )
        await message.reply(
            'В тексте сообщения не найдено упоминаний людей, ранее зарегистрированных в базе данных.'
        )
        await message.answer('Вывожу информацию о тебе...')  # tckb ytn
    # если 1, то он и есть cod_user
    elif len(persons) == 1:
        cod_user = persons[0]
        logger.info(
            f'В тексте сообщения найдено упоминание пользователя, ранее зарегистрированного в базе данных'
        )
        await message.reply(
            'В тексте сообщения найдено упоминание пользователя, ранее зарегистрированного в базе данных'
        )
        await message.answer('Вывожу информацию об этом пользователе...')
    # если несколько - то первый из упомянутых - cod_user
    else:
        cod_user = persons[0]
        logger.info(
            f'В тексте найдено сообщения упоминание нескольких пользователей, ранее зарегистрированных в базе данных, начато редактирование пользователя {cod_user.tg_account}'
        )
        await message.reply(
            f'В тексте найдено сообщения упоминание нескольких пользователей, ранее зарегистрированных в базе данных'
        )
        await message.answer(
            f'Вывожу информацию об этом пользователе...{cod_user.tg_account}')
    await OrderEditUser.step_1.set()  # Устанавливаем состояние step_1
    await edit_person_in_bd(db, cod_user, message, state)
Пример #2
0
async def show_full_profile_info(message: types.Message, is_reply=True):
    """показывает данные пользователя"""
    logger.info(
        f'Хэндлер show_full_profile_info запущен пользователем с id {message.from_user.id} '
        f'({message.from_user.full_name}, {message.from_user.username})')
    await types.ChatActions.typing()
    update_tg_account(message.from_user)
    db = DB()
    if not db.get_person_by_tg_account(db.get_tg_account(
            message.from_user.id)):
        await message.answer(
            'Для отображения статистики необходимо сообщить мне свой ACTIVISION ID: /add_me',
            reply=True)
    else:
        tg_acc = db.get_tg_account(message.from_user.id)
        print(tg_acc)
        cod_user = db.get_person_by_tg_account(tg_acc)
        print(cod_user)
        full_text = full_profile_info(cod_user)
        await message.answer(full_text, reply=is_reply, parse_mode=text())
Пример #3
0
async def edit_me_in_bd(message: types.Message, state: FSMContext):
    logger.info(
        f'Хэндлер edit_me запущен пользователем с id {message.from_user.id} '
        f'({message.from_user.full_name}, {message.from_user.username})')
    await types.ChatActions.typing()
    await OrderEditUser.step_0.set()  # Устанавливаем состояние step_0

    db = DB()
    update_tg_account(message.from_user)
    if db.is_tg_account_exists(message.from_user.id) is False:
        await message.answer(
            str(message.from_user.first_name) +
            ", для выполнения данной команды вы должны зарегистрироваться." +
            "\nДля регистрации перейдите в ПРИВАТНЫЙ ЧАТ с ботом", )
        await state.finish()
        return
    else:
        tg_account = db.get_tg_account(tg_id=message.from_user.id)
        person = db.get_person_by_tg_account(tg_account=tg_account)
        await OrderEditUser.step_1.set()  # Устанавливаем состояние step_1
        await edit_person_in_bd(db, person, message, state)
Пример #4
0
async def command_me(message: types.Message, state: FSMContext):
    message_id = message.message_id

    await types.ChatActions.typing()
    data = await state.get_data()
    logger.info(f'Пользователь {message.from_user.full_name} '
                f'(ID: {message.from_user.id}) указал значение {message.text}')

    db = DB()
    person = Person(tg_account=TG_Account(id=message.from_user.id))
    if data['selected_account'] == 'psn_account':
        person.psn_account = message.text
    if data['selected_account'] == 'blizzard_account':
        person.blizzard_account = message.text
    if data['selected_account'] == 'activision_account':
        person.psn_account = message.text
    if data['selected_account'] == 'xbox_account':
        person.psn_account = message.text
    db.session.add(person)
    db.session.commit()
    update_tg_account(from_tg_user=message.from_user)

    db.session.commit()
    text = [
        f'{message.from_user.full_name}, спасибо за регистрацию.',
        '',
        f'Что я могу для тебя сделать?',
    ]

    inline_kb = inline_kb1_shoe_profile_or_stats
    await CommandMeState.show_profile_or_stats.set()
    joined_text = '\n'.join(text)
    await bot.edit_message_text(chat_id=message.from_user.id,
                                message_id=data['main_message_id'],
                                text=joined_text,
                                reply_markup=inline_kb)
    await bot.delete_message(chat_id=message.from_user.id,
                             message_id=message_id)
    db.close()
Пример #5
0
async def callback_show_statistics(query: types.CallbackQuery,
                                   state: FSMContext):
    await types.ChatActions.typing()
    data = await state.get_data()
    main_message_id = data['main_message_id']
    logger.info(
        f'Пользователь {query.from_user.full_name} '
        f'(ID: {query.from_user.id}) нажал инлайн кнопку ПОКАЗАТЬ СТАТИСТИКУ')

    db = DB()
    await bot.answer_callback_query(callback_query_id=query.id)
    tg_account = db.get_tg_account(tg_id=query.from_user.id)
    update_tg_account(query.from_user)

    person = db.get_person_by_tg_account(tg_account=tg_account)
    update_statistics_if_needs(db, person)

    await types.ChatActions.typing()
    name_or_nickname = 'empty'
    if person.name_or_nickname is not None:
        name_or_nickname = str(person.name_or_nickname)
    username = '******'
    if person.tg_account.username is not None:
        username = str(person.tg_account.username)
    activision_account = 'empty'
    if person.activision_account is not None:
        activision_account = str(person.activision_account)
    psn_account = 'empty'
    if person.psn_account is not None:
        psn_account = str(person.psn_account)
    kd_warzone = 'empty'
    if person.kd_warzone is not None:
        kd_warzone = str(float(person.kd_warzone))
    kd_multiplayer = 'empty'
    if person.kd_multiplayer is not None:
        kd_multiplayer = str(float(person.kd_multiplayer))
    kd_cold_war_multiplayer = 'empty'
    if person.kd_cold_war_multiplayer is not None:
        kd_cold_war_multiplayer = str(float(person.kd_cold_war_multiplayer))
    modified_kd_at = 'empty'
    if person.modified_kd_at is not None:
        modified_kd_at = str(person.modified_kd_at.strftime("%d.%m.%Y")) + \
                         '\n' + str(person.modified_kd_at.strftime("%H:%M:%S"))
    text_by_strings = [
        f'Имя/ник: <b>{name_or_nickname}</b>',
        f'Имя в Телеге: <b>{username}</b>',
        f'Аккаунт ACTIVISION: <b>{activision_account}</b>',
        f'Аккаунт PSN: <b>{psn_account}</b>',
        f'К/Д WarZone: <b>{kd_warzone}</b>',
        f'К/Д в мультиплеере(MW19): <b>{kd_multiplayer}</b>',
        f'К/Д в Cold War: <b>{kd_cold_war_multiplayer}</b>', '',
        f'Last update: ', f'<b>{modified_kd_at}</b>'
    ]
    full_text = '\n'.join(text_by_strings)
    await bot.edit_message_text(chat_id=query.from_user.id,
                                message_id=main_message_id,
                                text=full_text,
                                parse_mode=types.ParseMode.HTML,
                                reply_markup=inline.inline_kb_go_back)
    db.close()
    await CommandMeState.show_profile_or_stats.set()
Пример #6
0
async def show_stat(message: types.Message):
    logger.info(
        f'Хэндлер STAT запущен пользователем с id {message.from_user.id} '
        f'({message.from_user.full_name}, {message.from_user.username})')
    """показывает статистику игрока"""
    await types.ChatActions.typing()
    db = DB()
    update_tg_account(message.from_user)

    members = mentioned_user_list(message)

    # если упоминаний нет, то добавляем в список себя
    if len(members) == 0:
        logger.info(
            f'Не найдено ни каких упоминаний, выводим статистику по себе...')
        tg_account = db.get_tg_account(tg_id=message.from_user.id)
        logger.info(f'{tg_account=}')
        try:
            me = db.get_person_by_tg_account(tg_account)
            if me is not None:  # проверяем, смогли ли мы загрузить свою учётку в БД
                if me.modified_kd_at is None:
                    logger.info(f'КД ранее ни разу удачно не обновлялось')
                    need_to_update_kd = True
                else:
                    logger.info(
                        f'Последнее удачное обновление КД произошло {me.modified_kd_at}'
                    )
                    # сколько прошло секунд с последнего обновления
                    timestamp_delta = datetime.now().timestamp(
                    ) - me.modified_kd_at.timestamp()
                    # переводим секунды в часы, с округлением вниз
                    hours_delta_int = math.floor(timestamp_delta / (60 * 60))
                    logger.info(
                        f'Последнее удачное обновление КД было {hours_delta_int} часов назад'
                    )
                    hours = 10  # как часто обновлять КД
                    if hours_delta_int > hours:
                        need_to_update_kd = True
                    else:
                        need_to_update_kd = False
                        logger.info(
                            f'КД обновляется на чаще раза в {hours} часов. Еще не пришло время обновлять КД'
                        )
                if need_to_update_kd:
                    logger.info(f'Обновляем КД')
                    await stat_update(db=db, person=me)
                members.append(me)
        except Exception as ex:
            print(ex)
            await message.answer(
                'Ошибка: пользователь не найден в базе данных.\nДля работы БОТА необходимо открыть ПРИВАТНЫЙ чат с ним и зарегистрироваться.',
                reply=True)

    for person in members:
        await types.ChatActions.typing(2)
        name_or_nickname = 'empty'
        if person.name_or_nickname is not None:
            name_or_nickname = str(person.name_or_nickname)
        username = '******'
        if person.tg_account.username is not None:
            username = str(person.tg_account.username)
        activision_account = 'empty'
        if person.activision_account is not None:
            activision_account = str(person.activision_account)
        psn_account = 'empty'
        if person.psn_account is not None:
            psn_account = str(person.psn_account)
        kd_warzone = 'empty'
        if person.kd_warzone is not None:
            kd_warzone = str(float(person.kd_warzone))
        kd_multiplayer = 'empty'
        if person.kd_multiplayer is not None:
            kd_multiplayer = str(float(person.kd_multiplayer))
        kd_cold_war_multiplayer = 'empty'
        if person.kd_cold_war_multiplayer is not None:
            kd_cold_war_multiplayer = str(float(
                person.kd_cold_war_multiplayer))
        modified_kd_at = 'empty'
        if person.modified_kd_at is not None:
            modified_kd_at = str(person.modified_kd_at.strftime("%d.%m.%Y")) + \
                             '\n' + str(person.modified_kd_at.strftime("%H:%M:%S"))
        text_by_strings = [
            'Имя/ник: ' + name_or_nickname, 'Имя в Телеге: ' + username,
            'Аккаунт ACTIVISION: ' + activision_account,
            'Аккаунт PSN: ' + psn_account, 'К/Д WarZone: ' + kd_warzone,
            'К/Д в мультиплеере(MW19): ' + kd_multiplayer,
            'К/Д в Cold War: ' + kd_cold_war_multiplayer, '', 'Last update: ',
            modified_kd_at
        ]
        full_text = '\n'.join(
            text_by_strings)  # красивый способ объеденить строки с пререносами
        await message.answer(text=full_text, reply=True)