Ruby
Splatoon
discord
discordrb
DiscordDay 23

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

はじめに

この記事は 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