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