Exemplo n.º 1
0
 def add_player_txn(self, player_name, password, avatar_hash):
     # Player shouldn't exist yet
     p = models.PlayerModel.get(models.playermodel_key(player_name))
     if p:
         return None
     player_key = models.playermodel_key(player_name)
     p = models.PlayerModel(key_name=player_key.name())
     p.name = player_name
     p.password = md5(password).hexdigest().lower()
     p.avatar_hash = avatar_hash
     p.put()
     return p
Exemplo n.º 2
0
 def add_player_txn(self, player_name, password, avatar_hash):
     # Player shouldn't exist yet
     p = models.PlayerModel.get(models.playermodel_key(player_name))
     if p:
         return None
     player_key = models.playermodel_key(player_name)
     p = models.PlayerModel(key_name=player_key.name())
     p.name = player_name
     p.password = md5(password).hexdigest().lower()
     p.avatar_hash = avatar_hash
     p.put()
     return p
Exemplo n.º 3
0
    def __init__(self, j, viewing_player_name='', load_players=False):
        super(GameStats, self).__init__(json.loads(j))
        self.json = j
        self.viewing_player_name = viewing_player_name

        # Prune out non-contributing players
        self.prune_zombie_players()

        # Calc results
        self.init_win_results()

        # Initialize PlayerStats objects
        self.init_player_stats()

        # Create pid->player_stat map
        self.pid_player_stat_map = {}
        for player_stat in self.player_stats:
            self.pid_player_stat_map[player_stat.pid] = player_stat
                
        # Create key->pid map
        self.key_pid_map = {}
        for player_stat in self.player_stats:
            if player_stat.is_user:
                key = models.playermodel_key(player_stat.name)
                self.key_pid_map[key] = player_stat.pid

        # If asked, load and push Player objects into PlayerStat objects
        if load_players:
            self.load_player_objects()

        # Remember teams
        self.teams = self.get_teams()
Exemplo n.º 4
0
 def txn():
     p = models.PlayerModel.get(models.playermodel_key(player_name))
     if not p:
         return False
     player.reset_stats(p)
     p.put()
     return True
Exemplo n.º 5
0
    def post(self):
        if not self.has_access():
            self.redirect(users.create_logout_url(config.ADMIN_URL))
            return

        self.response.headers['Content-Type'] = 'text/plain'
        player_name = self.request.get('u')
        if not player_name:
            self.response.out.write('no player name entered')
            return

        choice = self.request.get('choice')
        if not choice:
            self.response.out.write('no choice selected')
            return
            
        p = models.PlayerModel.get(models.playermodel_key(player_name))
        if not p:
            self.response.out.write('cannot find player in database')
            return
            
        if choice == 'block':
            p.blocked = True
        elif choice == 'unblock':
            p.blocked = False
        else:
            self.response.out.write('choice not quarantine or unquarantine')
            return

        p.put()
        self.response.out.write('success. %s is now quarantined=%s.' % (player_name, choice == 'block'))
Exemplo n.º 6
0
    def do_action(self, args, player_name, password, password2, avatar_data):
        if not self.is_valid_player_name(player_name):
            return createaccount.kErrPlayerNameInvalid
        p = models.PlayerModel.get(models.playermodel_key(player_name))
        if not p:
            return createaccount.kErrAccountNotFound
        if p.password != md5(password).hexdigest().lower():
            return createaccount.kErrIncorrectPassword
        if password2 and not self.is_valid_password(password2):
            return createaccount.kErrPasswordInvalid

        # If no avatar was offered, don't change the existing one.
        avatar_data_new = avatar.prepare_avatar(avatar_data) if avatar_data else None
        if avatar_data and not avatar_data_new:
            return createaccount.kErrAvatarInvalid

        # Perform transaction
        avatar_hash = self.get_avatar_hash(avatar_data_new)
        db.run_in_transaction(self.update_player_txn, p, password2, avatar_hash)
        if avatar_data_new:
            avatar.save_avatar(avatar_hash, avatar_data_new)

        # Set up args for the template
        args['player'] = player.Player(p)
        args['password'] = password2 if password2 else '<unchanged>'
        return createaccount.kErrNone
Exemplo n.º 7
0
 def txn():
     p = models.PlayerModel.get(models.playermodel_key(player_name))
     if not p:
         return False
     player.reset_stats(p)
     p.put()
     return True
