def group_invite(bot, update, user_data): mes = update.message group = user_data.get("battle_group") if group is None: group = BattleGroup(mes.from_user.id) user_data.update({"battle_group": group}) elif group.creator != mes.from_user.id: bot.send_message( chat_id=mes.from_user.id, text= "Вы не являетесь создателем группы и не можете приглашать в неё новых игроков" ) return id = mes.text.partition(" ")[2] if not id.isdigit(): request = "select id from players where nickname = %s" cursor.execute(request, (id, )) row = cursor.fetchone() if row is None: bot.send_message( chat_id=mes.from_user.id, text="Игрок не найден. Проверьте правильность ввода.") return id = row[0] creator = get_player(mes.from_user.id) invited_player = get_player(id, notify_not_found=False) if invited_player is None: bot.send_message(chat_id=mes.from_user.id, text="Игрок не найден. Проверьте правильность ввода.") return if dispatcher.user_data.get(id).get("battle_group") is not None: bot.send_message(chat_id=mes.from_user.id, text="Данный игрок уже находится в группе.") return group.invitations.append(id) buttons = [ InlineKeyboardButton("Да", callback_data="bgiy {0}".format( mes.from_user.id)), InlineKeyboardButton("Нет", callback_data="bgin {0}".format(mes.from_user.id)) ] reply_markup = InlineKeyboardMarkup(build_menu(buttons, 2)) bot.send_message( chat_id=id, text="<b>{0}</b> пригласил вас в свою группу. Вы примете приглашение?". format(creator.nickname), parse_mode='HTML', reply_markup=reply_markup) bot.send_message(chat_id=mes.from_user.id, text="Приглашение игроку <b>{0}</b> отправлено!".format( invited_player.nickname), parse_mode='HTML')
def fast_travel(bot, update, user_data): player = get_player(update.message.from_user.id) j = travel_jobs.get(player.id) print(j.get_time_left()) if j is not None: j.job.schedule_removal() j.job.run(bot)
def group_leave(bot, update, user_data): mes = update.message group = user_data.get("battle_group") if group is None: bot.send_message(chat_id=mes.chat_id, text="На данный момент вы не состоите в группе.") return if group.creator == mes.from_user.id: for id in group.players: try: dispatcher.user_data.get(id).pop("battle_group") except KeyError: logging.error(traceback.format_exc()) bot.send_message(chat_id=id, text="Ваша группа была распущена") return user_data.pop("battle_group") try: group.players.remove(mes.from_user.id) except ValueError: logging.error(traceback.format_exc()) player = get_player(mes.from_user.id) bot.send_message(chat_id=group.creator, text="<b>{0}</b> покинул вашу группу".format( player.nickname), parse_mode='HTML') bot.send_message(chat_id=mes.chat_id, text="Вы успешно покинули группу")
def lvl_up_points(bot, update, user_data): id = update.message.from_user.id player = get_player(id) if player is None: return if update.message.text == "Готово": player.update_stats() update_status(user_data.get('saved_lvl_up_status'), player, user_data) user_data.pop('saved_lvl_up_status') show_general_buttons(bot, update, user_data) player.lvl_check() return else: player.lvl_up_point(update.message.text) player.free_points -= 1 players.update({id: player}) players_need_update.put(player) if(update.message.text == "заряд"): bot.send_message(chat_id=update.message.chat_id, text="Улучшен <b>{0}</b>".format(update.message.text), parse_mode='HTML') else: bot.send_message(chat_id=update.message.chat_id, text="Улучшена <b>{0}</b>".format(update.message.text), parse_mode='HTML') choose_points(bot, update, user_data)
def parse_travel_jobs(): try: f = open('backup/travel_jobs', 'rb') to_parse = pickle.load(f) f.close() for i in to_parse: player = get_player(i) user_data = dispatcher.user_data.get(i) update_status(user_data.get('status'), player, user_data) dispatcher.user_data[i].update({'saved_status': 'Traveling'}) t = to_parse.get(i) update = Chat_Id_Update(player.id) contexts = { 'chat_id': player.id, 'location_id': user_data.get('new_location'), 'player': player, 'update': update, 'user_data': user_data } j = MyJob( job.run_once(move_player, t[1], context=contexts), t[1], player.id ) # TODO неверно работает, необходимо сохранять не сколько осталось, а когда заканчивается j.start_time = time.time() - t[0] travel_jobs.update({i: j}) except FileNotFoundError: logging.error("Data file not found") except: logging.error(traceback.format_exc())
def return_to_location(bot, update, user_data): player = get_player(update.message.from_user.id) j = travel_jobs.get(player.id) if j is None: bot.send_message( chat_id=update.message.chat_id, text="Вы стоите на месте, наверное вы заблудились /return") return j.job.schedule_removal() j.swap_time() new_loc_id = user_data.get('location') tmp_loc = user_data.get('location') user_data.update({'location': user_data.get('new_location')}) user_data.update({'new_location': tmp_loc}) sec = int(j.get_time_left() % 60) time_str = '' + str(int( j.get_time_left() // 60)) + ':' + ('0' if sec < 10 else '') + str(sec) location_name = locations.get(new_loc_id).name user_data.update({'location_name': location_name}) contexts = { 'chat_id': update.message.chat_id, 'location_id': new_loc_id, 'player': player, 'update': update, 'user_data': user_data } bot.send_message( chat_id=update.message.chat_id, text="Вы решили вернуться в локацию {0}, осталось идти: <b>{1}</b>". format(location_name, time_str), parse_mode='HTML') j.job = job.run_once(move_player, j.get_time_left(), context=contexts)
def commands_count(bot, update): curr_id = update.message.from_user.id count = messages_from_player.get(curr_id) if count is None: count = 0 elif count >= MAX_ALLOWED_COMMANDS_PER_SECOND: muted_players.update({curr_id: time.time() + IGNORE_PLAYER_SECONDS}) bot.send_message( chat_id=curr_id, text= "В целях защиты от спама не пишите больше 3 сообщений в секунду") curr_ban = bans_per_player.get(curr_id) if curr_ban is None: curr_ban = 1 elif curr_ban >= MAX_BANS_PER_PLAYER: muted_players.update({curr_id: time.time() + MUTE_TIME}) bot.send_message( chat_id=curr_id, text= "<b>Слишком много спама, бан по причине СПАМ на {0} минут</b>". format(int(MUTE_TIME / 60)), parse_mode='HTML') curr_ban += 1 bans_per_player.update({curr_id: curr_ban}) count += 1 messages_from_player.update({curr_id: count}) player = get_player(update.message.from_user.id, notify_not_found=False) if player is not None: player.last_message_time = time.time() print('setting time: {}, id: {}'.format(player.last_message_time, player.id))
def avg_lvl(self): lvl_sum = 0 total_players = 0 for curr in self.players: player = get_player(curr) lvl_sum += player.lvl total_players += 1 return lvl_sum / total_players
def farm(bot, update, user_data): player = get_player(update.message.from_user.id) update_status("Farming", player, user_data) print(player.status) user_data.update({'Farming_started': time.time(), 'Farming': True}) player.grind_started_time = time.time() grinding_players.append(player) show_general_buttons(bot, update, user_data)
def lvl_up(bot, update, user_data): # Сюда игрок попадает при нажатии /lvl_up, ему предлагается выбрать скилл id = update.message.from_user.id player = get_player(id) if player is None: start(bot, update, user_data) return user_data.update({'saved_lvl_up_status': user_data.get('status')}) choose_skill(bot, update, user_data)
def pve_start(bot, update, user_data): player = get_player(update.message.from_user.id) battle_group = user_data.get("battle_group") if battle_group is not None: if update.message.from_user.id != battle_group.creator: bot.send_message( chat_id=update.message.from_user.id, text="Только лидер группы может отправляться фармить!") return battle_list = [] for player_id in battle_group.players: curr_player = get_player(player_id) battle_list.append(curr_player) else: battle_list = [player] battle_pve_start(battle_list, [ AIDSEnemy(1), ])
def choose_way(bot, update, user_data): if update.message.text == 'Назад': update_status('In Location', get_player(update.message.from_user.id), user_data) show_general_buttons(bot, update, user_data) return player = get_player(update.message.from_user.id) current_location = locations.get(player.location) paths = current_location.roads loc_name = update.message.text new_loc_id = 0 for i in paths.keys(): tmp_location = i if locations.get(tmp_location).name == loc_name: new_loc_id = tmp_location break if new_loc_id == 0: logging.error('ERROR: NO SUCH ID bot.py in choose_way, id = 0') else: update_status('Traveling', player, user_data) bot.send_message( chat_id=update.message.chat_id, text="Вы отправились в локацию: {0}, до нее идти {1} минут".format( locations.get(new_loc_id).name, paths.get(new_loc_id)), reply_markup=traveling_buttons) contexts = { 'chat_id': update.message.chat_id, 'location_id': new_loc_id, 'player': player, 'update': update, 'user_data': user_data } if filter_is_admin(update.message): bot.send_message(chat_id=update.message.chat_id, text="Вы можете использовать /fasttravel") user_data.update({'new_location': new_loc_id}) tmp_job = job.run_once(move_player, paths.get(new_loc_id) * 60, context=contexts) j = MyJob(tmp_job, paths.get(new_loc_id) * 60, update.message.chat_id) travel_jobs.update({player.id: j}) return
def choose_points(bot, update, user_data): id = update.message.from_user.id player = get_player(id) if(player is None): return free_points = player.free_points if(free_points < 0): player.free_points = 0 free_points = 0 if(free_points == 0): bot.send_message(chat_id = update.message.chat_id, text = "У вас нет свободных очков\n\n" "Выносливость - <b>{0}</b>\nБроня - <b>{1}</b>\n" "Сила - <b>{2}</b>\nСкорость - <b>{3}</b>\n" "Заряд - <b>{4}</b>".format( player.stats.get("endurance"), player.stats.get("armor"), player.stats.get("power"), player.stats.get("speed"), player.stats.get("charge")), parse_mode = "HTML", reply_markup = ReplyKeyboardRemove()) player.update_stats() players.update({id: player}) players_need_update.put(player) update_status(user_data.get('saved_lvl_up_status'), player, user_data) user_data.pop('saved_lvl_up_status') player.update_stats() show_general_buttons(bot, update, user_data) return update_status("Lvl_up_points", player, user_data) button_list = [ KeyboardButton("Выносливость"), KeyboardButton("Броня"), KeyboardButton("Сила"), KeyboardButton("Скорость"), KeyboardButton("Заряд"), KeyboardButton("Готово") ] buttons = ReplyKeyboardMarkup(build_menu(button_list, n_cols=2), resize_keyboard=True, one_time_keyboard=False) s = '' if free_points == 1: s = "характеристику" elif free_points >= 2 or free_points <= 4: s = "характеристики" elif free_points >= 5: s = "характеристик" bot.send_message(chat_id=update.message.chat_id, text="Вы можете улучшить <b>{5}</b> {6}\n\nВыберите характеристику, которую хотите улучшить\n" "Выносливость - <b>{0}</b>\nБроня - <b>{1}</b>\n" "Сила - <b>{2}</b>\nСкорость - <b>{3}</b>\n" "Заряд- <b>{4}</b>".format(player.stats.get("endurance"), player.stats.get("armor"), player.stats.get("power"), player.stats.get("speed"), player.stats.get("charge"), free_points, s), parse_mode='HTML', reply_markup=buttons) players.update({id: player}) players_need_update.put(player)
def return_from_farm(bot, update, user_data): player = get_player(update.message.from_user.id) update_status("In Location", player, user_data) try: user_data.pop('Farming') user_data.pop('Farming_started') except KeyError: pass while player in grinding_players: grinding_players.remove(player) show_general_buttons(bot, update, user_data)
def update_player(bot, update, args): id = None if not args: id = update.message.from_user.id else: id = int(args[0]) player = get_player(id) if player is None: bot.send_message(chat_id=update.message.from_user.id, text="Игрок не найден, проверьте синтаксис") return player.update_from_database() bot.send_message(chat_id=update.message.from_user.id, text="Игрок обновлён")
def lvl_up_skill(bot, update, user_data): id = update.message.from_user.id player = get_player(id) if player is None: return if update.message.text == "Готово": update_status("Lvl_up_points", player, user_data) bot.send_message(chat_id = update.message.from_user.id, text="Теперь выберите очки характеристик") choose_points(bot, update, user_data) else: player.lvl_up_skill(update.message.text) player.free_skill_points -= 1 players.update({id : player}) players_need_update.put(player) bot.send_message(chat_id = update.message.chat_id, text="Улучшен <b>{0}</b> скилл".format(update.message.text), parse_mode='HTML') choose_skill(bot, update, user_data)
def buy(bot, update, user_data): player = get_player(update.message.from_user.id) request = "SELECT equipment_id, item_price FROM merchant_items WHERE item_id = %s" cursor.execute(request, (update.message.text.partition('_')[2], )) row = cursor.fetchone() equipment = get_equipment(row[0]) gold = player.resources.get("gold") if row is None or equipment is None or gold < row[1]: bot.send_message(chat_id=update.message.from_user.id, text="Указанный предмет не найден") return player.resources.update({"gold": gold - row[1]}) player.add_item(player.eq_backpack, equipment, 1) players_need_update.put(player) bot.send_message(chat_id=update.message.from_user.id, text="Вы наслаждаетесь видом новой шмотки")
def travel(bot, update, user_data): player = get_player(update.message.from_user.id) user_data.update({'location': player.location}) user_data.update({'location_name': locations.get(player.location).name}) current_location = locations.get(player.location) paths = current_location.roads path_buttons = [] for i in paths: path_buttons.append(KeyboardButton(locations.get(i).name)) path_buttons.append(KeyboardButton("Назад")) road_buttons = ReplyKeyboardMarkup(build_menu(path_buttons, n_cols=2), resize_keyboard=True, one_time_keyboard=True) bot.send_message(chat_id=update.message.chat_id, text="Вы в локации: {0}".format(current_location.name), reply_markup=road_buttons) update_status('Choosing way', player, user_data)
def battle_group_callback(bot, update, user_data): chat_id = update.callback_query.from_user.id mes = update.callback_query.message data = update.callback_query.data player_id = update.callback_query.from_user.id player = get_player(player_id) if user_data.get("status") != "In Location": bot.send_message(chat_id=chat_id, text="Сейчас вы заняты чем-то ещё") bot.answerCallbackQuery(callback_query_id=update.callback_query.id) return group_id = int(data.partition(" ")[2]) group = dispatcher.user_data.get(group_id).get("battle_group") if group is None: bot.deleteMessage(chat_id=player_id, message_id=mes.message_id) bot.send_message(chat_id=player_id, text="Данная группа не найдена") return if update.callback_query.from_user.id not in group.invitations: bot.deleteMessage(chat_id=player_id, message_id=mes.message_id) bot.send_message(chat_id=player_id, text="Приглашение не найдено") return if data.find("bgiy") == 0: if user_data.get("battle_group") is not None: bot.send_message(chat_id=chat_id, text="Вы уже состоите в группе!") bot.answerCallbackQuery(callback_query_id=update.callback_query.id) return group.invitations.remove(player_id) group.players.append(player_id) user_data.update({"battle_group": group}) bot.deleteMessage(chat_id=player_id, message_id=mes.message_id) bot.send_message(chat_id=player_id, text="Приглашение принято!") bot.send_message( chat_id=group.creator, text="<b>{0}</b> принял ваше приглашение в группу.".format( player.nickname), parse_mode='HTML') else: group.invitations.remove(player_id) bot.deleteMessage(chat_id=player_id, message_id=mes.message_id) bot.send_message(chat_id=player_id, text="Приглашение отклонено.") bot.send_message( chat_id=group.creator, text="<b>{0}</b> отклонил ваше приглашение в группу.".format( player.nickname), parse_mode='HTML')
def group_info(bot, update, user_data): mes = update.message group = user_data.get("battle_group") if group is None: bot.send_message( chat_id=mes.chat_id, text= "На данный момент вы не состоите в группе. Пригласите кого-нибудь! /group_invite" ) return response = "Список игроков в группе:\n" response += "⭐️" for i in range(len(group.players)): player = get_player(group.players[i]) response += "<b>{0}</b>, <b>{1}</b>, Уровень: <b>{2}</b>\n".format( player.nickname, player.game_class, player.lvl) if group.creator == mes.from_user.id and group.creator != player.id: response += "Выгнать из группы: /group_kick_{0}\n".format(i) response += "\n" response += "\nПокинуть группу: /group_leave" bot.send_message(chat_id=mes.chat_id, text=response, parse_mode='HTML')
def loadData(): try: f = open('backup/userdata', 'rb') work_materials.globals.dispatcher.user_data = pickle.load(f) f.close() f = open('backup/battles', 'rb') pending_battles_tmp = pickle.load(f) for i in list(pending_battles_tmp): battle = pending_battles_tmp.get(i) battle.last_count_time = time.time() pending_battles.update({i: battle}) f.close() f = open('backup/grinding_players', 'rb') grinding_players_ids = pickle.load(f) for player_id in grinding_players_ids: player = get_player(player_id) grinding_players.append(player) print("Data picked up") except FileNotFoundError: logging.error("Data file not found") except: logging.error(traceback.format_exc())
def merchant_buy(bot, update, user_data): text = update.message.text player = get_player(update.message.from_user.id) if text == 'Голова': type = "eh" elif text == 'Тело': type = "eb" elif text == 'Перчатки': type = "es" elif text == 'Ноги': type = "ez" elif text == 'Средства передвижения': type = "em" elif text == 'Импланты': type = "ei" else: type = "e" location_id = player.location location_type = 0 if (location_id >= 14 and location_id <= 16) else 1 request = "SELECT item_id, equipment_id, item_name, item_price FROM merchant_items WHERE location_type = %s and item_type = %s" cursor.execute(request, (location_type, type)) row = cursor.fetchone() if row is None: bot.send_message( chat_id=update.message.from_user.id, text="Пройдя в указанный продавцом угол, вы обнаружили" " лишь пыль на давно пустующих полках. Что же, может, в другой раз?" ) return response = "Список товаров:\n" while row: response += "\n<b>{0}</b>\n<b>💰{1}</b>\nПодробнее: /item_{2}\nКупить: /buy_{2}\n".format( row[2], row[3], row[0]) row = cursor.fetchone() bot.send_message(chat_id=update.message.from_user.id, text=response, parse_mode="HTML")
def return_to_location_admin(bot, update, user_data): player_id = update.message.chat_id player = get_player(player_id) update_status('In Location', player, user_data) update_location(player.location, player, user_data) j = travel_jobs.get(player.id) if pending_battles.get(user_data.get("Battle id")) is not None: pending_battles.pop(user_data.get("Battle id")) """list_user_data = list(user_data) if 'saved_battle_status' in list_user_data: user_data.pop('saved_battle_status') if 'chosen skill' in list_user_data: user_data.pop('chosen skill') if 'Battle waiting update' in list_user_data: user_data.pop('Battle waiting update') if 'Battle id' in list_user_data: user_data.pop('Battle id') if 'matchmaking' in list_user_data: user_data.pop('matchmaking') if 'Team' in list_user_data: user_data.pop('Team')""" if 'saved_info_status' in user_data: user_data.pop('saved_info_status') interprocess_dict = InterprocessDictionary(player.id, "battle status return", {}) interprocess_queue.put(interprocess_dict) try: grinding_players.remove(player) user_data.pop('grind_started') user_data.pop('farming_started') except Exception: pass #bot.send_message(chat_id=player_id,text="Вы вернулись в локацию: {0}".format(locations.get(player.location).name)) if j is None: return j.job.schedule_removal()
def return_from_merchant(bot, update, user_data): player = get_player(update.message.from_user.id) update_status(user_data.get('saved_merchant_status'), player, user_data) user_data.pop('saved_merchant_status') show_general_buttons(bot, update, user_data)
def interprocess_monitor(): data = interprocess_queue.get() while data is not None: try: keys = list(data.data.keys()) if data.type == "user_data": user_data = dispatcher.user_data.get(data.id) player = get_player(data.id) if 'status' in keys: update_status(data.data.get('status'), player, user_data) data.data.pop('status') keys.remove('status') for user_data_record in keys: user_data.update( {user_data_record: data.data.get(user_data_record)}) #print(user_data) elif data.type == "battles_pending": for record in keys: pending_battles.update({record: data.data.get(record)}) print("put battle") elif data.type == "battle status return": dispatcher.user_data.get(data.id).update({ 'status': dispatcher.user_data.get( data.id).get('saved_battle_status') }) user_data = dispatcher.user_data.get(data.id) if user_data.get('status') == None: dispatcher.user_data.get(data.id).update( {'status': 'In Location'}) list_user_data = list(user_data) if 'saved_battle_status' in list_user_data: user_data.pop('saved_battle_status') if 'chosen skill' in list_user_data: user_data.pop('chosen skill') if 'Battle_waiting_to_count' in list_user_data: user_data.pop('Battle_waiting_to_count') if 'Battle id' in list_user_data: try: pending_battles.pop(user_data.get('Battle id')) except KeyError: pass user_data.pop('Battle id') if 'matchmaking' in list_user_data: user_data.pop('matchmaking') if 'Team' in list_user_data: user_data.pop('Team') if 'stunned' in list_user_data: user_data.pop('stunned') if 'Test' in list_user_data: user_data.pop('Test') player = get_player(data.id) player.saved_battle_status = None show_general_buttons(dispatcher.bot, player.id, user_data) elif data.type == "remove stun": user_data = dispatcher.user_data.get(data.id) list_user_data = list(user_data) if "stunned" in list_user_data: user_data.pop('stunned') elif data.type == "change_player_state": player = get_player(list(data.data)[0]) list_keys = list(data.data)[1:] for key in list_keys: change_value = data.data.get(key) if key == "exp": player.exp += change_value player.lvl_check() elif key == "dead": player.dead = change_value elif key == "resources": for new_key in change_value: delta = change_value.get(new_key) old_value = player.resourses.get(new_key) if old_value is None: continue old_value += delta player.resources.update({new_key: old_value}) elif key == "eq_backpack": for new_key in change_value: delta = change_value.get(new_key) old_value = player.eq_backpack.get(new_key) if old_value is None: continue old_value += delta player.resources.update({new_key: old_value}) elif key == "al_backpack": for new_key in change_value: delta = change_value.get(new_key) old_value = player.al_backpack.get(new_key) if old_value is None: continue old_value += delta player.resources.update({new_key: old_value}) elif key == "res_backpack": for new_key in change_value: delta = change_value.get(new_key) old_value = player.res_backpack.get(new_key) if old_value is None: continue old_value += delta player.resources.update({new_key: old_value}) players_need_update.put(player) except Exception: logging.error(traceback.format_exc()) data = interprocess_queue.get() return 0
def matchmaking_callback(bot, update, user_data): mes = update.callback_query.message matchmaking = user_data.get("matchmaking") if update.callback_query.data == "mm start" or update.callback_query.data == "mm cancel": group = user_data.get("battle_group") player = get_player(update.callback_query.from_user.id) if update.callback_query.data == "mm cancel": if user_data.get("status") != "Matchmaking" and user_data.get( "status" ) != "Battle": # TODO Как битвы будут готовы, удалить проверку на статус "Battle", сейчас используется для отладки bot.send_message(chat_id=update.callback_query.from_user.id, text="Вы не находитесь в поиске битвы") return player_matchmaking = Player_matchmaking(player, 0, matchmaking, group=group) matchmaking_players.put(player_matchmaking) bot.answerCallbackQuery(callback_query_id=update.callback_query.id, text="Подбор игроков успешно отменён", show_alert=False) try: bot.deleteMessage(chat_id=update.callback_query.from_user.id, message_id=mes.message_id) except Unauthorized: pass except BadRequest: pass new_status = user_data.get('saved_battle_status') update_status(new_status, player, user_data) matchmaking_start(bot, update.callback_query, user_data) return # Начало подбора игроков flag = 0 for i in matchmaking: if i == 1: flag = 1 break if flag == 0: bot.send_message(chat_id=update.callback_query.from_user.id, text="Необходимо выбрать хотя бы один режим") bot.answerCallbackQuery(callback_query_id=update.callback_query.id) return if group is not None and ( matchmaking[0] or (group.num_players() > 3 and matchmaking[1]) or (group.num_players() > 5 and matchmaking[2])): bot.answerCallbackQuery(callback_query_id=update.callback_query.id) bot.send_message( chat_id=update.callback_query.from_user.id, text= "Игроков в группе больше, чем разрешено в выбранных режимах! (Хотя бы одном)" ) return status = user_data.get("status") player.saved_battle_status = status player_matchmaking = Player_matchmaking(player, 1, matchmaking, group=group) # bot.answerCallbackQuery(callback_query_id=update.callback_query.id, text = "Подбор игроков успешно запущен!", show_alert = False) button_list = [ InlineKeyboardButton("Отменить подбор игроков", callback_data="mm cancel") ] reply_markup = InlineKeyboardMarkup(build_menu(button_list, n_cols=1)) try: bot.deleteMessage(chat_id=update.callback_query.from_user.id, message_id=mes.message_id) except TelegramError: pass bot.send_message(chat_id=update.callback_query.from_user.id, text="Подбор игроков запущен!", reply_markup=reply_markup) user_data.update( saved_battle_status=status) if status != 'Matchmaking' else 0 update_status('Matchmaking', player, user_data) matchmaking_players.put(player_matchmaking) return # Настройки матчмейкинга битв callback_data = update.callback_query.data if callback_data == "mm 1x1": matchmaking[0] = (matchmaking[0] + 1) % 2 elif callback_data == "mm 3x3": matchmaking[1] = (matchmaking[1] + 1) % 2 elif callback_data == "mm 5x5": matchmaking[2] = (matchmaking[2] + 1) % 2 first_button_text = "{0}1 x 1".format('✅' if matchmaking[0] else "") second_button_text = "{0}3 x 3".format('✅' if matchmaking[1] else "") third_button_text = "{0}5 x 5".format('✅' if matchmaking[2] else "") button_list = [ InlineKeyboardButton(first_button_text, callback_data="mm 1x1"), InlineKeyboardButton(second_button_text, callback_data="mm 3x3"), InlineKeyboardButton(third_button_text, callback_data="mm 5x5") ] footer_buttons = [ InlineKeyboardButton("Начать поиск", callback_data="mm start") ] reply_markup = InlineKeyboardMarkup( build_menu(button_list, n_cols=3, footer_buttons=footer_buttons)) try: bot.editMessageReplyMarkup(chat_id=mes.chat_id, message_id=mes.message_id, reply_markup=reply_markup) bot.answerCallbackQuery(callback_query_id=update.callback_query.id) except TelegramError: logging.error(traceback.format_exc) pass
def filter(self, message): location_id = get_player(message.from_user.id).location return location_id >= 14 and location_id <= 16 and dispatcher.user_data[ message.from_user.id].get('status') == 'In Location'
def filter(self, message): location_id = get_player(message.from_user.id).location return location_id >= 14 and location_id <= 16
def merchant(bot, update, user_data): player = get_player(update.message.from_user.id) update_status('Merchant', player, user_data) user_data.update({'saved_merchant_status': 'In Location'}) show_general_buttons(bot, update, user_data)
def choose_skill(bot, update, user_data): id = update.message.from_user.id player = get_player(id) if player is None: return free_skill = player.free_skill_points if free_skill < 0: player.free_skill_points = 0 free_skill = 0 if free_skill == 0: button_list = [ KeyboardButton("Выносливость"), KeyboardButton("Броня"), KeyboardButton("Сила"), KeyboardButton("Скорость"), KeyboardButton("Заряд"), KeyboardButton("Готово") ] buttons = ReplyKeyboardMarkup(build_menu(button_list, n_cols=2), resize_keyboard=True, one_time_keyboard=False) bot.send_message(chat_id = update.message.chat_id, text = "У вас нет очков навыков\n\n" "{5} - {0}-го уровня\n{6} - {1}-го уровня\n" "{7} - {2}-го уровня\n{8} - {3}-го уровня\n" "{9} - {4}-го уровня".format(list(player.skill_lvl.values())[0], list(player.skill_lvl.values())[1], list(player.skill_lvl.values())[2], list(player.skill_lvl.values())[3], list(player.skill_lvl.values())[4], list(player.skill_lvl)[0], list(player.skill_lvl)[1], list(player.skill_lvl)[2], list(player.skill_lvl)[3], list(player.skill_lvl)[4]), reply_markup = buttons) update_status("Lvl_up_points", player, user_data) player.update_skills() players.update({id: player}) players_need_update.put(player) choose_points(bot, update, user_data) show_general_buttons(bot, update, user_data) player.lvl_check() return update_status("Lvl_up_skill", player, user_data) button_list = [ KeyboardButton("1"), KeyboardButton("2"), KeyboardButton("3"), KeyboardButton("4"), KeyboardButton("5"), KeyboardButton("Готово") ] buttons = ReplyKeyboardMarkup(build_menu(button_list, n_cols=2), resize_keyboard=True, one_time_keyboard = False) s = '' if free_skill == 1: s = "навык" elif free_skill >= 2 and free_skill <= 4: s = "навыка" elif free_skill >= 5: s = "навыков" bot.send_message(chat_id=update.message.chat_id, text="Вы можете улучшить <b>{5}</b> {6}\n\nВыберите навык, который хотите улучшить\n\n" "{7} - {0}-го уровня\n{8} - {1}-го уровня\n" "{9} - {2}-го уровня\n{10} - {3}-го уровня\n" "{11} - {4}-го уровня".format(list(player.skill_lvl.values())[0], list(player.skill_lvl.values())[1], list(player.skill_lvl.values())[2], list(player.skill_lvl.values())[3], list(player.skill_lvl.values())[4], free_skill, s, list(player.skill_lvl)[0], list(player.skill_lvl)[1], list(player.skill_lvl)[2], list(player.skill_lvl)[3], list(player.skill_lvl)[4]), parse_mode='HTML', reply_markup=buttons) players.update({id: player}) players_need_update.put(player)