中規模Discordに便利！ロールを自動付与できるDiscordBotを作ってみた

この記事は [プロトアウトスタジオのアドベントカレンダー2020](https://qiita.com/advent-calendar/2020/protoout) の3日目の記事です！
（[去年](https://qiita.com/tkyko13/items/0e5d5db8477a64209635) も3日目だった…）

どうも、プロトアウトスタジオ1期生で、同スクールで講師も務めるようになったおの([@tkyk](https://twitter.com/tkyko13))です！

## はじめに
大学の授業でもDiscordを使いたい

### Slackと違ったDiscordの良さ

<a href="https://gyazo.com/9697b5a419a5843016e353722ccfefee"><img src="https://i.gyazo.com/9697b5a419a5843016e353722ccfefee.png" alt="Image from Gyazo" width="256"/></a>

カテゴリーがあるのがよい！
授業を複数受け持っているので、それらで分けられ、その授業の受講生はそのカテゴリーしか見れないようにすればよさそう

<a href="https://gyazo.com/58a9ec57e8628688e365be31dc44fea4"><img src="https://i.gyazo.com/58a9ec57e8628688e365be31dc44fea4.png" alt="Image from Gyazo" width="233"/></a>

一つの授業内でも細かくグループを分けて、グループワークをさせたり、教師の方から見回り（実際の通話はZoomのブレイクアウトルームを使用）できる。

グループを小さくすることで、結構質問が出てくる。
（今回の自分の授業は1グループ4,5人にしました）

## いざ作ってみる

参考：https://note.com/bami55/n/ncc3a68652697

### Bot設定

ここ(https://discord.com/developers/applications) から

「New Application」を押し、Botの名前を記入

[![Image from Gyazo](https://i.gyazo.com/c5828c83c42070bd5d7f6e9fa1123571.png)](https://gyazo.com/c5828c83c42070bd5d7f6e9fa1123571)

「Bot」から「Add Bot」

[![Image from Gyazo](https://i.gyazo.com/94c660fe83401a0635d2ae8a19a4531f.png)](https://gyazo.com/94c660fe83401a0635d2ae8a19a4531f)

「OAuth2」から「bot」のチェックを入れ招待するURLをコピー

[![Image from Gyazo](https://i.gyazo.com/9c124774c50adbad9dd26a7fdcd2ed19.png)](https://gyazo.com/9c124774c50adbad9dd26a7fdcd2ed19)

URLをブラウザで開いてサーバーへBotを招待

[![Image from Gyazo](https://i.gyazo.com/82aa1a9f062d2aa2be161d1e742d2ac2.png)](https://gyazo.com/82aa1a9f062d2aa2be161d1e742d2ac2)

追加されていればオッケー

[![Image from Gyazo](https://i.gyazo.com/b884c18c802de3b73a47ecf0b5d9ef0a.png)](https://gyazo.com/b884c18c802de3b73a47ecf0b5d9ef0a)

### 開発に必要な情報取得

「OAuth2」内からトークンをコピー

[![Image from Gyazo](https://i.gyazo.com/7e6b4c661e690a331cdd2ece65cad43a.png)](https://gyazo.com/7e6b4c661e690a331cdd2ece65cad43a)

（必要ならば）実際に[Discord](https://discord.com/)へログイン後、「サーバー設定」->「ウィジェット」からサーバーIDの取得

[![Image from Gyazo](https://i.gyazo.com/480b0d3eadfbce02e951e33887da68dc.jpg)](https://gyazo.com/480b0d3eadfbce02e951e33887da68dc)

### Node.jsを書く

参考：https://discord.js.org/#/

```sh
npm i discord.js
```

```js
const Discord = require('discord.js');
const client = new Discord.Client();

// https://discord.com/developers/applications
const BOT_TOKEN = 'コピーしたbotのトークン';

// guild id
const SERVER_ID = 'コピーしたサーバーID';

// 付与したいロールのID
// IDの取得は一回プログラムを実行して確認する
const ROLES_ID = '付与したいロールのID';

client.on('ready', async () => {
  console.log(`Logged in as ${client.user.tag}!`);
  const guild = await client.guilds.fetch(SERVER_ID);
  const rols = await guild.roles.fetch();
  rols.cache.forEach(role => {
    console.log(role.name + ' : ' + role.id);//idが確認できる
  })
});

client.on('guildMemberAdd', async (member) => {
  // ロールを自動付与
  const addRole = await member.guild.roles.fetch(ROLES_ID);
  member.roles.add(addRole);
});

client.login(BOT_TOKEN);
```

付与したいロールのIDの取得は一回プログラムを実行して確認する

## 今後

- 実際に運用までしてみたい
    - 「!autoRole @ロール名」みたいな感じでメッセージでコマンド送ると招待URL勝手に生成してくれるとか
    - でも入ってきた人はどんな招待コードから入ってきたかの情報がわからない
- 複数ロールを付与したい
    - 自分の授業を複数受講してくれる学生もいたけど、その人は手作業の追加だった