def make_single(self, specific):
        if specific in redeclipse().modes:
            mint = redeclipse().modes[specific]
        else:
            try:
                mint = int(specific)
            except TypeError:
                return {'Error': 'Mode does not exist'}
        if mint not in list(range(len(redeclipse().modestr))):
            return {}
        ret = {
            "id": mint,
            "name": redeclipse().modestr[mint],
            "corename": redeclipse().cmodestr[mint],
            "recentgames": {},
            }
        gamerows = list(self.db.execute(
            """SELECT * FROM games
            WHERE mode = re_mode(id, '%s')""" % ret["corename"]))
        ret["games"] = [r[0] for r in gamerows]

        gs = dbselectors.get("game", self.db)
        gs.flags_none()
        gs.weakflags(['players'], True)

        # Recent Games
        if self.flags['recentgames']:
            num = self.q.qint('recentgames', cfg.get('recent'))
            for row in utils.sliceneg(list(reversed(gamerows)), num):
                game = gs.fromrow(row)
                ret["recentgames"][game["id"]] = game

        return ret
Exemple #2
0
    def make_single(self, specific):
        ret = {
            "name": specific,
            "recentgames": {},
            "toprace": {
                "game": None,
                "gameplayer": None,
                "time": 0,
                },
            "toperace": {
                "game": None,
                "gameplayer": None,
                "time": 0,
                },
            "topraces": [],
            "toperaces": [],
            }
        gamerows = list(self.db.execute(
            """SELECT * FROM games
            WHERE map = ?""", (ret['name'],)))
        ret["games"] = [r[0] for r in gamerows]
        if not ret["games"]:
            return {'error': 'Map has no games'}
        gs = dbselectors.get("game", self.db)
        gs.flags_none()
        gs.weakflags(['players'], True)

        # Recent Games
        if self.flags['recentgames']:
            num = self.q.qint('recentgames', cfg.get('recent'))
            for row in utils.sliceneg(list(reversed(gamerows)), num):
                game = gs.fromrow(row)
                ret["recentgames"][game["id"]] = game

        # Race Times
        if self.flags['race']:
            self.getracetimes(ret, gs, "toprace")
            self.getracetimes(ret, gs, "toperace",
                "AND(mutators & re_mut(id, 'endurance'))")
        return ret
    def fromrow(self, row):
        if not row:
            return {}
        recentgames = self.q.qint('recentgames', cfg.get('recent'))
        recentsums = self.recent('recentsums')
        ret = {
            "recentgames": {},
            }
        dbselectors.rowtodict(ret, row, [
            "name", "handle"
            ], start=1)
        handle = ret['handle']
        # Games
        if self.flags['games']:
            gamerows = list(self.db.execute(
                """SELECT * FROM games
                WHERE id in (SELECT game FROM game_players
                WHERE handle=?)""", (handle,)))
            ret["games"] = [r[0] for r in gamerows]
            # Recent Games
            if self.flags['recentgames']:
                gs = dbselectors.get("game", self.db)
                gs.flags_none()
                gs.weakflags(['players'], True)
                for row in utils.sliceneg(
                    list(reversed(gamerows)), recentgames):
                    game = gs.fromrow(row)
                    game['player'] = [p for p in list(game["players"].values())
                        if p["handle"] == handle][0]
                    # Count FFA rounds for this player in a new index
                    ffarounds = []
                    for ffaround_row in self.db.execute(
                        """SELECT * FROM game_ffarounds
                        WHERE playerhandle = ?
                        AND game = %d""" % game['id'], (handle,)):
                            ffaround = {}
                            dbselectors.rowtodict(
                                ffaround, ffaround_row, ["game",
                                None, None, "round", "winner"])
                            ffarounds.append(ffaround)
                    if ffarounds:
                        game['player_ffarounds'] = ffarounds
                    ret["recentgames"][game["id"]] = game

        #Data from games
        recentsum = lambda x: self.db.execute(
            """SELECT sum(%s) FROM
            (SELECT * FROM game_players
            WHERE game IN (SELECT id FROM games
            %s)
            AND %s
            AND handle = ?
            %s)""" % (x,
                "WHERE mode != re_mode(id, 'race')" if x not in
                ['timeactive'] else "",
                self.vlimit(),
                recentsums), (ret['handle'],)).fetchone()[0]
        recent = {
            'weapons': {},
            }

        # Affinity data
        if self.flags['affinities']:
            captures = []
            for capture_row in self.db.execute(
                """SELECT * FROM game_captures WHERE playerhandle = ?
                AND game in (SELECT id FROM games
                %s)""" % (recentsums), (handle,)):
                    capture = {}
                    dbselectors.rowtodict(capture, capture_row, ["game",
                        None, None, "capturing", "captured"])
                    captures.append(capture)
            if captures:
                ret['captures'] = captures
            bombings = []
            for bombing_row in self.db.execute(
                """SELECT * FROM game_bombings WHERE playerhandle = ?
                AND game in (SELECT id FROM games
                %s)""" % (recentsums), (handle,)):
                    bombing = {}
                    dbselectors.rowtodict(bombing, bombing_row, ["game",
                        None, None, "bombing", "bombed"])
                    bombings.append(bombing)
            if bombings:
                ret['bombings'] = bombings

        # Sums of data
        if self.flags['recentsums']:
            for t in ['frags', 'deaths', 'timealive', 'timeactive']:
                recent[t] = recentsum(t)

            # Damage
            if self.flags['damage']:
                recent["damage"] = self.db.execute(
                    """SELECT (sum(damage1) + sum(damage2)) FROM game_weapons
                        WHERE %s
                        AND playerhandle = ?
                        AND game IN (SELECT id FROM games
                        WHERE mode != re_mode(id, 'race'))
                        %s""" % (self.vlimit(),
                        recentsums),
                            (ret["handle"],)).fetchone()[0]

            if self.flags['weapons']:
                #Weapon Data
                for weapon in redeclipse().weaponlist:
                    wr = {'name': weapon}
                    recentsum = lambda x: self.db.execute(
                        """SELECT sum(%s) FROM
                        (SELECT * FROM game_weapons
                        WHERE weapon = ? AND playerhandle = ?
                        AND game IN (SELECT id FROM games
                        WHERE mode != re_mode(id, 'race'))
                        AND %s
                        %s)""" % (x,
                        self.vlimit(),
                        recentsums),
                        (weapon, ret['handle'])).fetchone()[0]
                    for t in redeclipse().weapcols:
                        wr[t] = recentsum(t)
                    recent['weapons'][weapon] = wr
        ret["recent"] = recent
        return ret