0
2

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 1 year has passed since last update.

Denoで動作するDiscord botをHerokuにデプロイする

Posted at

概要

Denoで動作する対話的なDiscord botを作成し、Herokuにデプロイするまでの手順についてまとめます。

以下のスクリーンショットのように、投稿したテキストメッセージの内容に応じてDiscord botがメッセージを送信するものを作成します。
スクリーンショット.png

準備

Denoのインストール

Installation | Manual | Deno に従ってインストールします。

curl -fsSL https://deno.land/x/install/install.sh | sh
$ deno --version
deno 1.19.1 (release, x86_64-unknown-linux-gnu)
v8 9.9.115.7
typescript 4.5.2

Denonのインストール

Denoで作成したプログラムを簡単に実行するために、denonをインストールします。
denonは様々な機能を提供していますが、今回はnpm scriptsの代替として利用します。プログラムが複雑になるまではシェルスクリプトで代用する方法でも良いと思います。

deno install -qAf --unstable https://deno.land/x/denon/denon.ts
$ denon --version
[*] [main] v2.5.0

Discord botの設定

  1. Discord Developer Portalにアクセスし、New Application -> Nameを入力 -> Create でDiscord アプリケーションを作成します。

  2. Settings -> Bot -> Add Bot で Botの機能を有効化します。

  3. OAuth2 -> URL Generator から認証URLを発行します。
    スクリーンショット 2022-02-27 103249.png

  4. 発行した認証URLにアクセスし、Discordサーバにbotを追加します。
    スクリーンショット 2022-02-27 103744.png

Herokuの設定

The Heroku CLI | Heroku Dev Center の手順に従ってインストールします。

curl https://cli-assets.heroku.com/install.sh | sh
$ heroku --version
heroku/7.59.2 linux-x64 node-v12.21.0

Discord botのプログラムを作成する

ディレクトリ構成

$ tree
.
├── .envrc
├── .gitignore
├── Procfile
├── scripts.yml
├── src
│   └── main.ts
└── runtime.txt

ソースコード

Discordのライブラリとしてdiscordeno/discordeno: Discord API library for Denoを使用しています。

./src/main.ts
import {
  createBot,
  startBot,
  getUser
} from "https://deno.land/x/discordeno@13.0.0-rc22/mod.ts";

const bot = createBot({
  token: Deno.env.get("DISCORD_TOKEN")!,
  intents: ["GuildMessages"],
  botId: BigInt(Deno.env.get("APPLICATION_ID")!),
  events: {
    ready() {
      console.log("Successfully connected to gateway");
    },
    async messageCreate(bot, message) {
      console.log(message.content)
      if (message.channelId === BigInt(Deno.env.get("CHANNEL_ID")!)) {
        if (message.content === "bye") {
          const user = await getUser(bot, message.authorId)
          bot.helpers.sendMessage(
            message.channelId,
            {
              content: `die ${user.username} :-1:`,
            },
          );
        } else if (!message.isBot) {
          bot.helpers.sendMessage(
            message.channelId,
            {
              content: ":middle_finger:",
            },
          );
        }
      }
    },
  },
});

await startBot(bot);

各種設定ファイル

環境変数

./.envrc
# https://discord.com/developers/applications
# Settings -> Bot -> TOKEN
export DISCORD_TOKEN=XXXXXXXXXXXXXXXXXXXXXXXX.XXXXXX.XXXXXXXXXXXXXXXXXXXXXXXXXXX
# General Information -> APPLICATION ID
export APPLICATION_ID=000000000000000000

# チャンネルを右クリック -> IDをコピー
export CHANNEL_ID=000000000000000000

Denonの設定ファイル

./src/scripts.yml
scripts:
  start:
    cmd: "deno run --allow-env --allow-net ./src/main.ts"
    desc: "run discord bot"

Herokuの設定ファイル

./Procfile
Worker: deno run --allow-env --allow-net ./src/main.ts
./runtime.txt
v1.19.1

.gitignore

./.gitignore
.envrc

動作確認

$ denon start
[*] [main] v2.5.0
[*] [daem] watching path(s): **/*.*
[*] [daem] watching extensions: ts,tsx,js,jsx,json
[!] [#0] starting `deno run --allow-env --allow-net ./src/main.ts`
Successfully connected to gateway
hi
:middle_finger:
bye
die gogobike :-1:

スクリーンショット 2022-02-27 102342.png

Herokuにデプロイする

heroku create --buildpack https://github.com/chibat/heroku-buildpack-deno.git
heroku config:set DISCORD_TOKEN=XXXXXXXXXXXXXXXXXXXXXXXX.XXXXXX.XXXXXXXXXXXXXXXXXXXXXXXXXXX
heroku config:set APPLICATION_ID=000000000000000000
heroku config:set CHANNEL_ID=000000000000000000

git init
git add -A
git commit -m 'Initial commit'
git push heroku main:main

heroku ps:scale Worker=1:Free

参考

0
2
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
0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?