Esempio n. 1
0
    def post(self):
        template_params = handle_user()
        if not 'admin' in template_params:
            self.redirect('/')
            return
        tournament_url = self.request.get("url")
        # Check for input
        if tournament_url == "":
            self.redirect("/addTournaments")
            return
        dup_check = TournamentModel.query(
            TournamentModel.url == convert_url(tournament_url))
        if dup_check.get() is not None:
            render_template(self, 'error_dup_league.html', template_params)
            return
        api.set_credentials(CHALLONGE_USERNAME, CHALLONGE_API)
        #Handle tournament not found error
        tournament = tournaments.show(tournament_url)
        tournament_object = TournamentModel()
        tournament_object.name = tournament['name']
        tournament_object.url = convert_url(tournament_url)
        timestamp = parser.parse(tournament['created-at'][:-6])
        tournament_object.timestamp = timestamp
        tournament_object.put()

        # Extract the matches
        # Move participant seach to preindex'd list rather than 3 challonge requests
        match_list = matches.index(tournament['id'])
        participant_list = participants.index(tournament['id'])
        self.response.out.write(participant_list)
        for match in match_list:
            match_object = MatchModel(parent=tournament_object.key)
            # Find names via challonge
            #match_object.player1 = participants.show(tournament['id'], match['player1-id'])['name']
            #match_object.player2 = participants.show(tournament['id'], match['player2-id'])['name']
            # Find names via list
            for p in participant_list:
                if p['id'] == match['player1-id']:
                    match_object.player1 = p['name']
                if p['id'] == match['player2-id']:
                    match_object.player2 = p['name']
            if match['scores-csv'] != "":
                parts = match['scores-csv'].split('-')
                match_object.player1Score = int(parts[0])
                match_object.player2Score = int(parts[1])
            winner = participants.show(tournament['id'], match['winner-id'])
            match_object.winner = winner['name']
            match_object.label = match['identifier']
            timestamp = parser.parse(match['started-at'][:-6])
            match_object.timestamp = timestamp
            match_object.put()

        self.redirect("/listTournaments")
Esempio n. 2
0
    def post(self):
        a = MatchModel()
        a.player1 = self.request.POST['player1']
        a.player2 = self.request.POST['player2']

        a.scores = utils.calculate_score_from_post(self.request)

        #TODO: Break rest of the score calculation into utils.py
        players = ndb.get_multi([ndb.Key(PlayerModel, a.player1), ndb.Key(PlayerModel, a.player2)])
        p1_total = [a.scores[0].player1, a.scores[1].player1, a.scores[2].player1]
        p2_total = [a.scores[0].player2, a.scores[1].player2, a.scores[2].player2]

        logging.info("Match between %s %s and %s %s" % (players[0].first_name,
                                                        players[0].last_name,
                                                        players[1].first_name,
                                                        players[1].last_name))

        p1_wins = 0
        p2_wins = 0

        for i in range(0, len(p1_total)):
            logging.info("Game %d: %d - %d" % (i + 1, p1_total[i], p2_total[i]))
            if p1_total[i] > p2_total[i]:
                p1_wins += 1
                logging.info("%s wins Game %d" % (players[0].first_name, i + 1))
            elif p2_total[i] > p1_total[i]:
                p2_wins += 1
                logging.info("%s wins Game %d" % (players[1].first_name, i + 1))

        logging.info("%s won %d games; %s won %d games" % (players[0].first_name,
                                p1_wins, players[1].first_name, p2_wins))

        if p1_wins > p2_wins:
            winner = players[0]
            loser = players[1]
        elif p2_wins > p1_wins:
            winner = players[1]
            loser = players[0]
        else:
            logging.info("No score submitted, loading ladder")
            self.get()
            return

        logging.info("Winner: %s" % winner)
        logging.info("Loser: %s" % loser)

        logging.info("%s %s's old rank was %d" %
                     (winner.first_name, winner.last_name, winner.skillScore))
        logging.info("%s %s's old rank was %d" %
                     (loser.first_name, loser.last_name, loser.skillScore))

        winnerRank, loserRank  = utils.calculate_elo_rank(winner.skillScore,
                                                          loser.skillScore)

        # Try returning the point change for some interesting data
        point_change = int(winnerRank - winner.skillScore)

        logging.info("%s %s's rank is now %d, a change of %d points" %
                     (winner.first_name, winner.last_name, winnerRank,
                      winnerRank - winner.skillScore))
        logging.info("%s %s's rank is now %d, a change of %d points" %
                     (loser.first_name, loser.last_name, loserRank,
                      loser.skillScore - loserRank))

        winner.skillScore = int(winnerRank)
        loser.skillScore = int(loserRank)

        basePoints = int((loser.skillScore - winner.skillScore) * 0.3)
#        #print basePoints
        if basePoints < -100 :
            basePoints = 5
        elif basePoints < -20:
            basePoints = 10 #todo: This is wrong, but better.
        elif basePoints < 20:
            basePoints = 20

        a.baseValue = basePoints
        a.put()

#       Not needed with ELO calculations from utils.py
#        bonusPoints = int((basePoints*point_dff)/10)

#        winner.skillScore = winner.skillScore + basePoints + bonusPoints
#        loser.skillScore = loser.skillScore - basePoints - bonusPoints
        winner.gamesWon += 1
        winner.gamesPlayed += 1
        loser.gamesPlayed += 1

        winner.put()
        loser.put()

        user = users.get_current_user()
        user_email = str(user.email())
        if user_email != str(a.player1):
            opponent_email = str(a.player1)
        else:
            opponent_email = str(a.player2)

        #TODO: Break email dispatch into utils.py
        message = mail.EmailMessage()
        message.sender = user_email
        message.to = opponent_email
        message.subject = "Match Entry - Vendasta Foosball Ladder"
        if winner == players[0]:
            message.html = """
<p>A match was entered between %s (winner) and %s (loser).</p>
<p>The game scores were %d-%d, %d-%d, %d-%d</p>
<p>Check out the ladder by going <a href='http://vendladder.appspot.com'>here</a>.</p>
""" % (winner.first_name + " " + winner.last_name,
       loser.first_name + " " + loser.last_name,
            a.scores[0].player1, a.scores[0].player2,
            a.scores[1].player1, a.scores[1].player2,
            a.scores[2].player1, a.scores[2].player2)
        else:
            message.html = """
<p>A match was entered between %s (winner) and %s (loser).</p>
<p>The game scores were %d-%d, %d-%d, %d-%d</p>
<p>Check out the ladder by going <a href='http://vendladder.appspot.com'>here</a>.</p>
""" % (winner.first_name + " " + winner.last_name,
       loser.first_name + " " + loser.last_name,
           a.scores[0].player2, a.scores[0].player1,
           a.scores[1].player2, a.scores[1].player1,
           a.scores[2].player2, a.scores[2].player1)

        logging.info("Emailing %s from %s" % (user_email, opponent_email))

        message.send()

        self.get(success=True, point_change=point_change)