예제 #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()
    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)
예제 #2
0
async def add_all_psn_to_friends(message: types.Message):
    logger.info(
        f'Хэндлер ADD_ALL_PSN_TO_FRIEND запущен пользователем с id {message.from_user.id} '
        f'({message.from_user.full_name}, {message.from_user.username})')
    await types.ChatActions.typing()
    db = DB()
    members = db.get_all_persons()  # получаем список всех пользователей из БД
    members_with_psn = []
    logger.info(f'Всего профилей в БД: {len(members)}')
    for user in members:
        if user.psn_account is not None:
            logger.debug(f'{user} - PSN указан ({user.psn_account})')
            members_with_psn.append(user)

    logger.info(f'Всего профилей в БД c PSN: {len(members_with_psn)}')  # выводим список пользователей из БД с psn_id
    for item in members_with_psn:
        logger.info(f'профилей в БД c PSN - {item}')
    ps_pars = PSN_Bot(PSN_USERNAME, PSN_EMAIL, PSN_PASSWORD)  # создаем экземпляр браузера
    if not ps_pars.is_logged_in_func():  # проверяем, залогинены ли мы
        ps_pars.login()  # если нет, то логинимся
    psn_friends = ps_pars.friends_list(ps_pars.username)
    logger.info(f'Друзей в PSN: {len(psn_friends)}')  # выводим кол-во друзей
    i = 0
    for item in psn_friends:
        logger.info(f': {i} друг - {item}')  # выводим кол-во друзей в PSN
        i +=1
    members_with_psn_not_friend = members_with_psn
    for user in members_with_psn:
        for psn_friend in psn_friends:
            if user.psn_account == psn_friend['psn']:
                logger.info(f'найден друг с PSN: {user.psn_account}')
                members_with_psn_not_friend.remove(user)
    logger.info(
        f'Пользователей в БД, указавших PSN, но не подружившихся с ботом: {len(members_with_psn_not_friend)}')  # выводим кол-во друзей
    for member_with_psn_not_friend in members_with_psn_not_friend:
        logger.info(f'{member_with_psn_not_friend.psn_account}')

    for user in members_with_psn_not_friend:
        try:
            if ps_pars.psn_status(user.psn_account) == 'Добавить Друга':
                sleeptime = random.randrange(3, 10)
                await asyncio.sleep(sleeptime)
                ps_pars.add_to_friend(user.psn_account)
                await message.answer(str(user.psn_account + ' - направлен в друзья направлен'))
            elif ps_pars.psn_status(user.psn_account) == 'Вы подписаны':
                await message.answer('Скорее всего с пользователем ' + user.psn_id + ' вы уже друзья')
            elif ps_pars.psn_status(user.psn_account) == 'Подписаться':
                await message.answer('запрос на добавление ' + user.psn_account + ' уже был ранее отправлен')
            else:
                logging.exception("Что-то не так")
        except:
            logging.exception("Exception occurred")
예제 #3
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
예제 #4
0
async def show_stats_all(message: types.Message, is_reply=True):
    """показывает статистику всех игроков в базе данных"""
    logger.info(
        f'Хэндлер STATS_ALL запущен пользователем с id {message.from_user.id} '
        f'({message.from_user.full_name}, {message.from_user.username})')
    await types.ChatActions.typing()
    db = DB()
    members = db.get_all_persons()
    logger.info(f'Из БД загружено {len(members)} записей')
    await message.answer(text=f'Кол-во записей в БД: {len(members)}',
                         reply=True)
    for person in members:
        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 = [
            'Имя/ник: ' + 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=False)
예제 #5
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"
            )
예제 #6
0
async def stats_update_all(message: types.Message):
    logger.info(
        f'Хэндлер stats_update_all запущен пользователем с id {message.from_user.id} '
        f'({message.from_user.full_name}, {message.from_user.username})')
    await types.ChatActions.typing()
    db = DB()
    players = db.get_all_persons()
    for player in players:
        await types.ChatActions.typing()
        if player is not None:  # проверяем, смогли ли мы загрузить свою учётку в БД
            if player.modified_kd_at is None:
                logger.info(f'КД ранее ни разу удачно не обновлялось')
                need_to_update_kd = True
            else:
                logger.info(
                    f'Последнее удачное обновление КД произошло {player.modified_kd_at}'
                )
                # сколько прошло секунд с последнего обновления
                timestamp_delta = datetime.now().timestamp(
                ) - player.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=player)
                await message.answer(
                    f'статистика игрока с аккаунтом ACTIVISION {player.activision_account} обновлена'
                )
            else:
                await message.answer(
                    f'Обновление статистики для игрока с аккаунтом ACTIVISION {player.activision_account} не требуется'
                )
    await message.answer(
        message.from_user.first_name +
        ", обновление статистики по всем пользователям закончена!")
예제 #7
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)
예제 #8
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
예제 #9
0
async def add_user_to_bd_step_1(message: types.Message):
    logger.info(
        f'Хэндлер add_me запущен пользователем с id {message.from_user.id} '
        f'({message.from_user.full_name}, {message.from_user.username})')
    await types.ChatActions.typing()
    db = DB()
    if db.is_tg_account_exists(message.from_user.id):
        await message.answer(
            str(message.from_user.first_name) + ", вы уже были зарегистрированы ранее." +
            "\nДля внесения изменений воспользуйтесь командой: /edit_me"
            )
    else:
        tg_account = TG_Account(
            id=message.from_user.id,
            username=message.from_user.username,
            first_name=message.from_user.first_name,
            is_bot=message.from_user.is_bot,
            language_code=message.from_user.language_code,
            modified_at=datetime.now()
        )
        person = Person(tg_account=tg_account)
        try:
            db.session.add(person)
            db.session.commit()
            await message.answer(
                str(message.from_user.first_name) + ", спасибо за регистрацию." +
                "\nДля внесения изменений воспользуйтесь командой: /edit_me"
            )
        except Exception as ex:
            db.session.rollback()
            logger.error(ex)
        keyboard = types.ReplyKeyboardMarkup(resize_keyboard=True)
        keyboard.add("отмена")
        await message.answer(
            "Для правильной работы сообщите мне ACTIVISION_ID:\n" +
            "\nпример: Ivan_Ivanov#123456789"
            , reply_markup=keyboard)
        await OrderAddUser.waiting_for_enter_activision_id.set()
예제 #10
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())
예제 #11
0
 def setUp(self):
     DB.init_app('sqlite://')
     DB.create_all()
     DB.session.add(User(name='Cristian'))
     DB.commit()
예제 #12
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)