Example #1
0
def get_ladder():
    import datetime
    a=PlayerModel.query()
    a=a.order(-PlayerModel.skillScore)

    b=PlayerModel.query()
    lastweek = datetime.datetime.now() - datetime.timedelta(days=7)
    b=b.filter(PlayerModel.lastGame > lastweek)

    return (a, b)
Example #2
0
def start_game_db(Session):

    session = Session()

    players = list()
    players.append(
        PlayerModel(nickname='nwhite', email='*****@*****.**', role=4))
    players.append(
        PlayerModel(nickname='nwhite2', email='*****@*****.**', role=4))
    players.append(
        PlayerModel(nickname='nwhite3', email='*****@*****.**', role=4))
    players.append(
        PlayerModel(nickname='nwhite4', email='*****@*****.**', role=4))

    numberOfTeams = 2
    minRequiredPlayers = 2
    maxPlayersPerTeam = 2
    game = GameModel(name='game1',
                     initiator=players[0],
                     numberOfTeams=numberOfTeams,
                     minRequiredPlayers=minRequiredPlayers,
                     maxPlayersPerTeam=maxPlayersPerTeam)

    for index in range(50):
        print("Putting card.")
        forbidden = "{'word1', 'word2', 'word3', 'word4'}"
        card = CardModel("word_" + str(index + 1), forbidden, "Book", "345")
        session.add(card)

    session.add(game)
    session.commit()

    for i in range(numberOfTeams):
        teamName = 'team' + str(i)
        team = TeamModel(teamName)

        if (i == 0):
            team.addPlayer(players[0])
            team.addPlayer(players[1])
        else:
            team.addPlayer(players[2])
            team.addPlayer(players[3])

        game.addTeam(team)
    game.gameState = GAME_READY

    session.commit()
    session.close()
Example #3
0
def update_player_name(key, fname, lname):
    user = PlayerModel.get_by_id(key)

    user.first_name = fname
    user.last_name = lname

    user.put()
Example #4
0
def get_most_games(type="total", top=5):
    """
    Gets the top X number of people with the chosen type of game
    @param type: Which type of games to calculate. The default is "total", which
    will just get all games. Accepted inputs: "wins" and "losses"
    @param top: Number of people to collect
    """
    players = PlayerModel.query()
    player_games = []
    for player in players:
        email = player.key.id()
        games = 0
        new_player = {
            "email":email,
            "data":0,
            "full_name":get_player_full_name(email)
        }
        if type == "wins":
            games = player.gamesWon
        elif type == "losses":
            games = player.gamesPlayed - player.gamesWon
        elif type == "total":
            games = player.gamesPlayed
        new_player['data'] = games
        player_games.append(new_player)

    sorted_players = sorted(player_games, key=itemgetter('data'))

    if len(sorted_players) < top:
        top = len(sorted_players)

    return sorted_players[len(sorted_players)-top:]
Example #5
0
def get_player_full_name(email):
    """
    Returns full name like "first last"
    @param email: Email/key of the person who's name you want
    """
    user = PlayerModel.get_by_id(email)
    return user.first_name + " " + user.last_name
Example #6
0
    def test3JoinTeam(self):
        player1 = PlayerModel.findPlayerById(self.session, 2)
        team1 = TeamModel.getTeamById(self.session, 1)
        cGame = GameModel.getGameById(1, self.session)
        player1.team = team1

        for i in range(1, 8):
            team = TeamModel.getTeamById(self.session, i)
            player2 = PlayerModel.findPlayerById(self.session, 2 * i)
            player3 = PlayerModel.findPlayerById(self.session, 2 * i + 1)
            player2.team = team
            player3.team = team
            i = i + 1
            self.session.flush()
            self.session.commit()
        self.assertTrue(player1 in team1.players)
        self.assertTrue(player1.team == team1)
Example #7
0
def start_game2_db(Session):
    session = Session()

    players = list()
    players.append(
        PlayerModel(nickname='nwhite', email='*****@*****.**', role=4))
    players.append(
        PlayerModel(nickname='nwhite2', email='*****@*****.**', role=4))
    players.append(
        PlayerModel(nickname='nwhite3', email='*****@*****.**', role=4))
    players.append(
        PlayerModel(nickname='nwhite4', email='*****@*****.**', role=4))

    numberOfTeams = 2
    minRequiredPlayers = 2
    maxPlayersPerTeam = 2
    game = GameModel(name='game1',
                     initiator=players[0],
                     numberOfTeams=numberOfTeams,
                     minRequiredPlayers=minRequiredPlayers,
                     maxPlayersPerTeam=maxPlayersPerTeam)

    session.add(game)
    session.commit()

    for i in range(numberOfTeams):
        teamName = 'team' + str(i)
        team = TeamModel(teamName)

        if (i == 0):
            team.addPlayer(players[0])
            team.addPlayer(players[1])
        else:
            team.addPlayer(players[2])
            team.addPlayer(players[3])

        game.addTeam(team)
    game.gameState = GAME_READY

    session.commit()
    session.close()
