mirror of
https://github.com/tiennm99/miti99bot.git
synced 2026-09-15 20:20:38 +00:00
grammY-based bot with a module plugin system loaded from the MODULES env var. Three command visibility levels (public/protected/private) share a unified command namespace with conflict detection at registry build. - 4 initial modules (util, wordle, loldle, misc); util fully implemented, others are stubs proving the plugin system end-to-end - util: /info (chat/thread/sender ids) + /help (pure renderer over the registry, HTML parse mode, escapes user-influenced strings) - KVStore interface with CFKVStore and a per-module prefixing factory; getJSON/putJSON convenience helpers; other backends drop in via one file - Webhook at POST /webhook with secret-token validation via grammY's webhookCallback; no admin HTTP surface - Post-deploy register script (npm run deploy = wrangler deploy && node --env-file=.env.deploy scripts/register.js) for setWebhook and setMyCommands; --dry-run flag for preview - 56 vitest unit tests across 7 suites covering registry, db wrapper, dispatcher, help renderer, validators, and HTML escaper - biome for lint + format; phased implementation plan under plans/
32 lines
1.1 KiB
JavaScript
32 lines
1.1 KiB
JavaScript
/**
|
|
* @file dispatcher — wires every command (public, protected, AND private)
|
|
* into the grammY Bot via `bot.command()`.
|
|
*
|
|
* Visibility is pure metadata at this layer: the dispatcher does NOT care
|
|
* whether a command is hidden from the menu or from /help. All three paths
|
|
* share a single bot.command() registration. Visibility only affects:
|
|
* 1. What scripts/register.js pushes to Telegram's setMyCommands (public only).
|
|
* 2. What phase-05's /help renderer shows (public + protected).
|
|
*/
|
|
|
|
import { buildRegistry } from "./registry.js";
|
|
|
|
/**
|
|
* Build the registry (if not already built) and register every command with grammY.
|
|
*
|
|
* @param {import("grammy").Bot} bot
|
|
* @param {any} env
|
|
* @returns {Promise<import("./registry.js").Registry>}
|
|
*/
|
|
export async function installDispatcher(bot, env) {
|
|
const reg = await buildRegistry(env);
|
|
|
|
for (const { cmd } of reg.allCommands.values()) {
|
|
// grammY's bot.command() matches /cmd and /cmd@botname, case-sensitively,
|
|
// which naturally satisfies the "exact, case-sensitive" rule for private commands.
|
|
bot.command(cmd.name, cmd.handler);
|
|
}
|
|
|
|
return reg;
|
|
}
|