Discord.jsでグローバルBANを作る

今回はdiscord.jsを利用し、グローバルBAN（以下Gban）を作っていきたいと思います
## Gbanとは
Botが参加しているすべてのDiscordサーバーから、特定のユーザーをBANすることです。

#1. 環境
OS: Windows10
エディタ: [VisualStudioCode](https://code.visualstudio.com/)
node v17.1.0
discord.js v13.6.0

#2. 必要パッケージ
- discord.js

 `npm install discord.js`でインストールしておきましょう

#3. 作り方

### 1. Botの基礎を作る
作業フォルダにて、index.jsを作成します

```js:index.js
const { Client, Intents } = require('discord.js')
const client = new Client({
    disableEveryone: true, 
    intents: [ 
        Intents.FLAGS.GUILDS, Intents.FLAGS.GUILD_MESSAGES, Intents.FLAGS.GUILD_MESSAGE_REACTIONS
    ],
})

const prefix = "!" // ここはコマンドの接頭辞です。好きなものに変更しましょう
const token = "xxxxxxxxxxxxxxxx" // 自分のDiscordTokenを入力してください

// 起動した際に行う処理
client.on('ready', () => {
    console.log(`${client.user.tag}でログインしました`)
})



// ここに処理を書いていく


client.login(token)
```
その中にこれを入力してください

実行します
`node index.js`
これでBotが起動したはずです

できてなかったらTokenが違ったり、サーバーに未導入、またはコードが間違っている可能性があります

### 2. Gbanのプログラムを組み込んでいく

```js:index.js
// メッセージを受け取ったときに行う処理
client.on('message', async(message) => {
    // 送信者がBot、またはDM、コマンドの接頭辞から始まってなかった場合無視する
    if (message.author.bot || !message.guild || !message.content.toLowerCase().startsWith(client.config.prefix)) return;
    const args = message.content.slice(client.config.prefix.length).trim().split(/ +/g);
    // コマンドが入力されてなかったら無視

    if(message.content === `${prefix}gban`) { // もしもコマンドがgbanだったら
        if(!message.member.permissions.has('ADMINISTRATOR')) return message.reply('あなたに権限がありません'); // 管理者権限を持っていなかったら実行しない

        const gbanId = args[0]
        const reason = args[1]
        if(!gbanId) return message.reply('GbanIDを入力してください')
        if(!reason) return message.reply('理由を入力してください')

        client.guilds.cache.forEach(g => { // Botが参加しているすべてのサーバーで実行
            try {
                g.members.ban(gbanId, {reason}) // メンバーをBAN
                console.log(g.name + "でのGBANに成功しました"); // 成功したらコンソールに出す
            } catch(e) {
                console.log(g.name + "でのGBANの執行に失敗しました。\n" + e); // エラーが出たとき
            }
            message.reply('Gbanを執行しました')
        })
    }
})
```
これをさっきの処理を書くところに挿入してください
これで完成です。簡単ですね。

## 全体像

```js:index.js
const { Client, Intents } = require('discord.js')
const client = new Client({
    disableEveryone: true, 
    intents: [ 
        Intents.FLAGS.GUILDS, Intents.FLAGS.GUILD_MESSAGES, Intents.FLAGS.GUILD_MESSAGE_REACTIONS
    ],
})

const prefix = "!" // ここはコマンドの接頭辞です。好きなものに変更しましょう
const token = "xxxxxxxxxxxxxxxx" // 自分のDiscordTokenを入力してください

// 起動した際に行う処理
client.on('ready', () => {
    console.log(`${client.user.tag}でログインしました`)
})

// メッセージを受け取ったときに行う処理
client.on('message', async(message) => {
    // 送信者がBot、またはDM、コマンドの接頭辞から始まってなかった場合無視する
    if (message.author.bot || !message.guild || !message.content.toLowerCase().startsWith(client.config.prefix)) return;
    const args = message.content.slice(client.config.prefix.length).trim().split(/ +/g);
    // コマンドが入力されてなかったら無視

    if(message.content === `${prefix}gban`) { // もしもコマンドがgbanだったら
        if(!message.member.permissions.has('ADMINISTRATOR')) return message.reply('あなたに権限がありません'); // 管理者権限を持っていなかったら実行しない

        const gbanId = args[0]
        const reason = args[1]
        if(!gbanId) return message.reply('GbanIDを入力してください')
        if(!reason) return message.reply('理由を入力してください')

        client.guilds.cache.forEach(g => { // Botが参加しているすべてのサーバーで実行
            try {
                g.members.ban(gbanId, {reason}) // メンバーをBAN
                console.log(g.name + "でのGBANに成功しました"); // 成功したらコンソールに出す
            } catch(e) {
                console.log(g.name + "でのGBANの執行に失敗しました。\n" + e); // エラーが出たとき
            }
            message.reply('Gbanを執行しました')
        })
    }
})

client.login(token)
```

`node index.js`
と入力して起動してください！

# 4. 使い方

`!gban <Gbanしたい人のID> <理由>`
と入力すると多分実行されると思います
実際にBANされていたら成功です。
# 5. 最後に
初めてQiitaの記事を書いてみたんですけどどうだったでしょうか。
わかりやすかったら嬉しいです
これからもどんどん記事をアップしていくつもりなのでよろしくお願いします。
あと、このGbanですが、この状態だと、管理者権限を持っている人が誰でも実行できるようになってしまうので注意してください。


次回引き続き作成していこうと思っています！

### 次回: 特定のユーザーだけ実行できるコマンドを作る。

## 概要
Discord: ! ゆとがめす / YutoGames ᵈᵉᵛ#0001
YouTube: [𝒀𝒖𝒕𝒐𝑮𝒂𝒎𝒆𝒔【yt-YouTube】](https://youtube.com/ygcyt)
Twitter: [@YutoGamesYT_YG](https://twitter.com/YutoGamesYT_YG)

## 参考にしたサイト
[Discord.js Guide](https://discordjs.guide/)