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
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()
def txn(): p = models.PlayerModel.get(models.playermodel_key(player_name)) if not p: return False player.reset_stats(p) p.put() return True
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'))
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
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]
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))
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
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
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))
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()
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
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))
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))