Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
5
Help us understand the problem. What are the problem?
@nodokamome

【Hacobune】Discord Bot起動してみた

概要

さくらインターネットのHacobuneというサービスでDiscordのBotを運用しています。この起動手順についてまとめます。
Hacobuneは今はβ版のお試し期間なので無料で使えます。すごく簡単なのでお試しください。
Node.jsとTypeScript、Dockerで作成した私のGithubレポジトリで環境を構築していきます。

できるようになること

  • DiscordのBotをHacobuneで起動できる
  • node, typescriptのDiscordBot開発のベースを作ることができる

必要なもの

  1. Hacobuneのアカウント
  2. Dockerで動作するDiscord BotのGithub Repository
  3. Discord Botアカウント、およびそのトークン

サンプルプロジェクト・ソース

今回は私のDiscord Botテンプレートで説明します。
テストされる際はこちらをforkやcloneしてお試しください。

Discord Bot開発の記事ではないので深くは説明しないですが、discord.jsというnpmライブラリで開発をしています。

  ├ src/
  |  └ index.ts             // DiscordBotの動作を記載するファイル。
  |
  ├ .dockerignore           // 軽量なDockerImageを作成するときに使うファイル。node_moduleと.gitが書いてあれば良いと思います。
  ├ .Dockerfile             // DiscordBotのDockerImageを作成するために使うファイル。Hacobuneを使うにはこれが必須です。
  ├ .package.json           // nodeを使うためのファイル
  └ .tsconfig.json          // TypeScriptを書くためのファイル

// .gitignore, README.md, package-lock.json は説明不要と思い省略しています

ソース説明

index.tsDockerfileだけ記載します。他のファイルは私のレポジトリリンクから参照できます。
特に説明することもないですね。

この書き方であればTSでなくても良いと思いますがTemplateなのでとりあえずTSにしてます。
Botの動作は!pingがチャンネルで入力されたときにpongを返すようにしました。

index.ts
import { Client } from 'discord.js';
import { config } from 'dotenv';

config();

(function main() {
  const client = new Client();

  client.on('message', async (message) => {
    if (message.author.bot) return;

    if (message.content === '!ping') {
      message.channel.send('pong');
    }
  });

  client.once('ready', () => {
    console.log('Connected to Discord successfully!');
  });
  client.login(process.env.DISCORD_TOKEN);
})();

カッコつけてbuildとruntime用を分けてImageを作成してます。特に意味はないですが軽量化されている気がします。
Botのための特別なことはしておらず、ビルドして実行しているだけなのでご自由に変更してください。

Dockerfile
# ----------
# build(tscを実行してjsを作る)用のstage
# ----------
FROM node:14 AS build

WORKDIR /build
COPY . .
RUN npm install
RUN npm run build

# ----------
# runtime用のstage
# 必要なファイルは dist/, node_modules/, package.json, package-lock.json のみ
# ----------

FROM node:14

WORKDIR /usr/src/app
COPY package*.json ./
# ランタイムに必要な依存パッケージのみインストールし、同時にnpmのcacheファイルを削除する
RUN npm install --production --cache /tmp/empty-cache && rm -rf /tmp/empty-cache

ENV TZ=Asia/Tokyo
# --fromで前半で記述したAS buildと命名した中間イメージから必要なファイルのみ抽出する事ができる(distディレクトリにtsコンパイル結果であるjsファイルが出力されている)
COPY --from=build /build/dist ./dist

CMD [ "npm", "start" ]

Github連携でHacobuneにDiscord Bot導入

  1. プロジェクトからDiscord Bot用プロジェクト新規作成する。
    今回はテストなのでDiscord Botという名前と適当な説明を入力し、作成ボタンをクリックします。
    hacobune01.png
    hacobune02.png
    hacobune03.png

  2. アプリケーションからDiscord Botのアプリケーションを新規作成する。
    今回はGithub連携でソースを取得するので、必要な情報を入力し、GithubをクリックしてDiscord Bot用のRepositoryを選択します。
    hacobune04.png
    hacobune05.png

  3. Botの起動に.envファイルが必要なので設定ファイルから追加します。
    設定ファイルのモーダルに事前に用意したDiscord BotのTokenを入力し、作成ボタンをクリック。
    入力する内容は以下の形式で入力します。もしご自身のプロジェクトで他にも環境変数があるのであればこちらから追加してください。
    DISCORD_TOKEN=コピーしたDiscordのBot Token
    hacobune06.png
    hacobune07.png
    作成ボタンをクリックすると、入力したファイルが追加されていることがわかります。もしTokenを変更したい場合は、編集から変更できます。
    hacobune08.png

  4. その他は変更せず作成ボタンをクリック。
    今回はリソースプランをフリーで作成していますが、もしBotからのレスポンスが遅いと感じた場合は上位のプランに変更することをおすすめします。
    hacobune09.png

  5. 追加したbotのアプリケーションからログをクリックし、ビルドとアプリケーションのログを確認します。。
    Dockerのビルドをリアルタイムで確認できますので、何かエラーがあればここから確認してください。
    Successfullyとビルドが成功したら、アプリケーションログをクリックしてブラウザをリロードしてください。
    Connected to Discord successfully!と表示されて、ビルド完了しステータスが稼働中になっているはずです。
    hacobune10.png
    hacobune11.png
    hacobune12.png
    hacobune13.png

  6. Botを招待したDiscordチャンネルのオンラインステータスを確認し、追加したBotアカウントがオンラインになっていれば成功です。
    hacobune14.png

起動確認

オンラインが確認できるチャンネルで!pingとメッセージを入力するとボットからpongと返信があることがわかります。
これでHacobuneでのDiscord Botの起動が成功しました。
bot-test.gif

まとめ

Dockerで動くBot環境があれば簡単にHacobuneで環境を用意できます。
今なら無料で試すことができるのでDiscord Bot開発をしている人はぜひ試してください。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
5
Help us understand the problem. What are the problem?