LoginSignup
9
6

More than 5 years have passed since last update.

Docker上でDiscordのBotを動かす

Last updated at Posted at 2018-01-03

Docker上でDiscordのBotを動かす

どんなBotを作った?

特定の人が、特定のVoice Channelに入室すると、入場曲を歌うBot

(Ruby, discordrb使用)

なんのため?

ただの身内ネタです。
何の役にも立ちません。

なんでDocker上で動かす?

  • 環境非依存にする
  • 環境構築の手間を省く
    • Rubyのインストール
    • 必要パッケージのインストール
  • 最終的にはGoogle App Engine上にデプロイしたい
    • 詳細は別記事にて

DiscordにBotを登録する

導入に関する情報はぐぐればたくさんあるので省略。

イチからDiscord Bot。for Ruby。とか。

discordrbをインストールする

Gemfileにgem 'discordrb'を追加

Gemfile
gem 'discordrb'

入場曲を準備する

入場曲をmp3形式で準備します。5~10秒くらいの長さがちょうどいいかと思います。
作業ディレクトリ直下においてもいいですが、ここではdataディレクトリを作ってその中に入場曲を置くことにします。ファイル名はentrance_music.mp3とでもしておきます。

今のディレクトリ構成はこんな感じ。

$ ls
Gemfile     data        bot.rb
  • 先程gem discordrbを追加したGemfile
  • dataディレクトリの中にentrance_music.mp3
  • bot.rbはこれからコーディングするBot

入場曲を歌わせるコードを書く

bot.rb
require 'discordrb'

bot = Discordrb::Bot.new token: '自分のトークン'

bot.voice_state_update from: 入場曲を流したいユーザのID, channel: 入場曲を流したいVoiceChannelID, do |event|
    if event.old_channel.nil?
        voice_bot = bot.voice_connect 入場曲を流したいVoiceChannelID
        voice_bot.play_file 'data/entrance_music.mp3'
        voice_bot.destroy
    end
end

bot.run

Note:
ユーザやチャンネルのIDはそれぞれのアイコンを右クリックすると、IDをコピーというメニューがでます。

使用メソッドの概要

  • Bot#voice_state_update
    • ユーザのVoice Stateが変わったときに起きるイベント
    • from:でイベントを起こす人のフィルタリング
    • channel:でイベントを起こすチャンネルのフィルタリング
    • 詳細はこちら
  • Bot#voice_connect
    • Voice Channelに接続(入室)する
    • 返り値のVoice#VoiceBotを操作することで音声ファイルを再生したり、チャンネルとの接続を切ったりできる
    • 詳細はこちら
  • VoiceBot#play_file
    • 音声ファイルを再生する
    • 詳細はこちら
  • VoiceBot#destroy
    • Voice Channelとの接続を切る。(退室する)
    • 詳細はこちら

参考:discordrb Wiki

Dockerをインストールする

Install Dockerから環境に応じてインストールします。

Dockerfileを書く

  • ここではRuby2.3.3のDocker Imageを使います
    • Ruby2.1以上ならなんでもいいと思います
  • DiscordのBotに音声を扱わせるには以下のパッケージが必要なのでインストールします
    • libsodium
    • libopus
    • FFmpeg
Dockerfile
FROM ruby:2.3.3

WORKDIR /app
COPY . /app

RUN apt-get update && apt-get install -y \
      libopus-dev \
      libsodium-dev \
      wget \
      xz-utils
RUN wget http://johnvansickle.com/ffmpeg/releases/ffmpeg-release-64bit-static.tar.xz \
      && tar Jxvf ./ffmpeg-release-64bit-static.tar.xz \
      && cp ./ffmpeg*64bit-static/ffmpeg /usr/local/bin/
RUN bundle install

CMD ["ruby", "bot.rb"]

Botをビルドする

$ docker build -t entrance_music_bot

Botを起動する

$ docker run entrance_music_bot

実行したあとに以下を確認できたら完成です。

  • Botがオンラインになる
  • 特定のユーザーが特定のVoice Channelに入ると、BotもそのVoice Channelに入室する
  • 入場曲を歌う
  • 歌い終わったらVoice Channelから退出する

Future Work

これではPCを起動している間しかBotは動作しません。
そこで、Google Cloud Platform (App Engine)にデプロイして常時Botが動くようにします。(その記事はまた後日)

(追記)
記事書きました

9
6
1

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