Discord Elixir プログラミング 環境構築

ElixirでDiscord Bot開発(あいさつBot)by discord_alchemy

2020年9月9日

今回はプログラミング言語のElixirでDiscordのBotを開発していこうと思います。
使用するライブラリは「discord_alchemy 」になります。
Elixirって何ぞや?って人もいると思いますが、まぁ「そういう言語があるんだなぁ」と思ってもらえれば......。後々Elixirに関する記事は書く予定なのでしばらくお待ちください。

開発についてですが、今回はVisual Studio Codeとコマンドラインを使用して開発していこうと思います。
今回開発するBotは挨拶を返す「あいさつBot」です。
内容としてはhelloコマンドを送信すると、「こんにちは、○○さん」と返してくるBotです。

開発環境の準備

Visual Studio Codeのインストールはこちらの記事をご覧ください。

[st-card-ex url="https://www.dice-programming-etc.com/2020/08/30/javascriptdiscord-botdiscord-js/" target="_blank" rel="nofollow" label="" name="" bgcolor="" color="" readmore=""]

次に、Elixirの環境を整えましょう。Windowsではインストーラーを使うことで環境ができます。
こちらのサイトからWindows用のインストーラーをダウンロードしてください。

[st-card-ex url="https://elixir-lang.org/install.html" target="_blank" rel="nofollow" label="" name="" bgcolor="" color="" readmore=""]

Erlang がインストールされていない場合、このセットアップ中に同時にインストールすることができます。
Elixirのバージョンは「1.10.4」をインストールしました。
次にVisual Studio Codeの拡張機能をインストールしましょう。

画像1

vscode-elixirをインストールしてください。
一つ下の「ElixirLS: Elixir support and debugger」はデバッガーなので必要な人はインストールしておいてください。

これで、環境の準備は完了です。ではBotを作っていきましょう。

Discord Bot作り

まずはプロジェクトを作りましょう。これはコマンドプロンプト(またはwindows PowerShell)を使用します。
コマンドラインを開いてプロジェクトを保存するフォルダまで移動してください。

cd 移動先

移動先はエクスプローラーのからでも調べられるので、リンクをコピーして移動してください。
移動したらこのコマンドを実行してください。

mix new プロジェクト名

プロジェクト名を「bot」とした場合はこんな感じですね。

mix new bot

これを入力するとこんな感じに表示されると思います。これでプロジェクトが作成されました。

* creating README.md
* creating .formatter.exs
* creating .gitignore
* creating mix.exs
* creating lib
* creating lib/bot.ex
* creating test
* creating test/test_helper.exs
* creating test/bot_test.exs

Your Mix project was created successfully.
You can use "mix" to compile it, test it, and more:

    cd bot
    mix test

Run "mix help" for more commands.

次にVisual Studio Codeでフォルダを開いてください。「ファイル>フォルダを開く」でプロジェクト名を「bot」とした場合は「bot」フォルダを開いてください。

画像2

次は使用するライブラリをインストールします。画像の22行目~27行目のところに追加していきます。

  defp deps do
    [
      {:alchemy, "~> 0.6.4", hex: :discord_alchemy}
      # {:dep_from_hexpm, "~> 0.3.0"},
      # {:dep_from_git, git: "https://github.com/elixir-lang/my_dep.git", tag: "0.1.0"}
    ]
  end

3行目を追加しました。これで必要なものが準備できました。次にこのコマンドを実行してください。

mix deps.get

では、本格的にやっていきます。

プログラムを書いていこう

ではまず、「lib」フォルダ内にあるプロジェクト名.exを開いてください。(画像2の場合は「bot.ex」)

defmodule Bot do
  @moduledoc """
  Documentation for `Bot`.
  """

  @doc """
  Hello world.

  ## Examples
      iex> Bot.hello()
      :world
  """
  def hello do
    :world
  end
end

