Discord.jsで特定のユーザーのみが利用できるコマンドを作る

今回はdiscord.jsを利用し、特定のユーザーのみが利用できるコマンドを作って行きたいと思います
## なぜそんなことをするの？
botのシャットダウンや、プレミアム機能を付けるときに必要だからです

#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(messsage.author.id !== "実行できる人のID") 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
if(!message.member.permissions.has('ADMINISTRATOR')) return message.reply('あなたに権限がありません');
```
この行を消して、

```js:index.js
if(messsage.author.id !== "実行できる人のID") return message.reply("あなたに実行する権限がありません")
```
これに置き換えました。
実行できる人のIDのところは、自分のIDとかにしておいてください。

## 全体像

```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> <理由>`

IDのところを消したりして、実際に動いているかどうかなどを確認できたらオッケー👌
# 5. 最後に
今回はDiscordのGbanコマンドの改良をしました。
Discord.jsの多機能Botを作るシリーズとか始めたら面白そうです。
次回からそれ、やってみたいと思います。
CommandHandler、EventHandler、MongoDBなども使っていくので次回も見てください！

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

### 次回: Discord.jsで多機能Botを作る #1

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

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