Example #8
0
    def test1CreatePlayers(self):
        delete_db(engine)
        AppModelBase.metadata.create_all(engine)
        for i in range(50):
            email = "member" + str(i + 1) + "@bsu.edu"
            if PlayerModel.emailExists(self.session, email):
                print("the entered email already exists")
            else:
                member1 = PlayerModel("Member " + str(i + 1), email, 3)
                self.session.add(member1)
                self.session.flush()
        self.session.commit()
        self.assertEqual(PlayerModel.numberOfRows(self.session), 50)

        print(
            "\n\n*************Test add exist Player**********************\n\n")
        member2_email = "*****@*****.**"
        if (PlayerModel.emailExists(self.session, member2_email)):
            print("the entered email already exists")
        else:
            member2 = PlayerModel("Member2", "*****@*****.**", 3)
            self.session.add(member2)
            self.session.flush()
            self.session.commit()
        self.assertEqual(PlayerModel.numberOfRows(self.session), 50)

        print(
            "\n\n*************Test add invalid email Player***************\n\n"
        )
        member3_email = ""
        member3_name = "member3"
        data = {"email": member3_email, "username": member3_name}
        feedback = PlayerModel.isValidPlayer(data)
        self.assertFalse(feedback["valid"])
        self.assertEqual(feedback["message"], 'invalid email')

        print(
            "\n\n*************Test add invalid username Player***************\n\n"
        )
        member4_email = "*****@*****.**"
        member4_name = ""
        data = {"email": member4_email, "username": member4_name}
        feedback = PlayerModel.isValidPlayer(data)
        print(feedback)
        self.assertFalse(feedback["valid"])
        self.assertEqual(
            feedback["message"],
            'username must be between 2 and 255  characters inclusive')
Example #9
0
def get_highest_goals(against=False, top=5):
    """
    Pass in a boolean to tell the method to calculate goals against instead of
    the default which is goals for.
    @return: a list of dictionaries containing the top however many people with
    the highest goals
    @param against: Pass True if you want this to count goals against
    @param top: Pass in the number of "top" people you want (e.g. Top 5)
    """
    players = PlayerModel.query()

    player_goals = []
    for player in players:
        email = player.key.id()
        matches = MatchModel.query(ndb.OR(MatchModel.player1 == email,
                                      MatchModel.player2 == email))
        goals = 0
        new_player = {
            'email': email,
            'data': 0,
            'full_name': get_player_full_name(email)
        }
        for match in matches:
            if against:
                if match.player1 == email:
                    goals += match.scores[0].player2
                    goals += match.scores[1].player2
                    goals += match.scores[2].player2
                elif match.player2 == email:
                    goals += match.scores[0].player1
                    goals += match.scores[1].player1
                    goals += match.scores[2].player1
            elif not against:
                if match.player1 == email:
                    goals += match.scores[0].player1
                    goals += match.scores[1].player1
                    goals += match.scores[2].player1
                elif match.player2 == email:
                    goals += match.scores[0].player2
                    goals += match.scores[1].player2
                    goals += match.scores[2].player2
        new_player["data"] += goals
        player_goals.append(new_player)

    sorted_players = sorted(player_goals, key=itemgetter('data'))

    if len(sorted_players) < top:
        top = len(sorted_players)

    return sorted_players[len(sorted_players)-top:]
