はじめに
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ファイルに書いてやります。
CLIENT_ID="xxx"
CLIENT_SECRET="xxx"
BOT_TOKEN="xxx"
Dockerfileに起こすときにgem install ~~~
ってやるよりbundle install
がスマートなのでGemfile書きます。
source "https://rubygems.org"
gem 'dotenv'
gem 'discordrb'
あとは実行するコードです。
もっと良いコードになるのはわかってます許してください。
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
ちゃんと動いています。
コンテナ化
Dockerで実行できるようにします。
Docker初学者なので全然間違ってるかもしれません。
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で、実行はラズパイにしてみようかといったところです。