Exemplo n.º 8
0
    def __init__(self, j, viewing_player_name='', load_players=False):
        super(GameStats, self).__init__(json.loads(j))
        self.json = j
        self.viewing_player_name = viewing_player_name

        # Prune out non-contributing players
        self.prune_zombie_players()

        # Calc results
        self.init_win_results()

        # Initialize PlayerStats objects
        self.init_player_stats()

        # Create pid->player_stat map
        self.pid_player_stat_map = {}
        for player_stat in self.player_stats:
            self.pid_player_stat_map[player_stat.pid] = player_stat

        # Create key->pid map
        self.key_pid_map = {}
        for player_stat in self.player_stats:
            if player_stat.is_user:
                key = models.playermodel_key(player_stat.name)
                self.key_pid_map[key] = player_stat.pid

        # If asked, load and push Player objects into PlayerStat objects
        if load_players:
            self.load_player_objects()

        # Remember teams
        self.teams = self.get_teams()
Exemplo n.º 9
0
 def get_gamestats_rows(self, player_name, user_name, count, all):
     q = models.GameStatsModel.all()
     if not all and user_name:
         key_name = models.playermodel_key(user_name).name()
         q.filter('player_key_names = ', key_name)
     q.order('-date')
     results = q.fetch(count)
     return [gamestats.GameStats(obj.json, player_name) for obj in results]
Exemplo n.º 10
0
    def post(self):
        account = self.has_access()
        if not account:
            self.redirect(users.create_logout_url(config.ADMIN_URL))
            return

        self.response.headers['Content-Type'] = 'text/plain'
        player_name = self.request.get('u')
        if not player_name:
            self.response.out.write('no player name entered')
            return

        choice = self.request.get('choice')
        if not choice:
            self.response.out.write('no choice selected')
            return

        reason = self.request.get('r')
        if not reason:
            self.response.out.write('no reason specified')
            return

        p = models.PlayerModel.get(models.playermodel_key(player_name))
        if not p:
            self.response.out.write('cannot find player in database')
            return

        if choice == 'block':
            p.blocked = True
        elif choice == 'unblock':
            p.blocked = False
        else:
            self.response.out.write('choice not block or unblock')
            return

        # Record this action
        d = dict(
            action='block_player' if choice == 'block' else 'unblock_player',
            player_name=player_name,
            reason=reason)
        admin.save_action(account.name, self.request.remote_addr, d)

        p.put()
        self.response.out.write('success. %s is now blocked=%s, reason: %s.' %
                                (player_name, choice == 'block', reason))
Exemplo n.º 11
0
 def do_action(self, args, player_name, password, password2, avatar_data):
     if not self.is_valid_player_name(player_name):
         return kErrPlayerNameInvalid
     if not self.is_valid_password(password):
         return kErrPasswordInvalid
     if password != password2:
         return kErrPasswordMismatch
     p = models.PlayerModel.get(models.playermodel_key(player_name))
     if p:
         return kErrAccountExists
     avatar_data_new = avatar.prepare_avatar(avatar_data) if avatar_data else None
     if avatar_data and not avatar_data_new:
         return kErrAvatarInvalid
     p = self.create_player(player_name, password, avatar_data_new)
     if not p:
         return kErrUnexpectedError
     args['player'] = player.Player(p)
     return kErrNone
Exemplo n.º 12
0
 def do_action(self, args, player_name, password, password2, avatar_data):
     if not self.is_valid_player_name(player_name):
         return kErrPlayerNameInvalid
     if not self.is_valid_password(password):
         return kErrPasswordInvalid
     if password != password2:
         return kErrPasswordMismatch
     p = models.PlayerModel.get(models.playermodel_key(player_name))
     if p:
         return kErrAccountExists
     avatar_data_new = avatar.prepare_avatar(
         avatar_data) if avatar_data else None
     if avatar_data and not avatar_data_new:
         return kErrAvatarInvalid
     p = self.create_player(player_name, password, avatar_data_new)
     if not p:
         return kErrUnexpectedError
     args['player'] = player.Player(p)
     return kErrNone
Exemplo n.º 13
0
    def post(self):
        account = self.has_access()
        if not account:
            self.redirect(users.create_logout_url(config.ADMIN_URL))
            return

        self.response.headers['Content-Type'] = 'text/plain'
        player_name = self.request.get('u')
        if not player_name:
            self.response.out.write('no player name entered')
            return

        choice = self.request.get('choice')
        if not choice:
            self.response.out.write('no choice selected')
            return

        reason = self.request.get('r')
        if not reason:
            self.response.out.write('no reason specified')
            return
            
        p = models.PlayerModel.get(models.playermodel_key(player_name))
        if not p:
            self.response.out.write('cannot find player in database')
            return
            
        if choice == 'hide':
            p.hidden = True
        elif choice == 'show':
            p.hidden = False
        else:
            self.response.out.write('choice not hide or show')
            return
        p.put()

        # Record this action
        d = dict(action='hide_player' if choice == 'hide' else 'show_player', player_name=player_name, reason=reason)
        admin.save_action(account.name, self.request.remote_addr, d)

        # Return the response
        self.response.out.write('success. %s is now hidden=%s, reason: %s.' % (player_name, choice == 'hide', reason))
