水無瀬のゲーム日記

TRPGのシナリオややっているゲームで話したいことを記事にしていきます。

DiscordのBotを作ってみよう #1(導入編)

はじめに

どうも、SkypeからDiscordに移行した水無瀬です。
最近Discord流行ってますよね。
そのDiscordでbotが作れるみたいなので、試しに作ってみようと言う企画になります。
試しに作るのはダイスボットと言うことで。
さくっと導入から簡単なものを動かせるようになるまで。

導入...の前に

今回botに使用するのはPythonなので、そこの準備は適当に。
homebrewが入っているならbrew install python3とかでinstall出来ます。

さくっと導入

プログラムの準備

まずはライブラリを以下のコマンドで導入します。

python3 -m pip install -U discord.py[voice]

[voice]は無くてもインストール出来ますが、
音声サポート受けるならこっちって書いてあったので、とりあえずこっちで。
サンプルを丸コピすれば動きますが、その前にDiscord側の設定を。

Discord側の設定

ここからbotを追加しに行きます。

f:id:minase_mira:20171020221832p:plain f:id:minase_mira:20171020221925p:plain

"newApp"をクリック。"APP NAME"を入力すると右下のボタンが"Create App"に変わるのでクリック。
成功すると"APP DETAILS"が出てくるので、"Client ID"を覚えといて下さい。
僕みたいに記憶力に自信がなければ、メモ帳にでもコピペしとけば問題ないです。

f:id:minase_mira:20171020221955p:plain

次に、その1個下にある"Create a Bot User"をクリックするとなんか確認が出てくるので、"Yes,do it!"をクリックで。
そうすると、"Token"の隣にある"click to reval"をクリックしてTokenをメモっといて下さい。

サーバにBot君を招待して上げなきゃいけないので、以下のURLの【】の部分を自環境に合わせて変えて下さい。
ここで先程の"Client ID"を入れてあげます。

 https://discordapp.com/oauth2/authorize?&client_id=【ApplicationClientID】&scope=bot&permissions=0

これでようやく事前準備が完了です。

Botを作ってみよう

サンプルコードをダイスボットへとサクッと改良。
コードは以下の通りです。

# -*- coding: utf-8 -*-
import discord
import asyncio
import re,random

client = discord.Client()

@client.event
@asyncio.coroutine
async def on_ready():
    pass
    print('Logged in as')
    print(client.user.name)
    print(client.user.id)
    print('------')

@client.event
async def on_message(message):
    matchDice = re.search(r'1d100 <= (\d+)', message.content)
    
    # 1d100 <= '数字' で1d100の判定が出来る
    if matchDice:
        num = randNum()
        targetNum = matchDice.group(1)
        resultMessage = '1D100 <= ' + str(targetNum) + '→' + str(num)
        if num <= int(targetNum):
            await client.send_message(message.channel, resultMessage + '成功')
        else:
            await client.send_message(message.channel, resultMessage + '失敗')
    # お試し100面ダイス振るだけよう
    elif message.content == '1d100':
        num = randNum()
        await client.send_message(message.channel, str(num) + 'だよ')

def randNum():
    # 乱数精製
    randomNum = random.randint(1,100)
    return randomNum

client.run(【Token】)

コードのやってることはコメントの通りです。
やってるのは1d100の判定と100面ダイスを振るだけです。

f:id:minase_mira:20171020222011p:plain

動かすとこんな感じ。

まとめ

サンプルとしては良いかなってところです。
これから機能を追加できて行く予定。
また追加されたらそのときにでも。
それでは今回はこの辺で。