Edited at
DiscordDay 23

Discord用スプラトゥーン武器ランダム配布Botを作る

More than 1 year has passed since last update.


はじめに

この記事は Discord Advent Calendar 2017 23日目の記事になります。皆さん当然クリスマスの夜はスプラトゥーンで過ごしますよね.

先日,DiscordBotをGoogleHomeで音声操作してみるという記事を書いて,メインはGoogleHomeでDiscordのBotを操作することだったのでBot自体はサラッと流して書いていたのですが,

このようなツイートを見かけまして,似たようなの作ってる方が居たのかと,そして100RT越えと意外に需要がありそうなので,私が作成したBotの作り方を詳しく書こうかと思います.Botが需要あるのであってBotの作り方は需要ないとか言わないで

ちなみに上のツイートの方とは全く別人ですので同一の機能を作る訳ではありません…そして私の作成するBotは最低限の機能しかないのでBot使いたい人は上の方のリンクへ飛んで下さい.便利です.オススメです.


作るもの

ボイスチャンネルに居る人へ,ランダムに武器を指定してくれるBotです.

DiscordBotをGoogleHomeで音声操作してみる

とはGoogleHomeを介さないので少しソースコードを変えてあります.

動作例

test_chに3人メンバーがいます.

FullSizeRender 3.jpg

!random_bukiと入力.

スクリーンショット 2017-12-25 14.07.18.png

FullSizeRender 4.jpg

Botがメンバーへ武器を指定してくれます.

スクリーンショット 2017-12-05 21.38.06.png

ソースコードはこちら


discord_bot.rb

require 'discordrb'

require "csv"

#client_idはbotに設定されているものを入力 prefixはコマンドの呼び出しの時の記号(!play 等の!部分 ?とかでも可)
bot = Discordrb::Commands::CommandBot.new token: '自分のトークン', client_id: 000000000000, prefix: '!'
#スプラトゥーンの武器名が入っているcsvファイルを読み込み
data = CSV.read('buki.csv')

#"!random_buki"とチャットに入力があった場合反応
bot.command :random_buki do |event|
channel = event.user.voice_channel
users = channel.users
for num in 0..users.length do
event.respond "#{users[num].name} の使うブキ -> #{data[rand(0..data.length)][0]}"
end
end

bot.run


BotのRubyファイルと同階層に武器名の入ったcsvファイルが必要です.

スクリーンショット 2017-12-05 19.59.10.png

仕組みとしては,Discordでコマンドを呼び出したユーザーの入っているボイスチャンネルを取得し,それぞれに向けてcsvファイルの中身をランダムに返しているだけです.

以下で作り方を詳しく解説して行きます.


discordrb

Botを作成するにはDiscordBot用のRubyライブラリdiscordrbを使います.

導入はこちら参照

イチからDiscord Bot 。for Ruby

導入記事の方にも書いてありますが,ハローワールドなBotから


hello_bot.rb

require 'discordrb'

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

bot.command :hello do |event|
event.send_message("hallo,#{event.user.name}")
end

bot.run


まず最初のbot=...でBotの初期設定を行います.tokenclient_idはDiscordのアプリ内でBotを登録時に出てくるBotのトークンとIDです.

そしてprefixはBotの呼び出し時につける記号です.今回は!となっているのでhelloコマンドの呼び出しは!helloとなります.prefixを?にした場合は?helloになる訳ですね.

次にcommand部分へ行きましょう

bot.command :[コマンド名] do |event|

という書き方でBotのコマンドを設定します.

event.send_message("hallo,#{event.user.name}")

send_messageはチャンネルにテキストメッセージを送ります.

今回はevent.user.nameで発言者の名前を取得しています.

ここは,

event.respond("hallo,#{event.user.name}")

と,respondを使う事でも書き換え可能です.

eventには発言者の様々な情報が入っているので,発言者のサーバー,チャンネル等が取得可能です.例えば以下のコード.


event_bot.rb

bot.command :hello do |event|

event.respond "hello, #{event.user.name}!"
event.respond "server: #{event.server.name}"
event.respond "channel: #{event.channel.name}"
end

発言者のサーバーとチャンネル(テキストチャンネル)を取得し,respondでメッセージを送ります.

スクリーンショット 2017-12-25 13.06.15.png

サーバー名とチャンネル名を返せています.

スクリーンショット 2017-12-25 13.06.32.png

次はボイスチャンネルとチャンネル内にいるユーザーの取得をしてみましょう.


event_bot.rb

bot.command :hello do |event|

event.respond "hello, #{event.user.name}!"
event.respond "server: #{event.server.name}"
event.respond "channel: #{event.channel.name}"
#以下追加
voice_channel = event.user.voice_channel
event.respond "voice_channel: #{voice_channel.name}"
users = voice_channel.users
for num in 0..users.length do
event.respond "user: #{users[num].name}"
end
end

!helloコマンドを打つと・・・

スクリーンショット 2017-12-25 13.42.15.png

スクリーンショット 2017-12-25 13.42.19.png

ボイスチャンネルのユーザーが取得できました.

これでもうdiscordrb独自の作業は終了です.csvファイルを読み込む機能を作り,ランダムでuser名の後ろに武器の名前をつけましょう.


discord_bot.rb

require 'discordrb'

require "csv"

#client_idはbotに設定されているものを入力 prefixはコマンドの呼び出しの時の記号(!play 等の!部分 ?とかでも可)
bot = Discordrb::Commands::CommandBot.new token: '自分のトークン', client_id: 000000000000, prefix: '!'
#スプラトゥーンの武器名が入っているcsvファイルを読み込み
data = CSV.read('buki.csv')

#"!random_buki"とチャットに入力があった場合反応
bot.command :random_buki do |event|
channel = event.user.voice_channel
users = channel.users
for num in 0..users.length do
event.respond "#{users[num].name} の使うブキ -> #{data[rand(0..data.length)][0]}"
end
end

bot.run


これで完成です!お疲れ様でした!

今回はチャンネル全員へ武器を指定していますが,単純に発言者へ武器を指定するだけなら

bot.command :random_buki do |event|

event.respond "#{event.user.name}:#{data[rand(0..data.length)][0]}"
end

でOKですね.

後はRubyファイルを走らせ,Botを招待したサーバーでコマンド!random_bukiを入力すれば使用できます.

チャンネル・ボイスチャンネルのユーザー取得さえ出来れば,あるユーザーへ向けて〇〇したいという機能はほぼ完成ですので,この記事を参考にして貰って色々なゲームで,色々なBotをどんどん作っていただければ幸いです!


参考

discordrbドキュメント(http://www.rubydoc.info/github/meew0/discordrb)

イチからDiscord Bot 。for Ruby