Example #10
0
    def test2GameCreate(self):
        print(
            "\n\n*************Test add new valid game with 7 teams**************\n\n"
        )
        initiator = PlayerModel.findPlayerById(self.session, 1)
        #print ("Email: " + initiator.email)
        game = GameModel(initiator, "CS699", 60)
        team1 = TeamModel("Team 1")
        team2 = TeamModel("Team 2")
        team3 = TeamModel("Team 3")
        teams = [team1, team2, team3]
        initiator.team = team1
        self.session.flush()
        game.teams = teams
        self.session.add(game)
        self.session.commit()
        self.assertEqual(GameModel.numberOfRows(self.session), 1)
        self.assertEqual(GameModel.getGameById(1, self.session), game)
        cGame = GameModel.getGameById(1, self.session)
        self.assertEqual(cGame.teams, teams)
        self.assertEqual(team1.gameId, 1)

        print(
            "\n\n*************Test add invalid gamename **************************\n\n"
        )
        gameData = {
            "maxPlayersPerTeam": 2,
            "turnDuration": 30,
            "pointsToWin": 30,
            "numberOfTeams": 2,
            "skipPenaltyAfter": 3,
            "gameChangers": True,
            "name": "",
            "initiatorTeam": {
                "name": "team1"
            },
            "teamData": [{
                "name": "team1"
            }, {
                "name": "team2"
            }]
        }
        feedback = GameModel.isValidGame(self.session, gameData)
        self.assertFalse(feedback["valid"])
        self.assertEqual(feedback["message"],
                         'game name must be between 2 and 255 characters')

        print(
            "\n\n*************Test add invalid turnDuration **************************\n\n"
        )
        gameData = {
            "maxPlayersPerTeam": 2,
            "turnDuration": 0,
            "pointsToWin": 30,
            "numberOfTeams": 2,
            "skipPenaltyAfter": 3,
            "gameChangers": True,
            "name": "game123",
            "initiatorTeam": {
                "name": "team1"
            },
            "teamData": [{
                "name": "team1"
            }, {
                "name": "team2"
            }]
        }
        feedback = GameModel.isValidGame(self.session, gameData)
        self.assertFalse(feedback["valid"])
        self.assertEqual(feedback["message"],
                         "turn duration must be between 30 and 120 inclusive")

        print(
            "\n\n*************Test add invalid teams *****************************\n\n"
        )
        gameData = {
            "maxPlayersPerTeam": 2,
            "turnDuration": 30,
            "pointsToWin": 30,
            "numberOfTeams": 0,
            "skipPenaltyAfter": 3,
            "gameChangers": True,
            "name": "game123",
            "initiatorTeam": {
                "name": "team1"
            },
            "teamData": []
        }
        feedback = GameModel.isValidGame(self.session, gameData)
        self.assertFalse(feedback["valid"])
        self.assertEqual(feedback["message"],
                         "number of teams must be between 2 and 5 inclusive")

        print(
            "\n\n*************Test add invalid players in one team *****************************\n\n"
        )
        gameData = {
            "maxPlayersPerTeam": 10,
            "turnDuration": 30,
            "pointsToWin": 30,
            "numberOfTeams": 2,
            "skipPenaltyAfter": 3,
            "gameChangers": True,
            "name": "game123",
            "initiatorTeam": {
                "name": "team1"
            },
            "teamData": [{
                "name": "team1"
            }, {
                "name": "team2"
            }]
        }
        feedback = GameModel.isValidGame(self.session, gameData)
        self.assertFalse(feedback["valid"])
        self.assertEqual(
            feedback["message"],
            "number of players in a team must be between 2 and 5 inclusive")

        print(
            "\n\n*************Test add invalid points to win *****************************\n\n"
        )
        gameData = {
            "maxPlayersPerTeam": 2,
            "turnDuration": 30,
            "pointsToWin": 1,
            "numberOfTeams": 2,
            "skipPenaltyAfter": 3,
            "gameChangers": True,
            "name": "game123",
            "initiatorTeam": {
                "name": "team1"
            },
            "teamData": [{
                "name": "team1"
            }, {
                "name": "team2"
            }]
        }
        feedback = GameModel.isValidGame(self.session, gameData)
        self.assertFalse(feedback["valid"])
        self.assertEqual(feedback["message"],
                         "points to win must be between 10 and 60 inclusive")
