既然我們昨天寫出了 MongoDB 的儲存後端,那我們就可以來寫一個有趣的模組了:伺服器訂閱方案。
總而言之,我希望模組可以長這樣:
.use(new Subscription(["premium", "premium+", "test"]))
這個方法會接受一個陣列,裡面是方案的名稱。模組會依照這些方案的名稱為每個 guild 建立一個 plan-expiration 的紀錄儲存在資料庫裡。
.use(new SubscriptionChecker())
則是提供 !sub
指令讓使用者可以查看該伺服器所具有的訂閱項目。
Subscription
模組這個模組會為 ctx
介面擴充一個 subs
屬性,讓其他模組可以查詢正在處理的 guild 具有什麼訂閱方案。
SubscriptionChecker
模組這個模組會提供 !sub
指令讓使用者可以查看該伺服器所具有的訂閱項目。
我們可以用 StoreContext & StoreSubContext
來擴充 ctx
介面,讓我們可以在 ctx
上使用 ctx.subs
查詢該伺服器的訂閱方案。
class SubscriptionChecker extends BaseModule implements Module {
name = "subscription-checker";
intents = [
GatewayIntentBits.Guilds,
GatewayIntentBits.GuildMessages,
GatewayIntentBits.MessageContent,
];
async messageCreate(
args: [message: Message<boolean>],
ctx: StoreContext & StoreSubContext,
next: CallNextModule,
): Promise<void> {
const [message] = args;
if (message.content !== "!sub") {
await next();
return;
}
const subs = await ctx.subs?.();
if (!subs || subs.size === 0) {
await message.reply("This server has no active subscriptions.");
} else {
await message.reply(
`This server has the following active subscriptions: \n${[...subs.entries()]
.map(([plan, exp]) => `- **${plan}** (Until ${exp.toLocaleString()})`)
.join("\n")}`,
);
}
}
}
伺服器原本是沒有訂閱方案的,所以我們先來看看沒有訂閱方案的情況:
然後我們可以用 MongoDB Compass 來修改記錄:
預設的時間是
1970-01-01T00:00:00.000Z
(Unix 時間戳記的起始時間)。
我們再來看看有訂閱方案的情況:
其他模組也可以使用 ctx.subs
查詢該伺服器的訂閱方案,但是要注意的是,Subscription
模組必須要在欲使用 ctx.subs
的模組之前被載入。
接下來,應該要來研究一下簡化 interaction 流程的模組了。
以 2022/09/25 20:00 ~ 2022/09/26 20:00 文章觀看數增加值排名
誤差: 1 小時
+1057
D08 - 載入就應該要有載入的樣子
+1054
D07 - 開趴前先 loading 一下
+1032
D11 - 開房間!開派對!♪( ◜ω◝و(و
+1029
D10 - 讓前後端接上線
+1026
D01 - 沒時間解釋了,快上車!
+1026
D09 - NestJS 是啥?好吃嗎?
+1001
D06 - 打造遊戲選單按鈕
+938
D03 - 建立專案
+938
D02 - 來打個草稿吧
+935
D04 - 門面怎麼可以沒有背景
今日評語:恭喜鱈魚?????(他寫的文章是蠻有趣的啦)