Пример #1
0
def do_run_program(player, bot, gamedata, pdb, program_id):
    with pdb.connect() as conn:
        player.update_lore(gamedata)
        update_player(player, conn)
        if program_id not in player._installed_soft:
            bot.send_message(player._chat_id,
                             u"Нужно сперва скомпилировать программу")
            return
        program = gamedata._programs[program_id]
        cpu_ok = (player.get_cpu() -
                  player.get_used_cpu(gamedata)) >= program._cpu_usage
        ram_ok = (player.get_ram() -
                  player.get_used_ram(gamedata)) >= program._ram_usage
        if cpu_ok and ram_ok:
            player._running_soft.add(program_id)
            player._installed_soft.remove(program_id)
            update_player(player, conn)
            bot.send_message(
                player._chat_id,
                u"Запускаю {}".format(gamedata._programs[program_id]._name))
        else:
            text = u"Не удалось запустить программу\n"
            if not cpu_ok:
                text += u"Недостаточно CPU\n"
            if not ram_ok:
                text += u"Недостаточно свободной памяти\n"
            bot.send_message(player._chat_id, text)
Пример #2
0
def do_show_software(player, bot, gamedata, pdb):
    with pdb.connect() as conn:
        player.update_lore(gamedata)
        update_player(player, conn)
    text = u""
    if player._running_soft:
        text += u"Запущенные программы:\n"
        for program_id in player._running_soft:
            text += gamedata._programs[
                program_id]._name + u" /view_{} /stop_{}\n".format(
                    program_id, program_id)
        text += u"\n"
    if player._installed_soft:
        text += u"Скомпилированные программы:\n"
        for program_id in player._installed_soft:
            text += gamedata._programs[
                program_id]._name + u" /view_{} /run_{}\n".format(
                    program_id, program_id)
        text += u"\n"
    text += u"Новые программы:\n"
    for program_id in gamedata._programs:
        if program_id not in player._running_soft and (
                len(player._compiling_soft) == 0 or player._compiling_soft[0]
                != program_id) and program_id not in player._installed_soft:
            text += gamedata._programs[
                program_id]._name + u" /view_{} /compile_{}\n".format(
                    program_id, program_id)
    bot.send_message(player._chat_id, text)
Пример #3
0
def undo_last_match():
    conn, cursor = db.connect()
    matches = db.get_matches(cursor)

    if not matches:
        return None, None, None, None

    latest_match = matches[0]

    if latest_match.player1_score > latest_match.player2_score:
        winner = get_player(player_id=latest_match.player1_id)
        winner_prev_rating = latest_match.player1_rating
        loser = get_player(player_id=latest_match.player2_id)
        loser_prev_rating = latest_match.player2_rating
    else:
        winner = get_player(player_id=latest_match.player2_id)
        winner_prev_rating = latest_match.player2_rating
        loser = get_player(player_id=latest_match.player1_id)
        loser_prev_rating = latest_match.player1_rating

    db.delete_matches(cursor, ids=[latest_match.id])
    db.update_player(cursor, winner.id, new_rating=winner_prev_rating)
    db.update_player(cursor, loser.id, new_rating=loser_prev_rating)
    conn.commit()
    conn.close()
    return winner.name, winner_prev_rating, loser.name, loser_prev_rating
Пример #4
0
def do_show_mind(player, bot, gamedata, pdb):
    with pdb.connect() as conn:
        player.update_lore(gamedata)
        update_player(player, conn)
        text = u"{}\nЗнание Мира: {}\nСырое ЗМ: {}".format(
            player.get_name(), player._lore, player._raw_lore)
        if player._raw_lore > 0:
            text += u", время обработки: {}\n".format(
                format_time(player._raw_lore * 1. / player.get_cpu() * 60))
        else:
            text += u"\n"
        text += u"""Использование памяти: {} / {}\nЗагрузка CPU: {} / {}\n""".format(
            player.get_used_ram(gamedata), player.get_ram(),
            player.get_used_cpu(gamedata), player.get_cpu())
        text += u"Запущенных программ: {}\n".format(len(player._running_soft))
        text += u"Скомпилированных программ: {}\n".format(
            len(player._installed_soft))
        text += u"Новых программ: {} /software".format(len(gamedata._programs))
        if player._compiling_soft != []:
            program = gamedata._programs[player._compiling_soft[0]]
            cpu, start_time = player._compiling_soft[1:3]
            ts = time.time()
            progress = (ts - start_time) / (program._compile_time / cpu *
                                            TICK_DURATION)
            progress = int(progress * 100)
            text += u"\nКомпиляция {} выполнена на {}%".format(
                program._name, progress)
        send_message(player, conn, bot, text)
