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
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)
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())
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" )
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)
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
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)