def change_update_message(bot, update, user_data): user_data.update({"status": "technical_tower", "location_id": 5}) tower = Location.get_location(5) format_values = tower.special_info.get("enter_text_format_values") format_values[ 0] = "Последнее обновление: {}.\nДля просмотра возьмите страничку сверху 🗂Архива".format( great_format_time(get_current_datetime())) tower.special_info.update({"enter_text_format_values": format_values}) tower.update_location_to_database() last_update_id = tower.special_info.get("last_update_id") last_update_id += 1 tower.special_info.update({"last_update_id": last_update_id}) tower.update_location_to_database() request = "insert into bot_updates (text, date_created) VALUES (%s, %s)" cursor.execute(request, (update.message.text, datetime.datetime.now(tz=moscow_tz).replace(tzinfo=None))) bot.send_message( chat_id=update.message.from_user.id, text= "Обновление успешно опубликовано. Вы спускаетесь, чтобы проверить, что всё выглядит " "хорошо.\n\n<em>В случае, если после этого не последует сообщение с обновлением, " "измените его</em>", parse_mode='HTML') send_general_buttons(update.message.from_user.id, user_data, bot=bot) bot.send_message(chat_id=MY_CHANNEL_ID, text=update.message.text, parse_mode='HTML')
def construct(bot, update, user_data): mes = update.message location_id = None for loc in list(locations.values()): if loc.name == mes.text: location_id = loc.id break if mes.text == '/build_teaparty': location_id = 9 if location_id is None: send_general_buttons(mes.from_user.id, user_data=user_data, bot=bot) return location = Location.get_location(location_id) if location is None: bot.send_message(chat_id=mes.chat_id, text="Локация не найдена.") return if location.state is True or location.building_process < 0: bot.send_message(chat_id=mes.chat_id, text="Локация уже построена или стройка не начиналась.") return context = [update.message.from_user.id, user_data] j = job.run_once(callback=construction_return, when=CONSTRUCTION_DURATION_SECONDS, context=context) old_j = construction_jobs.get(update.message.from_user.id) if old_j is not None: old_j.job.schedule_removal() construction_jobs.update({update.message.from_user.id: MyJob(j, CONSTRUCTION_DURATION_SECONDS)}) user_data.update({"status": "construction", "construction_id": location.id}) buttons = get_general_buttons(user_data) bot.send_message(chat_id=update.message.chat_id, text="Вы отправились на стройку. Это займёт 5 минут.", reply_markup=buttons)
def unknown_input(bot, update, user_data): """ Функция ответа на неопознанный ввод в ЛС - присылает кнопки и текст текущей локации """ if filter_is_pm(update.message): player = Player.get_player(update.message.from_user.id, notify_on_error=False) if player is None: return send_general_buttons(update.message.from_user.id, user_data, bot=bot)
def change_rp(bot, update, user_data): """ Функция смены режима работы бота (команды /change_rp) """ if update.message.from_user.id != update.message.chat_id: return user_data.update({"status": DEFAULT_CASTLE_STATUS}) rp_off = user_data.get("rp_off") if rp_off: user_data.pop("rp_off") send_general_buttons(update.message.from_user.id, user_data, bot=bot) return user_data.update({"status": "rp_off", "rp_off": True}) bot.send_message( chat_id=update.message.chat_id, text="Режим РП отключён. Если Вы захотите снова использовать " "все функции, нажмите /change_rp ещё раз.") send_general_buttons(update.message.from_user.id, user_data, bot=bot)
def change_debrief(bot, update, user_data): """ Непосредственно смена дебрифа на новый """ user_data.update({"status": "throne_room", "location_id": 2}) throne = Location.get_location(2) format_values = throne.special_info.get("enter_text_format_values") format_values[1] = update.message.text throne.special_info.update({"enter_text_format_values": format_values}) throne.update_location_to_database() bot.send_message( chat_id=update.message.from_user.id, text= "Дебриф успешно изменён. Вы выходите в тронный зал, чтобы проверить, что всё выглядит " "хорошо.\n\n<em>В случае, если после этого не последует сообщение с дебрифом, " "измените его</em>", parse_mode='HTML') send_general_buttons(update.message.from_user.id, user_data, bot=bot)
def headquarters(bot, update, user_data): """ Штаб-квартира МИДа """ user_data.update({"status": "headquarters", "location_id": 4}) send_general_buttons(update.message.from_user.id, user_data, bot=bot)
def throne_room(bot, update, user_data): """ Функция, вызываемая при входе в тронный зал """ user_data.update({"status": "throne_room", "location_id": 2}) send_general_buttons(update.message.from_user.id, user_data, bot=bot)
def barracks(bot, update, user_data): """ Функция, вызываемая при входе в казарму """ user_data.update({"status": "barracks", "location_id": 1}) send_general_buttons(update.message.from_user.id, user_data, bot=bot)
def central_square(bot, update, user_data): """ Функция, вызываемая при входе на Центральную Площадь """ user_data.update({"status": "central_square", "location_id": 0}) send_general_buttons(update.message.from_user.id, user_data, bot=bot)
def technical_tower(bot, update, user_data): user_data.update({"status": "technical_tower", "location_id": 5}) send_general_buttons(update.message.from_user.id, user_data, bot=bot)
def treasury(bot, update, user_data): user_data.update({"status": "treasury", "location_id": 6}) send_general_buttons(update.message.from_user.id, user_data, bot=bot)
def tea_party(bot, update, user_data): user_data.update({"status": "tea_party", "location_id": 9}) send_general_buttons(update.message.from_user.id, user_data, bot=bot)
def construction_plate(bot, update, user_data): user_data.update({"status": "construction_plate", "location_id": 7}) send_general_buttons(update.message.from_user.id, user_data, bot=bot)
def hero(bot, update, user_data): mes = update.message text = mes.text castle = re.search("([🍁☘️🖤🐢🦇🌹🍆🎖]+)(.+)", text) nickname = castle.group(2) castle = castle.group(1) if castle != '🖤': pass # Игрок не из Скалы # bot.send_message(chat_id=mes.from_user.id, text="Пользователям не из Скалы запрещена регистрация!") # return player = Player.get_player(mes.from_user.id, notify_on_error=False) if player is not None and player.id == 402027858 and player.castle != '🖤' and castle == '🖤': # Рыбак вернулся! bot.send_message( chat_id=player.id, text= "Стражи с гулким стуком ударяют копьями о землю. Врата медленно " "отворяются, открывая взору такие знакомые, но в то же время изменившиеся улицы.\n" "<b>С возвращением домой!</b>", parse_mode='HTML') if player is None and mes.chat_id != mes.from_user.id: # Добавление новых пользователей только в личке у бота return forward_message_date = utc.localize( mes.forward_date).astimezone(tz=moscow_tz).replace(tzinfo=None) print(forward_message_date) if datetime.datetime.now() - forward_message_date > datetime.timedelta(seconds=30) and \ mes.from_user.id not in urned_players: bot.send_message(chat_id=mes.chat_id, text="Это устаревший профиль.", reply_to_message_id=mes.message_id) return # Парсинг хиро guild_tag = re.search("[🍁☘🖤🐢🦇🌹🍆🎖]\\[(.+)\\]", text) if guild_tag: guild_tag = guild_tag.group(1) lvl = int(re.search("🏅Уровень: (\\d+)", text).group(1)) attack = int(re.search("⚔Атака: (\\d+)", text).group(1)) defense = int(re.search("🛡Защита: (\\d+)", text).group(1)) stamina = int(re.search("🔋Выносливость: \\d+/(\\d+)", text).group(1)) pet = re.search("Питомец:\n.(\\s.+\\(\\d+ lvl\\))", text) exp = int(re.search("🔥Опыт: (\\d+)", text).group(1)) last_updated = datetime.datetime.now(tz=moscow_tz).replace(tzinfo=None) if pet: pet = pet.group(1) # Парсинг экипировки print("parsing eq") player_equipment = { "main_hand": None, "second_hand": None, "head": None, "gloves": None, "armor": None, "boots": None, "cloaks": None } equip_strings = text.partition("🎽Экипировка")[2].splitlines()[1:] for string in equip_strings: # clear_name = re.search("\\+?\\d?\\s?(.+?)\\s\\+", string) clear_name = re.search( "(⚡?\\+?\\d*\\s?(.+?))\\s\\+((\\d*)⚔)?\\s*\\+?(\\d*)🛡?", string) if clear_name is None: # logging.warning("Error while parsing item_string\n{}".format(string)) continue else: pass # logging.info("successful parsed {},, Got: {}".format(string, clear_name.group(1))) full_name = clear_name.group(1) eq_attack = int(clear_name.group(4)) if clear_name.group( 4) is not None and clear_name.group(4) != "" else 0 eq_defense = int( clear_name.group(5)) if clear_name.group(5) != "" else 0 clear_name = clear_name.group(2) eq = get_equipment_by_name(clear_name) if eq is None: logging.warning( "Equipment with name {} is None".format(clear_name)) continue eq.name = full_name eq.attack = eq_attack eq.defense = eq_defense player_equipment.update({eq.place: eq}) if player is None: if mes.from_user.username is None: bot.send_message( chat_id=mes.chat_id, text= "Регистрация без имени пользователя невозможна. Пожалуйста, " "установите его в настройках аккаунта Telegram") return player = Player(mes.from_user.id, mes.from_user.username, nickname, guild_tag, None, lvl, attack, defense, stamina, pet, player_equipment, castle=castle, last_updated=last_updated, created=last_updated, exp=exp) # Добавляем игрока в бд player.insert_into_database() player = player.reload_from_database() user_data.update({"status": DEFAULT_CASTLE_STATUS, "location_id": 0}) bot.send_message( chat_id=mes.chat_id, text= "Добро пожаловать в 🖤Скалу, <b>{}</b>!\n\n<a href=\"https://t.me/joinchat/DdKE7kUfsmDVIC2DJymw_A\">Чат центральной площади</a>\n\nДля добавления информации о классе " "необходимо прислать ответ @ChatWarsBot на кнопку \"🏅Герой\" (рекомендуется сделать для " "получения доступа к некоторых дополнительным фишкам, особенно стражникам).\n\n" "<em>Вы всегда можете отключить рп составляющую бота командой </em>/change_rp.<em> " "Обратите внимание, что это сделает недоступными некоторые функции " "бота.</em>".format(player.nickname), parse_mode='HTML') if filter_is_pm(mes): send_general_buttons(mes.from_user.id, user_data) auth(bot, update) else: # Обновляем существующую информацию player.username = mes.from_user.username player.nickname = nickname player.guild_tag = guild_tag player.lvl = lvl player.attack = attack player.defense = defense player.stamina = stamina player.pet = pet player.equipment = player_equipment player.castle = castle player.last_updated = last_updated player.exp = exp player.update() bot.send_message(chat_id=mes.chat_id, text="Профиль успешно обновлён, <b>{}</b>!".format( player.nickname), parse_mode='HTML') if player.guild is not None: guild = Guild.get_guild(player.guild) guild.calculate_attack_and_defense() guild.sort_players_by_exp()
def back(bot, update, user_data): """ Функция обработки кнопки ↩️Назад (↩️Back) - возврат на предыдущую локацию, а также отмена текущего действия (Добыча ресурсов, квест, ...) """ statuses_back = { "barracks": "central_square", "central_square": "central_square", "castle_gates": "central_square", "throne_room": "central_square", "mid_feedback": "throne_room", "duty_feedback": "castle_gates", "king_cabinet": "throne_room", "headquarters": "throne_room", "changing_castle_message": "king_cabinet", "sending_guild_message": "headquarters", "editing_debrief": "headquarters", "technical_tower": "central_square", "my_cabinet": "technical_tower", "sending_bot_guild_message": "technical_tower", "editing_update_message": "technical_tower", "sawmill": "castle_gates", "quarry": "castle_gates", "construction": "construction_plate", "construction_plate": "central_square", "treasury": "throne_room", "hall_of_fame": "central_square", # "tops": "hall_of_fame", "tops": "central_square", "manuscript": "technical_tower", "guides": "manuscript", "tea_party": "central_square", "exploration": "tea_party", "pit": "tea_party", "roulette": "tea_party", "awaiting_roulette_bet": "roulette", "add_autospend_rule": "barracks" } statuses_rp_off = { "tops": DEFAULT_CASTLE_STATUS, "mid_feedback": DEFAULT_CASTLE_STATUS, "manuscript": DEFAULT_CASTLE_STATUS, } status = user_data.get("status") if status is None: send_general_buttons(update.message.from_user.id, user_data, bot=bot) return if status in [ "sawmill", "quarry", "construction", "exploration", "pit", "waiting_second_player_for_quest", "two_quest" ]: if "quest_name" in user_data: return_from_quest(update.message.from_user.id, user_data) bot.send_message(chat_id=update.message.from_user.id, text="Операция отменена.") rp_off = user_data.get("rp_off") or False new_status = None if rp_off: new_status = statuses_rp_off.get(status) if new_status is None: new_status = statuses_back.get(status) new_location = Location.get_id_by_status(new_status) user_data.update({"status": new_status, "location_id": new_location}) send_general_buttons(update.message.from_user.id, user_data, bot=bot)
def roulette_main(bot, update, user_data): """ Функция, вызывающаяся при входе в рулетку """ user_data.update({"status": "roulette", "location_id": 10}) send_general_buttons(update.message.from_user.id, user_data, bot=bot)
def welcome(bot, update, user_data): """ Функция, вызываемая при успешной регистрации """ send_general_buttons(update.message.from_user.id, user_data, bot=bot)