/** * Calculate a single player new elo * * @param User $user * @param int $opponentElo * @param int $win * @return int */ protected function calculateUserElo(User $user, $opponentElo, $win) { $score = $this->calculateScore($win); $expected = $this->calculateExpected($user->getElo(), $opponentElo); $kFactor = $this->nbRatedGamesToKfactor($user->getNbRatedGames()); $difference = 2 * $kFactor * ($score - $expected); return round($user->getElo() + $difference); }
public function testCalculateWithoutProvision() { $calculator = new Calculator(); $user1 = new User(); $user1->setElo(1313); $user1->setNbRatedGames(1256); $user2 = new User(); $user2->setElo(1158); $user2->setNbRatedGames(124); $win = -1; list($newP1Elo, $newP2Elo) = $calculator->calculate($user1, $user2, $win); $this->assertEquals(1322, $newP1Elo); $this->assertEquals(1149, $newP2Elo); }
public function punish(User $user) { $this->log(sprintf('Punish player %s', $user->getUsernameWithElo())); $games = $this->gameRepository->findCancelableByUser($user); foreach ($games as $game) { $loser = $game->getLoser(); if ($eloDiff = $loser->getEloDiff()) { if ($loserUser = $loser->getUser()) { $this->log(sprintf('Restitute %d elo to %s for game %s', -$eloDiff, $loserUser->getUsername(), $game->getId())); $this->eloUpdater->adjustElo($loserUser, $loserUser->getElo() - $eloDiff); $game->setIsEloCanceled(true); } } } $this->log(sprintf('Reset %s elo to %d', $user->getUsername(), User::STARTING_ELO)); $this->eloUpdater->adjustElo($user, User::STARTING_ELO); }
public function getData(User $user) { $userId = $user->getId(); $usernames = $this->userRepository->getUsernamesIndexedById(); $games = iterator_to_array($this->gameRepository->createRecentByUserQuery($user)->hydrate(false)->select('createdAt', 'status', 'turns', 'v', 'isRated', 'clock.l', 'clock.i', 'players.user.$id', 'players.c', 'players.w', 'players.elo', 'players.eloDiff')->getQuery()->execute()); $data = array(array('#', 'Date (RFC 2822)', 'Color', 'Opponent', 'Result', 'Status', 'Plies', 'Variant', 'Mode', 'Time control', 'Your Elo', 'Your Elo change', 'Opponent Elo', 'Opponent Elo Change', 'Game url', 'Analysis url', 'PGN url')); $it = 0; foreach ($games as $gameId => $game) { list($player, $opponent) = $this->findPlayerAndOpponent($game, $userId); if (!empty($player['isAi'])) { $opponentUsername = sprintf('A.I. level %d', $opponent['aiLevel']); } elseif (!empty($opponent['user']['$id'])) { $opponentUsername = isset($usernames[(string) $opponent['user']['$id']]) ? $usernames[(string) $opponent['user']['$id']] : 'Anonymous'; } else { $opponentUsername = '******'; } $clock = isset($game['clock']) ? $game['clock'] : null; $data[] = array(++$it, date('r', $game['createdAt']->sec), $player['c'], $opponentUsername, $this->getPgnResult($game), $this->getStatusMessage($game['status']), $game['turns'] - 1, $this->getVariantName($game['v']), !empty($game['isRated']) ? 'rated' : 'casual', $clock ? sprintf('%d %d', round($clock['l'] / 60, 1), $clock['i']) : 'unlimited', (int) $player['elo'], (int) isset($player['eloDiff']) ? $player['eloDiff'] : 0, (int) isset($opponent['elo']) ? $opponent['elo'] : 0, (int) isset($opponent['eloDiff']) ? $opponent['eloDiff'] : 0, $this->urlGenerator->generate('lichess_game', array('id' => $gameId, 'color' => $player['c']), true), $this->urlGenerator->generate('lichess_pgn_viewer', array('id' => $gameId, 'color' => $player['c']), true), $this->urlGenerator->generate('lichess_pgn_export', array('id' => $gameId, 'color' => $player['c']), true)); } return $data; }
public function is(User $user = null) { return $user && $user->getUsernameCanonical() === $this->getUsernameCanonical(); }
/** * Sets: Optional registered user who owns the hook * * @param User user */ public function setUser(User $user) { $this->user = $user; $this->username = $user->getUsername(); $this->elo = $user->getElo(); $this->engine = $user->isEngine(); }
public function isOnline(User $user) { return $this->isUsernameOnline($user->getUsernameCanonical()); }
public function __construct(User $user) { $this->id = $user->getUsernameCanonical(); $this->addEntry($user->getCreatedAt()->getTimestamp(), User::STARTING_ELO, self::TYPE_START); }
/** * @param User * @return null */ public function setAuthor(User $author) { $this->author = $author; $this->authorName = $author->getUsername(); }
public function linkUser(User $user, $class = null) { $url = $this->getRouterGenerator()->generate('fos_user_user_show', array('username' => $user->getUsername())); return sprintf('<a class="user_link%s" href="%s"%s>%s</a>', $user->getIsOnline() ? ' online' : '', $url, null === $class ? '' : ' class="' . $class . '"', $user->getUsernameWithElo()); }
/** * Get the rank of the user starting from 1 (better) * * @return int **/ public function getUserRank(User $user) { return $this->createQueryBuilder()->field('elo')->gt($user->getElo())->getQuery()->count() + 1; }
public function findOneByUser(User $user) { return $this->findOneBy(array('id' => $user->getUsernameCanonical())); }
public function adjustElo(User $user, $elo) { $user->setElo($elo); $ts = date_create()->getTimestamp(); $this->historyRepository->findOneByUserOrCreate($user)->addAdjust($ts, $elo); }
public function linkUser(User $user, $class = null, $withElo = false) { $username = $withElo ? $user->getUsernameWithElo() : $user->getUsername(); $url = $this->getUrlGenerator()->generate('fos_user_user_show', array('username' => $user->getUsername())); return sprintf('<a class="user_link%s%s" href="%s">%s</a>', $user->getIsOnline() ? ' online' : '', null === $class ? '' : ' ' . $class, $url, $username); }
/** * Get the rank of the user starting from 1 (better) * * @return int **/ public function getUserRank(User $user) { return $this->createEnabledQueryBuilder()->field('elo')->gt($user->getElo())->hint(array('elo' => -1))->getQuery()->count() + 1; }