昨天不負責的說了一下我們需要來研究一下如何做權限管理,今天就來研究一下。
const perms = {
    command: {
        help: new Date("2099-12-31"),
        ping: new Date(0),
        perm: {
            set: new Date(0),
            remove: new Date(0),
            list: new Date(0),
            self: new Date("2099-12-31"),
        }
    }
};
上面這個就是我們的「基礎權限樹」,我們可以用這個來判斷使用者是否有權限使用某個指令,葉節點的值就是權限的到期時間,如果到期時間是 0 的話代表無權限(一定已過期),如果到期時間是 2099-12-31 的話就相當永久權限(在 Discord 消失之前都不會過期)。
假設我們有兩位使用者,一位是 @admin,另一位是 @user,他們的權限樹如下:
const admin_perms = copy(perms);
const user_perms = copy(perms);
admin_perms.command.ping = new Date("2099-12-31");
admin_perms.command.perm = new Date("2099-12-31");
這邊我們直接把 @admin 的 ping 指令權限和 perm 指令權限都設定成永久權限,perm 指令的部分應為設定在母節點上,所有子節點都會直接繼承母節點的權限。而 @user 的權限樹就是我們的基礎權限樹。
權限的部分應該也會對 context 做擴充,我們可以在 context 中加入一個 perm 的欄位,這樣在指令中就可以直接使用 ctx.perm 來取得是否有權限。
ctx.perm("command.help") // true / false
接下來,比較麻煩的我們需要在 TypeScript 中也可以做到權限樹的節點類型安全:

以 2022/10/07 21:00 ~ 2022/10/08 21:00 文章觀看數增加值排名
誤差: 1 小時
+1597 [Day 1]  工具從來不是問題,知識才是力量 ! Scrum 該懂的二三事 !
+522 Day-1   阿里雲服務概論
+521 挑戰 blind75: 以圖解方式練習解題- 前導文
+443 【DAY24】Proxy模式 - 找個代理人來幫忙你吧!
+436 【DAY23】Flyweight模式 - 共享的意義
+423 【DAY25】Memento模式 - 無限生命值的秘訣!
+421 【DAY26】Mediator模式 - 瞭解通訊軟體如何去發送訊息
+421 圖解 blind 75: Array & HashTable -  two sum (1/3)
+415 【DAY4】UML (統一建模語言)
+411 【DAY18】Observer模式 - 訂閱你喜好的Youtuber!