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 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")
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 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)
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 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 + ", обновление статистики по всем пользователям закончена!")
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 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()
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())
def setUp(self): DB.init_app('sqlite://') DB.create_all() DB.session.add(User(name='Cristian')) DB.commit()
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)