3
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Discordのbotを作ってみる

Last updated at Posted at 2020-12-15

#はじめに

これは、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を開いて以下のコマンドを実行します。

discord.pyをインストール
py -3 -m pip install -U discord.py[voice]

ちなみにpython3.9ではインストールしようとしてもエラーを吐いて使えないみたいです。

botの作成

とりあえず動かしてみる

こちらの記事を参考にプログラムを動かしてみます。

discordbot.py
# インストールした 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)

このプログラムを起動すると、
bot返信例
こんな感じでレスポンスを返してくれます。
こちらでイベントリストとその詳細について解説されています。

Minecraftサーバーを操作する

最近身内でMinecraftを遊んでいて、僕がサーバーを立てているのですが、PCから離れていると操作できないんですよね。
そんな不満を解消してくれたら便利だなあと思って作りました。
先程のプログラムを基に、Discordを通じてMinecraftマルチサーバーの起動及び終了ができるように色々付け足したプログラムです。

MCserverbot.py
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側で見るとこんな感じ。
MCserverbot実行例

サーバーもちゃんと起動しています。
server_shell

おわりに

この記事では、DiscordのbotでMinecraftサーバーの起動と終了をできるようにしました。
本当はもっと色々な機能 (Rich Presence機能を使ってステータスを表示させるみたいな) を持たせたかったのですが、途中で力尽きました、、、
botには他にも様々な動作をさせることができるみたいなので、時間があれば挑戦してみたいですね!

参考

3
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?