RiotAPIを使ってLP変動を調べてみる

初投稿です。お手柔らかにおねがいします。


#LOLとは
LoL(League of Legends)はRiotgames社開発の5vs5のオンラインゲームです。
先日にはLJLという日本一決定戦がビックサイトにて行われて大いに盛り上がりました。

さてLoLではRiot APIという形でゲームのいろいろなデータが取得できるようになっています。
学校で学んだことを趣味に生かすため練習にLP(スプラトゥーンでいうウデマエ)の変動を取得してみました。

#実行環境
+ CentOS
 + 7.2.1511
+ PHP 
  + 5.4.16

#APIを使うまで
こちらのふたつのサイト様を参考にさせていただきました。
[Riot Games APIでLeague of Legendsの試合データを取得しよう](http://qiita.com/himrox/items/8e99ee4a8451add5f332)
[Riot Games APIでLeague of Legendsのデータを取得する](http://blog.kizne.net/post/63)

RiotAPIのドキュメントがこちら
[Riot Games API](https://developer.riotgames.com)

またPHP自身の書き方についてこちらの投稿を参考にさせていただきました。
[PHPオブジェクト指向入門（前半）](http://qiita.com/mpyw/items/41230bec5c02142ae691)

#LPを取得するためのクラス及びメソッドを作る
参考にさせて頂いた投稿で学んだオブジェクト指向を意識してクラス、メソッドを作りました。

```php:LP.php
<?php

class LP {

    private $api_key = '*********************************'; 
    private $region = '*****';
    private $name; 
    private $summonersid;
    private $summonerurl;
    private $rankurl;
    

    public function setName($name) {
        $this->name = mb_strtolower($name); 
    }

    public function getName() {
        return $this->name;
    }

    public function setSummonerUrl() {
        $this->summonerurl = 'https://' . $this->region . '.api.pvp.net/api/lol/' . $this->region . '/v1.4/summoner/by-name/' . $this->name . '?api_key=' . $this->api_key;
        
    }

    public function setSummonersid() {
        $curl = curl_init($this->summonerurl);
        curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'GET');
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
        $result = curl_exec($curl);
        curl_close($curl);
        $array = json_decode($result, TRUE);
        $this->summonersid = $array[$this->name]['id'];
        
    }

    public function setRankUrl() {
        $this->rankurl = 'https://' . $this->region . '.api.pvp.net/api/lol/' . $this->region . '/v2.5/league/by-summoner/' . $this->summonersid . '/entry?api_key=' . $this->api_key;
    }

    public function getTotalLP() {
        $curl = curl_init($this->rankurl);
        curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'GET');
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
        $result = curl_exec($curl);
        curl_close($curl);
        $array = json_decode($result, true);
        $tier = $array[$this->summonersid][0]['tier'];
        $divison = $array[$this->summonersid][0]['entries'][0]['division'];
        $LP = $array[$this->summonersid][0]['entries'][0]['leaguePoints'];
        $totalLP =0;
        switch ($tier) {
            case 'BRONZE':
                $totalLP += 0;
                break;
            case 'SILVER':
                $totalLP += 500;
                break;
            case 'GOLD':
                $totalLP += 1000;
                break;
            case 'PLATINUM':
                $totalLP += 1500;
                break;
            case 'DIAMOND':
                $totalLP += 2000;
                break;
            default :
                return "マスター以上です　\n";
                
        }

        switch ($divison) {
            case 'V':
                $totalLP += 0;
                break;
            case 'IV':
                $totalLP += 100;
                break;
            case 'III':
                $totalLP += 200;
                break;
            case 'II':
                $totalLP += 300;
                break;
            case 'I':
                $totalLP += 400;
                break;
        }

        $totalLP += $LP;

        return $totalLP;
    }

}
```
**setName**で取得したサモナーネームからサモナーIDを調べるため**/v1.4/summoner/by-name/**のAPIを使い、
帰ってきたJSONデータからサモナーIDを取り出し、**/v2.5/league/by-summoner/**のAPIを使ってサモナーのランク情報を取得しています。

**getTotalLP**にて**tier,divison,LP**に対して倍率をかけた上、すべて加算することによって
ブロンズ5,0LPを0LPとした際のトータルLPを計算しています。


#取得したLP合計を使い、変動を調べツイートする
LoLをやっている友人とランクを競う糧とするため取得するLP変動をツイートすることにしました。
ツイートするため使わせていただいたライブラリはmpyw様作成の[TwistOAuth](https://github.com/mpyw/TwistOAuth)です。
今回は自分と友人3人のデータを比較してツイートするようにしてみました。

```php:getLP.php
<?php

require_once __DIR__.'/LP.php';
require __DIR__ . '/TwistOAuth.phar';

$ck = '**********************************';
$cs = '**********************************';
$at = '**********************************';
$as = '**********************************';


$sasuke = new LP();
$sasuke->setName('sasuke287');
$sasuke->setSummonerUrl();
$sasuke->setSummonersid();
$sasuke->setRankUrl();


$sasukeLP =$sasuke->getTotalLP();
$sasukeName = $sasuke->getName();
//echo $sasukeName.":".$sasukeLP;
sleep(2);

$sion = new LP();
$sion->setName('ごめんなSion');
$sion->setSummonerUrl();
$sion->setSummonersid();
$sion->setRankUrl();


$sionLP =$sion->getTotalLP();
$sionName =$sion->getName();
//echo $sionName.":".$sionLP;
sleep(2);


$Masami = new LP();
$Masami->setName('Masami');
$Masami->setSummonerUrl();
$Masami->setSummonersid();
$Masami->setRankUrl();


$MasamiLP =$Masami->getTotalLP();
$MasamiName = $Masami->getName();
//echo $MasamiName.":".$MasamiLP;
sleep(2);


$NanaAlly = new LP();
$NanaAlly->setName('NanaAlly');
$NanaAlly->setSummonerUrl();
$NanaAlly->setSummonersid();
$NanaAlly->setRankUrl();


$NanaAllyLP =$NanaAlly->getTotalLP();
$NanaAllyName=$NanaAlly->getName();
//echo $NanaAllyName.":".$NanaAllyLP;
sleep(2);

$json = file_get_contents("LP.json");
$json = mb_convert_encoding($json, 'UTF8', 'ASCII,JIS,UTF-8,EUC-JP,SJIS-WIN');
$array = json_decode($json,true);

$sasukeOldLP = $array["sasuke287"];
$sionOldLP = $array["ごめんなsion"];
$MasamiOldLP = $array["masami"];
$NanaAllyOldLP = $array["nanaally"];

$sasukeLPGap = $sasukeLP-$sasukeOldLP;
$sionLPGap = $sionLP -$sionOldLP;
$MasamiLPGap = $MasamiLP- $MasamiOldLP;
$NanaAllyLPGap= $NanaAllyLP- $NanaAllyOldLP;

$LPGap = array(
    "@sasuke_287" => "$sasukeLPGap",
     "@RIPTakajun" => "$sionLPGap" ,
    "@MasuraoReisen " => "$MasamiLPGap" ,
    "@na7tut" => "$NanaAllyLPGap"
        );
$sort = arsort($LPGap);
$LPGapjson =  json_encode($LPGap, JSON_PRETTY_PRINT|JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES);
file_put_contents("LPGap.json", $LPGapjson);

foreach ($LPGap as $key => $value){
  $txt .= $key.' '.$value."\n";
}
$tweet = '前回からのLP変動は'."\n".$txt.'です。';

try {
    $to = new TwistOAuth($ck, $cs, $at, $as)れ
    $status = $to->post('statuses/update', ['status' => $tweet]);
    var_dump($status);
} catch (TwistException $e) {
    echo "[{$e->getCode()}] {$e->getMessage()}";
}

```

上に記したLP.phpから
**setName**,**setSummonerUrl**,**setSummonersid**,**setRankUrl**,**getTotalLP**と参照することで現在の合計LPを取得します。
そして後にでてきますが前回実行時の合計LPが記録されている**LP.json**から取得した過去の合計LPを取得します。

現在の合計LPから過去の合計LPを引いたものがLP変動となります。(**LPGap= LP -OldLP**)
LP変動値をどうやってソートしていいのかわからなかったため一度配列にしarsortを使いソートした後、
foreachで回してツイート本文を作っています。

ツイート部分はライブラリTwistOAuthのサンプルをそのまま使いました。

なおsleep(2)はAPIの制限に引っ掛からないように入れてみました。

#実行結果
実行した結果がこちらになります
![screenshot.135.jpg](https://qiita-image-store.s3.amazonaws.com/0/151522/b000615b-4ab2-4e5f-2ec6-bba2bc2de0ba.jpeg)
[https://twitter.com/Gmso_pzlbot/status/849305749163474944](https://twitter.com/Gmso_pzlbot/status/849305749163474944)

きちんと筆者、sasuke287がランクで負け、減ったLP文が反映されています。
このプログラムをcronで定期的に動かしLPを上げなければというプレッシャーを作れたらと思います。

#学んだこと
* オブジェクト指向っぽいの
* RiotAPIの使い方の基礎
* JSONデータからの値の取り出し方
* (この記事を書くにあたって)マークダウンの書き方
* (同じく)このサイトの発音がキータなこと

#不安・満足していない・だめだと思うところ
* マスターランク以上のLPがとれない
  * ~~そこまでランクが上がらないと思うのでいらないかも~~
- 昇格戦前後の変動がゲーム内表記と異なる
  - 昇格戦かどうかとかどう取得するんでしょうか・・・
-  例外処理とかガバガバ
  - 本来ならAPIから帰ってくるエラーコードに例外処理とか書くべきなはず・・・
-  オブジェクト指向がこれで合っているのかがわからない


#さいごに
RiotAPIを使った物として有名な物ではOP.GGやchampion.ggが、ユニークな物はQiitaやTwitterなどで数多くの物が作られています。
好きなゲームのデータでいろいろなことができるのはとても楽しいのでみなさんも是非RiotAPIについて調べてみてください!



またソースのガバガバな部分や記述がガバガバな部分がありましたらコメントなど頂けるとありがたいです。
お読みいただきありがとうございました。