discord.jsでDISBOARDのbump通知を作る方法

2021/06/05

discord.js Node.js

この記事では、discord.jsでDISBOARD(https://disboard.org)のbump通知をしてくれる機能を作成します。

動作に必要なもの

  • Node.js
  • discord.js
  • 24時間365日起動し続けることができるできる環境

→setTimeoutを使っているので再起動したら通知できないからです。
 データベースとか使った方法もまた今度考えます。

反応対象をDISBOARDのみに

他のBotに反応すると困るので、IDで反応対象を絞ります。

client.on('message', async message => {
  if (message.author.id === '302050872383242240') {

  }
})

トリガーのメッセージを指定

message.embedsでメッセージのEmbedが取得できます。

client.on('message', async message => {
  if (message.author.id === '302050872383242240') {
    if (message.embeds[0].description.match(/表示順をアップしたよ/) ||
        message.embeds[0].description.match(/Bump done/) ||
        message.embeds[0].description.match(/Bump effectué/) ||
        message.embeds[0].description.match(/Bump fatto/) ||
        message.embeds[0].description.match(/Podbito serwer/) ||
        message.embeds[0].description.match(/Успешно поднято/) ||
        message.embeds[0].description.match(/갱신했어/) ||
        message.embeds[0].description.match(/Patlatma tamamlandı/) {

    }
  }
})

通知する

setTimeoutを使うことで、「○○ミリ秒後に実行する」が実現できます。

const { MessageEmbed } = require('discord.js')

client.on('message', async message => {
  if (message.author.id === '302050872383242240') {
    if (message.embeds[0].description.match(/表示順をアップしたよ/) ||
        message.embeds[0].description.match(/Bump done/) ||
        message.embeds[0].description.match(/Bump effectué/) ||
        message.embeds[0].description.match(/Bump fatto/) ||
        message.embeds[0].description.match(/Podbito serwer/) ||
        message.embeds[0].description.match(/Успешно поднято/) ||
        message.embeds[0].description.match(/갱신했어/) ||
        message.embeds[0].description.match(/Patlatma tamamlandı/) {
      message.channel.send(
        new MessageEmbed()
          .setTitle('Bumpが実行されました!')
          .setDescription('2時間後にお知らせします。')
      )
      setTimeout(() => {
        message.channel.send(
          new MessageEmbed()
            .setTitle('Bumpできます!')
            .setDescription('`!d bump` でサーバーの掲載順を上にできます。')
        )
      }, 7200000)
    }
  }
})

Bumpに失敗した際に再度実行を促す

あと何分で再度実行できるか、ユーザーにお知らせします。

const { MessageEmbed } = require('discord.js')

client.on('message', async message => {
  if (message.author.id === '302050872383242240') {
    if (message.embeds[0].description.match(/表示順をアップしたよ/) ||
        message.embeds[0].description.match(/Bump done/) ||
        message.embeds[0].description.match(/Bump effectué/) ||
        message.embeds[0].description.match(/Bump fatto/) ||
        message.embeds[0].description.match(/Podbito serwer/) ||
        message.embeds[0].description.match(/Успешно поднято/) ||
        message.embeds[0].description.match(/갱신했어/) ||
        message.embeds[0].description.match(/Patlatma tamamlandı/) {
      message.channel.send(
        new MessageEmbed()
          .setTitle('Bumpが実行されました!')
          .setDescription('2時間後にお知らせします。')
      )
      setTimeout(() => {
        message.channel.send(
          new MessageEmbed()
            .setTitle('Bumpできます!')
            .setDescription('`!d bump` でサーバーの掲載順を上にできます。')
        )
      }, 7200000)
    }
  } else if (message.embeds[0].description.match(/上げられるようになるまで/)) {
    const splcontent_a = message.embeds[0].description.split('と')
    const splcontent_b = splcontent_a[1].split('分')
    const remaining_time = splcontent_b[0]
    message.channel.send(
      new MessageEmbed()
        .setTitle('Bumpに失敗したようです...')
        .setDescription(`${remaining_time}分後に再度実行できます。`)
    )
  }
})

コード全文

この記事で書いたコードの全文です。

const { MessageEmbed } = require('discord.js')

client.on('message', async message => {
  if (message.author.id === '302050872383242240') {
    if (message.embeds[0].description.match(/表示順をアップしたよ/) ||
        message.embeds[0].description.match(/Bump done/) ||
        message.embeds[0].description.match(/Bump effectué/) ||
        message.embeds[0].description.match(/Bump fatto/) ||
        message.embeds[0].description.match(/Podbito serwer/) ||
        message.embeds[0].description.match(/Успешно поднято/) ||
        message.embeds[0].description.match(/갱신했어/) ||
        message.embeds[0].description.match(/Patlatma tamamlandı/) {
      message.channel.send(
        new MessageEmbed()
          .setTitle('Bumpが実行されました!')
          .setDescription('2時間後にお知らせします。')
      )
      setTimeout(() => {
        message.channel.send(
          new MessageEmbed()
            .setTitle('Bumpできます!')
            .setDescription('`!d bump` でサーバーの掲載順を上にできます。')
        )
      }, 7200000)
    }
  } else if (message.embeds[0].description.match(/上げられるようになるまで/)) {
    const splcontent_a = message.embeds[0].description.split('と')
    const splcontent_b = splcontent_a[1].split('分')
    const remaining_time = splcontent_b[0]
    message.channel.send(
      new MessageEmbed()
        .setTitle('Bumpに失敗したようです...')
        .setDescription(`${remaining_time}分後に再度実行できます。`)
    )
  }
})

おわり

お読みいただきありがとうございました!

エラーやご指摘等ありましたら下のコメント欄までお願いします。

シェアもぜひ!

QooQ