Exemplo n.º 14
0
 def is_viewer_also_player(self):
     key1 = models.playermodel_key(self.name)
     key2 = models.playermodel_key(self.viewing_player_name)
     return key1.name() == key2.name()
Exemplo n.º 15
0
def load_from_name(name, viewing_player_name=''):
    p = models.PlayerModel.get(models.playermodel_key(name))
    if p:
        return Player(p, viewing_player_name)
    return None
Exemplo n.º 16
0
 def is_viewer_also_player(self):
     key1 = models.playermodel_key(self.name)
     key2 = models.playermodel_key(self.viewing_player_name)
     return key1.name() == key2.name()
Exemplo n.º 17
0
    def get(self):
        account = self.has_access()
        if not account:
            self.redirect(users.create_login_url(self.request.uri))
            return
        type = self.request.get('t').lower()
        u = self.request.get('u').lower()
        player_name = self.request.get('p').lower()
        message = ''

        # if no type specified, there is no query
        rating = 0
        next_type = ''
        if not type:
            # The next request will be a query for a player name's score
            next_type = 'q'

        # Validate the user. Is this a query or set score request?
        p = None
        if type == 'q' or type == 's':
            # This is a query for a user. Make sure the user is valid
            if not u:
                message = 'No player name entered!'
                type = ''
                next_type = 'q'
            else:
                p = models.PlayerModel.get(models.playermodel_key(u))
                if not p:
                    message = 'Could not find player %s! Please try again:' % u
                    u = ''
                    type = ''
                    next_type = 'q'

        # Step through the states
        rating = 0
        reason = ''
        if type == 'q':
            # The next request will be for changing a score
            next_type = 's'
            rating = p.rating

        if type == 's':
            # Is the new rating valid?
            rating = self.request.get('s')
            reason = self.request.get('r')
            success = True
            try:
                rating = int(rating)
            except:
                success = False
                
            if not success or rating >= 3000 or rating < 0:
                message = '"%s" is an invalid score. Please try again:' % rating
                rating = p.rating
                type = 'q'
                next_type = 's'

            elif not reason:
                message = 'Must enter a reason. Please try again:'
                rating = p.rating
                type = 'q'
                next_type = 's'

            else:
                # Record this action
                d = dict(action='adjust_score', player_name=u, old_rating=p.rating, new_rating=rating, reason=reason)
                admin.save_action(account.name, self.request.remote_addr, d)

                p.rating = rating
                p.put()
                message = 'Successfully set the score of player %s to %s, reason: %s.' % (u, rating, reason)
                type = ''
                next_type = 'q'

        template_values = {
            'tabs': config.get_tabs(player_name, account),
            'selected_tab': config.TAB_NONE,
            'form_url': config.ADJUSTSCORE_URL,
            'message': message,
            'player_name': player_name,
            'u': u,
            'rating': rating,
            'type': type,
            'reason': reason,
            'next_type': next_type
        }

        self.response.headers['Content-Type'] = 'application/xhtml+xml'
        path = os.path.join(os.path.dirname(__file__), 'adjustscore.xhtml')
        self.response.out.write(template.render(path, template_values))
Exemplo n.º 18
0
def load_from_name(name, viewing_player_name=''):
    p = models.PlayerModel.get(models.playermodel_key(name))
    if p:
        return Player(p, viewing_player_name)
    return None
