【Discord.js】ユーザーインストールコマンドを使ってみよう

こんにちは、りょうです。
今回はユーザーインストールコマンドを作って実行してみようという記事です。
pyのはあったんですけどjsの日本語記事が皆無だったんでとりあえず自分がわかってる範囲で書きます

:::note warn
**注意**
今回紹介するものはDiscord公式の機能であり、selfbotとは別物です。
誤解のないようにお願いします
:::

# ユーザーインストールコマンドとは？
Discordで去年の5月くらいにβ版で使えるようになり、その後正式に実装された機能です。
実際にそのサーバーにBOTを導入していなくても使えるものです。
サーバー、DM、グループなどすべての場所で使えるようになります。
この機能でBOTを使う場合はチャンネル権限の「外部のアプリを使用」が必要です。
もしこれがオフになっている場合は実行者にしか見えないようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3818367/4cf70f55-7e70-a1dd-2aa5-05e930d044ad.png)

## 導入手順
ユーザーインストールができるBOTは導入時にこんな表示になります。
これのマイアプリに追加を押して導入をするとコード内で指定された場所で使えるようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3818367/c56af1a7-7b63-23e4-7c5d-4ffe7447a92b.png)

スラッシュコマンドやコンテキストメニューは使えますが!kickのようにテキストを入力して使うコマンドは使用できません。
VCで音声を流したりリアクションをつけたりとそのコマンド以外に影響するようなことはできません。
Automodの貫通もできないため荒らし対策等はそれでできると思います。

# ユーザーインストールコマンドを実装しよう
ここからは開発者側の話です
## インストールリンクの設定
まずはBOTのインストールリンクの設定を行います。
[デベロッパーポータル](https://discord.com/developers/applications)に移動して自分のBOTを選択します。
Installationタブに移動して**Installation Contexts**の両方にチェックを入れます。
Install Linkは**Discord Provided Link**を選択。
あとはGuildInstallのほうの権限を設定したら完了です。
上に書いてる手順で導入をしましょう

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3818367/fea9a71d-f307-f03d-0b6e-f2ff9bdecdfe.png)

## コードを書く
スラッシュコマンドの登録などは今までのものを使ってもらって構いません。特に変更はないです。
**ユーザーインストールの実装で設定が必要なもの**
- InteractionContextType (コマンドの実行場所の設定)
これは設定されていない場合はすべての場所で使えるようになっています。
設定をすれば指定した場所でのみ使えるようになります。

| プロパティ | 整数値 |場所|
|:-:|:-:|:-:|
| Guild | 0 | サーバー |
| BotDM | 1 | このBOTのDM |
| PrivateChannel | 2 | BOT以外のユーザーのDMやグループDM |

- ApplicationIntegrationType (ギルドとユーザーのどちらにインストールするかを設定)
これは設定しないとすべてGuildInstallで処理されます。必須です。

| プロパティ | 整数値 |場所|
|:-:|:-:|:-:|
| GuildInstall | 0 | 通常のサーバーで使うコマンド |
| UserInstall | 1 | ユーザーインストールコマンド |

例
```slashcommand.js
const { SlashCommandBuilder, InteractionContextType, ApplicationIntegrationType } = require('discord.js');

module.exports = {
  data: new SlashCommandBuilder()
    .setName('ping')
    .setDescription('ping!')
    .setContexts(InteractionContextType.Guild)
    .setIntegrationTypes(ApplicationIntegrationType.UserInstall),

  async execute(interaction) {
    await interaction.reply('pong!');
  }
};
```

```contextmenu.js
const { ContextMenuCommandBuilder, ApplicationCommandType, InteractionContextType, ApplicationIntegrationType, MessageFlags } = require('discord.js');

module.exports = {
  data: new ContextMenuCommandBuilder()
    .setName('ping')
    .setType(ApplicationCommandType.Message)
    .setContexts(InteractionContextType.Guild)
    .setIntegrationTypes(ApplicationIntegrationType.UserInstall),

  async execute(interaction) {
    await interaction.reply({ content: 'Pong!', flags: MessageFlags.Ephemeral });
  }
};
```

# まとめ
今回はユーザーインストールコマンドについて解説をしました。
ここで説明していない部分もありますが基本的なところはこんな感じです。
もしわからないことがあればコメントしてもらえれば..

Discordに湧く荒らしの情報や対策方法の共有をしている自鯖↓

https://discord.gg/ESRGwGQhxc

# 参考
https://discord.js.org/docs/packages/core/main/InteractionContextType:Enum

https://discord.js.org/docs/packages/core/main/ApplicationIntegrationType:Enum

https://discord.com/developers/docs/interactions/application-commands#installation-context