Eureka

アクアリウムとかサカナクションのこと

Pythonでスプラトゥーン2のリグマ募集DiscordBotを作った

熱帯魚が水槽から飛び出して、地面で煮干しのように干からびている光景を目にした飼い主の気持ちを答えよ。

夏あたりからPythonを使ってDiscord Botを作成したことのアウトプットをつらつらと。ちなみにこの記事を書いては止めてを繰り返して2ヶ月以上経っている。
なお、以下、プログラミングコードなどは載ってない…はず。(理由は汚い&見たまま記法なのでコードブロックがない。)

 

 

経緯

超大型台風が来て、関東全域が停電になるっていうから暇つぶしにできることを探した結果である。「え、ゲームできないじゃん?テレビも見れないじゃん?暇じゃん?」ってなりました。ネットも使わずにやれる暇つぶしはないかと考えた結果、そうだプログラミングをしよう!となる思考回路。
チームへリグマを募集するようになって気づく。@everyone入れるのがめんどくせぇと。ルールを調べるのがめんどくせぇと。ステージを打ち込むのがめんどくせぇと。Twitterクライアントを入れていないため、@everyoneが入ってないと募集を見逃す。
全てにおいて、まず「めんどくせーぇ」と言うことに定評がありすぎるため、なんとかならんかなぁと考えていました。

その結果がコレである。

運用について

チームのリーダーがbotを作っていたので色々調べる。なぜか最初に運用の方法調べました、作って運用に金かかるってなると非常に萎えるので。
結果として、botHerokuを使えば無料で動かせそうってこと、Pythonも無料で触れそうってことが分かりました。
最近は無料で何でもできる世の中でうれしい限り。言語をPythonにした理由はネットに転がっている文献が非常に多かったので、コピペで作れるかなって思ったの。RubyでもJavaScriptでも何でも良かったって言えば良かった。

 

要件定義

んじゃぁーとりあえず要件を決めようってこって、下記としました。

  1. 冒頭に【.tl】、文章内に【@everyone】を入れる
  2. botを叩いた人の名前を入れる
  3. ナワバリまたはリグマのステージを通知する
  4. ルールと今のステージと次のステージまで分かるようにする

本当はリアクションで参加表明通知とかさせたかったんですけど、めんどくさくなってしまったので入れませんでした。なるべく早めにリリースをすること、多分そうしないと頓挫する。

 

環境設定

Python初心者だったためPythonのインストールとエディタを確認する。Pythonはなぜか3.*と2.*があったんだけど、あれは何なの?よく分からないけど、バージョンは高いほうがいいべってことで【Python 3.7.4】をインストール。インストールの方法はQiita様に聞きました。

エディタは何にしようかなー、メモ帳でもいいんだけどいいのないかなー?って思って色々ググったところ【PyScripter】というのが良さげだったのでインストール。無料のくせに…とても使いやすいです、ありがとう。

Pythonをインストール後、Discord Bot用のプラグインがいるとのことでインポートを実施しました。

ついでにDiscordのサーバを立てる。無料で建てられるなんて初めて知ったぞ。
自分のサーバを建てた後は、Botをサーバ上に作成してトークンを生成しました。
ちなみにここまでを台風の前日にクリアしました、ネット環境必須のところなので。

 

構築(台風当日)

朝から豪雨、きっと新宿も豪雨だったでしょう。
まず真っ先に電気がつくことと水が出ることを確認して、朝ご飯を食べて少しゲームしました。飽きてきた頃合いでPCを起動し、Discord Botの作成を実施しました。

コードなどはQiitaに聞いてください笑

 1時間ほどで自分の発言に反応するDiscord Botが作成できました。コードは当たり前のようにコピペです。
要件の1と2はクリアできたので、本格的にスプラトゥーンの情報を取得しようと考えました。

Discord Botの作り方を調べてる時点で、ステージAPI*1があることは分かっていたので、とりあえずGoogleさんに「Python WebAPI 取り方」って聞いてみた。速攻でQiita様が答えてくれました。良くある天気予報を取るやつが上がってきたので改変をしてステージ情報のJSON*2を落としてくるようにしました。
ここら辺からが非常に厄介で、インフラしかやってこなかったため「じぇいそんとは…?でぇたけいしき…?」と猿が初めてプログラミング触ったんか?レベルでひたすら調べ続けてました。結果としてよく分からんけど、なんか配列くさいやつ。全部をインタプリタに出力したら、とりあえずステージらしきものが取得できてました。ここから添字を追加してお目当てだった「今」と「次」のステージ情報を取得。

残りは、「自分の発言に反応する」プログラムと、「ステージ情報を取ってくる」プログラムをがっちゃんこして完成。テッテレーン

なお、豪雨暴風で非常にお外はうるさかったのですが一切停電などは起きず、私は一体何をしてるんだと…。 

 ここまでやってとりあえず寝ました。要件は満たせているけど、APIを借りているサイトの要件(User-Agentの明記)が済んでいなかったので、後日記述しました。

 

テスト

しないよ、してないよーーー!!!!!!

一応軽く時間跨ぎとかした程度です、情報が間違えているとすれば…API側()。
軽くAPIに渡す引数が正しいか、とかそういう程度のテストです。

 

リリース

前述しているが、サーバはHerokuを使うことにしていました。Qiita様様で「DiscordBot Heroku アップロード」で全てが解決した。めちゃくちゃ時間かかったけど…。
まずHerokuにアップロードするための3種のファイルの書き方が分からなかった。地味に大文字小文字も判定されてて、アップロードして起動しているのに無反応だったりして…。
インタプリタぽいものがどこにあるかも分からないし、動かない理由がどこに出力されているの?!って感じでてんやーわんやーしてました。
なお、調べて色々Try&Errorをしてしまったため、明確に記載できない。する気もない。コマンドを全部コピーして、今でも無心でアップロードしてますw

 

後記

色々書きましたが、適当です。「頑張ったね、自分」という気持ちを込めて笑
なお製作には約3日ほどの人日となります。Pythonとか業務で使ってる人なら半日あれば終わるんじゃないか説。

実はリリースしてから「もしかして余計な事してない?!」とか「頑張って作ったけど使われなかったらどうしよう」などと突然不安になりましたw チームリーダーや運営の方々、アイコンを描いてくださった方…結構な人を巻き込んでいた気がする。本当にすみません、そしてありがとうございます!運用の方法を調べる前に、まず許可取ってから動こうな?

半年ほど運用していますが、なんだかんだチームメンバから使われているのを見て嬉しい次第でございます。やっぱツールは作っても使ってもらわなきゃ意味がないのでね…。使っていただき、ありがとうございます!!