Работа с игроками в dota2-api

В заметке о матчах говорилось, что данные об его участниках можно получить из другого API. Сейчас пришло время его рассмотреть. Данные, которые это API возвращает, общие для всего Steam. В dota2-api есть класс Dota2Api\Mappers\PlayersMapperWeb. Пример использования:

require_once 'vendor/autoload.php';
require_once 'api-key.php';
 
use \Dota2Api\Models\Player;
 
\Dota2Api\Utils\Request::$apiKey = API_KEY;
 
$playersMapperWeb = new Dota2Api\Mappers\PlayersMapperWeb();
$playersMapperWeb->addId(Player::convertId('88553213')); // Chuan
$playersMapperWeb->addId(Player::convertId('82262664')); // Kuroky
$players = $playersMapperWeb->load();
foreach($players as $player) {
    echo $player->get('avatar')."\n";
    echo $player->get('personaname')."\n";
    echo $player->get('profileurl')."\n";
}

Немного детальнее. Мы пробуем загрузить данные про двух игроков — Chuan и Kuroky. Статический метод convertId класса модели Player используется для перевода account_id (используется в Dota2Api\Models\Slot) в steamlid. Для Чуаня, account_id — 88553213, а steam_id будет — 76561198048818941. Метод load возвращает массив объектов класса Dota2Api\Models\Player. В каждом из них есть поля avatar, personaname, profileurl, steamid. Тут надо быть осторожным с двумя полями, а именно — personaname содержит имя, которое использует игрок в данный момент, а profileurl — это ссылка на профиль, которую игрок выбирает сам. Оба этих значения могут быть изменены в любой момент самым игроком. Например, практически ни один проф. игрок не играет под своим «настоящим» ником. Ибо чревато. Потому не стоит удивляться, что personaname почти всегда содержит какую-то белиберду. profieurl для Chuan (на момент публикации заметки) содержит значение «http://steamcommunity.com/id/bestdotachuan/». «bestdotachuan» — эту часть игрок выбрал себе сам. И может в любой момент поменять. Как же получить постоянную ссылку на его профиль? Берем «https://steamcommunity.com/profiles/» и добавляет в конец steamid. Для Chuan ссылка будет такой — Chuan in Steam. При переходе происходит автоматическое перенаправление на ссылку с «bestdotachuan».

Важное замечание. API может не вернуть никаких данных про запрашиваемый профиль, если у него настройки приватности это запрещают.

Для сохранения данных об игроках в БД есть класс Dota2Api\Mappers\PlayerMapperDb. Пример использования:

$playersMapperWeb = new \Dota2Api\Mappers\PlayersMapperWeb();
$playerMapperDb = new \Dota2Api\Mappers\PlayerMapperDb();
$playersMapperWeb->addId(Player::convertId('88553213'));
$players = $playersMapperWeb->load();
foreach($players as $player) {
    $playerMapperDb->save($player);
}

Из БД данные можно получить используя класс Dota2Api\Mappers\PlayersMapperDb:

$playersMapperDb = new \Dota2Api\Mappers\PlayersMapperDb();
$playersMapperDb->addId(Player::convertId('123051238'));
$players = $playersMapperDb->load();
foreach($players as $player) {
    echo $player->get('personaname');
}

Чуть выше мы говорили, что про игроки почти никогда не играют под своими «реальными» никами. Однако, есть API, где доступны нормальные ники про игроков. Это https://api.steampowered.com/IDOTA2Fantasy_570/GetProPlayerList/V001/. В dota2-api под него нет маппера «из коробки», однако он не особо и нужен. Ниже пример кода, который выполняет запрос и проходится по полученным данным:

$r = new \Dota2Api\Utils\Request('https://api.steampowered.com/IDOTA2Fantasy_570/GetProPlayerList/V001/', []);
$result = $r->send();
foreach ($result->player_infos->message as $r) {
    echo $r->account_id . ' ' . $r->name."\n";
}

Внутри цикла может быть какая угодно логика. Например, обновление поля personaname будет выглядеть так:

use \Dota2Api\Utils\Db;
$db = Db::obtain();
$r = new \Dota2Api\Utils\Request('https://api.steampowered.com/IDOTA2Fantasy_570/GetProPlayerList/V001/', []);
$result = $r->send();
foreach ($result->player_infos->message as $r) {
    $db->updatePdo(Db::realTablename('users'), array('personaname'=>$r->name), array('account_id'=>$r->account_id));
}

А можно сделать и через мапперы:

$r = new \Dota2Api\Utils\Request('https://api.steampowered.com/IDOTA2Fantasy_570/GetProPlayerList/V001/', []);
$playerMapperDb = new \Dota2Api\Mappers\PlayerMapperDb();
$result = $r->send();
foreach ($result->player_infos->message as $r) {
    $player = new \Dota2Api\Models\Player();
    $player->set('personaname', $r->name);
    $player->set('account_id', $r->account_id);
    $playerMapperDb->update($player);
}

, ,

Оставить комментарий

Top ↑ | Main page | Back