Example #1
0
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')
Example #2
0
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)
Example #3
0
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="Вы успешно покинули группу")
Example #4
0
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)
Example #5
0
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())
Example #6
0
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)
Example #7
0
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))
Example #8
0
 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
Example #9
0
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)
Example #10
0
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)
Example #11
0
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),
    ])
Example #12
0
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
Example #13
0
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)
Example #14
0
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)
Example #15
0
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="Игрок обновлён")
Example #16
0
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)
Example #17
0
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="Вы наслаждаетесь видом новой шмотки")
Example #18
0
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)
Example #19
0
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')
Example #20
0
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')
Example #21
0
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())
Example #22
0
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")
Example #23
0
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()
Example #24
0
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)
Example #25
0
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
Example #26
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
Example #27
0
 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'
Example #28
0
 def filter(self, message):
     location_id = get_player(message.from_user.id).location
     return location_id >= 14 and location_id <= 16
Example #29
0
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)
Example #30
0
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)