キューマン・エノビクト
416 views
Discord
プログラミング
API
bot
Python
タグを編集する

SOLD OUT 2 市場情報bot for Discordを作った話

初投稿です。キューマン・エノビクトと申します。
ミミ星人街で「./90k.py」(#44206)という店を営んでおります。水が欲しいので近々引っ越しをしようかと考えてます。
主に使うプログラミング言語はPythonです。どうでもいいですね。
この記事はQiitaに投稿しようかと思っていましたが、セクレタリというものの存在を知って、良さそうだと思ったので投稿することにしました。

def main("主題"):

タイトルのままです。Discord用のbotを作りました。
SO2のAPIをボッコボコに叩いてます。
GitHubのリポジトリはこちらです→https://github.com/Qman11010101/SO2MarketInfoBotForDiscord

def purpose("目的"):

mu氏が公式Discordサーバーを作る前から身内鯖がありました。
その中のチャンネルの一つに、「市場情報」というものがあります。
値段が上がってたり下がってたりするのを見つけたときに各自思いのままに報告するチャンネルですので、知りたい情報を得ることができるというわけではありません。
そこで、いつでも好きなアイテムの情報を得ることができたらいいと思いました。
そんな話を友人(Pythonをすごく書ける)にしたら、「作ろう」と言われたので、作ることにしました。

def environment("環境"):

使用言語: Python 3.7
使用したDiscord用APIラッパー: discord.py 1.2.1
使用したサードパーティーライブラリ: requirements.txt参照

def mechanism("機能"):

市場情報

コマンドとアイテム名を入力すると、その時点での

  • 販売最安値
  • 販売最高値
  • 販売最安TOP5平均値
  • 全体平均値
  • 中央値
  • 市場全体の販売数
  • 販売店舗数

および

  • 注文最高値
  • 注文最安値
  • 注文最高TOP5平均
  • 全体平均値
  • 中央値
  • 市場全体の注文数
  • 注文店舗数

を表示します。コマンドに引数をつけることで、販売品のみ・注文品のみや、特定の街のみを得たり、Beta版の情報を得たりできます。
項目はSOLD OUT 2 市場情報を参考にしました。最初は比較的正確な目安としてTOP5平均値を用意していました(全体平均値は、例えばハーブティーはなぜか常に1000万で出している人がいるためバグるしスピードポーションも必ず314159Gで出してる人がいる)。
ただ、市場情報のサイトが中央値を採用しているため、友達と相談して中央値を追加しました。
情報はAPIの制限上常に最新のものを取得できるというわけではないため、あくまでも目安となります。

エイリアス

短縮名称を登録し、それを正式名称と同じように扱うことができます。
身内鯖では「ハーブティー」を「はぶち」、「スピードポーション」を「スピポ」などのように呼んでいるため、需要があると判断しました。
サーバーのメンバーが自由に追加・削除できますが民度がいい(というかほとんどみんな使ってない)ため荒らしは発生しません。

検索

コマンドと一緒に文字列を入力すると、その文字列を正規表現として解釈し、引っかかるアイテムを列挙します。

棚情報

(2019.10.12追記)コマンドと一緒に街を指定すると、その街の合計販売額や販売棚数、販売数トップ3を表示します。

定期実行系

市場情報

毎日決まった時間に登録されたアイテムの販売最安TOP5平均値、販売中央値、および販売全体平均値を投稿します。
鯖メンバーからの要望で実装しました。
アイテムはコマンドで登録できます。

優待案内

月末になると、スピードポーション30本を得るために優待券・優待回数券・優待お試し券を利用することを勧める文章が投稿されます。

イベント案内

SO2のBBSからイベントの情報を取得し表示します。

def usage("用法"):

botを動かすためのサーバーが必要です。Windowsでも動くように設計してはいますが、Linux系サーバーで動かすことを強くおすすめします。私は家にあるRaspberry Pi 3 Model B+(Webサーバー兼用)で動かしていますが特段動きが遅いとは思いません。
無料で動かす手段としては、Google Cloud PlatformHerokuの無料枠利用などが挙げられますが、いくつか注意点もあります。

スペックの問題

Google Cloud Platform(以下GCP)の無料枠は非常にスペックが低く、応答に時間がかかる可能性が考えられます。下手したらRaspberry Pi(以下ラズパイ)のほうがスペックがいいということもあるので、よく考えましょう。

難易度の問題

GCPを利用するということは、要するに一つのLinuxサーバーを1から設定するということなので、そこそこ知識か根気、あとはググり力がないときついです。サーバーを建てられても、例えばこのプログラムはPython 3.7を要求するので、プリインストールされているPythonが3.6だったりすると動きません。それがわからないようなら、Herokuの無料枠を利用するのが賢明でしょう。

クレジットカードの問題

GCPにせよHerokuにせよはたまたIBM Cloudにせよ、最初にクレジットカードの登録はほぼ必須です。設定を間違えることがなければ課金はされませんが、未成年にはすこしきついかもしれません。
私が確認した限りでは、少なくともHerokuではKyashのデビットカードが利用できます。Kyashの登録自体も無料ですので是非試してみてください。

課金の問題

上で「設定を間違えることがなければ課金はされません」と書きましたが、GCPに関しては事情が少し違います。というのも、中国とオーストラリア宛の通信は課金されるようになっているからです。普通にSO2をプレイする分には中国やオーストラリアと通信はしないかもしれませんが、その2国から何らかの攻撃があった場合、通信容量を消費して課金されてしまいます。
中国・オーストラリアからの通信を全部シャットアウトする方法もネット上に転がっているので適用しましょう。

リセットの問題

これはHeroku特有(IBM Cloudは知らない)の問題なのですが、プログラムを走らせているDyno(コンピュータのことだと思っておけばOK)は毎朝9:00(つまりUTC0:00)に再起動し、その際にリセットがかかります。
リセットされると、それまで動いていたプログラム等全体のファイルの変更がなかったことになります。
このbotに関して言えば、コマンドから追加したエイリアス等が全部消えます。
定期実行系で登録されたアイテムも消えます。
これが嫌で私は家のサーバーにbotを移しましたが、一応定期実行系・エイリアスの2つの機能に関しては設定で無効化もできるようにしてあるため、どうしてもHerokuで動かしたいなら定期実行・エイリアスを無効化しておくことをおすすめします。
IBM Cloudに関してはマジで触ったことがない(Qiitaで調べた程度)ので、調べてみてください。私も調べるつもりです。
2019/9/24追記: Unuboってサービスがあるらしいです。公式サイト

def conclusion("まとめ"):

とりあえず自分がほしいと思った機能を追加していったらこうなりました。何百行もプログラムを書いたのは初めてだったのでちゃんと動いているのを見ると感動しますね。
中央値の計算を間違えたりすることもありましたがちゃんと形になってよかったです。
イベント情報を取ってきてくれたりするのはかなり便利なので役に立ってます。
皆さんも是非使ってみてください。
ちなみに私はぜひともSO2公式Discord鯖でこいつを稼働させたいのですが、切り込む勇気もないので誰か紹介してください(丸投げ)。

以上、そこそこ長い記事ではありましたがご覧いただきありがとうございました。
もし導入する上でわからないことがあったら私のTwitterアカウントに質問を投げていただければ可能な限り対処いたします。

この記事はどうでしたか?
👍&ツイートをお願いします!

コメント

コメントにはログインが必要です

SOLDOUT2

ゲーム紹介
初心者の方へ

ゲームシステム


地形
店舗種類
ポイント
称号一覧
レシピ
Tips

攻略

お役立ちリンク集
改装ループ

アイテム・作業

アイテム一覧
作業一覧

業種職種
薬屋 道具屋
武器屋 防具屋
本屋 八百屋
肉屋 魚屋
パン屋 商店
資材屋 食堂
錬金術師 狩人
鉱夫 作家
漁師 酪農家
畜産家 農家
行商人 鍛冶職人
革細工師 裁縫師
勇者 木工師
細工師 調理師
石工師 鋳物師
木こり 魔王

カテゴリ
原料






アクセサリ
地図
道具
生物
食物

店舗情報
その他

メニュー

最新の5件

メニュー
読み込み中