こんな感じだと思います。これを改良しましょう。
とりあえず、2行目~15行目まで消しちゃってください。使いません。

defmodule Bot do

end

はい、こんな感じですね。そうしたらこれがアプリケーションだと分かるようにしましょうか。

defmodule Bot.App do

end

はい。次にBotをスタートさせる関数を作ります。

defmodule Bot.App do
  use Application
  alias Alchemy.Client

  def start(_type, _args) do
   token_str = get_token()
   run = Client.start(token_str)
   use Discord.Commands
   run
  end
end

6行目の「get_token」はこれから作ります。8行目は後で作るモジュールになります。次に「get_token」を作っていきます。

defmodule Bot.App do
  use Application
  alias Alchemy.Client

  def start(_type, _args) do
   token_str = get_token()
   run = Client.start(token_str)
   use Discord.Commands
   run
  end

  defp get_token do
    Application.fetch_env!(:bot, :token)
  end
end

13行目でconfigファイルからトークンを読み取っています。では次にconfigファイルを作成します。

configファイル


まず、configフォルダを作成してその中に「config.exs」を作成しましょう。

内容をこんな感じにして下さい。

import Config

config :bot,
  :token, "トークン"

トークンについてはこちら。

[st-card-ex url="https://www.dice-programming-etc.com/java%e3%81%a7discord-bot%e9%96%8b%e7%99%ba%ef%bc%88javacord%ef%bc%89/#DiscordBot" target="_blank" rel="nofollow" label="" name="" bgcolor="" color="" readmore=""]

コマンドを受け付けよう


次にコマンドを受け付けてイベントを起こすモジュールを作成します。bot.exと同じlibフォルダにcommand.exというファイルを作成しましょう。(名前は何でも良いです)
作成したら何も書いていないファイルだと思うので、一旦中身をこうしてください。

defmodule Discord.Commands do

end

1行目のモジュール名......、どこかで見ましたね。
そう、bot.exです。useで呼び出されてたやつをこれから作っていきます。
と言ってもbot.exほど書くことはありません。さっと書いてしまいますね。

defmodule Discord.Commands do
  use Alchemy.Cogs

  Cogs.def hello do
    {:ok, name}= Cogs.member
    Cogs.say "こんにちは、#{name.user.username}さん"
  end
end

これで完成です。はい。
少し解説しますね。

2行目:use Alchemy.Cogs
これはコマンドを登録するためのモジュールです。

4行目:Cogs.def hello do
ここで「hello」というコマンドを登録しています。
discordでは「!hello」で呼び出せます。

5行目:{:ok, name}= Cogs.member
発言した人の情報をnameに格納しています。

6行目:Cogs.say
botが発言します。

6行目:name.user.username
nameに格納された情報からユーザー名を取得しています。

これでプログラムは終了です。
じゃあ起動!......と行きたいところですがあと一手足りません。
ちょっとだけmix.exsにつけたします。

  def application do
    [
      extra_applications: [:logger],
      mod: {Bot.App, []}
    ]
  end

4行目を足してください。これで一通り完成です。
では起動してみましょう。

Bot起動

コマンドラインを使います。プロジェクトのフォルダ内に移動してください。
(botというプロジェクトであればフォルダ名はbotになります。)
そうしたらこのコマンドを打ってBotを起動しましょう。

mix run --no-halt

コンソール内に

[debug] Shard [0, 1] received READY

のような文が表示されていれば起動したはずです。本当に起動したか、Botを入れたサーバーで確認してみましょう。

ボットがオンラインになっていれば起動しています。ではコマンドを打って反応が返ってくるか見てみましょう。

こんな感じに挨拶がBotから返ってくれば成功です。

まとめ

お疲れ様でした。これで簡単なコマンドの実装でき、簡易的なBotが完成しました。
当サイトでは様々な言語でDiscord Botの開発方法を紹介しています。自分にあった言語で開発してみてください。

-Discord, Elixir, プログラミング, 環境構築
-,