#はじめに
この記事は Discord Advent Calendar 2017 23日目の記事になります。皆さん当然クリスマスの夜はスプラトゥーンで過ごしますよね.
先日,DiscordBotをGoogleHomeで音声操作してみるという記事を書いて,メインはGoogleHomeでDiscordのBotを操作することだったのでBot自体はサラッと流して書いていたのですが,
お待たせしました!
— おじーじじ@Botアイコンゆる募 (@gura_kyo) 2017年12月18日
Discordで武器と言うとランダムで武器が選ばれるBotができました!
普段使っているツールから気軽に武器ルーレットを使いたい方はぜひどうぞー!
以下のURLから認証して頂いて、導入したい鯖を選んでくださいhttps://t.co/mvOtm1yvTy#Splatoon2
このようなツイートを見かけまして,似たようなの作ってる方が居たのかと,そして100RT越えと意外に需要がありそうなので,私が作成したBotの作り方を詳しく書こうかと思います.Botが需要あるのであってBotの作り方は需要ないとか言わないで
ちなみに上のツイートの方とは全く別人ですので同一の機能を作る訳ではありません…そして私の作成するBotは最低限の機能しかないのでBot使いたい人は上の方のリンクへ飛んで下さい.便利です.オススメです.
#作るもの
ボイスチャンネルに居る人へ,ランダムに武器を指定してくれるBotです.
DiscordBotをGoogleHomeで音声操作してみる
とはGoogleHomeを介さないので少しソースコードを変えてあります.
ソースコードはこちら
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ファイルが必要です.
仕組みとしては,Discordでコマンドを呼び出したユーザーの入っているボイスチャンネルを取得し,それぞれに向けてcsvファイルの中身をランダムに返しているだけです.
以下で作り方を詳しく解説して行きます.
#discordrb
Botを作成するにはDiscordBot用のRubyライブラリdiscordrbを使います.
導入はこちら参照
イチからDiscord Bot 。for Ruby
導入記事の方にも書いてありますが,ハローワールドなBotから
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の初期設定を行います.token
とclient_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には発言者の様々な情報が入っているので,発言者のサーバー,チャンネル等が取得可能です.例えば以下のコード.
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でメッセージを送ります.
サーバー名とチャンネル名を返せています.
次はボイスチャンネルとチャンネル内にいるユーザーの取得をしてみましょう.
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
コマンドを打つと・・・
ボイスチャンネルのユーザーが取得できました.
これでもうdiscordrb独自の作業は終了です.csvファイルを読み込む機能を作り,ランダムでuser名の後ろに武器の名前をつけましょう.
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