Discord.jsとTypeORMをうまく組み合わせて、Heroku Postgresへ接続する

DiscordボットをHerokuで動かすときに、Heroku Postgresを使ってデータを保存したいという人向けのテンプレートを作成しました。

世代管理もできます。

# このテンプレートを使う際に

TypeORM(opens new window) の使い方を理解していないと、難しい内容となっています。

Discord.jsを使って、Discordボットを作るためにプログラミングを始めた人はこの記事を参考にしないでください。

初心者の方はまずDiscord.js Japan User Group(opens new window) のScrapboxやDiscordサーバーを利用して学習をはじめてみてはいかが?

# クレジットカードの登録が必要

  • Workerを月1000時間に伸ばさないと常時起動することができない
    • 一ヶ月が700時間以上あるため
    • クレジットカードを登録していない状態だと、月550時間が限界
  • Heroku Postgresがアドオンであるため
    • 無料のプランでもクレジットカードの登録が必要

デフォルトでは課金しないので、安心してください。

# Dockerが必要

開発する際にローカルでPostgresを動かす必要があるため、Dockerが必要であり、使用方法を知っている必要があります。

# Gitが必要

gitが必要で、使用方法を知っている必要があります。

# Heroku CLIが必要

公式サイト(opens new window) からインストールしましょう。

# リポジトリからデプロイボタンをクリックする

リポジトリ(opens new window) のREADMEにあるDeploy to Herokuの画像をクリックするとHerokuへリダイレクトされ、下の画像のようなメニューが出てくると思います。

Image from Gyazo

必須の項目を入力し、Heroku PostgresがFreeになっていることを必ず確認してから、Deploy appをクリックしてください。

完了すると、既にDiscordボットが稼働していると思います。

# ローカルにソースコードをクローンしたり、コミットする

アプリのダッシュボードからDeployをクリックし、Deploy using Heroku Gitに詳しいことが書いてあります。

# データの保存方法

デフォルトではUser, Guild, GuildMemberの3つが拡張されており、getSettingsメソッドが追加されています。

Active Recordなので、下記のような書き方をします。

// src/bot.ts
import './extensions'

import { Client } from '.'

const client = new Client()

client.on('message', async message => {
  if (message.system || message.author.bot) return
  if (!message.content.includes('discord')) return
  
  const userSettings = await message.author.getSettings()

  userSettings.level += 1

  userSettings.save()
    .catch(console.error)
})

client.login()
  .catch(console.error)