@adriangalilea/utils 0.31.0 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +47 -3
- package/dist/bot/admin.d.ts.map +1 -1
- package/dist/bot/admin.js.map +1 -1
- package/dist/bot/create.d.ts +110 -0
- package/dist/bot/create.d.ts.map +1 -0
- package/dist/bot/create.js +228 -0
- package/dist/bot/create.js.map +1 -0
- package/dist/bot/kit.d.ts +1 -2
- package/dist/bot/kit.d.ts.map +1 -1
- package/dist/bot/kit.js.map +1 -1
- package/dist/bot/language.d.ts +8 -0
- package/dist/bot/language.d.ts.map +1 -1
- package/dist/bot/language.js +9 -2
- package/dist/bot/language.js.map +1 -1
- package/dist/bot/menu.d.ts +30 -5
- package/dist/bot/menu.d.ts.map +1 -1
- package/dist/bot/menu.js +47 -31
- package/dist/bot/menu.js.map +1 -1
- package/dist/bot/payments/derive.d.ts +1 -1
- package/dist/bot/payments/derive.js +1 -1
- package/dist/bot/payments/plugin.d.ts +6 -0
- package/dist/bot/payments/plugin.d.ts.map +1 -1
- package/dist/bot/payments/plugin.js +5 -2
- package/dist/bot/payments/plugin.js.map +1 -1
- package/dist/bot/storage-d1.d.ts +50 -0
- package/dist/bot/storage-d1.d.ts.map +1 -0
- package/dist/bot/storage-d1.js +68 -0
- package/dist/bot/storage-d1.js.map +1 -0
- package/dist/bot/worker.d.ts +57 -0
- package/dist/bot/worker.d.ts.map +1 -0
- package/dist/bot/worker.js +235 -0
- package/dist/bot/worker.js.map +1 -0
- package/package.json +15 -2
package/README.md
CHANGED
|
@@ -350,7 +350,7 @@ const notify = (msg: Polyglot<'en' | 'es'>, lang: 'en' | 'es') =>
|
|
|
350
350
|
transport.send(say(msg, lang))
|
|
351
351
|
```
|
|
352
352
|
|
|
353
|
-
In a bot, `bot/language` adds `ctx.
|
|
353
|
+
In a bot, `bot/language` adds `ctx.lang` + `ctx.say`. Both resolve stored explicit pick → Telegram client hint → configured default, at READ time — the hint is never persisted, and `session.language` is written only by an explicit pick (the plugin's menuItem action):
|
|
354
354
|
|
|
355
355
|
```typescript
|
|
356
356
|
ctx.say({ en: 'Continue', es: 'Continuar' }) // → string
|
|
@@ -367,6 +367,47 @@ Plugins for personal Telegram bots built on [GramIO](https://gramio.dev). Each p
|
|
|
367
367
|
pnpm add @adriangalilea/utils gramio @gramio/storage @gramio/session
|
|
368
368
|
```
|
|
369
369
|
|
|
370
|
+
#### One bot file, ideation → production (`bot/create`)
|
|
371
|
+
|
|
372
|
+
`createBot` is the composer: it constructs the storage + session pair ONCE and threads it into every feature, so "must be the SAME instance you passed to session()" is unrepresentable instead of a doc warning. The same file runs in every stage — **storage and transport are environment decisions, never code shape**:
|
|
373
|
+
|
|
374
|
+
| stage | run | session | transport |
|
|
375
|
+
|---|---|---|---|
|
|
376
|
+
| ideation | `BOT_TOKEN=… tsx bot.ts` | memory (ephemeral, announced) | long-poll |
|
|
377
|
+
| experiment | `BOT_PERSIST=./bot.sqlite tsx bot.ts` | sqlite | long-poll |
|
|
378
|
+
| prod · your own hardware | systemd/launchd unit running the same command | sqlite / `BOT_PERSIST=redis://…` | long-poll (a legitimate prod mode: dials out, no inbound port/TLS) |
|
|
379
|
+
| prod · Cloudflare Worker | `wrangler deploy` (D1 binding `DB`) | D1 (`bot/storage-d1`) | webhook (`bot/worker`) |
|
|
380
|
+
| prod · Node/Bun server | webhook behind your HTTP server | sqlite/redis | fetch-shaped handler |
|
|
381
|
+
|
|
382
|
+
```typescript
|
|
383
|
+
import { createBot } from '@adriangalilea/utils/bot/create'
|
|
384
|
+
|
|
385
|
+
const app = createBot({
|
|
386
|
+
admins: 190202471,
|
|
387
|
+
language: { supported: ['en', 'es'] as const, default: 'en' },
|
|
388
|
+
menu: {
|
|
389
|
+
adminContact: '@you',
|
|
390
|
+
header: async (ctx) => `⚙️ hi ${ctx.from?.firstName}`, // async — read your db here
|
|
391
|
+
items: [/* … */],
|
|
392
|
+
personalData: { onForget: async (ctx, userId) => {/* wipe YOUR tables */} },
|
|
393
|
+
},
|
|
394
|
+
handlers: (bot) => bot.command('start', (ctx) => ctx.say({ en: 'hi', es: 'hola' })),
|
|
395
|
+
})
|
|
396
|
+
|
|
397
|
+
export default app // Worker: webhook + /setup + /pause + deploy DMs
|
|
398
|
+
if (app.isMain(import.meta)) app.poll() // Node: `tsx bot.ts` long-polls
|
|
399
|
+
```
|
|
400
|
+
|
|
401
|
+
Cloudflare is one adapter, not the architecture: `bot/worker` and `bot/storage-d1` are the workerd cap (~each 100 lines, both optional); `bot/kit`'s `gracefulStart` is the Node twin (signals + start/stop DMs) and stays the one deliberately Node-only corner. The worker-safe tripwire (`pnpm test:worker-safe`) guarantees the core never grows a Node dependency.
|
|
402
|
+
|
|
403
|
+
#### Design rules the bot plugins hold to (each learned the hard way)
|
|
404
|
+
|
|
405
|
+
- **Resolution is read-time.** Language resolves stored pick → live Telegram hint → default on every surface (`ctx.lang`, `ctx.say`, menu chrome, picker highlight). Inferred values are NEVER persisted — a user who switches their client language moves with it until they pick.
|
|
406
|
+
- **Only explicit user signals are stored.** The session holds picks, consent, state the user created — never derived values, never render caches. If a sync signature ever tempts you to cache a rendered string into the session, the signature is the bug (menu resolvers are async for exactly this reason).
|
|
407
|
+
- **Derives cover every event the user can speak through** — message, callback, AND inline. A feature that skips inline forces consumers to fork shadow helpers that read the session directly; those forks then read as design.
|
|
408
|
+
- **Forget actually forgets.** `personalData.onForget` runs inside the same try as the session delete: your message logs/metrics/credit rows get wiped too, or the user is told it failed — never a partial erasure reading as success.
|
|
409
|
+
- **The composer owns instance wiring.** Features still compose manually (below) when you need full control, but every "same instance" contract has one home.
|
|
410
|
+
|
|
370
411
|
#### Threaded Mode — pin the `@gramio/contexts` fork
|
|
371
412
|
|
|
372
413
|
Telegram added [Threaded Mode](https://telegram.org/blog/threaded-conversations) for private chats (BotFather → Bot Settings → Threaded Mode). gramio's `SendMixin` skips auto-threading there, and `CallbackQueryContext` doesn't expose `threadId` at all. Fixes [PR'd upstream](https://github.com/gramiojs/contexts/pull/4); until merged, pin the fork in **your bot project's** workspace root (pnpm only honors overrides at the root, not transitively — and pnpm ≥11 reads them from `pnpm-workspace.yaml`, not `package.json`):
|
|
@@ -392,8 +433,11 @@ Then `pnpm install`. Every `ctx.send` / `ctx.sendDocument` / `ctx.reply` / etc.
|
|
|
392
433
|
| `@adriangalilea/utils/bot/allow-list` | Static allow-list by **id and/or @username** — stateless, no session/storage. `allowList({ ids?, usernames? })` is a plugin that decorates `ctx.allowed` (boolean); gate in your handlers (`if (!ctx.allowed) return`). `makeAllowList(...)` is the pure framework-free predicate. The light counterpart to `access-control` (which adds an approve/deny flow + revocable store, needing session+storage). Username caveat: a `@username` is optional and mutable, and the Bot API can't resolve username→id ahead of time — prefer `ids` when known, `usernames` is the pragmatic fallback. |
|
|
393
434
|
| `@adriangalilea/utils/bot/coalesce` | Joins client-split inbound messages back into one. When a user pastes >4096 chars, Telegram clients fragment it into separate `message` updates with no marker. Middleware detects the burst and emits one combined event. |
|
|
394
435
|
| `@adriangalilea/utils/bot/llm` | The full LLM-chatbot pipeline in one module. **Input:** `streamChat(response)` parses OpenAI-compatible SSE (OpenAI, vllm, mlx-lm, llama.cpp, Together, Groq, …) into a typed `AsyncGenerator<{type: 'content' \| 'reasoning', text}>`. **Output:** `ctx.startStream()` (low-level: debounced markdown to Telegram, 4000-char split, exposes `wasPartial` after `.end()`). `ctx.startChatStream(response)` (high-level: consumes the stream, renders reasoning as a Telegram `expandable_blockquote` entity + content as streamed markdown — both go through `markdownToFormattable` with graceful degradation — returns `{ content, reasoning }`). **History:** `llmHistory({...})` returns `.plugin` (decorates `ctx.llm` with `.add() / .get() / .clear() / .all() / .clearAll()`, per-(user, thread) OpenAI `ChatMessage` shape, persisted in the shared session record so the menu's 🗑 Forget wipes it automatically) AND `.menuItem` (drop-in "🗑 Delete this thread" for `botMenu` — wipes the LLM history AND calls `deleteForumTopic` so the Telegram thread + all its messages disappear from the chat; falls back to Redis-only clear when no `threadId` is present). |
|
|
395
|
-
| `@adriangalilea/utils/bot/menu` | `botMenu({ command, description, items, privacy?, personalData?, adminContact })` — `/settings` command + InlineKeyboard router. Root view always renders a `🛡️ Privacy & data` submenu button that wraps the privacy policy link plus (if `personalData: { storage }`) 🗑 Forget + 📥 Export buttons. Items take `keepRow` (render on the same row as the next item — e.g. a two-per-row language picker) and `rootExtra` (render at the bottom of the root menu, below Privacy & data). `toggleMenuItem({ id, read, write, label: { off, on }, toast? })` — convenience factory for boolean-toggle items with dynamic label + optional toast, storage-agnostic via `read`/`write` closures. |
|
|
436
|
+
| `@adriangalilea/utils/bot/menu` | `botMenu({ command, description, items, privacy?, personalData?, adminContact })` — `/settings` command + InlineKeyboard router. Root view always renders a `🛡️ Privacy & data` submenu button that wraps the privacy policy link plus (if `personalData: { storage }`) 🗑 Forget + 📥 Export buttons. Items take `keepRow` (render on the same row as the next item — e.g. a two-per-row language picker) and `rootExtra` (render at the bottom of the root menu, below Privacy & data). `label` / `header` / `style` / `visible` resolvers may be **async** (read your db at render time — never cache render strings in the session); `parseMode: 'HTML'` renders the header formatted (you own escaping); `personalData.onForget(ctx, userId)` wipes YOUR tables inside the same try as the session delete, so Forget either forgets everything or reports failure. `toggleMenuItem({ id, read, write, label: { off, on }, toast? })` — convenience factory for boolean-toggle items with dynamic label + optional toast, storage-agnostic via `read`/`write` closures. |
|
|
396
437
|
| `@adriangalilea/utils/bot/payments` | `botPayments({ session, storage, paysupport, paysupportHint?, legal, waiver, vip?, credits?, perks? })` — Telegram Stars monetization in one drop-in plugin. **Three axes, all optional:** `vip` (positional tier ladder — single rung in v1 is just `vip: [{...}]`, ladder is `vip: [{...}, {...}]`; ids are `vip.1`, `vip.2`, …), `credits` (consumable balance + top-up packs `credits.1`, `credits.2`, …), `perks` (orthogonal one-shot unlocks `perks.<key>`). **Surface:** `ctx.payments.atLeast('vip')` / `atLeast('vip.2')` (typed rank check), `ctx.payments.tier()` / `.tier.level()` / `.tier.label()`, `ctx.payments.credits.{balance, consume, tryConsume}` (throws `InsufficientCredits`), `ctx.payments.has(perkId)`, `await ctx.payments.require('vip', { feature? })` (gate that sends a localized upgrade prompt deep-linked to `/settings → 💎 VIP`), `await ctx.payments.invoice(productKey)` (threads Art. 103(m) TRLGDCU consent inline before `sendInvoice`). **Owns:** waiver consent flow (versioned text → forces re-consent on bump, snapshotted on every charge for audit), `/paysupport` slash command (Telegram ToS §6.5; `paysupportHint` overrides the where-to-manage-charges line when your menu isn't `/settings`), idempotent `successful_payment` fulfillment via `pay:idempotency:{chargeId}` sentinel, lazy subscription expiry (no cron needed), tier upgrade auto-cancel of the lower rung's renewal, and admin-DM refund approval (mirror of `accessControl`'s [✅ Aprobar][❌ Denegar] pattern). **Returns:** `{ plugin, menuItem, payouts, onFulfilled }` — `menuItem` is the drop-in `💎 VIP` entry for `botMenu`; `payouts.{record, list, export, exportForUsers}` is the Fragment payout ledger (you receive TON, log the EUR conversion, export time-windowed CSV/JSON for your gestor); `onFulfilled(productKey \| '*', handler)` registers fire-and-forget hooks. **Stars-only by design** — Telegram ToS §6.2 forbids third-party payment providers for digital goods. Crypto Pay deferred (MiCA risk); Stripe-outside-Telegram is a future v2 channel. Full compliance memo (Spanish-autónomo seller-of-record analysis, Verifactu vs Crea y Crece, MiCA, Art. 103(m) waiver text, GDPR retention) in `src/bot/payments/CLAUDE.md`. |
|
|
438
|
+
| `@adriangalilea/utils/bot/create` | `createBot<S>({ token?, storage?, initial?, admins?, language?, menu?, access?, payments?, handlers?, worker? })` — the composer (see "One bot file, ideation → production" above). Returns `{ build, session, poll, isMain, fetch }`: `poll()` long-polls, `export default app` is a complete Worker, `app.session(ctx)` / the `handlers` callback's `session(ctx)` is the TYPED accessor for your `S` fields. Owns storage+session wiring; resolves storage per environment (D1 binding → `bot/storage-d1`; `BOT_PERSIST` path → sqlite, `redis://` → redis, lazily-imported optional peers; else announced-ephemeral memory) — or pass `storage: (env) => Storage` when the choice is env-dependent (e.g. a D1 binding not named `DB`). Boot NARRATES the composition (`session: memory …`, `features: language(en,es) · menu(/settings)`) so every implicit decision is visible where you're looking. Runnable demo: `pnpm demo:bot`. |
|
|
439
|
+
| `@adriangalilea/utils/bot/worker` | `botWorkerFetch(resolve)` — the Cloudflare Worker cap: secret-checked webhook (ack fast, work + storage flush ride `ctx.waitUntil`, errors DM admins throttled), `POST /setup` (webhook registration with handler-derived `allowed_updates` + a commit-narrating 🚀 deploy DM from the request body), `POST /deploy-started` (the 🛳 "what is shipping" DM — curl it from your deploy script on the still-live version, body `{sha, author, message, etaSeconds?}`), operator-authed `/pause` `/resume` `/webhook-status` (+ `statusExtra`), and a `routes` escape hatch tried before the built-ins. Structural bot type — no workers-types dependency. |
|
|
440
|
+
| `@adriangalilea/utils/bot/storage-d1` | `d1Storage({ db, table? })` — `@gramio/storage` adapter over a D1 `session` table (schema in the module doc). `flush()` matters: the session plugin writes un-awaited and workerd freezes the isolate the instant `fetch()` returns — hand `flush` to `bot/worker` (automatic via `createBot`) so writes survive. |
|
|
397
441
|
|
|
398
442
|
Standard wiring:
|
|
399
443
|
|
|
@@ -507,7 +551,7 @@ Field summary:
|
|
|
507
551
|
- `action` returns `void | string | Polyglot<string>`; the menu plugin sends a single `answerCallbackQuery` with that text. **Never call `ctx.answer(...)` from inside an action** — Telegram rejects the second answer, the action throws, and `refresh` never runs.
|
|
508
552
|
- `confirm: { prompt }` adds a one-step confirmation overlay before the action runs. Cancel returns to root. Use this for destructive actions instead of `ctx.answer({ show_alert: true })` — Telegram's alert UI doesn't compose with refresh / toast.
|
|
509
553
|
|
|
510
|
-
**Live state inside resolvers**: `label` / `style` resolvers fire AFTER the action mutated the session
|
|
554
|
+
**Live state inside resolvers**: `label` / `style` / `header` / `visible` resolvers fire AFTER the action mutated the session, and they may be **async** — read your database (or `ctx.session.<field>`) directly at render time; never cache render strings into the session to satisfy a signature. `ctx.lang` from `bot/language` is a snapshot at event start and goes stale within the same callback; `ctx.say(...)` IS live and safe to use anywhere.
|
|
511
555
|
|
|
512
556
|
See `src/bot/CLAUDE.md` for storage layout, design decisions, and gotchas.
|
|
513
557
|
|
package/dist/bot/admin.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"admin.d.ts","sourceRoot":"","sources":["../../src/bot/admin.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,KAAK,YAAY,CAAC,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;AAEtC;;;GAGG;AACH,MAAM,MAAM,MAAM,GACf,MAAM,GACN,SAAS,MAAM,EAAE,GACjB,CAAC,MAAM,YAAY,CAAC,MAAM,GAAG,SAAS,MAAM,EAAE,CAAC,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"admin.d.ts","sourceRoot":"","sources":["../../src/bot/admin.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,KAAK,YAAY,CAAC,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;AAEtC;;;GAGG;AACH,MAAM,MAAM,MAAM,GACf,MAAM,GACN,SAAS,MAAM,EAAE,GACjB,CAAC,MAAM,YAAY,CAAC,MAAM,GAAG,SAAS,MAAM,EAAE,CAAC,CAAC,CAAC;AAQpD,eAAO,MAAM,YAAY,GAAI,QAAQ,MAAM;;;;;MAsB1C,CAAC"}
|
package/dist/bot/admin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"admin.js","sourceRoot":"","sources":["../../src/bot/admin.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAahC,gGAAgG;AAChG,MAAM,KAAK,GAAG,CAAC,CAA6B,EAAY,EAAE,CACzD,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,
|
|
1
|
+
{"version":3,"file":"admin.js","sourceRoot":"","sources":["../../src/bot/admin.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAahC,gGAAgG;AAChG,MAAM,KAAK,GAAG,CAAC,CAA6B,EAAY,EAAE,CACzD,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CACvC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAC3D,CAAC;AAEH,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,MAAc,EAAE,EAAE;IAC9C,+FAA+F;IAC/F,wFAAwF;IACxF,MAAM,OAAO,GACZ,OAAO,MAAM,KAAK,UAAU;QAC3B,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,KAAK,CAAC,MAAM,MAAM,EAAE,CAAC;QACnC,CAAC,CAAC,CAAC,GAAG,EAAE;YACN,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;YAC1B,OAAO,KAAK,IAAI,EAAE,CAAC,GAAG,CAAC;QACxB,CAAC,CAAC,EAAE,CAAC;IAER,OAAO,IAAI,MAAM,CAAC,gCAAgC,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QACxE,MAAM,GAAG,GAAG,MAAM,OAAO,EAAE,CAAC;QAC5B,4FAA4F;QAC5F,2CAA2C;QAC3C,MAAM,QAAQ,GACb,UAAU,IAAI,GAAG,CAAC,CAAC,CAAE,GAA6B,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;QACzE,OAAO;YACN,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;YACpB,OAAO,EAAE,OAAO,QAAQ,KAAK,QAAQ,IAAI,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC;SAC/D,CAAC;IACH,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `createBot` — one bot file from ideation to production.
|
|
3
|
+
*
|
|
4
|
+
* The composer owns the WIRING that used to be documented foot-guns: it
|
|
5
|
+
* constructs the storage + session pair ONCE and threads it into every
|
|
6
|
+
* feature (menu, language, access, payments), so "must be the SAME instance
|
|
7
|
+
* you passed to session()" is unrepresentable instead of a doc warning.
|
|
8
|
+
*
|
|
9
|
+
* The same file runs in every stage — storage and transport are environment
|
|
10
|
+
* decisions, never code shape:
|
|
11
|
+
*
|
|
12
|
+
* ideation BOT_TOKEN=… tsx bot.ts memory session, long-poll
|
|
13
|
+
* experiment BOT_PERSIST=./bot.sqlite tsx bot.ts sqlite session, long-poll
|
|
14
|
+
* prod worker wrangler deploy (D1 binding `DB`) D1 session, webhook (bot/worker)
|
|
15
|
+
* prod server systemd/launchd unit running poll() sqlite/redis, long-poll
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* const app = createBot({
|
|
19
|
+
* language: { supported: ["en", "es"] as const, default: "en" },
|
|
20
|
+
* menu: { adminContact: "@you", items: [...] },
|
|
21
|
+
* handlers: (bot) => bot.command("start", (ctx) => ctx.say({ en: "hi", es: "hola" })),
|
|
22
|
+
* })
|
|
23
|
+
* export default app // Worker: webhook + /setup + /pause + deploy DMs
|
|
24
|
+
* if (app.isMain(import.meta)) app.poll() // Node: `tsx bot.ts` long-polls
|
|
25
|
+
*
|
|
26
|
+
* Worker-safe by construction: the Node-only conveniences (sqlite/redis
|
|
27
|
+
* adapters) load lazily on the poll path only; `bot/kit` stays out of the
|
|
28
|
+
* graph entirely (wrap `app.poll` with `gracefulStart` yourself if you want
|
|
29
|
+
* signal-handled start/stop DMs on a server).
|
|
30
|
+
*/
|
|
31
|
+
import { type Storage } from "@gramio/storage";
|
|
32
|
+
import { Bot } from "gramio";
|
|
33
|
+
import { type AccessControlOptions } from "./access-control.js";
|
|
34
|
+
import { type Admins } from "./admin.js";
|
|
35
|
+
import { type LanguageOptions } from "./language.js";
|
|
36
|
+
import { type BotMenuOptions, type PersonalDataOptions } from "./menu.js";
|
|
37
|
+
import { type BotPaymentsConfig } from "./payments/index.js";
|
|
38
|
+
import { type BotWorkerRuntime } from "./worker.js";
|
|
39
|
+
type EnvLike = Record<string, unknown>;
|
|
40
|
+
export type CreateBotOptions<S extends Record<string, unknown> = Record<string, unknown>> = {
|
|
41
|
+
/** Display name for startup logs. Default: the bot's username once known. */
|
|
42
|
+
name?: string;
|
|
43
|
+
/**
|
|
44
|
+
* Bot token. Default: the `BOT_TOKEN` environment value (process env on
|
|
45
|
+
* Node, the Worker env in workerd). Missing token throws at build — a bot
|
|
46
|
+
* with no token must scream, not idle.
|
|
47
|
+
*/
|
|
48
|
+
token?: string | ((env: EnvLike) => string | undefined);
|
|
49
|
+
/**
|
|
50
|
+
* Session storage OVERRIDE — an instance, or `(env) => Storage` when the
|
|
51
|
+
* choice depends on the environment (e.g. a D1 binding NOT named `DB`).
|
|
52
|
+
* Default resolution (the lifecycle story): workerd → the `DB` D1 binding;
|
|
53
|
+
* Node → `BOT_PERSIST` (a path = sqlite via `@gramio/storage-sqlite`,
|
|
54
|
+
* `redis://…` = `@gramio/storage-redis`), else in-memory (ephemeral,
|
|
55
|
+
* announced at startup).
|
|
56
|
+
*/
|
|
57
|
+
storage?: Storage | ((env: EnvLike) => Storage | Promise<Storage>);
|
|
58
|
+
/** Initial session record for a new user. Types `S` through to `handlers`' session accessor. */
|
|
59
|
+
initial?: () => S;
|
|
60
|
+
/** Admin user ids (static or a LIVE resolver) — enables access/payments admin flows + lifecycle DMs. */
|
|
61
|
+
admins?: Admins;
|
|
62
|
+
/** UI language feature (`ctx.lang`/`ctx.say`, read-time stored→hint→default). */
|
|
63
|
+
language?: Omit<LanguageOptions<readonly string[]>, "session">;
|
|
64
|
+
/**
|
|
65
|
+
* /settings menu. `personalData` is auto-wired to the composer's storage —
|
|
66
|
+
* pass `personalData: { onForget }` to also wipe your own tables, or
|
|
67
|
+
* `personalData: false` to drop Forget/Export entirely. When `language` is
|
|
68
|
+
* configured its picker item is appended automatically (opt out with
|
|
69
|
+
* `languagePicker: false`).
|
|
70
|
+
*/
|
|
71
|
+
menu?: Omit<BotMenuOptions, "personalData"> & {
|
|
72
|
+
personalData?: Pick<PersonalDataOptions, "onForget"> | false;
|
|
73
|
+
languagePicker?: boolean;
|
|
74
|
+
};
|
|
75
|
+
/** Gate the bot to admins + approved users (requires `admins`). */
|
|
76
|
+
access?: Omit<AccessControlOptions, "session" | "storage">;
|
|
77
|
+
/** Telegram Stars monetization (requires `admins` — the refund approver). */
|
|
78
|
+
payments?: Omit<BotPaymentsConfig<string>, "session" | "storage">;
|
|
79
|
+
/**
|
|
80
|
+
* Your commands/handlers — runs LAST, after every feature is wired.
|
|
81
|
+
* `session(ctx)` is the TYPED accessor for your `S` fields (gramio derive
|
|
82
|
+
* types don't flow into generic handlers; this beats casting per call site).
|
|
83
|
+
*/
|
|
84
|
+
handlers?: (bot: Bot, api: {
|
|
85
|
+
session: (ctx: unknown) => S;
|
|
86
|
+
}) => void;
|
|
87
|
+
/** Extra options forwarded to `bot/worker` in the Worker cap (routes, statusExtra, mode…). */
|
|
88
|
+
worker?: (env: EnvLike) => Partial<BotWorkerRuntime>;
|
|
89
|
+
};
|
|
90
|
+
export type BotApp<S extends Record<string, unknown> = Record<string, unknown>> = {
|
|
91
|
+
/** Build (memoized) — exposed for tests and custom runtimes. */
|
|
92
|
+
build(env?: EnvLike): Promise<{
|
|
93
|
+
bot: Bot;
|
|
94
|
+
storage: Storage;
|
|
95
|
+
flush?: () => Promise<void>;
|
|
96
|
+
}>;
|
|
97
|
+
/** Typed accessor for your session fields (`S`), usable anywhere a ctx exists. */
|
|
98
|
+
session(ctx: unknown): S;
|
|
99
|
+
/** Long-poll (Node/Bun/Deno). The ideation loop AND a legitimate prod mode on your own hardware. */
|
|
100
|
+
poll(): Promise<void>;
|
|
101
|
+
/** True when this module is the process entrypoint (`tsx bot.ts`). Always false on workerd. */
|
|
102
|
+
isMain(meta: ImportMeta): boolean;
|
|
103
|
+
/** The Worker fetch handler — `export default app` is a complete workerd bot. */
|
|
104
|
+
fetch(request: Request, env: EnvLike, ctx: {
|
|
105
|
+
waitUntil(p: Promise<unknown>): void;
|
|
106
|
+
}): Promise<Response>;
|
|
107
|
+
};
|
|
108
|
+
export declare function createBot<S extends Record<string, unknown> = Record<string, unknown>>(opts?: CreateBotOptions<S>): BotApp<S>;
|
|
109
|
+
export {};
|
|
110
|
+
//# sourceMappingURL=create.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../src/bot/create.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `createBot` — one bot file from ideation to production.
|
|
3
|
+
*
|
|
4
|
+
* The composer owns the WIRING that used to be documented foot-guns: it
|
|
5
|
+
* constructs the storage + session pair ONCE and threads it into every
|
|
6
|
+
* feature (menu, language, access, payments), so "must be the SAME instance
|
|
7
|
+
* you passed to session()" is unrepresentable instead of a doc warning.
|
|
8
|
+
*
|
|
9
|
+
* The same file runs in every stage — storage and transport are environment
|
|
10
|
+
* decisions, never code shape:
|
|
11
|
+
*
|
|
12
|
+
* ideation BOT_TOKEN=… tsx bot.ts memory session, long-poll
|
|
13
|
+
* experiment BOT_PERSIST=./bot.sqlite tsx bot.ts sqlite session, long-poll
|
|
14
|
+
* prod worker wrangler deploy (D1 binding `DB`) D1 session, webhook (bot/worker)
|
|
15
|
+
* prod server systemd/launchd unit running poll() sqlite/redis, long-poll
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* const app = createBot({
|
|
19
|
+
* language: { supported: ["en", "es"] as const, default: "en" },
|
|
20
|
+
* menu: { adminContact: "@you", items: [...] },
|
|
21
|
+
* handlers: (bot) => bot.command("start", (ctx) => ctx.say({ en: "hi", es: "hola" })),
|
|
22
|
+
* })
|
|
23
|
+
* export default app // Worker: webhook + /setup + /pause + deploy DMs
|
|
24
|
+
* if (app.isMain(import.meta)) app.poll() // Node: `tsx bot.ts` long-polls
|
|
25
|
+
*
|
|
26
|
+
* Worker-safe by construction: the Node-only conveniences (sqlite/redis
|
|
27
|
+
* adapters) load lazily on the poll path only; `bot/kit` stays out of the
|
|
28
|
+
* graph entirely (wrap `app.poll` with `gracefulStart` yourself if you want
|
|
29
|
+
* signal-handled start/stop DMs on a server).
|
|
30
|
+
*/
|
|
31
|
+
import { inMemoryStorage } from "@gramio/storage";
|
|
32
|
+
import { Bot } from "gramio";
|
|
33
|
+
import { runtime } from "../runtime.js";
|
|
34
|
+
import { createLogger } from "../universal/log.js";
|
|
35
|
+
import { accessControl } from "./access-control.js";
|
|
36
|
+
import { adminContext } from "./admin.js";
|
|
37
|
+
import { language } from "./language.js";
|
|
38
|
+
import { botMenu, } from "./menu.js";
|
|
39
|
+
import { botPayments } from "./payments/index.js";
|
|
40
|
+
import { botSession } from "./session.js";
|
|
41
|
+
import { d1Storage } from "./storage-d1.js";
|
|
42
|
+
import { botWorkerFetch } from "./worker.js";
|
|
43
|
+
const log = createLogger("bot");
|
|
44
|
+
// Optional Node-only peers, loaded lazily on the poll path. The specifier goes
|
|
45
|
+
// through a variable so TS doesn't demand types for an optional dependency.
|
|
46
|
+
async function importPeer(name, why) {
|
|
47
|
+
try {
|
|
48
|
+
const specifier = name;
|
|
49
|
+
return await import(specifier);
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
throw new Error(`createBot: install ${name} for ${why}`);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
const idsOf = (v) => (typeof v === "number" ? [v] : [...v]).filter((n) => Number.isFinite(n) && n > 0);
|
|
56
|
+
export function createBot(opts = {}) {
|
|
57
|
+
let built = null;
|
|
58
|
+
const resolveToken = (env) => {
|
|
59
|
+
const token = typeof opts.token === "string"
|
|
60
|
+
? opts.token
|
|
61
|
+
: (opts.token?.(env) ?? env.BOT_TOKEN);
|
|
62
|
+
if (!token)
|
|
63
|
+
throw new Error("createBot: no token — set BOT_TOKEN or pass `token`");
|
|
64
|
+
return token;
|
|
65
|
+
};
|
|
66
|
+
const resolveStorage = async (env) => {
|
|
67
|
+
if (opts.storage) {
|
|
68
|
+
if (typeof opts.storage === "function") {
|
|
69
|
+
return {
|
|
70
|
+
storage: await opts.storage(env),
|
|
71
|
+
kind: "custom (env-resolved)",
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
return { storage: opts.storage, kind: "custom" };
|
|
75
|
+
}
|
|
76
|
+
const db = env.DB;
|
|
77
|
+
if (db && typeof db === "object" && "prepare" in db) {
|
|
78
|
+
const storage = d1Storage({ db });
|
|
79
|
+
return { storage, kind: "d1", flush: storage.flush };
|
|
80
|
+
}
|
|
81
|
+
const persist = env.BOT_PERSIST;
|
|
82
|
+
if (persist?.startsWith("redis://") || persist?.startsWith("rediss://")) {
|
|
83
|
+
const mod = await importPeer("@gramio/storage-redis", "BOT_PERSIST=redis://…");
|
|
84
|
+
const factory = mod
|
|
85
|
+
.redisStorage;
|
|
86
|
+
if (!factory)
|
|
87
|
+
throw new Error("createBot: @gramio/storage-redis has no redisStorage export");
|
|
88
|
+
return { storage: factory(persist), kind: "redis" };
|
|
89
|
+
}
|
|
90
|
+
if (persist) {
|
|
91
|
+
const mod = (await importPeer("@gramio/storage-sqlite", "a BOT_PERSIST path"));
|
|
92
|
+
const factory = mod.sqliteStorage ?? mod.default;
|
|
93
|
+
if (!factory)
|
|
94
|
+
throw new Error("createBot: @gramio/storage-sqlite has no storage export");
|
|
95
|
+
return { storage: factory(persist), kind: `sqlite ${persist}` };
|
|
96
|
+
}
|
|
97
|
+
return {
|
|
98
|
+
storage: inMemoryStorage(),
|
|
99
|
+
kind: "memory (ephemeral — set BOT_PERSIST to keep state)",
|
|
100
|
+
};
|
|
101
|
+
};
|
|
102
|
+
const build = (env) => {
|
|
103
|
+
built ??= (async () => {
|
|
104
|
+
const e = env ?? (runtime.isNode ? process.env : {});
|
|
105
|
+
const bot = new Bot(resolveToken(e));
|
|
106
|
+
const { storage, kind, flush } = await resolveStorage(e);
|
|
107
|
+
log.info(`session: ${kind}`);
|
|
108
|
+
// ONE session, threaded everywhere — the composer's whole job.
|
|
109
|
+
const session = botSession({
|
|
110
|
+
storage,
|
|
111
|
+
initial: (opts.initial ?? (() => ({}))),
|
|
112
|
+
});
|
|
113
|
+
bot.extend(session);
|
|
114
|
+
const lang = opts.language
|
|
115
|
+
? language({ ...opts.language, session })
|
|
116
|
+
: null;
|
|
117
|
+
if (lang)
|
|
118
|
+
bot.extend(lang.plugin);
|
|
119
|
+
if (opts.admins)
|
|
120
|
+
bot.extend(adminContext(opts.admins));
|
|
121
|
+
if (opts.access) {
|
|
122
|
+
if (!opts.admins)
|
|
123
|
+
throw new Error("createBot: `access` needs `admins` (the approver)");
|
|
124
|
+
bot.extend(accessControl({ ...opts.access, session, storage }));
|
|
125
|
+
}
|
|
126
|
+
const payments = opts.payments
|
|
127
|
+
? botPayments({ ...opts.payments, session, storage })
|
|
128
|
+
: null;
|
|
129
|
+
if (payments) {
|
|
130
|
+
if (!opts.admins)
|
|
131
|
+
throw new Error("createBot: `payments` needs `admins` (the refund approver)");
|
|
132
|
+
bot.extend(payments.plugin);
|
|
133
|
+
}
|
|
134
|
+
if (opts.menu) {
|
|
135
|
+
const { personalData, languagePicker, items, ...menuOpts } = opts.menu;
|
|
136
|
+
const composed = [...(items ?? [])];
|
|
137
|
+
if (lang && languagePicker !== false)
|
|
138
|
+
composed.push(lang.menuItem);
|
|
139
|
+
if (payments)
|
|
140
|
+
composed.push(payments.menuItem);
|
|
141
|
+
bot.extend(botMenu({
|
|
142
|
+
...menuOpts,
|
|
143
|
+
items: composed,
|
|
144
|
+
...(personalData === false
|
|
145
|
+
? {}
|
|
146
|
+
: {
|
|
147
|
+
personalData: { storage, onForget: personalData?.onForget },
|
|
148
|
+
}),
|
|
149
|
+
}).plugin);
|
|
150
|
+
}
|
|
151
|
+
opts.handlers?.(bot, { session: sessionOf });
|
|
152
|
+
// Narrate the composition — automation you can watch is not magic.
|
|
153
|
+
const features = [
|
|
154
|
+
opts.language ? `language(${opts.language.supported.join(",")})` : null,
|
|
155
|
+
opts.menu ? `menu(/${opts.menu.command ?? "settings"})` : null,
|
|
156
|
+
opts.admins ? "admins" : null,
|
|
157
|
+
opts.access ? "access" : null,
|
|
158
|
+
opts.payments
|
|
159
|
+
? `payments(${[
|
|
160
|
+
opts.payments.vip?.length
|
|
161
|
+
? `vip×${opts.payments.vip.length}`
|
|
162
|
+
: null,
|
|
163
|
+
opts.payments.credits ? "credits" : null,
|
|
164
|
+
opts.payments.perks ? "perks" : null,
|
|
165
|
+
]
|
|
166
|
+
.filter(Boolean)
|
|
167
|
+
.join("+")})`
|
|
168
|
+
: null,
|
|
169
|
+
].filter(Boolean);
|
|
170
|
+
if (features.length > 0)
|
|
171
|
+
log.info(`features: ${features.join(" · ")}`);
|
|
172
|
+
return { bot, storage, flush };
|
|
173
|
+
})();
|
|
174
|
+
return built;
|
|
175
|
+
};
|
|
176
|
+
// The typed session accessor: gramio derive types don't flow into generic
|
|
177
|
+
// handlers, so this ONE cast (behind a name) replaces a cast per call site.
|
|
178
|
+
const sessionOf = (ctx) => {
|
|
179
|
+
const s = ctx.session;
|
|
180
|
+
if (!s)
|
|
181
|
+
throw new Error("createBot: no session on this ctx (service update?)");
|
|
182
|
+
return s;
|
|
183
|
+
};
|
|
184
|
+
const adminIds = () => {
|
|
185
|
+
const a = opts.admins;
|
|
186
|
+
if (a === undefined)
|
|
187
|
+
return undefined;
|
|
188
|
+
return typeof a === "function"
|
|
189
|
+
? async () => idsOf(await a())
|
|
190
|
+
: async () => idsOf(a);
|
|
191
|
+
};
|
|
192
|
+
const workerFetch = botWorkerFetch(async (env) => {
|
|
193
|
+
const { bot, flush } = await build(env);
|
|
194
|
+
return {
|
|
195
|
+
bot: bot,
|
|
196
|
+
webhookSecret: env.WEBHOOK_SECRET,
|
|
197
|
+
operatorSecret: env.OPERATOR_SECRET,
|
|
198
|
+
mode: env.MODE ?? opts.name,
|
|
199
|
+
adminIds: adminIds(),
|
|
200
|
+
flush,
|
|
201
|
+
...opts.worker?.(env),
|
|
202
|
+
};
|
|
203
|
+
});
|
|
204
|
+
return {
|
|
205
|
+
build,
|
|
206
|
+
session: sessionOf,
|
|
207
|
+
async poll() {
|
|
208
|
+
const { bot } = await build();
|
|
209
|
+
await bot.start();
|
|
210
|
+
log.ready(`${opts.name ?? "bot"} polling as @${bot.info?.username}`);
|
|
211
|
+
},
|
|
212
|
+
isMain(meta) {
|
|
213
|
+
const main = meta.main;
|
|
214
|
+
if (main !== undefined)
|
|
215
|
+
return main;
|
|
216
|
+
if (!runtime.isNode)
|
|
217
|
+
return false;
|
|
218
|
+
// Fallback for runtimes without import.meta.main: entrypoint filename match.
|
|
219
|
+
const argv1 = process.argv[1];
|
|
220
|
+
if (!argv1)
|
|
221
|
+
return false;
|
|
222
|
+
const tail = argv1.split("/").pop();
|
|
223
|
+
return !!tail && meta.url.endsWith(`/${tail}`);
|
|
224
|
+
},
|
|
225
|
+
fetch: workerFetch,
|
|
226
|
+
};
|
|
227
|
+
}
|
|
228
|
+
//# sourceMappingURL=create.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../src/bot/create.ts"],"names":[],"mappings":"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"}
|
package/dist/bot/kit.d.ts
CHANGED
|
@@ -34,8 +34,7 @@
|
|
|
34
34
|
*
|
|
35
35
|
* await gracefulStart(bot, { onShutdown: () => db.end() })
|
|
36
36
|
*/
|
|
37
|
-
import type { Plugin as PluginType } from "gramio";
|
|
38
|
-
import type { AnyBot } from "gramio";
|
|
37
|
+
import type { AnyBot, Plugin as PluginType } from "gramio";
|
|
39
38
|
export { botSession, prefixStorage } from "./session.js";
|
|
40
39
|
export type GracefulStartOptions = {
|
|
41
40
|
/** Runs after `bot.stop()` resolves, before `process.exit`. Close DBs, flush logs. */
|
package/dist/bot/kit.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kit.d.ts","sourceRoot":"","sources":["../../src/bot/kit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,OAAO,KAAK,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"kit.d.ts","sourceRoot":"","sources":["../../src/bot/kit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,QAAQ,CAAC;AAI3D,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAIzD,MAAM,MAAM,oBAAoB,GAAG;IAClC,sFAAsF;IACtF,UAAU,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IACxC,yDAAyD;IACzD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,qEAAqE;IACrE,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,6DAA6D;IAC7D,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC;IACtC;;;;;;;;;;;;;;;;;;;OAmBG;IACH,WAAW,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;CAC/B,CAAC;AAEF,eAAO,MAAM,aAAa,GACzB,KAAK,MAAM,EACX,OAAM,oBAAyB,KAC7B,OAAO,CAAC,IAAI,CAmEd,CAAC;AAOF,YAAY,EAAE,UAAU,EAAE,CAAC"}
|
package/dist/bot/kit.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kit.js","sourceRoot":"","sources":["../../src/bot/kit.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"kit.js","sourceRoot":"","sources":["../../src/bot/kit.ts"],"names":[],"mappings":"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"}
|
package/dist/bot/language.d.ts
CHANGED
|
@@ -325,6 +325,14 @@ declare const buildLanguagePlugin: <Lang extends string>(args: {
|
|
|
325
325
|
lang: Lang;
|
|
326
326
|
say: Sayer<Lang>;
|
|
327
327
|
};
|
|
328
|
+
inline_query: {
|
|
329
|
+
lang: Lang;
|
|
330
|
+
say: Sayer<Lang>;
|
|
331
|
+
};
|
|
332
|
+
chosen_inline_result: {
|
|
333
|
+
lang: Lang;
|
|
334
|
+
say: Sayer<Lang>;
|
|
335
|
+
};
|
|
328
336
|
callback_query: {
|
|
329
337
|
lang: Lang;
|
|
330
338
|
say: Sayer<Lang>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"language.d.ts","sourceRoot":"","sources":["../../src/bot/language.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"language.d.ts","sourceRoot":"","sources":["../../src/bot/language.ts"],"names":[],"mappings":"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"}
|
package/dist/bot/language.js
CHANGED
|
@@ -304,15 +304,22 @@ const buildLanguagePlugin = (args) => {
|
|
|
304
304
|
// session derive runs exactly once per update — but the types
|
|
305
305
|
// (ctx.session: SessionLike) flow into our handlers below.
|
|
306
306
|
.extend(sessionPlugin)
|
|
307
|
-
.derive(
|
|
307
|
+
.derive(
|
|
308
|
+
// Inline events included: ctx.lang/ctx.say must exist wherever the
|
|
309
|
+
// user speaks to the bot, or consumers fork their own resolvers.
|
|
310
|
+
["message", "callback_query", "inline_query", "chosen_inline_result"], (ctx) => {
|
|
308
311
|
// The Telegram hint, scope-resolved ONCE per event (it can't change
|
|
309
312
|
// mid-handler): honored only in user-scoped resolution — in groups it
|
|
310
313
|
// would flicker per-speaker. Full tag first ("pt-BR"), then its
|
|
311
314
|
// primary subtag ("pt"). Never persisted: the read-time middle rung
|
|
312
315
|
// between a stored explicit pick and the configured default.
|
|
316
|
+
// Inline events carry no chat — they resolve as "private" (user-scoped),
|
|
317
|
+
// which is what an inline interaction is. Structural read: `message`
|
|
318
|
+
// only exists on callback ctxs in the widened event union.
|
|
313
319
|
const chatType = ctx.is("message")
|
|
314
320
|
? ctx.chat.type
|
|
315
|
-
: (ctx.message?.chat
|
|
321
|
+
: (ctx.message?.chat
|
|
322
|
+
.type ?? "private");
|
|
316
323
|
const strategy = resolveScope(scopeOpt, chatType);
|
|
317
324
|
const hintLang = strategy === "user"
|
|
318
325
|
? (matchSupported(ctx.from.languageCode) ??
|
package/dist/bot/language.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"language.js","sourceRoot":"","sources":["../../src/bot/language.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"language.js","sourceRoot":"","sources":["../../src/bot/language.ts"],"names":[],"mappings":"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"}
|