Esempio n. 1
0
def mentioned_user_list(message: types.Message):
    """Возвращает списком всех упомянутых пользователей"""
    tg_account_list = []
    db = DB()
    members = []

    # часть кода, чтобы узнать есть ли в сообщении текст, кроме текста команд
    message_text = message.text
    pattern = re.compile('/+\w{0,100}')  # паттерн, для нахождения команд в тексте
    all_commands = re.findall(pattern, message_text)  # список всех команд в тексте
    for item in all_commands:
        message_text = message_text.replace(item, '', 1)
    print('ТЕКСТ БЕЗ КОМАНД: ', message_text)
    if message_text == '':
        print('а текст то пустой =)')
        return []
    # часть кода, для mention
    pattern = re.compile('@+\w{0,100}')  # паттерн, для нахождения упоминаний в тексте
    username_list = re.findall(pattern, message.text)  # Список упоминаний по username в данном сообщении
    logger.info(f'В указанном тексте {len(username_list)} упоминаний по username')
    if len(username_list) > 0:
        for mention in username_list:
            mention = mention.replace('@', '')  # Удалим из списка символ @
            logger.info(f'обнаружено упоминание Username = {mention}')
            tg_account = db.get_tg_account(tg_username=mention)
            if tg_account is not None:
                tg_account_list.append(tg_account)

    # часть кода, для text_mention
    text_mentions = []
    for entity in message.entities:
        if entity.type == 'text_mention':
            text_mentions.append(entity)
    logger.info(f'В указанном тексте {len(text_mentions)} упоминаний по text_mention')
    if len(text_mentions) > 0:
        for entity in text_mentions:  # перебираем сущности, являюзиеся текстовыми упоминаниями
            if entity.type == 'text_mention':  # если находим упоминания
                logger.info('text_mention обнаружен')
                tg_account = db.get_tg_account(tg_id=entity.user.id)
                if tg_account is not None:
                    tg_account_list.append(tg_account)


    if len(tg_account_list) > 0:
        for tg_account in tg_account_list:
            member = db.get_person_by_tg_account(tg_account)
            if member is not None:
                logger.info(f'найден аккаунт, соответствующий данному username: {member}')
                members.append(member)
            else:
                logger.info(f'аккаунт, соответствующий {tg_account} не обнаружен')
    return members
Esempio n. 2
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()
    cod_user: Person
    # находим кол-во упомянутых пользователей
    persons = mentioned_user_list(message)
    print('Кол-во идентифицированных упомянутых пользователей: ', len(persons))
    # если 0, то или cod_user - это вы, или прерываем хендлер
    if len(persons) == 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Для регистрации напишите боту в ПРИВАТНОМ ЧАТЕ команду: /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 edit_person_in_bd(cod_user, message, state)
Esempio n. 3
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())
Esempio n. 4
0
async def stat_update_handler(message: types.Message):
    await types.ChatActions.typing()
    db = DB()
    tg_account = db.get_tg_account(tg_id=message.from_user.id)
    if tg_account is not None:
        member = db.get_person_by_tg_account(tg_account=tg_account)
        print(member)
        if await stat_update(person=member, db=db):
            await message.answer(message.from_user.first_name +
                                 ", статистика обновлена")
        else:
            await message.answer(
                message.from_user.first_name +
                ", вам необходимо уточнить свой ACTIVISION_ID, для этого воспользуйтесь командой /add_me"
            )
Esempio n. 5
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()
    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 edit_person_in_bd(person, message, state)
Esempio n. 6
0
def update_tg_account(from_tg_user) -> bool:
    """Обновляем аккаунт телеграм в БД"""
    db = DB()
    try:
        tg_account = db.get_tg_account(tg_id=from_tg_user.id)
        tg_account.username = from_tg_user.username
        tg_account.first_name = from_tg_user.first_name
        tg_account.is_bot = from_tg_user.is_bot
        tg_account.language_code = from_tg_user.language_code
        tg_account.modified_at = datetime.now()
        db.session.add(tg_account)
        db.session.commit()
        logger.info(f'{tg_account} - успешное обновление в БД')
        return True
    except Exception as ex:
        logger.info(f'Обновление в БД с ОШИБКОЙ {ex}')
        db.session.rollback()
        return False
Esempio n. 7
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)