簡単なDidcordのbotを作った


discordのbotを作りたい。
調べてみると、自分でコードを書いてやる方法と、既にアプリとしてビルド済みのbotを自分のサーバーに入れる方法の二つがあるらしい。

VCのうちの誰かがライブ配信を開始、またはカメラをオンにすると特定のチャンネルに通知される仕組みが欲しかったので、前者の自分でコードを書くやり方で実現させた。

手順としては、
・DiscordのAPIアクセスキーをゲット
・ローカル環境でコードをテスト
・Herokuにコードをアップロードして自動でビルド

Herokuって周りの人が使っててなんだろ〜と思ってたけど、無料アカウントでも単一のアプリもしくはスクリプトに限って24時間ずっと実行状態にしてくれるらしい。今回はお試しで自分用チャンネルに対して自動で実行する設定とした。

コードは下記の通り。


参考
https://stackoverflow.com/questions/65545509/check-if-a-user-is-streaming-in-a-discord-vc
https://qiita.com/1ntegrale9/items/9d570ef8175cf178468f
https://qiita.com/n0bisuke/items/ba3ed0a43642a966f635
https://discordpy.readthedocs.io/ja/latest/api.html#discord.VoiceState.self_stream


### インストールした discord.py を読み込む
import discord

# 自分のBotのアクセストークンに置き換えてください
TOKEN =  'MY TOKEN'

# 接続に必要なオブジェクトを生成
client = discord.Client()

# 起動時に動作する処理
@client.event
async def on_ready():
   # 起動したらターミナルにログイン通知が表示される
   print('ログインしました')

# メッセージ受信時に動作する処理
@client.event
async def on_message(message):
   # メッセージ送信者がBotだった場合は無視する
   if message.author.bot:
       return
   # 「/neko」と発言したら「にゃーん」が返る処理
   if message.content == '/neko':
       await message.channel.send('にゃーん')

CHANNEL_ID = xxxxxxxxxx # 任意のチャンネルID(int)


@client.event
async def on_voice_state_update(member, prev, cur):
   if prev.channel and cur.channel: 
       if prev.self_video != cur.self_video:
           print("video started!")
           channel = client.get_channel(CHANNEL_ID)
           await channel.send(f"{member.name} is turning on camera!")
       if prev.self_stream != cur.self_stream:
           print("streaming started!")
           channel = client.get_channel(CHANNEL_ID)
           await channel.send(f"{member.name} is starting streaming game!")


# Botの起動とDiscordサーバーへの接続
client.run(TOKEN)

​