6
2

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 5 years have passed since last update.

DiscordAdvent Calendar 2019

Day 9

discordrbで作る、1プロセスで複数BOTを動かす方法

Last updated at Posted at 2019-12-09

この記事の対象

  • 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で使用している方法です。

test_bot1.rb
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
test_bot2.rb
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
execute_bots.rb
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というものに参加させていただきました。
優しい日本語を心がけようとした結果、少しおかしな読みにくい文章になってしまいましたが、最後まで読んで頂きありがとうございます。
何かあればお気軽にコメントを頂ければと思います。
それでは。

6
2
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
6
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?