discord botでminecraft serverを操作する【総集編】

# 初めに
この記事は[discord botからminecraft serverを動かすことが目標のアドベントカレンダー](https://qiita.com/advent-calendar/2022/itohal)最終日です．

必要な環境は
- Python 3.8以降
- discord.py 2以上
- java 17以上

です．私の環境は
- WSL, Ubuntu22.04.1
- Python 3.10.6
- discord.py 2.1.0

となっています．

# discord botを作成する
まず，botを作成するためにアカウントを取得します．
[こちらの記事](https://qiita.com/halglobe0108/items/dc056cc48256eeff5526)で説明しています．[discord developer portal](https://discord.com/developers/docs/intro)にてアカウントを作成しましょう．このとき，トークンをコピーしておいてください．

# トークンを環境変数に設定
先程コピーしたトークンを環境変数に設定しておきましょう．`.env`ファイルに環境変数を設定して，`dotenv`で読み込みましょう．こちらの方法は[この記事の中](https://qiita.com/halglobe0108/items/dc056cc48256eeff5526#%E7%92%B0%E5%A2%83%E5%A4%89%E6%95%B0%E3%81%B8%E3%81%AE%E8%A8%AD%E5%AE%9A)で説明しています．`dotenv`を使わない方法は[こちらの記事](https://qiita.com/halglobe0108/items/735433531e7b17a20b54)で説明しています．

# discord.pyでプログラムを作る．
[この記事の中](https://qiita.com/halglobe0108/items/dc056cc48256eeff5526#discordpy%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)で，discord.pyのインストールの方法と，最低限のプログラムを載せています．

# minecraft serverを起動，停止させる

ここからアプリケーションコマンドを登録し，minecraft serverを起動，停止させます．それは[こちらの記事](https://qiita.com/halglobe0108/items/095ba4e080363554aa25)で説明しています．コマンドの登録自体は[こちらの記事](https://qiita.com/halglobe0108/items/990f51c6c02162cb7d9f)で，それをオブジェクト指向っぽくクラス分けして保守しやすくしたい場合の方法は[こっちの記事](https://qiita.com/halglobe0108/items/3e1fd4f01a6390b746a8)で説明しています．
また，minecraft serverはpythonのsubprocessで実行しています．これの説明を[ここの記事](https://qiita.com/halglobe0108/items/4fb05b14bf362b0cdc33)でしています．

ちなみにserver自体は複数立てることはできません，そのため複数回実行させないように制限した方が良いと思います．これにはデザインパターンのsingletonというものが有効だと思います．これについては，[ここの記事](https://qiita.com/halglobe0108/items/896d6e36399b7bc5152e)で説明しています~~が，コメントの方が有用かもしれないです．~~

# minecraftのコマンドをbotから入力する
minecraftではゲーム難易度の変更や時間変更，テレポートなどのコマンドを実行できます．それをbotで操作させることができます．これは[ここの記事](https://qiita.com/halglobe0108/items/9ed9b87440ddb4f2f972)で説明しています．ただ，誰でもコマンドが実行されてしまうと困るので，minecraft serverの権限をコマンド実行権限に対応させます．これは[ここの記事](https://qiita.com/halglobe0108/items/30c4a72e818678659e5d)で説明しています．
また，他の制限については以下のことを説明しました．
- [discord botのcooldownとinteraction_check](https://qiita.com/halglobe0108/items/06ecae398197acda692b)
- [discord botのコマンド実行を制限するためのcheck](https://qiita.com/halglobe0108/items/19a0e36a80bed54bfb51)


# discord botを常駐させる
minecraft serverを起動するためにbotを起動させるという状況は意味がないので，botを常駐させていつでも起動できるようにします．これは，[準備編の記事](https://qiita.com/halglobe0108/items/da65a7bc4956fc500d39)と[後編の記事](https://qiita.com/halglobe0108/items/8d8ec566255562160ec8)に分かれていますが，この2つの記事で説明しています．


基本的なdiscord botでminecraft serverを操作するプログラムは以上で完成です．

# 柔軟にコマンドを作る
botによるコマンドは様々なものが作れます．例えばボタンを作ったり，メッセージを右クリックしてコマンドを実行させたりすることができます．色々と記事を投稿しましたので，必要そうなやつがあれば参考になればいいなと思います．
- [discord pyのcontext menuとbutton](https://qiita.com/halglobe0108/items/db982af6b08844051606)
- [discord botでドロップダウンメニューを作る](https://qiita.com/halglobe0108/items/190c4fd19db280c30e06)
- [discord.pyのTextInput](https://qiita.com/halglobe0108/items/97f204286708ea52c107)
- [discord botで定期的に処理をさせるためのLoop](https://qiita.com/halglobe0108/items/a9d43a3eecabba06b5ef)
- [discord botにminecraftの座標を登録してtpコマンドを作ってもらう](https://qiita.com/halglobe0108/items/649f9a25f05eca14e84e)
- [discord botでメッセージを転送する](https://qiita.com/halglobe0108/items/d6794e2104b6c90580a6)
- [discord.pyのslash commandでhelp表示](https://qiita.com/halglobe0108/items/84978d8dc7d9e548e201)

以上となります．[アドベントカレンダー自体](https://qiita.com/advent-calendar/2022/itohal)も見ていただけると嬉しいです．
お疲れ様でした．