チンパンジーでも作れるDiscordBot その1 〜環境構築編〜

逆になんでBot作らんの?(テンプレ化

難しそう?面倒くさい?そんなのやってから言えボケ


DiscordのBotって面白そうだし自分でも作れるなら作ってみたいけど何から始めればいいか分からない、
もしくは身近な範囲でプログラミング的な事をやってみたい人向けに環境ゼロの状態からのDiscordBot開発の始め方を何回かに分けて書いてみます。

今回はDiscordBotの開発に必要な環境の整備です。あとついでに簡単に動作確認用のBotも書いていきます。
次回以降では機能別にBotの作り方を少しずつ紹介し、最終的にちょっとした音楽Botを作ってみようと思っています。

あまりプログラミングに馴染みのない人でもある程度分かるような内容にするつもりですが、
最低限if文の条件分岐ぐらいはなんとなくでも分かっていると読みやすいかと思います。

開発環境を整える

今回の環境構築編では必要な言語やライブラリ等のインストールをして開発環境を整えていきます。

プログラミング言語にはRubyを使います。
他でも良かったのですが、単純に私自身がDiscordBot開発にRubyを使っているのでここでもそれを使うことにします。

Rubyってなんだよ

Rubyのインストールの前に少しだけRubyについて説明させてください。
何を言っているかわからなくてもさして問題はないのでとりあえず簡単に目を通してみてください。

Rubyはプログラミング言語の一つです。
Rubyと言えばRuby on Railsが割と有名だと思います。
Ruby on RailsはRubyのフレームワークの一つで、Webアプリケーションの開発に使われています。
(Ruby on Rails自体はプログラミング言語ではありません)

フレームワークとは文字通り何かしらのシステム開発をする際に、それを楽に出来る様に作られたプログラムの枠組みのようなもの。

Ruby on RailsはよくRailsと呼ばれたりします。
国内ではcookpad食べログ、他にも実はTwitterなんかのサーバーサイドのプログラムがRailsを使って作られています。
RubyはこうしたWebサービスでよく使われているイメージですが、もちろん他の用途でも使うことはできます。

ここまで語っておきながらアレですが、今回作るのはあくまでただのDiscordBotなので、これらのフレームワークは今回ほとんど関係ありません。

今度はRuby言語自体の特徴をいくつか挙げてみます。
Ruby自体の大きな特徴として挙げられるのが

  • コードの記述量が少ない
  • 幅広い書き方ができる
  • 日本発

という点。まず文法がシンプルで自由度が高いので、同じ処理をさせるにしてもいろんな書き方が許されています。
慣れるとイケてなくてダサいコードをイケイケでクールに書くことができるので、Rubyの感覚に慣れると結構面白いですよ。
似たような特徴を持つものは他にもありますが、趣味の開発にも割と向いてる言語なんじゃないですかね。

[1, 2, 3, 4, 5].each do |item|
  puts item
end
# 結果:
#    1
#    2
#    3
#    4
#    5

array = [1, 2, 3, 4, 5].map{ |item| "アイテム#{item}" }
puts array # 結果: ["アイテム1", "アイテム2", "アイテム3", "アイテム4", "アイテム5"]

testes = if array.count == 5
           true
         else
           false
         end
puts testes # 結果: true

適当にRubyっぽそうなコードを並べただけなので、いきなりこれを読もうとしなくても大丈夫です。

C系などと比べて学習難易度も易しく、実行するたびにコードをコンパイルする必要もありません。
エラーにも結構寛容な言語だと言えます。

何より大きいのはRubyが日本発祥の言語だということ。
つまり、他の言語と比べて日本語で書いてある資料が多めなので、何か分からないことや躓いたことがあっても比較的日本語の情報が多く見つかりやすい言語です。

以上がRubyの強みですが、一応弱点も紹介しておきます。
他の言語と比べて実行速度が遅めという点と、多彩な書き方ができるがゆえに書き方を統一させないとメンテナンスのしづらいコードになりがちな点です。

実行速度が遅めとは言ってもDiscordBotの様な簡単なプログラムで、この実行速度の違いを体感するようなことはまずないと思います。

Rubyをインストールする

Rubyをインストールしてみます。

ちなみにMacの人はRubyを新たにインストールする必要はありません。
OS X/macOSには少しだけ古いバージョンではありますがRubyが初期状態でインストールされています。
今後も開発を続けていくなら将来的にアップデートしておいたほうがいいかもしれませんが、今回はスキップしてもいいでしょう。

Linuxの場合はよく知りません。多分同じくデフォルトで入ってる場合が多いと思います。
入っていなくてもLinuxなんか使う人ならインストールもできるでしょう。

Windowsの場合、実は結構面倒です。今回の記事ではWindows10での方法を紹介します。

まずはRubyInstallerのダウンロードページをブラウザで開きます。そこから「Ruby+Devkit 2.5.3-1 (x86)」をダウンロードしてください。62bitOSの場合でも必ずx64ではなくx86のインストーラーをダウンロードしてください。

今回は2.5.3をダウンロードしましたが、2.3.x以上なら基本的にどのバージョンでも構いません。
ただし、必ず「WITH DEVKIT」の中にある物を入れるようにしてください。

ダウンロードしたらインストールしましょう。「I accept the License」をクリックして次へ。

ここでは3つ目の「Use UTF-8 as default external encoding.」にチェックを入れて次へ進みます。

2つともにチェックが入っているのを確認してそのまま次へ進みます。

そうするとインストールが始まります。

終わるとこんな感じの表示になります。ちなみにまだインストールは終わっていません。
「Run ‘ridk install’ to setup MSYS2 and development toolchain…」にチェックが入っているのを確認して「Finish」をクリックしてください。

すると今度はMSYS2のインストール画面が表示されます。こちらも必要なのでインストールします。
そのままキーボードのEnterキーを押してください。

Enterを押すと凄まじい速度でログが流れていきます。これには少し時間がかかります。

しばらくしてようやく終わりました。「Install MSYS2 and MINGW development toolchain succeeded」と出たら成功です。
このままこのウィンドウを閉じます。

これでRubyのインストールは終わりです
次のステップに移る前に少しだけRubyを触れてみます。
Windowsの検索から「Interactive Ruby」を起動してみてください。

ここではRubyのコードを直接打ち込み、その場で実行することができます。
実際のDiscordBot開発では使わないのですがせっかくなので「“Hello World!”」と入れてEnterを押してみましょう。

「=> “Hello World!”」と返ってきました。Rubyでは文字列を「”」もしくは「’」で囲んで表現します。
ここでは先ほど打った「Hello World!」という文字列に何の処理も書き込んでいないので、そのまま実行結果として返ってきました。

今度は「7*2」と入れてみます。

ここでは「7×2」を計算したので「14」と返ってきました。
ちなみにRubyでは他の言語と同じように、四則演算をする際このように書きます。

演算子
加算 + 1+1
減算 2-1
乗算 * 1*2
除算 / 4/2

ちょっと横道に逸れてしまいましたが、この辺りにして次へ進みましょう。

discordrbをインストールする

RubyからDiscordのAPIを操るためのライブラリ(Rubyではgemと言います)「discordrb」をインストールします。
Windowsの検索からコマンドプロントを起動します。

一応ここでRubyが正しくインストールされているかをもう一度確認するために「ruby -v」と入れてインストールされているRubyのバージョンを見てみます。

先ほどインストールしたRubyのバージョンが表示されていれば、OKです。
それでは「discordrb」をインストールします。「gem install discordrb --platform=ruby」と入れてください。
Mac/Linuxの場合は「gem install discordrb」だけで十分です。

インストールには少し時間がかかります。終わるとこんな感じになります。

Rubyを使ったDiscordBot開発に必要なものはこれでほぼ揃いました。
テキストエディタを持っていない人は入れておきましょう。メモ帳だと今後色々とお話になりません。

テキストエディタ

テキストエディタにも色々とあるのですが、ここでは私自身が使い慣れているSublime Textを使います。
複数の箇所を同時に編集できる機能があったり、プラグインも結構豊富です。

無料でも無期限無制限で使えますが本来は有料のエディタです。
無料のまま使っているとたまに「良かったら買ってくれない?」というメッセージが表示されるので、気に入ったら買ってみるのもいいでしょう。
ただ9000円もする代物なので趣味でほんの少しだけ手を出すのには高すぎるかもしれませんね・・・

ちなみに購入していない状態だとウィンドウの右上に「UNREGISTERED」と表示されます。

他にはVisual Studio Codeや、最近ではAtomなんかが有名です。
3つとも機能面では特にどれが劣っているというのは無いので、パッと見で選んでもいいと思います。
ちなみに3つともWindows/Mac/Linuxの全てに対応しています。

とりあえず作ってみる

Ruby、discordrb、テキストエディタの準備が終わったらいよいよBot作りを始めることができます。
本格的には次回以降で作っていくのですが、せっかく環境を整えたのでごくごく簡単なbotを作ってみたいと思います。

まずはDiscord Developer PortalのサイトにアクセスしてBotを登録しましょう。
「Create an application」をクリック。

するとアプリケーションが作成されます。ここでは「MyFirstBot」という名前のBotを作ることにします。
名前やアイコンはなんでも構いません。この画面にある「CLIENT ID」の部分をコピーしてどこかに控えておいてください。

次に画面左側のメニューから「Bot」を選択。

「Add Bot」をクリック。

「Yes, do it!」をクリック。

するとBot専用のDiscordアカウントが作成されます。ここからでも名前とアイコンを変更できます。
ここも「TOKEN」の部分にある「Copy」ボタンをクリックして、コピーされたトークンを先ほど控えておいたIDと同じように控えてください。
そして、Botをどこかに公開する気がないのなら「PUBLIC BOT」をオフにしましょう。
「PUBLIC BOT」をオンにすると、公開Botとして自分以外の人がこのBotを自由にいろんなサーバーに追加できるようになります。

ちなみに、ここでコピーしたトークンは流出するとBotのアカウントを直接コントロールできてしまうため、絶対に他人には(少なくとも信用できない人には)見せないでください。

これでDeveloper Portalへの登録は終わりです。早速自分のサーバーにbotを追加してみましょう。
ブラウザで「https://discordapp.com/oauth2/authorize?client_id=先ほど控えたID&scope=bot」を開いてください。
「先ほど控えたID」の部分にIDを入れるのを忘れないように。

サーバーを選択して「Authorize」をクリックすると選択したサーバーにBotが参加します。
ですがBotは起動もしていなければ、そもそも何も処理を書いていないためオフライン表示になっています。

とりあえず書いてみる

なので次にBotのコードを書いていきます。テキストエディタを起動してください。
(ここからのスクリーンショットは一部macOS上のものになります)

先ほど、Rubyは多様な書き方が出来ると言いました。そのため人それぞれ書き方が少し違ったりするのですが、今回はThe Ruby Style Guideを参考にしていきます。

上記のスタイルガイドに基づいて、先にインデントの広さと改行コードの種類を設定していきます。下記はSublime Textでの方法になります。

画面右下の「Tab Size: 4」の部分をクリックし、「Indent Using Spaces」をクリックします。
もう一度「Spaces: 4」をクリックし、今度は「Tab width: 2」をクリックします。

改行コードはその左隣にある部分をクリックして変更します。
「Unix Line Endings (LF)」を選択してください。

そのさらに左隣の箇所は「UTF-8」になっていることを確認してください。
そして、一番右側の「Plain Text」とある部分はクリックして「Ruby」に変更してください。

最終的にこのようになるはず。

RubyでDiscordのBotを操るには先ほどインストールしたgem(ライブラリ)の「discordrb」を使います。
gemをプログラムの中で使うには「このプログラムではこのgemを使います」といった宣言をしなくてはいけません。その為には

require 'gemの名前'

と入れます。

今回はdiscordrbを使うので、

require 'discordrb'

となります。1行目に入れましょう。

次に先ほど控えたIDとトークンからRubyのコード内でBotを使えるように設定します。

bot = Discordrb::Commands::CommandBot.new(token: 'トークン', client_id: ID, prefix: ';;')

ここでは「bot」という新しい変数にトークンとIDを設定して作った「CommandBot」を代入しています。

以降は「bot」からこのDiscordBotの各種機能にアクセスできるようになります。
「prefix」の部分にはコマンドの接頭辞にしたい文字列を入れます。ここでは’;;’を使います。

そう言えばどんなBotを作っていくのか何も言ってませんでしたね。
凝ったものは次回以降で作っていくとして、ひとまずはコマンドの入力に反応させるようにしてみます。

bot.command(:hello) do |event|
  event.message.channel.send_message('Hello World!')
end

bot.run

「hello」というコマンドが入力されると、「bot.command(:hello) do |event|」の中にあるコードが実行されます。
「|」で囲まれているeventには、ユーザーが入力したコマンドのメッセージに関する様々な情報が格納されています。

2行目の部分では、情報が格納されている「event」から「message」を取り出し、そのメッセージが送信された「channel」を取り出し、そのチャンネルに対して「send_message(メッセージ内容)」とすることでメッセージを送信しています。

そして「end」で閉じて、最後にbot.runでbotをスタートさせています。
この「bot.run」は、コードの一番最後に一つだけ入れればOKです。

最終的にこんな感じのコードになるはずです。

require 'discordrb'

bot = Discordrb::Commands::CommandBot.new(token: 'トークン', client_id: ID, prefix: ';;')

bot.command(:hello) do |event|
  event.message.channel.send_message('Hello World!')
end

bot.run

この状態でbotを起動してみましょう。ファイルをデスクトップに「bot.rb」という名前で保存して、コマンドプロントを開いてください。
そこに「cd C:\Users\ユーザー名\Desktop」と入力して「ruby bot.rb」と入力します。すると…

MyFirstBot、オンラインになりました。

試しに「;;hello」と打ってみるとちゃんと「Hello World!」と返してくれましたね。

これで一応「;;hello」と打つ度に何度でも「Hello World!」と返してくれるBotが出来ました。今のコードを少しだけ手直ししてみましょう。

;;helloに対して「Hello World!」と返す「event.message.channel.send_message(‘Hello World!’)」の部分は、実はこのように書くこともできます。

event.respond('Hello World!')

先ほどは説明用にあえて回りくどい書き方をしていましたが、こっちの方がが短くてシンプルですよね。こっちの書き方に直しましょう。

ついでに「Hello World!」に加えて「Hello LEoREo_2247!」のようにコマンドを送信したユーザーの名前を入れたメッセージも送信させるようにしてみます。

bot.command(:hello) do |event|
  username = event.user.name
  event.respond('Hello World!')
  event.respond("Hello #{username}!")
end

基本的には先ほどと変わりませんが、’Hello World!’と送るコードの上下に新しいコードが入っています。

上の方はeventからuserを取得して、そのuserのnameを「username」という新しい変数に入れています。
つまり、コマンドのメッセージを投稿したユーザーの名前が「username」変数に入っています。

下の方は、上の方で取得したユーザー名を「”Hello #{username}!”」という形で埋め込んでいます。これでBotは「Hello LEoREo_2247!」と返すようになります。

「’Hello World!’」と、「”Hello #{username}!”」。コード上で文字列を囲っている記号が異なるのがわかります。
上と下の文字列は囲っている記号が異なるため、若干挙動が異なります。
簡単に言えば、
「’」で囲っている文字列は、中にある文字列がそのまま使用されますが、
「”」で囲っている文字列は、「#{}」を使うことで変数を文字列に埋め込むことができる
という違いがあります。

複数行の文字列を書くには、改行したいところに「\n」と入れます。
「\n」は改行コードで、これがある位置で文章は改行されます。

こういった改行コードは「”」で囲っている文字列でしか使うことができません。
「’」で囲った文字列に「\n」と書くと改行されずにそのまま「\n」と表示されてしまいます。

2種類ある文字列ですが、ある検証では「’」を使うと処理速度がわずかに遅くなるという結果が出ているのでこれからは無難に「”」を使っていきましょう。
あと、今更ですが「’」「”」で囲った文字列は「String」と言います。覚えておきましょう。

これでもう一度Botを実行してみます。ファイルを上書き保存し、先ほどのコマンドプロントに戻ります。
「Ctrl+C」キーを押して今動かしているBotを終了させて、そして再び「ruby bot.rb」を打ってBotを動かしてください。

「;;hello」と打つとこんな感じになるはずです。

続く

今回はゼロからdiscordrbを使ったDiscordBot開発環境を構築し、コマンドに反応するごくごくシンプルなBotを作りました。
説明することが多かったため少し長くなってしまいましたが、次回以降はもう少し短くできると思います。

次回は今回のブログで書いたコードをさらにパワーアップさせ、さらにじゃんけんコマンド、サーバー入退出監視の機能を作る予定です。

おわり。