Discordbotを使って、テスト自動化に関するConnpassイベントを通知する

今回はConnpassイベントを通知するDiscordbotを作成してみました。
Discordbotの作り方と簡単なコマンドを紹介しているので、bot作ってみたいという方は是非見てください。

# なぜこのbotを作ろうと思ったのか

近年コロナ渦ということもあり、ソフトウェアテスト関連のオンラインイベントが増えてきました。
そのため、いろんなイベントに参加して情報収集を行いたいのですが、
毎度Connpassを開いて検索する行為がめんどくさくなってきました。

そんな時に、イベント通知botを作っている記事を見かけました。

- [connpassからQA関連イベントを取得してSlackに通知する](https://better-software-testing.hatenablog.com/entry/2022/02/01/061657)

この記事ではslackとawsを使って、イベントを通知しています。
私はslackbotの作り方もawsの使い方も詳しくなかったですが、
2021年の9月に開催したXP祭りにて、discordbotを作った経験があったので、
今回はそちらで作成しようと思いました。

# Discordbot作成の準備

Discordbotを作るには以下の準備が必要です。

1. Discordのbotを新規作成する
1. 任意のサーバーに1で作ったbotを追加する
1. botを作成するためのライブラリをインストールする

## Discordのbotを新規作成する

Discordbotを作るための準備を紹介します。
無料でbotを作成することができます。

:::note info
Discordbotを作るときは、Discordのアカウントが必要です。
:::

1. [Discord Developer Portal](https://discord.com/login?redirect_to=%2Fdevelopers%2Fapplications)にアクセスする
1. 自分のDiscordアカウントでログインする
1. 右上のCreate new applicationボタンを押下して、任意の名前でアプリケーションを作成する
![discordの作り方.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1895890/8987422e-e324-5076-8f1f-d38fc72f6b89.png)
![discordの作り方2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1895890/6e614735-57c5-59c4-0403-68cf839165cd.png)

1. addbotを押下して、任意の名前でbotを追加する
![discordの作り方3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1895890/acec4eb9-dcca-f753-0c24-0c67a858e4fc.png)
bot追加が成功すると、以下の画面が表示されます。
![discordの作り方4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1895890/7987f245-c643-4ae1-b647-39ed4a55c412.png)

## 任意のサーバーにbotを追加する

上記で登録したbotを導入したいサーバーに招待します。

1. OAuthを開き、「URLGenerator」のタブに遷移
1. 「Bot」を選択して下に出てくる「BOT PERMISSIONS」で招待リンクからのBot導入時に付与される権限を設定
1. 権限が設定出来たら下の「GENERATED URL」に招待URLをコピー
1. ブラウザにコピーしたURLを貼る
1. Botを招待するサーバを選んで、参加させる

## botを作成するためのライブラリをインストールする

botを作るためのライブラリをインストールします。
今回は、Discord.jsを使います。

|環境|Version|
|:--:|:--:|
|node.js|16.14.0|
|discord.js|12.5.3|
|dotenv|16.0.0|
|Jest|27.5.1|

node.jsのインストール方法は[こちら]((https://qiita.com/mk185/items/7ad004bf202f400daea1))の記事が詳しく書いています。

1. 作成するフォルダを作る
1. cmdで作成するフォルダまで移動し、以下のコマンドを実施する。
    1. npm init
    1. npm discord.js
    1. npm install dotenv
    1. npm install --save-dev Jest
1. .envを作成し、そこにDiscordBotトークンを入力する
    DISCORD_TOKEN="bot TOKEN"（実際に入力する時、""はいらない）
1. index.jsを作成する

これで、Discordbotを作る準備が整いました。

# コードを書いてみる

ここから、ConnpassのイベントをDisocordに通知するコードを書いていきます。

## ConnpassのAPIを叩いて、JSONデータを取得する

今回は、fetch関数を使用します。
使用したAPIは以下です。
- [connpassAPI](https://connpass.com/about/api/)

```JavaScript:sample.js
async function callApi(){
    let url='https://connpass.com/api/v1/event/?keyword=テスト自動化&Count=10&ym='+今月+'&ym='+来月　//ConnpassAPIに基づいて設定
    let encodeUrl = encodeURI(url);  //URLに日本語が含まれるため、エンコードする
    const res = await fetch(encodeUrl); //fetch関数を使って、JSONデータを取得
    const jData = await res.json();
//以下、省略
```

## Disocordに通知する

取得したJSONから通知したい情報を選び、Discordに通知します。

【通知する情報】
- イベントタイトル
- 開催日時
- イベントURL

```sample.js

// 省略
    let max = 0;
     if(jData.results_available > 10){ //取得件数が10件未満の場合は、実際に取得した数を代入する
         max = 10;
     }else{
         max = jData.results_available
     }
     console.log(max);

     for (let i=0; i<max; i++){ //取得した件数もしくは10回繰り返し処理を行う
         let eventStart=jData.events[i].started_at;
         let eventStartDate = (eventStart.slice(0,10)).replace(/-/g,"");
         if(Number(eventStartDate)>Number(today)){ // イベント開催日付けが今日よりも前の場合は通知しない
             client.channels.cache.find(ch => ch.name === '一般').send("\n-----"); //通知するチャンネルを指定し、メッセージを送信
             client.channels.cache.find(ch => ch.name === '一般').send(jData.events[i].title); //イベントタイトル
             client.channels.cache.find(ch => ch.name === '一般').send(jData.events[i].started_at); //イベント開始日時
             client.channels.cache.find(ch => ch.name === '一般').send(jData.events[i].event_url); //イベントURL
        }
    }
}

```

## Disocordbotが起動するタイミングで、通知処理を実行させる

Discordbotには、処理を実行するタイミングがいろいろあります。
今回は、botが起動したタイミングで通知処理を実施します。

```sample.js

require('dotenv').config();
global.fetch = require('node-fetch');
const { Client, Intents } = require('discord.js');
const client = new Client({ intents: [Intents.FLAGS.GUILDS] });

 client.on('ready', () => { //起動が正常に行えたら、{}の処理を実施する
     console.log(`Logged in as ${client.user.tag}!`);
     client.channels.cache.find(ch => ch.name === '一般').send("オンラインになりました。\nテスト自動化に関するイベントを通知します。");
     callApi(); //api取得&メッセージ通知を行う
 });

 client.login(process.env.DISCORD_TOKEN) //botトークンを指定
```

## bot起動

以下のコマンドで、起動します

```起動
node index.js
```

# 実行結果

botを起動すると、以下のようにイベントが通知されます。
![エビデンス.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1895890/4285c511-1919-90e1-65d5-51acfb9840b2.png)

サンプルコードは[GitHub](https://github.com/tohru-ymgc/Notify_event_info
)に置いておきます。

# 今後やりたいこと

- JSON取得と通知が同じ関数に入っているので、分けたい
- 今は「テスト自動化」というキーワードだけで検索しているので、Discord側から検索ワードを変えるようにしたい
- Discord側からも検索が行えるようにしたい
- 今回は作ることしか専念してなかったため、Jestを使ってテストしてみたい
- glitch、herokuやawsを使って、定期的に通知するbotにしたい

# 所感

今まで開発経験がなかったため、このようなbot作りは良い勉強になったと思います。
web開発と比べるとハードルは低いということと[Discord.js Japan User Group](https://scrapbox.io/discordjs-japan/)で使い方がまとめられているので、始めやすいかなと思います。fizzbuzzbotからでも良いので試していただければと思います。意外と楽しいですよ^-^

# 参考資料

- [Node.js: fetch の使い方 - Qiita](https://qiita.com/ekzemplaro/items/be56faff3cd59ea383c6)
- [Node.js・npmのインストール方法 - Qiita](https://qiita.com/mk185/items/7ad004bf202f400daea1)
- [connpassからQA関連イベントを取得してSlackに通知する](https://better-software-testing.hatenablog.com/entry/2022/02/01/061657)
- [Discord.js Japan User Group](https://scrapbox.io/discordjs-japan/)
- [Discord.js 公式ページ](https://discord.js.org/#/docs/discord.js/stable/general/welcome)