9
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

DenoでDiscordのbotを作ってherekuにデプロイしてみた。

Last updated at Posted at 2020-05-29

ふとDiscordのBotを作ってみたくなり、ついでにDenoがv1.0.0になったと聞いて、どちらも初めてですが少し遊んでみました。

追記 2021-02-02

Discord APIのライブラリ
https://deno.land/x/coward@v0.1.0/mod.ts
の開発は停止されたようです。

代替として
https://github.com/discordeno/discordeno
を使うのが良さそうです。

Denoのインストール

ちょうどWSL2も使えるようになったので、今回はWSL2(Ubuntu)にDenoを入れるところからはじめました。Ubuntu自体は再インストールした直後のため、ほぼまっさらな状態です。

公式の手順に従ってインストールしましょう。

# Ubuntuの場合
$ curl -fsSL https://deno.land/x/install/install.sh | sh
$ deno --version
deno 1.0.1
v8 8.4.300
typescript 3.9.2

Discordのbot作成

まずはBotをDiscordに導入しておきます。

  1. DEVELOPER PORTALにアクセスします。
  2. NEW APPLICATIONから適当なアプリ名を付けます。
  3. BotメニューのAdd Botから新しいBotを作ります。
    4. TOKENの文字列をどこかにメモしておきます。
  4. OAuth2メニューのSCOPESbotにチェックを入れます。
    4. 下部のBOT PERMISSIONSは、ひとまずTEXT PERMISSIONSSend Messagesにチェックを入れておきます。
    5. https://discord.com/api/oauth2/authorize?client_id=XXXXXXXXXXXXXXXXXXXXXXXXXXX&permissions=Y&scope=botのようなリンクが見えていると思いますが、そのリンクを開くと任意のサーバにBotを導入できます。

以上でBotの作成とサーバへの導入ができました。

Botのプログラム作成

次に、導入したBotのプログラムをTypeScript(Deno)で用意します。(参考記事)

//main.ts
import { Coward, Message } from "https://deno.land/x/coward@v0.1.0/mod.ts";

let client = new Coward(Deno.env.get("BOT_TOKEN") as string);

client.on("ready", () => {console.log("Bot is ready!");});

client.on("messageCreate", async (message: Message) => {
    if(message.content == "Hello") {
        client.postMessage(message.channel.id, "World!");
    }
});

client.connect();

以上で、Helloというメッセージに反応してWorld!と返すBotの実装ができました。
やはり面倒な設定ファイルが不要で、main.tsだけで完結するのは気持ちいいですね。

ローカルでの動作確認

$ export BOT_TOKEN=メモしたbotのトークン
$ deno run --allow-net --allow-env --cached-only main.ts
Bot is ready!

上記コマンドを実行し、Botを起動させた状態でDiscordにHelloとメッセージを入力・送信してみます。
作成したBotがWorld!とメッセージを送信してくれると思います。
確認ができたらCtrl + Cで停止しておきましょう。

デプロイ

最後に、このBotをherokuで動かすようにしてみたいと思います。

HerokuとGit

WSLに何も入っていなかったのでサクッと導入してしまいます。
導入済みの方は、適宜スキップしましょう。

Herokuの導入とアプリ作成

herokuのアカウントは、無ければ作ってしまいましょう。
heroku-cliのインストールは公式のページにあるコマンドを使います。
デプロイ方法はこちらの記事を参考にしました。

$ curl https://cli-assets.heroku.com/install.sh | sh
$ heroku -v
heroku/7.41.1 linux-x64 node-v12.16.2
$ heroku create --buildpack https://github.com/chibat/heroku-buildpack-deno.git
#ブラウザが自動で開くので、ログインすると適当な名前のアプリが作成されていると思います。
$ heroku config:set BOT_TOKEN=メモしたbotのトークン

Procfile

ここで、Procfileというherokuに実行してもらうコマンドファイルを作成しておきます。
拡張子も無く、Procfileがそのままファイル名です。
ファイルの中身は、下記のように、worker: というラベルに続けて、ローカル実行時と同じコマンドを記入しておきます。

worker: deno run --allow-net --allow-env --cached-only main.ts

Gitの設定とHerokuへPush

こちらも、サクッとやってしまいます。

# gitのユーザ名、メールアドレス、パスワードの保存設定をします。
$ git config --global user.name 'USER NAME'
$ git config --global user.email 'example@com'
$ git config --global credential.helper 'store --file ~/.git_credentials' # とても危ないので良い子は真似してはいけない
$ git add .
$ git commit -m "first commit"
$ git push heroku master --force

main.tsProcfileがherokuにpushされていると思います。

$ heroku logs --tail

で、ビルドエラーなど発生していないか確認して見ましょう。

herokuの設定変更

作成したherokuアプリのWeb設定メニューから、Procfileの設定をする必要があります。

下記画像のように、Resourcesタブを開くと中央にProcfileの内容が表示されていると思います。
右端のペンマークをクリックし、編集可能状態にしたうえで、トグルボタンを押し、有効化させましょう。

image.png

この状態で、ローカル動作確認のときと同様に、DiscordにHelloとメッセージを入力・送信してみます。
Herokuで動いているBotがWorld!とメッセージを送信してくれば、完璧です。
(初回は、もしかしたら起きるのに時間がかかるかもしれないです)

まとめ

TypeScriptなのにmain.ts程度しかファイルが生まれないDeno、やはり気持ち良いですね。

9
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?