14
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

DiscordAdvent Calendar 2017

Day 23

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

Last updated at Posted at 2017-12-25

#はじめに
この記事は 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

14
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?