31
19

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.

Discordで通話時間を測定するBotを作ってみた

Last updated at Posted at 2018-03-19

#はじめに
discordでの通話時間を知りたかったのですが、discord内にそのような機能がないようなのでbotを作ってみました。勉強不足なため、用語などおかしいところがあるかもしれません。
#環境
Python 3.6.0
#作り方
##Botの作り方
こちらを参考にさせていただきました。
https://qiita.com/PinappleHunter/items/af4ccdbb04727437477f
##通話時間の取得
ボイスチャンネルへの入退室時にそれぞれ現在時刻を取得し、通話時間の計測を行います。

ドキュメントによると、on_voice_state_update(before, after)がボイスチャンネルで変化(ボイスチャットへの入退室、ボイスチャット内でのマイク・スピーカのミュート)があった際に呼び出されるようです。

パラメーターのbeforeはボイスチャンネルで変化が起こる前のMemberクラス、afterは変化が起こった後のMemberクラスのようです。

import discord

client = discord.Client()

@client.event
async def on_voice_state_update(before, after):
  print("ボイスチャンネルで変化がありました")

client.run("token")#botのトークン

今回は、ボイスチャットの入退出時のみ扱いたいため、マイク・スピーカのミュート時の呼び出しを弾きます。
.voice.self_muteでマイクミュートかどうかを確認し、同様にスピーカーも.voice.self_deafで行います。その結果、前後で変化があればreturnで弾きます。

if((before.voice.self_mute is not after.voice.self_mute) or (before.voice.self_deaf is not after.voice.self_deaf)):
  print("ボイスチャンネルでミュート設定の変更がありました")
  return

次に、通話時間の取得をします。現在時刻の取得には標準ライブラリのdatetimeモジュールのdatetime.datetime.now()を使いました。

after.voice_channelbefore.voice_channelで入退出時の前後にボイスチャンネルが存在しているかを確認し、入退室を判定します。
ボイスチャンネル入室時に名前と現在時刻を辞書に登録し、ボイスチャンネル退出時に退出時の時刻から入室時の時刻を引きます。

通話時間の結果はマイナスで出てくるので、最後に-1を掛けておきます。また、秒数表示にしたかったため.total_seconds()を使っています。

import datetime

pretime_dict = {}

if(before.voice_channel is None):#入室時
  pretime_dict[after.name] = datetime.datetime.now()
elif(after.voice_channel is None):#退出時
  duration_time = pretime_dict[before.name] - datetime.datetime.now()
  duration_time_adjust = int(duration_time.total_seconds()) * -1

最後に、Discord上にメッセージを送ります。メッセージはclient.send_messageを使うことで送れるようです。

#メッセージを送りたいテキストチャンネルの名前
reply_channel_name = "general"
reply_channel = [channel for channel in before.server.channels if channel.name == reply_channel_name][0]
#送りたいメッセージ
reply_text = after.name + " が "+ before.voice_channel.name + " から抜けました。 通話時間:" + str(duration_time_adjust) +""

await client.send_message(reply_channel ,reply_text)

##全体のコード

import discord
import datetime

client = discord.Client()
pretime_dict = {}

@client.event
async def on_voice_state_update(before, after):
  print("ボイスチャンネルで変化がありました")

  if((before.voice.self_mute is not after.voice.self_mute) or (before.voice.self_deaf is not after.voice.self_deaf)):
    print("ボイスチャンネルでミュート設定の変更がありました")
    return

  if(before.voice_channel is None):
    pretime_dict[after.name] = datetime.datetime.now()
  elif(after.voice_channel is None):
    duration_time = pretime_dict[before.name] - datetime.datetime.now()
    duration_time_adjust = int(duration_time.total_seconds()) * -1

    reply_channel_name = "general"
    reply_channel = [channel for channel in before.server.channels if channel.name == reply_channel_name][0]
    reply_text = after.name + " が "+ before.voice_channel.name + " から抜けました。 通話時間:" + str(duration_time_adjust) +""

    await client.send_message(reply_channel ,reply_text)

client.run("token")#ボットのトークン

#discord上の動作
discord結果.PNG

#参考
Discordドキュメント
[Pythonで簡単なDiscord Botの作り方]
(https://qiita.com/PinappleHunter/items/af4ccdbb04727437477f)
[python 現在時刻取得]
(https://qiita.com/mykysyk@github/items/e15d7b2b1a988b8e29d4)

31
19
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
31
19

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?