0
Help us understand the problem. What are the problem?

posted at

updated at

ボイスチャットの開始と終了だけ通知するdiscord bot

はじめに

やりたいこと,仕様など

  • ボイスチャットの入退室を検出して通知する
    • 最初の一人の入室 or 最後の一人の退室のみ通知する(LINE風の通知)
  • 通知を送信するテキストチャンネルを設定可能
  • 入退室を通知しないボイスチャンネルを設定可能
  • スラッシュコマンド対応は考えない
  • discordrb(Ruby)を使用

一人ひとりの入室,退室を全部報告するのではなく,
LINE風に開始と終了の通知だけにしたかった。

コード

notice.rbと同じディレクトリに「svrconf」ディレクトリを作成し
サーバごとの設定(=通知を流すテキストチャンネルのID)を保存する

notice.rb
# coding: utf-8
require 'discordrb'
require 'logger'

# トークンとID
bot = Discordrb::Commands::CommandBot.new token: トークン, client_id: クライアントID, prefix: '/'
# 外部ファイル(サーバ毎設定)
svr_conf="/ワークディレクトリ/svrconf/"

# ログ
log = Logger.new('/ワークディレクトリ/ログファイル.log', 3, 1024*1024*10) # 10MB * 3
log.level = Logger::WARN
log.datetime_format = '[%Y%m%d-%H%M%S]'

log.info('*** program start ***')

# 設定ファイルから削除する
def del_conf(svr_conf, svr_id, log)
  log.debug('function: del_conf')
  if File.exist?(svr_conf + svr_id.to_s) then
    File.delete(svr_conf + svr_id.to_s)
  end
end
# 設定ファイルに記録する
# ファイル名=サーバID 1行目=通知を流すテキストチャンネルのID 2行目=サーバ名
# 2行目のサーバ名は使用しない(整理用)
def add_conf(svr_conf, svr_id, channel, svrname, log)
  log.debug('function: add_conf')
  File.open(svr_conf + svr_id.to_s, "w", 0666) do |file|
    file.puts(channel)
    file.puts(svrname)
  end
end


# 誰かがボイスチャンネルに出入りする
bot.voice_state_update do |event|
  log.info('--- start main event:')

  in_sendtext = ""
  out_sendtext = ""
  # 入室
  unless event.channel.nil?
    # チャンネル名に「非通知」が含まれていれば通知しない
    is_notice = 1
    is_notice = 0 if event.channel.name.include?("非通知")
    is_notice = 0 if event.channel.name.include?("silent")

    if event.channel.users.length == 1 && is_notice == 1 then
      # 最初の一人
      in_sendtext = "#{event.user.name}#{event.channel.name}で通話を開始しました"
    end
  end
  # 退室
  unless event.old_channel.nil?
    # チャンネル名に「非通知」が含まれていれば通知しない
    is_notice = 1
    is_notice = 0 if event.old_channel.name.include?("非通知")
    is_notice = 0 if event.old_channel.name.include?("silent")

    if event.old_channel.users.length == 0 && is_notice == 1 then
      # 最後の一人
      out_sendtext = "#{event.old_channel.name}の通話が終了しました"
    end
  end
  # 例外処理
  # 1人から1人への変化(1人のときに配信開始など)で入室通知が暴発する
  if event.channel.nil? == false && event.old_channel.nil? == false then
    if event.channel.users.length == 1 && event.old_channel.users.length == 1 then
      in_sendtext = ""
    end
  end

  # 通知送信
  # 通知用文字列変数が空かどうかで管理する
  if in_sendtext.empty? == false || out_sendtext.empty? == false then
    # 通知先のテキストチャンネルを設定する
    send_channel = nil
    if File.exist?(svr_conf + event.server.id.to_s) then
      # 設定ファイルからテキストチャンネルIDを読み込み
      File.open(svr_conf + event.server.id.to_s, "r") do |file|
        send_channel = file.gets.chomp!
      end
    else
      # 設定ファイルがない テキストチャンネルを検索
      begin
        event.server.channels.each do |channel|
          if channel.type == 0 then
            send_channel ||= channel.id
            send_channel = channel.id if channel.name == '一般'
          end
        end
        exit unless send_channel
      rescue SystemExit => err
        log.warn('テキストチャンネルがない')
        log.debug(err.message)
      else
        # 例外が発生しなかった場合 設定を保存
        add_conf(svr_conf, event.server.id, send_channel, event.server.name, log)
      end
    end

    # 送信
    begin
      event.bot.send_message(send_channel, in_sendtext) unless in_sendtext.empty?
      event.bot.send_message(send_channel, out_sendtext) unless out_sendtext.empty?
    rescue
      # 送信失敗 -> チャンネルが削除された? 設定の記録から削除
      del_conf(svr_conf, event.server.id, log)
    end
  end
end

# テキストチャンネル設定
bot.command :setコマンド名 do |event|
  log.info('--- command, voice chat setting')
  add_conf(svr_conf, event.server.id, event.channel.id, event.server.name, log)
  event.respond("通知先テキストチャンネルを設定しました")
end

# ヘルプ
bot.command :helpコマンド名 do |event|
  log.info('--- command, help')
  event.respond("ボイスチャンネルの開始,終了を通知します\n\nコマンド\n/setコマンド名 : 通知するテキストチャンネルを設定します\n/helpコマンド名 : このメッセージを表示します\n\n仕様\nボイスチャンネル名に「非通知」「silent」が含まれるチャンネルについては通知しません")
end

bot.run

参考文献

Discordのボイスチャンネルに誰かが入ったら通知するbot - Qiita
https://qiita.com/trompot/items/5251704272cce302af33

DiscordのBotを作る #2 - gyneco2d note
https://gyneco2d.netlify.app/create-discord-bot-2/
・テキストチャンネルの探索部分など大いに参考にしました

Register as a new user and use Qiita more conveniently

  1. You can follow users and tags
  2. you can stock useful information
  3. You can make editorial suggestions for articles
What you can do with signing up
0
Help us understand the problem. What are the problem?