#はじめに
これは、SLP KBIT Advent Calendar 2020 の16日目の記事です。
今年も残すところあと半月となりましたね!
ということで、今回はDiscordのbotを作ってみました。
言語はPythonを使用し、DiscordのAPIラッパーであるdiscord.pyを利用しています。
##目次
#開発環境
- Windows10
- Python3.7.9
botアカウントの作成と招待
まずはディスコ側でbotアカウントを設定し、サーバーに招待してあげます。
下の記事に簡単な導入方法が解説されています。
アクセストークンも控えておきましょう。
https://note.com/bami55/n/ncc3a68652697
事前準備
今回はPythonを使用するのでdiscord.pyというモジュールをインストールします。
cmdを開いて以下のコマンドを実行します。
py -3 -m pip install -U discord.py[voice]
ちなみにpython3.9ではインストールしようとしてもエラーを吐いて使えないみたいです。
botの作成
とりあえず動かしてみる
こちらの記事を参考にプログラムを動かしてみます。
# インストールした discord.py を読み込む
import discord
TOKEN = 'ここに自分のbotのアクセストークンを入力'
# 接続に必要なオブジェクトを生成
client = discord.Client()
# 起動時に動作する処理
@client.event
async def on_ready():
# 起動したらターミナルにログイン通知が表示される
print('ログインしました')
# メッセージ受信時に動作する処理
@client.event
async def on_message(message):
# メッセージ送信者がBotだった場合は無視する
if message.author.bot:
return
# 「/neko」と発言したら「にゃーん」が返る処理
if message.content == '/neko':
await message.channel.send('にゃーん')
# Botの起動とDiscordサーバーへの接続
client.run(TOKEN)
このプログラムを起動すると、
こんな感じでレスポンスを返してくれます。
こちらでイベントリストとその詳細について解説されています。
Minecraftサーバーを操作する
最近身内でMinecraftを遊んでいて、僕がサーバーを立てているのですが、PCから離れていると操作できないんですよね。
そんな不満を解消してくれたら便利だなあと思って作りました。
先程のプログラムを基に、Discordを通じてMinecraftマルチサーバーの起動及び終了ができるように色々付け足したプログラムです。
import subprocess
# インストールした discord.py を読み込む
import discord
# TOKENとサーバーの情報
TOKEN = 'ここに自分のbotのアクセストークンを入力'
f_name = 'サーバー実行ファイル名.jar'
maxMemory = '8G' # 任意の最大メモリ割り当てサイズ
minMemory = '8G' # 任意の最小メモリ割り当てサイズ
# 接続に必要なオブジェクトを生成
client = discord.Client()
# サーバー操作用
class server_process:
def __init__(self, f_name, maxMemory,minMemory):
self.server = None
self.command = ["java", "-server",f'-Xms{minMemory}', f'-Xmx{maxMemory}', "-jar", f_name, "nogui"]
def start(self):
self.server = subprocess.Popen(self.command, stdin=subprocess.PIPE)
def stop(self):
input_string = "stop"
self.server.communicate(input_string.encode())
server = server_process(f_name, maxMemory, minMemory)
# 起動時に動作する処理
@client.event
async def on_ready():
# 起動したらターミナルにログイン通知が表示される
print('ログインしました')
# メッセージ受信時に動作する処理
@client.event
async def on_message(message):
# メッセージ送信者がBotだった場合は無視する
if message.author.bot:
return
if message.content == '/mcstart':
await message.channel.send('サーバーを起動します')
server.start()
elif message.content == '/mcstop':
await message.channel.send('サーバーを終了します')
server.stop()
# Botの起動とDiscordサーバーへの接続
client.run(TOKEN)
これと以下の記述をしたバッチファイルを作成して、マイクラサーバーの.jarファイルと同じ場所に置きます。
python MCserverbot.py
あとはバッチファイルを開くことでbotが起動します。
Discordで/mcstart
を送信することでサーバーを起動、/mcstop
で停止させることができます。
おわりに
この記事では、DiscordのbotでMinecraftサーバーの起動と終了をできるようにしました。
本当はもっと色々な機能 (Rich Presence機能を使ってステータスを表示させるみたいな) を持たせたかったのですが、途中で力尽きました、、、
botには他にも様々な動作をさせることができるみたいなので、時間があれば挑戦してみたいですね!
参考
- Pythonで実用Discord Bot(discordpy解説)
https://qiita.com/1ntegrale9/items/9d570ef8175cf178468f