とりあえず出来たもの

あらすじ

最近discordの権限をもらって,botの存在が気になってたので入れることにした.
とりあえず無難に音楽かなぁってことで,いろいろあったけど,FredBoatってやつにした.

「すごい,ボイチャで音楽が聞ける!」
しかし,人間欲深く.
「特定の時間帯だけ流したいなぁ......」
「効果音みたいなの出してぇなぁ......」

いわゆる音楽botはYoutubeとかの音を全て再生してしまい,0:54〜1:17までみたいな指定が出来ない.
例えば,ゲームに負けて落ち込んでるフレンドがいれば,すぐに「負けないでもう少し,最後まで走り抜けて」って音楽かけたいんだ.
前奏からじゃ間に合わない.
そして勝ちが続いて調子乗ってるフレンドがいれば,スネ夫の自慢話のときに流れてくる曲をかけたいんだ.
こういうのは新鮮さが大事.

この一発ネタをしたいがために作った.

まずは認証

  • Developer Portalにアクセスしてログイン
  • 右上の「New Application」→botの名前入れる(後で変更可)→「Create」
  • サイドメニューのsettingから「Bot」を選択.注意書きみたいなの出たら「Yes,do it!」
  • 下の写真のように「Build A Bot」の「TOKEN」からトークンをコピー.(プログラム書くとき使う)
image
  • サイドメニューから「OAuth2」を選択,「OAuth2 URL Generator」の「Scopes」から「bot」を選択.
image
  • 下にBOT PERMISSIONSが出現するのでBotの権限を選択.(少なくともConnectとSpeakは必須)
image
  • 先程Botを選択した,Scopesの下枠にURLがあるので,そのリンクを別タブで開く.
  • サーバーを選択して認証

他のもろもろと比べてもかなり認証が楽.
いいね.

中身

内容的には結構ありふれてるんだけど,discordがv1.0から書き方色々変わって,前のバージョンで書かれた記事も多かったので記事にした.

こんな感じ

import os
import dictionary
import discord
from asyncio import sleep

TOKEN = os.environ.get('DISCORD_TOKEN')
VC_ID = os.environ.get('VOICECHAT_ID')

class MyClient(discord.Client):

    async def on_ready(self):
        print('Username: {0.name}\nID: {0.id}'.format(self.user))

    async def on_message(self, message):
        if message.author.bot:
            return

        channel = client.get_channel(int(VC_ID))

        if message.content in dictionary.dict:
            if message.guild.voice_client is not None:
                message.guild.voice_client.disconnect()
            vc = await channel.connect()
            await message.delete()
            mp3 = dictionary.dict.get(message.content)
            vc.play(discord.FFmpegPCMAudio(mp3))
            while vc.is_playing():
                await sleep(1)
            await vc.disconnect()

        if message.content == '?stop':
            if message.guild.voice_client is not None:
                message.guild.voice_client.stop()
                await message.guild.voice_client.disconnect()
            await message.delete()

client = MyClient()

if TOKEN is None or VC_ID is None:
    print('環境変数が適切に設定されていません')
else:
    client.run(TOKEN)

GitHubにあげるので,トークンとかボイチャIDは環境変数に置いとく.
トークンは認証の際に,コピーしたトークン値
ボイチャIDは,まずdiscordの「ユーザ設定」→「テーマ」→「開発者モード」をONにして,参加させるボイスチャンネルを右クリックすると,「IDをコピー」というメニューが出来るので,そこから.

dictionary.pyの中身はこんな感じ

dict = {'?suneo' : 'suneo.mp3',
        'ganba' : 'makenaide.mp3',
        }

テキストチャンネルで,「?suneo」と打てば,botがボイチャにつながって,ローカルにあるsuneo.mp3を流すし,「ganba」と打てば,makenaide.mp3が流れる.
「?suneo」を「スネ夫」とか日本語に書き換えても動くっぽい.
これで,技術とかさっぱり興味ない半角文字とかめったにうたない人でも楽にコマンドが打てるね.
行儀よく,mp3を流し終わったら自動で退出ってしたくて,調べ回ったけど,

vc.play(discord.FFmpegPCMAudio(mp3))
while vc.is_playing():
    await sleep(1)
await vc.disconnect()

こんな感じで,1秒おきに流れてるか確認してっていうあまり行儀が良くない感じになっちゃった.

一発ネタじゃい!
どんな反応が来るか楽しみ.