Exemplo n.º 19
0
    def get(self):
        # If a game key is specified, use that. If no game key and a player
        # is specified, use the last game of that player. If neither, show
        # a message to the user. The common error case is a non-logged in
        # player, who hasn't specified a game.

        # Get player name, if any
        player_name = self.request.get('p')

        # Get game key. If missing, get it from the player's last game
        key_name = self.request.get('g')
        if key_name == '':
            # No game key name. Is there a player?
            if player_name == '':
                message.show(self, message.GAME_NOT_FOUND)
                return
            obj = models.PlayerModel.get(models.playermodel_key(player_name))
            if not obj:
                message.show(self, message.PLAYER_NOT_FOUND)
                return
            key_name = obj.last_game_key_name
            if key_name == '':
                message.show(self, message.PLAYER_NOT_PLAYED_GAME)
                return
        g, game_obj = gamestats.load_from_key_name(key_name, player_name,
                load_players=True)
        if not g:
            message.show(self, message.GAME_NOT_FOUND)
            return

        if self.request.get('j') == '1':
            self.response.headers['Content-Type'] = 'text/plain'
            self.response.out.write(g.json)
            return

        if self.request.get('i') == '1':
            self.response.headers['Content-Type'] = 'text/plain'
            for player_stat in g.player_stats:
                ip = 'unknown'
                if 'ip' in player_stat.__dict__ and len(player_stat.ip) != 0:
                    ip = player_stat.ip
                did = 'unknown'
                if 'did' in player_stat.__dict__ and len(player_stat.did) != 0:
                    did = player_stat.did
                winner = ''
                if player_stat.win_result == gamestats.PLAYER_RESULT_WIN:
                    winner = ' (winner)'
                self.response.out.write('Player: %s ip: %s did: %s %s\n' % (player_stat.name, ip, did, winner))
            if game_obj.dids:
                self.response.out.write('\n')
                self.response.out.write(game_obj.dids)
            return

        # Render the template and serve the response
        template_values = {
            'tabs': config.get_tabs(player_name),
            'selected_tab': config.TAB_NONE,
            'gamestats': g,
            'units_built_sums': self.get_units_built_sums(g),
            'computer_default_rating': gamestats.COMPUTER_DEFAULT_RATING,
            'anonymous_default_rating': gamestats.ANONYMOUS_DEFAULT_RATING,
            'player_default_rating': gamestats.PLAYER_DEFAULT_RATING,
            'computer_avatar_url': config.COMPUTER_AVATAR_URL,
            'anonymous_avatar_url': config.ANONYMOUS_AVATAR_URL,
            'winner_image_url': config.WINNER_IMAGE_URL,
            'chevron_image_url': config.CHEVRON_IMAGE_URL,
        }

        self.set_caching_headers(config.INFOPAGE_MAX_AGE_SECONDS)
        self.response.headers['Content-Type'] = 'application/xhtml+xml'
        path = os.path.join(os.path.dirname(__file__), 'gamedetail.xhtml')
        self.response.out.write(template.render(path, template_values))
Exemplo n.º 20
0
    def get(self):
        # If a game key is specified, use that. If no game key and a player
        # is specified, use the last game of that player. If neither, show
        # a message to the user. The common error case is a non-logged in
        # player, who hasn't specified a game.

        # Get player name, if any
        player_name = self.request.get('p')

        # Get game key. If missing, get it from the player's last game
        key_name = self.request.get('g')
        if key_name == '':
            # No game key name. Is there a player?
            if player_name == '':
                message.show(self, message.GAME_NOT_FOUND)
                return
            obj = models.PlayerModel.get(models.playermodel_key(player_name))
            if not obj:
                message.show(self, message.PLAYER_NOT_FOUND)
                return
            key_name = obj.last_game_key_name
            if key_name == '':
                message.show(self, message.PLAYER_NOT_PLAYED_GAME)
                return
        g, game_obj = gamestats.load_from_key_name(key_name,
                                                   player_name,
                                                   load_players=True)
        if not g:
            message.show(self, message.GAME_NOT_FOUND)
            return

        if self.request.get('j') == '1':
            self.response.headers['Content-Type'] = 'text/plain'
            self.response.out.write(g.json)
            return

        if self.request.get('i') == '1':
            self.response.headers['Content-Type'] = 'text/plain'
            for player_stat in g.player_stats:
                ip = 'unknown'
                if 'ip' in player_stat.__dict__ and len(player_stat.ip) != 0:
                    ip = player_stat.ip
                did = 'unknown'
                if 'did' in player_stat.__dict__ and len(player_stat.did) != 0:
                    did = player_stat.did
                winner = ''
                if player_stat.win_result == gamestats.PLAYER_RESULT_WIN:
                    winner = ' (winner)'
                self.response.out.write('Player: %s ip: %s did: %s %s\n' %
                                        (player_stat.name, ip, did, winner))
            if game_obj.dids:
                self.response.out.write('\n')
                self.response.out.write(game_obj.dids)
            return

        # Render the template and serve the response
        template_values = {
            'tabs': config.get_tabs(player_name),
            'selected_tab': config.TAB_NONE,
            'gamestats': g,
            'units_built_sums': self.get_units_built_sums(g),
            'computer_default_rating': gamestats.COMPUTER_DEFAULT_RATING,
            'anonymous_default_rating': gamestats.ANONYMOUS_DEFAULT_RATING,
            'player_default_rating': gamestats.PLAYER_DEFAULT_RATING,
            'computer_avatar_url': config.COMPUTER_AVATAR_URL,
            'anonymous_avatar_url': config.ANONYMOUS_AVATAR_URL,
            'winner_image_url': config.WINNER_IMAGE_URL,
            'chevron_image_url': config.CHEVRON_IMAGE_URL,
        }

        self.set_caching_headers(config.INFOPAGE_MAX_AGE_SECONDS)
        self.response.headers['Content-Type'] = 'application/xhtml+xml'
        path = os.path.join(os.path.dirname(__file__), 'gamedetail.xhtml')
        self.response.out.write(template.render(path, template_values))