Пример #5
0
def add_match(p1_id, nd1, p2_id, nd2, score_p1, score_p2):
    if p1_id == p2_id or int(score_p1) == int(score_p2):
        raise InvalidMatchRegistration()

    p1_id += "(nd)" if nd1 else ""
    p1 = get_player(p1_id)
    p2_id += "(nd)" if nd2 else ""
    p2 = get_player(p2_id)

    if p1 and p2:
        match = Match(None, p1_id, p2_id, score_p1, score_p2, p1.get_rating(),
                      p2.get_rating())
        conn, cursor = db.connect()
        db.create_match(cursor, match)

        new_rating1, new_rating2 = calculate_new_elo_ratings(
            rating1=p1.get_rating(),
            rating2=p2.get_rating(),
            player1_win=int(match.player1_score) > int(match.player2_score))
        db.update_player(cursor, p1.id, new_rating=new_rating1)
        db.update_player(cursor, p2.id, new_rating=new_rating2)
        conn.commit()
        conn.close()

        new_p1 = get_player(p1.id)
        new_p2 = get_player(p2.id)

        updated_players = (new_p1, new_rating1 - p1.get_rating(), new_p2,
                           new_rating2 - p2.get_rating())
        return updated_players
    raise PlayerDoesNotExist()
Пример #6
0
def do_change_location(player, bot, gamedata, pdb, to_loc_id):
    cur_loc_id = player._location_id
    with pdb.connect() as conn:
        player.set_location(to_loc_id)
        try:
            update_player(player, conn)
        except Exception as e:
            player.set_location(cur_loc_id)
            raise e
    do_show_map(player, bot, gamedata, pdb)
Пример #7
0
def update_display_name(player, new_name):
    conn, cursor = db.connect()
    players = db.get_players(cursor)
    names = [p.get_name().lower() for p in players]
    if new_name.lower() in names:
        return False
    db.update_player(cursor, player.get_id(), new_name=new_name)
    conn.commit()
    conn.close()
    return True
Пример #8
0
 def __call__(self, bot, update):
     user_id = update.message.from_user.id
     player = fetch_player(user_id, self._players)
     if player is None:
         return
     player = Player(user_id, update.message.chat_id)
     text = "User {} is welcome in chat {}".format(user_id, update.message.chat_id)
     keyboard = [[("CONTINUE", u"Продолжить")]]
     with self._players.connect() as conn:
         update_player(player, conn)
         send_message(player, conn, bot, text, keyboard)
     logging.info("NEW_USER\t{}".format(user_id))
Пример #9
0
def do_stop_program(player, bot, gamedata, pdb, program_id):
    with pdb.connect() as conn:
        player.update_lore(gamedata)
        update_player(player, conn)
        program = gamedata._programs.get(program_id)
        if program is None:
            return
        if program_id not in player._running_soft:
            bot.send_message(player._chat_id,
                             u"Программа {} не запущена".format(program._name))
            return
        player._running_soft.remove(program_id)
        player._installed_soft.add(program_id)
        update_player(player, conn)
        bot.send_message(player._chat_id,
                         u"Программа {} остановлена".format(program._name))
Пример #10
0
def do_compile_program(player, bot, gamedata, pdb, program_id):
    with pdb.connect() as conn:
        player.update_lore(gamedata)
        update_player(player, conn)
        if player._compiling_soft != []:
            bot.send_message(player._chat_id,
                             u"Другая программа ещё компилируется")
        else:
            if player.compile_program(program_id, gamedata):
                update_player(player, conn)
                send_message(
                    player, conn, bot, u"Компилирую {}".format(
                        gamedata._programs[program_id]._name))
            else:
                bot.send_message(player._chat_id,
                                 u"Недостаточно ЦП для начала компиляции")
