この記事の対象
- discordrbが何なのか程度はわかる人
- Herokuの無料枠で複数のBOTを稼働させたい人
discordrbを使った基本的なBOTの作り方については他に記事があるため、この記事では割愛させていただきます。
作り方
さっそく本題になりますが、discordrb(というかRuby)ではPython(discord.py)のように特別マルチスレッドを意識しなくても簡単に1プロセスで複数のBOTを稼働させることができます。
以下がそのコードとなりますが、単にBOTごとにインスタンスを分けるだけで実現可能です。
require 'discordrb'
TOKEN1 = #1つ目のBOTのトークン
TOKEN2 = #2つ目のBOTのトークン
bot1 = Discordrb::Commands::CommandBot.new(token: TOKEN1, prefix: "/")
bot1.command(:test1) { "TEST BOT1!" }
bot2 = Discordrb::Commands::CommandBot.new(token: TOKEN2, prefix: "/")
bot2.command(:test2) { "TEST BOT2!" }
bot1.run(:async)
bot2.run
1つ注意が必要なのはDiscordrb::Bot#run
はそのままだと以降の行の実行を止めてしまいます。
ですから、最後以外の#run
では引数に必ず:async
を渡しておく必要があります。
動かす上での問題点
以上のようにインスタンスを分けるだけで複数のBOTを実行することができますが、残念ながら出力ログは分かてくれません。
どちらのBOTも同じようにログを出力するため、基本的に見分けることもできません。
よって実際の開発ではBOT別に十分デバッグを行った上で、運用段階で統合させるのが良いでしょう。
また、1つのアプリをデプロイするために、全てのアプリを起動しなおすことになるため、わりと手間がかかります。
開発するときの工夫
実際の開発では上の例のように複数のBOTを1つのコード内に書くことはありませんし、するべきではありません。
そのため、BOTごとにクラスを定義して実行用のスクリプトで呼び出す方が現実的かと思います。
以下は私が実際に運用しているBOTで使用している方法です。
require 'discordrb'
class TestBot1
def initialize(token)
@bot = Discordrb::Commands::CommandBot.new(token: token, prefix: "/")
@bot.ready { @bot.game = "TestBot1" }
@bot.command(:test1) { "TestBot1" }
end
def run(async = false)
@bot.run(async)
end
end
require 'discordrb'
class TestBot2
def initialize(token)
@bot = Discordrb::Commands::CommandBot.new(token: token, prefix: "/")
@bot.ready { @bot.game = "TestBot2" }
@bot.command(:test2) { "TestBot2" }
end
def run(async = false)
@bot.run(async)
end
end
require './test_bot1'
require './test_bot2'
test_bot1 = TestBot1.new("BOTのトークン")
test_bot2 = TestBot2.new("BOTのトークン")
test_bot1.run(:async)
test_bot2.run
最後に
初めてAdvent Calendarというものに参加させていただきました。
優しい日本語を心がけようとした結果、少しおかしな読みにくい文章になってしまいましたが、最後まで読んで頂きありがとうございます。
何かあればお気軽にコメントを頂ければと思います。
それでは。