parent
fd50796b4e
commit
090985b931
6 changed files with 273 additions and 2 deletions
@ -0,0 +1,70 @@ |
|||||||
|
<?php |
||||||
|
|
||||||
|
class RiotRequest { |
||||||
|
|
||||||
|
protected string $endpoint; |
||||||
|
protected array $headers = array(); |
||||||
|
protected array $queries = array(); |
||||||
|
protected string $host = "https://euw1.api.riotgames.com"; |
||||||
|
public array $responseHeader = array(); |
||||||
|
public int $responseCode; |
||||||
|
private bool $triedEUNE = false; |
||||||
|
|
||||||
|
public function __construct($endpoint) { |
||||||
|
$this->endpoint = $endpoint; |
||||||
|
} |
||||||
|
|
||||||
|
public function useRouting(): void { |
||||||
|
$this->host = "https://europe.api.riotgames.com"; |
||||||
|
} |
||||||
|
|
||||||
|
public function setHeaders($headers): void { |
||||||
|
$this->headers = $headers; |
||||||
|
} |
||||||
|
|
||||||
|
public function setQueries($queries): void { |
||||||
|
$this->queries = $queries; |
||||||
|
} |
||||||
|
|
||||||
|
protected function getHeaderString(): string { |
||||||
|
$api_key = getenv("RIOT_API_KEY"); |
||||||
|
$header = "X-Riot-Token: $api_key\r\n"; |
||||||
|
foreach ($this->headers as $key => $value) { |
||||||
|
$header .= "$key: $value\r\n"; |
||||||
|
} |
||||||
|
return $header; |
||||||
|
} |
||||||
|
|
||||||
|
private function getFinalURL(): string { |
||||||
|
$queryString = "?"; |
||||||
|
foreach ($this->queries as $key => $value) { |
||||||
|
$queryString .= "$key=$value&"; |
||||||
|
} |
||||||
|
$url = $this->host . "/" . $this->endpoint . $queryString; |
||||||
|
return str_replace(" ", "", $url); |
||||||
|
} |
||||||
|
|
||||||
|
public function run() { |
||||||
|
$opts = [ |
||||||
|
"http" => [ |
||||||
|
"method" => "GET", |
||||||
|
"header" => $this->getHeaderString() |
||||||
|
] |
||||||
|
]; |
||||||
|
$context = stream_context_create($opts); |
||||||
|
$url = $this->getFinalURL(); |
||||||
|
$result = @file_get_contents($url, false, $context); |
||||||
|
$this->responseHeader = $http_response_header; |
||||||
|
preg_match_all("/HTTP\/\d\.\d\s+(\d+)\s+/", $this->responseHeader[0], $matches); |
||||||
|
$this->responseCode = intval($matches[1][0]); |
||||||
|
|
||||||
|
if ($this->responseCode == 404 && !$this->triedEUNE) { |
||||||
|
$this->host = "https://eun1.api.riotgames.com"; |
||||||
|
$this->triedEUNE = true; |
||||||
|
return $this->run(); |
||||||
|
} |
||||||
|
|
||||||
|
return json_decode($result); |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,180 @@ |
|||||||
|
<?php |
||||||
|
|
||||||
|
require_once "../util/mysql_connect.php"; |
||||||
|
require_once "RiotRequest.php"; |
||||||
|
|
||||||
|
class Tracker { |
||||||
|
private MySQLConnection $conn; |
||||||
|
|
||||||
|
/** |
||||||
|
* @var Account[] |
||||||
|
*/ |
||||||
|
public array $accounts; |
||||||
|
|
||||||
|
/** |
||||||
|
* @var Elo[][] |
||||||
|
*/ |
||||||
|
public array $entries; |
||||||
|
|
||||||
|
public function __construct() { |
||||||
|
$this->conn = new MySQLConnection(); |
||||||
|
$this->readAccounts(); |
||||||
|
$this->readEntries(); |
||||||
|
} |
||||||
|
|
||||||
|
private function readAccounts(): void { |
||||||
|
$accounts = []; |
||||||
|
|
||||||
|
$sql = $this->conn->query("SELECT * FROM `accounts`"); |
||||||
|
while ($row = $sql->fetch_assoc()) { |
||||||
|
$account = new Account(); |
||||||
|
$account->puuid = $row["puuid"]; |
||||||
|
$account->gameName = $row["gameName"]; |
||||||
|
$account->tagLine = $row["tagLine"]; |
||||||
|
|
||||||
|
$accounts[$account->puuid] = $account; |
||||||
|
} |
||||||
|
|
||||||
|
$this->accounts = $accounts; |
||||||
|
} |
||||||
|
|
||||||
|
private function readEntries(): void { |
||||||
|
$sql = $this->conn->query(" |
||||||
|
SELECT accounts.puuid AS puuid, date, tier, `rank`, points |
||||||
|
FROM accounts LEFT JOIN elo_entries ON id = accountId |
||||||
|
ORDER BY accounts.puuid, date |
||||||
|
"); |
||||||
|
|
||||||
|
$result = []; |
||||||
|
|
||||||
|
while ($row = $sql->fetch_assoc()) { |
||||||
|
$puuid = $row["puuid"]; |
||||||
|
$date = $row["date"]; |
||||||
|
|
||||||
|
if (!isset($result[$puuid])) |
||||||
|
$result[$puuid] = []; |
||||||
|
|
||||||
|
if (!$date) |
||||||
|
continue; |
||||||
|
|
||||||
|
$elo = new Elo(); |
||||||
|
$elo->tier = $row["tier"]; |
||||||
|
$elo->rank = $row["rank"]; |
||||||
|
$elo->points = $row["points"]; |
||||||
|
|
||||||
|
$result[$puuid][$date] = $elo; |
||||||
|
} |
||||||
|
|
||||||
|
$this->entries = $result; |
||||||
|
} |
||||||
|
|
||||||
|
public function update(): void { |
||||||
|
|
||||||
|
foreach ($this->accounts as $puuid => $account) { |
||||||
|
$account->updateRiotID(); |
||||||
|
$account->addNewEloEntry($this->entries[$puuid]); |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
class Account { |
||||||
|
public string $puuid; |
||||||
|
public string $gameName; |
||||||
|
public string $tagLine; |
||||||
|
|
||||||
|
/** |
||||||
|
* @param Elo[] $eloEntries |
||||||
|
*/ |
||||||
|
public function addNewEloEntry(array &$eloEntries): void { |
||||||
|
$summonerId = (new RiotRequest("lol/summoner/v4/summoners/by-puuid/$this->puuid"))->run()->id; |
||||||
|
$fetchedLeagues = (new RiotRequest("lol/league/v4/entries/by-summoner/$summonerId"))->run(); |
||||||
|
|
||||||
|
$currentElo = end($eloEntries); |
||||||
|
|
||||||
|
foreach ($fetchedLeagues as $fetchedElo) { |
||||||
|
if ($fetchedElo->queueType === "RANKED_SOLO_5x5" && ($fetchedElo->wins + $fetchedElo->losses >= 5)) { |
||||||
|
if (!$currentElo || |
||||||
|
$currentElo->tier !== $fetchedElo->tier || |
||||||
|
$currentElo->rank !== $fetchedElo->rank || |
||||||
|
$currentElo->points !== $fetchedElo->leaguePoints){ |
||||||
|
|
||||||
|
$currentElo = new Elo(); |
||||||
|
$currentElo->tier = $fetchedElo->tier; |
||||||
|
$currentElo->rank = $fetchedElo->rank; |
||||||
|
$currentElo->points = $fetchedElo->leaguePoints; |
||||||
|
|
||||||
|
$date = (new DateTime("now"))->format("Y-m-d H:i:s"); |
||||||
|
$eloEntries[$date] = $currentElo; |
||||||
|
|
||||||
|
$conn = new MySQLConnection(); |
||||||
|
|
||||||
|
$sqlAccountId = $conn->query(" |
||||||
|
SELECT id |
||||||
|
FROM `accounts` |
||||||
|
WHERE puuid = '$this->puuid' |
||||||
|
")->fetch_assoc()["id"]; |
||||||
|
|
||||||
|
$conn->prepare(" |
||||||
|
INSERT INTO `elo_entries` |
||||||
|
(accountId, date, tier, `rank`, points) |
||||||
|
VALUES (?, ?, ?, ?, ?) |
||||||
|
")->execute([ |
||||||
|
$sqlAccountId, $date, $currentElo->tier, $currentElo->rank, $currentElo->points |
||||||
|
]); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
public function updateRiotID(): void { |
||||||
|
$request = new RiotRequest("riot/account/v1/accounts/by-puuid/$this->puuid"); |
||||||
|
$request->useRouting(); |
||||||
|
$result = $request->run(); |
||||||
|
if ($request->responseCode == 200) { |
||||||
|
$this->gameName = $result->gameName; |
||||||
|
$this->tagLine = $result->tagLine; |
||||||
|
|
||||||
|
$conn = new MySQLConnection(); |
||||||
|
$conn->query(" |
||||||
|
UPDATE `accounts` |
||||||
|
SET `gameName` = '$this->gameName', `tagLine` = '$this->tagLine' |
||||||
|
WHERE `puuid` = '$this->puuid' |
||||||
|
"); |
||||||
|
|
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
class Elo { |
||||||
|
public string $tier; |
||||||
|
public string $rank; |
||||||
|
public int $points; |
||||||
|
public function value() : int { |
||||||
|
$tiers = [ |
||||||
|
"CHALLENGER" => 2800, |
||||||
|
"GRANDMASTER" => 2800, |
||||||
|
"MASTER" => 2800, |
||||||
|
"DIAMOND" => 2400, |
||||||
|
"EMERALD" => 2000, |
||||||
|
"PLATINUM" => 1600, |
||||||
|
"GOLD" => 1200, |
||||||
|
"SILVER" => 800, |
||||||
|
"BRONZE" => 400, |
||||||
|
"IRON" => 0, |
||||||
|
]; |
||||||
|
|
||||||
|
$ranks = [ |
||||||
|
"I" => 300, |
||||||
|
"II" => 200, |
||||||
|
"III" => 100, |
||||||
|
"IV" => 0, |
||||||
|
]; |
||||||
|
|
||||||
|
$tier = $this->tier; |
||||||
|
|
||||||
|
if ($tier === "MASTER" || $tier === "GRANDMASTER" || $tier === "CHALLENGER") |
||||||
|
return $tiers[$tier] + $this->points; |
||||||
|
|
||||||
|
return $tiers[$tier] + $ranks[$this->rank] + $this->points; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,6 @@ |
|||||||
|
<?php |
||||||
|
|
||||||
|
require_once "Tracker.php"; |
||||||
|
|
||||||
|
$tracker = new Tracker(); |
||||||
|
$tracker->update(); |
After Width: | Height: | Size: 41 KiB |
Loading…
Reference in new issue