Posted at

Discordの音楽BOTをDockerで立ち上げてみた


はじめに

Discordの音楽Botを自作して自分好みにカスタマイズしてみたくて作りました。

pythonかrubyかが作りやすそうで、深く考えずrubyを選んでます。pythonでも同じようにできると思います。rubyでdiscord bot開発するときのdiscordrbを使います。

macで開発時は特に気にならなかったですが、運用するときにrubyインストールしたりするの面倒だしバージョン云々もめんどくさい!だからDocker化しちゃおうといった具合でDockerに乗せました。


開発環境


  • macOS High Sierra v10.13.6

  • Docker version 18.09.2


ファイル構成

/workspace/discord_bot

├── data/
| ├── music1.mp3
| └── music2.mp3
├── .env
├── Dockerfile
├── Gemfile
├── Gemfile.lock
└── sample.rb


準備


  • Dockerの導入

  • DISCORDのBOT登録、APIキー取得


コード

APIキーは.envファイルに書いてやります。


.env

CLIENT_ID="xxx"

CLIENT_SECRET="xxx"
BOT_TOKEN="xxx"

Dockerfileに起こすときにgem install ~~~ってやるよりbundle installがスマートなのでGemfile書きます。


Gemfile

source "https://rubygems.org"

gem 'dotenv'
gem 'discordrb'

あとは実行するコードです。

もっと良いコードになるのはわかってます許してください。


sample.rb

require 'dotenv'

require 'discordrb'

Dotenv.load
TOKEN = ENV['BOT_TOKEN']
CLIENT_ID = ENV['CLIENT_ID']

bot = Discordrb::Commands::CommandBot.new(
token: TOKEN,
client_id: CLIENT_ID,
prefix: ';',
)

bot.command :ping do |event|
"pong!"
end

bot.command :connect do |event|
channel = event.user.voice_channel
next "voiceちゃんねるに入ってから実行してください。" unless channel
bot.voice_connect(channel)
"#{channel.name}に入りました。"
end

bot.command :play do |event|
music = "/app/data/music1.mp3"
event.voice.play_file(music)
end

bot.run



実行(ruby環境があれば)

とりあえず動かしてみました。

$ ruby sample.rb

AsZYiibYmpVy8051561796341_1561796358.png

ちゃんと動いています。


コンテナ化

Dockerで実行できるようにします。

Docker初学者なので全然間違ってるかもしれません。


Dockerfile


Dockerfile

FROM ruby:2.6.3

RUN apt-get update && apt-get install -y \
libsodium-dev \
libopus-dev \
ffmpeg
RUN gem install bundler
RUN mkdir /app
WORKDIR /app

COPY ./* /app/
RUN bundle install



実行


  • Build

    $ docker build -t discord_bot .

  • Run

    $ docker run -i -t --rm discord_bot ruby /app/sample.rb

PONG!


おわりに

connectはいろんなところに書いてあるんですけどdisconnect無いんですか?そんなわけないですよねソースを読みきれてないです。

最初見てたサイトがlibopus0-devになってて、「そんなん無い!」って言われてlibopus0にしたり右往左往しましたが、libopus-devが正解のようです。

開発はmacで、実行はラズパイにしてみようかといったところです。


参考サイト