Ruby
RaspberryPi
discord

DiscordのBotをRaspberry Piでポストするまでのメモ

More than 1 year has passed since last update.

DiscordでBotを作りたい

表題の通りで、最近仲の良い友人たちの間でDiscordを使っていて、こいつにBotを導入したかった。
応用は後で頑張るとして、まずは簡単なポスト(Ping - Pong)くらいできるようにしたい。

※余談だけど、Discord本当に良いのでSlackくらい流行ってほしい。

環境

常に動作させたかったので、自宅でおもちゃにしてるRaspberry Pi3で動作させることにした。

Linux raspberrypi 4.4.38-v7+ #938 SMP Thu Dec 15 15:22:21 GMT 2016 armv7l GNU/Linux

何を使う?

BotといえばSlackなんですけど(?)、よくHubotが使われてました。
自分も一度使ったことあるけど、色々面倒(Herokuとか使う)だったので、もう少し小規模にできるものから始めようかなと。
いろいろ調べた感じ、以下の二つが簡単にDiscordのBotを作れそう。

名前からおわかりの通り、discord.pyはPython、discordrbはRubyによるDiscordのAPIラッパーらしい。

二つのサンプルコードを貼ってみます。

discord.py.py
import discord
import asyncio

client = discord.Client()

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

@client.event
async def on_message(message):
    if message.content.startswith('!test'):
        counter = 0
        tmp = await client.send_message(message.channel, 'Calculating messages...')
        async for log in client.logs_from(message.channel, limit=100):
            if log.author == message.author:
                counter += 1

        await client.edit_message(tmp, 'You have {} messages.'.format(counter))
    elif message.content.startswith('!sleep'):
        await asyncio.sleep(5)
        await client.send_message(message.channel, 'Done sleeping')

client.run('token')
discordrb.rb
require 'discordrb'

bot = Discordrb::Bot.new token: '<token here>', client_id: 168123456789123456

bot.message(with_text: 'Ping!') do |event|
  event.respond 'Pong!'
end

bot.run

discordrbを使う

結論から言いますと、何故かdiscord.pyで上手く動作しなかったので、discordrbを使うことにした。なんでできなかったんだろう・・・

というわけで、以降はdiscordrbの簡単な導入方法になります。

Bot実装

discordrb導入

Linuxの場合導入自体はメチャクチャ簡単。

gem install discordrb

・・・といいつつ、エラーでdiscordrbがインストールできない!(エラー内容はメモるの忘れた)
検索したらrubyバージョン2.1.5なら大丈夫?とのことなので、先にrvmを導入してからインストールすることに。

rvmインストール

curl -L get.rvm.io | bash -s stable

上記のコマンドがコケたら、以下を実行してからもう一度試す。

gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3

rvmのインストールが完了したら、ターミナルを閉じるか以下のコマンドを実行。

source ~/.rvm/scripts/rvm

お目当てのrubyバージョンをインストール。

rvm install 2.1.5

どうやらここでrubyのコンパイルが入るらしく、えらい時間かかった。30分くらい。

環境によっては以下のインストールが必要みたいです。nazuna01107さんありがとうございます!

apt-get install ruby-dev

ここまできてやっと当初の目的であるdiscordrbをインストールできる。

再度、discordrbインストール

gem install discordrb

gemのインストールが完了したら、使用するソースで以下をrequireするだけ。

require 'discordrb'

Windowsの人は公式のドキュメント見て!

DiscordにBotを登録

開発者ページでBotの登録をします。
1.PNG

New Appをクリック


2.PNG
上の画像で黒塗りになってるClient ID と Token をメモっておく。

Discord側の設定はこれだけでOK。REDIRECT URI(S)は設定しなくても大丈夫。

コーディング & 実装

コーディングといいつつ、今回はポストするまでが目標なので、discordrbのサンプルをそのまま使う。
最初はechoだけでもいいと思ったけど、それだとあまりにも味気ないから、投稿されたRubyのコードをそのまま eval するサンプルを使った。

bot.rb
require 'discordrb'
bot = Discordrb::Commands::CommandBot.new token: 'あなたのトークンを入れてね', client_id: 000000000000000000, prefix: '!'

bot.command(:eval, help_available: false) do |event, *code|
  begin
    eval code.join(' ')
  rescue
    'An error occurred '
  end
end

これを適当なファイル名で保存して、

ruby bot.rb

すれば実行開始。
上手く行けば以下みたいな表記が出るはず。

Using WSCS version: 0.3.0
libsodium not available! You can continue to use discordrb as normal but voice support won't work.
        Read https://github.com/meew0/discordrb/wiki/Installing-libsodium for more details.
[INFO : websocket @ 2017-02-28 02:26:10.165] Discord using gateway protocol version: 6, requested: 6

※なんか利用不可って言われてるけど気にしない。

常に動作させたい場合はコマンドの末尾に & をつけてやってバックグラウンド実行するといいかも。

ruby bot.rb &

おしゃべりする

あとはDiscordでBotに話しかけるだけ!
3.PNG

ちなみに、ここですげー躓いたんだけど、Discordの場合、Botにコマンドを実行させるときは prefixが必要らしく、Botに対していくら

eval 1+2

ってやっても効かなくて、ちゃんと ! をつけてやらないとダメみたい(prefixは変更できる)。

!eval 1+2

それと、上記の画像はDMだけど、任意のチャンネルでBotにコマンドを打つときも @Chika !eval 1+1 ってやる必要はないみたい。
これだと、同じコマンドを持ったBotが複数いる場合どうなるんだろう・・・このへんの仕様はまだ調べてない。

次の目標

とりあえずポストできることがわかったので、次回はもう少し実用的なBotにしたい。