Example #11
0
    def get(self):
        OoR_object = OoRModel.query().get()
        if OoR_object == None:
            OoR = []
        else:
            OoR = OoR_object.players
        template_params = handle_user()
        if not 'admin' in template_params:
            self.redirect('/')
        # Delete All player Models
        players = PlayerModel.query()
        for player in players:
            player.key.delete()
        tournament_query = TournamentModel.query()
        tournaments = []
        for t in tournament_query:
            tournaments.append(t)
        #sort
        tournaments.sort(key=lambda x: x.timestamp)
        for tournament in tournaments:
            #self.response.out.write(tournament.name + "<br>")

            matches = []
            match_query = MatchModel.query(ancestor=tournament.key)
            for m in match_query:
                matches.append(m)
            matches.sort(key=lambda x: x.timestamp)
            for match in matches:
                player1 = match.player1
                player2 = match.player2
                winner = match.winner
                if player1 in OoR or player2 in OoR:
                    continue
                # Find player1 Model
                player1_query = PlayerModel.query(PlayerModel.tag == player1)
                if player1_query.get() is not None:
                    player1_object = player1_query.get()
                else:
                    player1_object = PlayerModel()
                    player1_object.tag = player1
                    player1_object.ranking = trueskill.Rating()
                    player1_object.put()
                player1_object.lastActive = match.timestamp
                # Find player2 Model
                player2_query = PlayerModel.query(PlayerModel.tag == player2)
                if player2_query.get() is not None:
                    player2_object = player2_query.get()
                else:
                    player2_object = PlayerModel()
                    player2_object.tag = player2
                    player2_object.ranking = trueskill.Rating()
                    player2_object.put()
                player2_object.lastActive = match.timestamp
                #Run Rankings Algo
                player1_rate = player1_object.ranking
                player2_rate = player2_object.ranking
                #self.response.out.write(player1_rate)
                #self.response.out.write('<br>')
                #self.response.out.write(player2_rate)
                #self.response.out.write('<br>')
                if winner == player1:
                    new_player1, new_player2 = trueskill.rate_1vs1(
                        player1_rate, player2_rate)
                else:
                    new_player2, new_player1 = trueskill.rate_1vs1(
                        player2_rate, player1_rate)
                #self.response.out.write(new_player1)
                #self.response.out.write('<br>')
                #self.response.out.write(new_player2)
                #self.response.out.write('<br>')
                #self.response.out.write('<br>')
                # Update player stats
                player1_object.ranking = new_player1
                player2_object.ranking = new_player2
                #Save
                player1_object.put()
                player2_object.put()
                #self.response.out.write(match.player1+" vs. "+player2)
                #self.response.out.write('<br>')
            #self.response.out.write('<hl><br><br>')
        self.redirect('/')
Example #12
0
  def get(self):
    OoR_object = OoRModel.query().get()
    if OoR_object == None:
      OoR = []
    else:
      OoR = OoR_object.players
    template_params = handle_user()
    if not 'admin' in template_params:
      self.redirect('/')
    # Delete All player Models
    players = PlayerModel.query()
    for player in players:
      player.key.delete()
    tournament_query = TournamentModel.query()
    tournaments = []
    for t in tournament_query:
      tournaments.append(t)
    #sort
    tournaments.sort(key = lambda x: x.timestamp)
    for tournament in tournaments:
      #self.response.out.write(tournament.name + "<br>") 
 
      matches = []
      match_query = MatchModel.query(ancestor=tournament.key)
      for m in match_query:
        matches.append(m)
      matches.sort(key = lambda x: x.timestamp)
      for match in matches:
        player1 = match.player1
        player2 = match.player2
        winner = match.winner
        if player1 in OoR or player2 in OoR:
          continue
        # Find player1 Model
        player1_query = PlayerModel.query(PlayerModel.tag == player1)
        if player1_query.get() is not None:
          player1_object = player1_query.get()
        else:
          player1_object = PlayerModel()
          player1_object.tag = player1
          player1_object.ranking = trueskill.Rating()
          player1_object.put()
        player1_object.lastActive = match.timestamp
        # Find player2 Model
        player2_query = PlayerModel.query(PlayerModel.tag == player2)
        if player2_query.get() is not None:
          player2_object = player2_query.get()
        else:
          player2_object = PlayerModel()
          player2_object.tag = player2
          player2_object.ranking = trueskill.Rating()
          player2_object.put()
        player2_object.lastActive = match.timestamp
        #Run Rankings Algo
        player1_rate = player1_object.ranking
        player2_rate = player2_object.ranking
        #self.response.out.write(player1_rate)
        #self.response.out.write('<br>')
        #self.response.out.write(player2_rate)
        #self.response.out.write('<br>')
        if winner == player1:
          new_player1, new_player2 = trueskill.rate_1vs1(player1_rate, player2_rate)
        else:
          new_player2, new_player1 = trueskill.rate_1vs1(player2_rate, player1_rate)
        #self.response.out.write(new_player1)
        #self.response.out.write('<br>')
        #self.response.out.write(new_player2)
        #self.response.out.write('<br>')
        #self.response.out.write('<br>')
        # Update player stats
        player1_object.ranking = new_player1
        player2_object.ranking = new_player2
        #Save
        player1_object.put()
        player2_object.put()
        #self.response.out.write(match.player1+" vs. "+player2)
        #self.response.out.write('<br>')
      #self.response.out.write('<hl><br><br>')
    self.redirect('/')
 def mutate(self, into, name):
     player = PlayerModel(name=name)
     db_session.add(player)
     db_session.commit()
     return InsertPlayer(player=player)