Пример #11
0
def do_get_outcome(player, bot, gamedata, pdb, event_id, text_id, option_text,
                   show_descr, lore_gained):
    descr, options = gamedata._texts[event_id][text_id]
    outcome = choose_outcome(options[option_text])
    message_parts = list()
    if show_descr:
        message_parts.append(descr)
    if outcome._message:
        message_parts.append(outcome._message)
    message = u" ".join(message_parts) + u"\n"
    outcome_id = outcome._outcome_id
    if outcome_id is not None:
        if outcome_id.startswith("i_"):
            if outcome_id not in gamedata._items:
                bot.send_message(player._chat_id,
                                 u"Unknown item: {}".format(outcome_id))
            else:
                item = gamedata._items[outcome_id]
                message += u"...\nНаходка! {} ({}) /view_{}".format(
                    item._name, outcome._cnt, outcome_id)
                backpack = player._avatar._backpack
                free_weight = backpack._max_weight - backpack.get_weight(
                    gamedata)
                taken_count = int(min(free_weight / item._weight,
                                      outcome._cnt))
                if taken_count > 0:
                    backpack.insert_item(outcome_id, taken_count)
                    message += u"\n{} ({}) помещён(-а) в рюкзак".format(
                        item._name, taken_count)
                if taken_count < outcome._cnt:
                    message += u"\n{} {} не поместился(-ась) в рюкзак".format(
                        outcome._cnt - taken_count, item._name)
                lore_for_new_item = player.get_lore_for_new_entity(
                    outcome_id, gamedata)
                if lore_for_new_item > 0:
                    message += u"\nПолучено {} ЗМ за находку".format(
                        lore_for_new_item)
        else:
            message += outcome_id
    if lore_gained > 0:
        message += u"\nПолучено {} ЗМ за исследование".format(lore_gained)
    keyboard = get_show_venues_keyboard(player, gamedata)
    with pdb.connect() as conn:
        update_player(player, conn)
        send_message(player, conn, bot, message, keyboard)
Пример #12
0
    def post(self):
        user_id = users.get_current_user().user_id()
        first_name = self.request.get('first_name')
        last_name = self.request.get('last_name')
        psn_id = self.request.get('psn_id')
        list_me = self.request.get('list_me') == 'on'
        telegram = self.request.get('telegram')
        bungie = self.request.get('bungie')
        dtr = self.request.get('dtr')
        youtube = self.request.get('youtube')
        twitch = self.request.get('twitch')

        player = db.find_player(user_id)
        if player is None:
            db.add_player(user_id, first_name, last_name, psn_id, telegram, bungie, dtr, youtube, twitch, list_me)
            self.redirect('/')
        else:
            db.update_player(player, first_name, last_name, psn_id, telegram, bungie, dtr, youtube, twitch, list_me)
            self.redirect('/players')
Пример #13
0
    def post(self):
        user_id = users.get_current_user().user_id()
        first_name = self.request.get("first_name")
        last_name = self.request.get("last_name")
        psn_id = self.request.get("psn_id")
        list_me = self.request.get("list_me") == "on"
        telegram = self.request.get("telegram")
        bungie = self.request.get("bungie")
        dtr = self.request.get("dtr")
        youtube = self.request.get("youtube")
        twitch = self.request.get("twitch")

        player = db.find_player(user_id)
        if player is None:
            db.add_player(user_id, first_name, last_name, psn_id, telegram, bungie, dtr, youtube, twitch, list_me)
            self.redirect("/")
        else:
            db.update_player(player, first_name, last_name, psn_id, telegram, bungie, dtr, youtube, twitch, list_me)
            self.redirect("/players")
Пример #14
0
    def post(self):
        user_id = users.get_current_user().user_id()
        first_name = self.request.get('first_name')
        last_name = self.request.get('last_name')
        psn_id = self.request.get('psn_id')
        list_me = self.request.get('list_me') == 'on'
        telegram = self.request.get('telegram')
        bungie = self.request.get('bungie')
        dtr = self.request.get('dtr')
        youtube = self.request.get('youtube')
        twitch = self.request.get('twitch')

        player = db.find_player(user_id)
        if player is None:
            db.add_player(user_id, first_name, last_name, psn_id, telegram,
                          bungie, dtr, youtube, twitch, list_me)
            self.redirect('/')
        else:
            db.update_player(player, first_name, last_name, psn_id, telegram,
                             bungie, dtr, youtube, twitch, list_me)
            self.redirect('/players')
Пример #15
0
def do_explore(player, bot, gamedata, pdb):
    loc = gamedata._map[player._location_id]
    venue_id = choose_outcome(loc._events)
    if venue_id not in gamedata._venues:
        bot.send_message(player._chat_id,
                         "Missing venue {}".format(venue_id.encode("utf8")))
        logging.error("Missing venue {}".format(venue_id.encode("utf8")))
        return

    researched = min(loc._research_rate,
                     100 - player._research_percent[player._location_id])
    lore_gained = int(researched * 0.1 * player.get_cpu())
    if researched > 0:
        with pdb.connect() as conn:
            player.update_lore(gamedata)
            player._raw_lore += lore_gained
            player._lore_last_update = time.time()
            player._research_percent[player._location_id] += researched
            update_player(player, conn)

    event_id = choose_outcome(gamedata._venues[venue_id]._events)
    resolve_event(player, bot, gamedata, pdb, event_id, lore_gained)
Пример #16
0
def update_player(player_id: uuid.UUID, player: Player):
    try:
        db.update_player(player_id, player)
    except KeyError:
        raise HTTPException(status_code=HTTP_404_NOT_FOUND)