Discord鯖の権限整備のノウハウとVUTDでの権限実装について

# **これは何**



この記事では，一般のDiscordサーバー管理で役に立つであろう，サーバー内の権限管理に必要な概念・知識を説明し，それをもとにVUTDではどのように整備しているかを解説します．

マニュアルを移設してきただけのため，大部分は箇条書きとなっています．ご了承ください．



# **一般的な権限の説明**


この記事はDiscordのロールなどの概念がわかっている方向けの記事です．そうでない方は，こちらに良さげな記事がありましたので共有しておきます→[Discordの権限設定について説明してみる](https://qiita.com/allegrogiken/items/305187f193e151b0676c)

公式資料はこちら→[権限をセットアップするには？ – Discord - サーバー設定](https://support.discord.com/hc/ja/articles/206029707)


## **権限項目**



* テキストチャンネルとボイスチャンネルで異なる
    * カテゴリチャンネルにはどちらの権限も設定できる
* 「**管理者**」（サーバー設定にのみ存在）がonのロールを持つユーザーは**他の全ての設定を無視**して，ロールがあれば可能なことは全て可能である
* わかりにくい項目
    * 「管理者」は上述，「サーバー管理」はサーバーの名前やアイコンの変更・Botの追加のみの権限
    * テキストチャンネルについて，「チャンネルを見る」はチャンネルが存在することとその名前が分かり，かつ見ている間に送信されたメッセージを見られる権限，「メッセージの履歴を見る」は自分がいなかった間のメッセージを見られる権限
    * ボイスチャンネルについて，「チャンネルを見る」はチャンネルが存在することとその名前が分かる権限．「接続」はボイスチャンネルに入って聞くことができる権限


## **権限設定**



* 権限設定は主に3種類
    1. サーバー設定：ロール
        * 全項目設定必須
        * `@everyone`は新しいロールを作るときの**デフォルト**となる
    2. チャンネル設定：ロール
        * まずロールを（チャンネル権限設定に）追加してから設定する
            * `@everyone`は必ず追加されている状態
        * 許可（✔︎），不許可（✖️），**設定なし**（**／**）が選べる
            * 全て設定なしの状態＝そのロールを追加していない状態
        * [カテゴリと同期](#権限のカテゴリ同期)できる
    3. チャンネル設定：ユーザー
        * 2. の「ロール」を「ユーザー」に読み替えたものと同じ
* 1. および2. で，あるユーザーのもつロールのうち複数について設定がある場合，**設定のある項目ごとの論理和（OR）**が採用される
* 各ユーザーの各項目ついて，**3 > 2 > 1 の優先度で適用される**（下の権限が設定されていれば上の権限は無視される）


## **権限のカテゴリ同期**


* カテゴリには[権限設定](#権限設定)の2. と3. を設定できる
    * カテゴリ内に新しいチャンネルを立てるときの**デフォルト**となる
* カテゴリ内のチャンネルはカテゴリと権限を同期できる
* 同期している場合
    * 同期すれば同じ設定になるし，**同じ設定にすれば自動で同期する**
    * カテゴリの権限を編集したとき，同期しているチャンネルの権限も編集される
* 同期していない場合
    * チャンネルの権限設定で「いますぐ同期する」を押すことで同期できる→チャンネルの設定は消失する
    * カテゴリの権限を編集しても，チャンネルの権限は**一切**編集されない


## **ロールの順序**



* ロールはサーバーに属し，順序が存在する
* 順序は以下に影響を及ぼす
    * ユーザーの表示名の色
        * そのユーザーの持つロールのうち一番上のロールの色を参照する
        * 参照されたロールの色が「**既定値**」だと，**その下の色を参照**する
        * `@everyone`の色は灰色
    * 「オンラインメンバーとは別にロールメンバーを表示する」場合の順番
        * あるユーザーは，そのユーザーの持つ権限のうちこの項目がonになっているものの中で一番上のロールの場所に表示される
    * 「ロールの管理」の範囲
        * あるユーザーがこの権限を持っている場合，**そのユーザーの持っている一番上のロール未満**のロールを管理できる
        * **一番上**のロールは**サーバー管理人のみ**が管理できる
    * 「メンバーをキック」「メンバーをBAN」の範囲
        * あるユーザーがこれらの権限を持っている場合，**そのユーザーの持っている一番上のロール未満のロールしか持っていないユーザー**をキック/BANできる
        * **一番上**のロールを持っているユーザーは**サーバー管理人のみ**がキック/BANできる



# **VUTDにおける権限管理**


## **原則**

以下1. ~ 3. は[権限設定](#権限設定)のそれを指す．



* 1. ~ 3. のうち**できるだけ上にある権限で設定**する
    * 上の権限の方が依存箇所（編集箇所）が少ない
    * 権限の剥奪がスムーズになる
* 2. および3. が必要であれば**できるだけカテゴリに同期**する
    * 理由は上に同じ
* 2. および3. が同期できないカテゴリについては，**新しいチャンネルを立てるときに設定数が最小限**になるように**カテゴリの権限**を設定する
    * カテゴリの権限設定はカテゴリ内に新しいチャンネルを立てるときのデフォルトとなることを考慮
* 1. および2. については，ある権限項目をonとしたい場合には**できるだけonと設定する部分が少なくなるようにする**
    * 権限の剥奪がスムーズになる
* **`@everyone`のほぼ全ての権限項目をoff**とする
    * 権限の剥奪がスムーズに
    * 新しいロールを作るときのデフォルトとなることを考慮
    * ニックネームの変更のみ1. でしか設定できないためon


## **実装**



* **大部分の権限を`@東大生`に集約** し，ほとんどのロールについて全ての権限項目をoffとする
    * OR仕様より，権限の集中管理が可能
    * 例えば「メッセージを送信」権限は`@東大生`・`#自己紹介`のチャンネル設定でのみonである
* **多くのカテゴリで2. および3. が不要であるようにする**
    * これを達成しつつ`@東大生`にのみ閲覧可能とするためにも，**`@everyone`の権限項目は全てoff・大部分の権限を`@東大生`に集約**
    * 権限設定がある必要なカテゴリ
        * 「はじめに読んでね」「つぎに読んでね」（後述）
        * 表示管理カテゴリ（後述）
        * 「運営」
            * `@everyone`の「チャンネルを見る」「接続」→✖️
            * `@manage`の「チャンネルを見る」「接続」→✔︎
            * `@Expander`の「チャンネルを見る」→✔︎，「メッセージ履歴を読む」→✖️
                * カテゴリ内**で**リンクを貼ったら展開するが，カテゴリ内**の**リンクを貼っても展開しない
                * [botのREADME](https://github.com/v-ut-d/expander#readme)
        * 「SERVER STATS」
            * `@everyone`の「接続」→✖️
            * `@Member Count`の「接続」→✔︎
* 「はじめに読んでね」「次に読んでね」を以下のように設定する：
    * カテゴリ設定：
        * `@everyone`の
            * 「チャンネルを見る」→✔︎，
            * 「メッセージ履歴」→✔︎，
            * 「メッセージを送信」→✖️
            * `#自己紹介`以外を閲覧専用で，かつ`@東大生`以外にも閲覧可能とするため
    * `#自己紹介`の設定：
        * `@everyone`の
            * 「チャンネルを見る」→✔︎，
            * 「メッセージ履歴」→✔︎，
            * 「メッセージを送信」→✔︎
            * `@東大生`以外も閲覧・送信可能とするため
    * `#自己紹介`以外の設定：カテゴリと同期
* 表示管理カテゴリを以下のように設定する：
    * 表示管理カテゴリとは：
        * 「リサーチキャンパス（ゼミ）」
        * 「ゲームセンター」
    * カテゴリ設定：
        * `@everyone`の「チャンネルを見る」→✖️，
            * 興味のない分野のチャンネルを見せないため
        * `@bot`の「チャンネルを見る」→✔︎
            * 各チャンネルでbotを使えるようにするため
    * ボイスチャンネル・付属テキストチャンネルの設定：設定なし
        * つまり溜まり場などと一致
    * 他の各チャンネルの設定：カテゴリ設定（デフォルト）に加えて，
        * 該当ロールの「チャンネルを見る」→✔︎
        * 主催ユーザーの「チャンネルを管理」→✔︎（ゼミの場合）
            * チャンネル名を変更してもらうため
* 管理者権限を`@manage`から外し、`@sudo`に分離：
    * ロール順位は それ以外 > `@sudo` > `@Sudo Manager` > `@manage`に設定