@xbibzlibrary/telebibz 0.4.5 → 3.0.1

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.
Files changed (276) hide show
  1. package/CHANGELOG.md +35 -138
  2. package/LICENSE +1 -1
  3. package/NOTICE.md +9 -4
  4. package/README.md +173 -256
  5. package/examples/01-quickstart.js +13 -0
  6. package/examples/02-menu-tombol.js +22 -0
  7. package/examples/03-wizard.js +29 -0
  8. package/examples/04-broadcast.js +25 -0
  9. package/examples/05-kirim-file.js +19 -0
  10. package/examples/06-menu.js +35 -0
  11. package/examples/07-inline-query.js +18 -0
  12. package/index.d.ts +81 -0
  13. package/index.js +42 -0
  14. package/lib/api.js +154 -0
  15. package/lib/broadcast.js +35 -0
  16. package/lib/composer.js +174 -0
  17. package/lib/context.js +190 -0
  18. package/lib/errors.js +35 -0
  19. package/lib/file.js +41 -0
  20. package/lib/inline-query.js +28 -0
  21. package/lib/keyboard.js +83 -0
  22. package/lib/logger.js +38 -0
  23. package/lib/menus.js +90 -0
  24. package/lib/net.js +115 -0
  25. package/lib/ratelimit.js +61 -0
  26. package/lib/runner.js +45 -0
  27. package/lib/session.js +36 -0
  28. package/lib/telebibz.js +190 -0
  29. package/lib/wizard.js +81 -0
  30. package/package.json +35 -97
  31. package/test/all.test.js +334 -0
  32. package/CODE_OF_CONDUCT.md +0 -37
  33. package/CONTRIBUTING.md +0 -59
  34. package/CONTRIBUTION_RULES.md +0 -41
  35. package/GOVERNANCE.md +0 -47
  36. package/README.id.md +0 -306
  37. package/README.zh-CN.md +0 -306
  38. package/RELEASE_AUTOMATION.md +0 -78
  39. package/RELEASE_POLICY.md +0 -32
  40. package/SECURITY.md +0 -47
  41. package/SHOWCASE.md +0 -29
  42. package/SUPPORT.md +0 -30
  43. package/assets/readme-preview.html +0 -75
  44. package/assets/telebibz-logo.png +0 -0
  45. package/assets/telebibz-readme-preview.png +0 -0
  46. package/bin/telebibz.mjs +0 -3
  47. package/dist/generated/api.d.ts +0 -13
  48. package/dist/generated/api.d.ts.map +0 -1
  49. package/dist/generated/api.js +0 -192
  50. package/dist/generated/api.js.map +0 -1
  51. package/dist/src/api/client.d.ts +0 -62
  52. package/dist/src/api/client.d.ts.map +0 -1
  53. package/dist/src/api/client.js +0 -104
  54. package/dist/src/api/client.js.map +0 -1
  55. package/dist/src/api/errors.d.ts +0 -45
  56. package/dist/src/api/errors.d.ts.map +0 -1
  57. package/dist/src/api/errors.js +0 -65
  58. package/dist/src/api/errors.js.map +0 -1
  59. package/dist/src/api/index.d.ts +0 -6
  60. package/dist/src/api/index.d.ts.map +0 -1
  61. package/dist/src/api/index.js +0 -6
  62. package/dist/src/api/index.js.map +0 -1
  63. package/dist/src/api/telegram-types/LICENSE +0 -21
  64. package/dist/src/api/telegram-types/api.d.ts +0 -22
  65. package/dist/src/api/telegram-types/checklist.d.ts +0 -72
  66. package/dist/src/api/telegram-types/inline.d.ts +0 -692
  67. package/dist/src/api/telegram-types/langs.d.ts +0 -193
  68. package/dist/src/api/telegram-types/manage.d.ts +0 -1144
  69. package/dist/src/api/telegram-types/markup.d.ts +0 -268
  70. package/dist/src/api/telegram-types/message.d.ts +0 -1537
  71. package/dist/src/api/telegram-types/methods.d.ts +0 -2870
  72. package/dist/src/api/telegram-types/mod.d.ts +0 -14
  73. package/dist/src/api/telegram-types/passport.d.ts +0 -163
  74. package/dist/src/api/telegram-types/payment.d.ts +0 -570
  75. package/dist/src/api/telegram-types/rich.d.ts +0 -1010
  76. package/dist/src/api/telegram-types/settings.d.ts +0 -120
  77. package/dist/src/api/telegram-types/story.d.ts +0 -89
  78. package/dist/src/api/telegram-types/update.d.ts +0 -84
  79. package/dist/src/api/telegram.d.ts +0 -7
  80. package/dist/src/api/telegram.d.ts.map +0 -1
  81. package/dist/src/api/telegram.js +0 -2
  82. package/dist/src/api/telegram.js.map +0 -1
  83. package/dist/src/api/transport.d.ts +0 -68
  84. package/dist/src/api/transport.d.ts.map +0 -1
  85. package/dist/src/api/transport.js +0 -264
  86. package/dist/src/api/transport.js.map +0 -1
  87. package/dist/src/api/types.d.ts +0 -466
  88. package/dist/src/api/types.d.ts.map +0 -1
  89. package/dist/src/api/types.js +0 -2
  90. package/dist/src/api/types.js.map +0 -1
  91. package/dist/src/branding/terminal.d.ts +0 -77
  92. package/dist/src/branding/terminal.d.ts.map +0 -1
  93. package/dist/src/branding/terminal.js +0 -328
  94. package/dist/src/branding/terminal.js.map +0 -1
  95. package/dist/src/broadcast/broadcast.d.ts +0 -50
  96. package/dist/src/broadcast/broadcast.d.ts.map +0 -1
  97. package/dist/src/broadcast/broadcast.js +0 -56
  98. package/dist/src/broadcast/broadcast.js.map +0 -1
  99. package/dist/src/cache/cache.d.ts +0 -34
  100. package/dist/src/cache/cache.d.ts.map +0 -1
  101. package/dist/src/cache/cache.js +0 -41
  102. package/dist/src/cache/cache.js.map +0 -1
  103. package/dist/src/cli.d.ts +0 -2
  104. package/dist/src/cli.d.ts.map +0 -1
  105. package/dist/src/cli.js +0 -84
  106. package/dist/src/cli.js.map +0 -1
  107. package/dist/src/context/context.d.ts +0 -124
  108. package/dist/src/context/context.d.ts.map +0 -1
  109. package/dist/src/context/context.js +0 -302
  110. package/dist/src/context/context.js.map +0 -1
  111. package/dist/src/core/bot.d.ts +0 -204
  112. package/dist/src/core/bot.d.ts.map +0 -1
  113. package/dist/src/core/bot.js +0 -506
  114. package/dist/src/core/bot.js.map +0 -1
  115. package/dist/src/core/events.d.ts +0 -75
  116. package/dist/src/core/events.d.ts.map +0 -1
  117. package/dist/src/core/events.js +0 -35
  118. package/dist/src/core/events.js.map +0 -1
  119. package/dist/src/core/webhook-reply.d.ts +0 -34
  120. package/dist/src/core/webhook-reply.d.ts.map +0 -1
  121. package/dist/src/core/webhook-reply.js +0 -37
  122. package/dist/src/core/webhook-reply.js.map +0 -1
  123. package/dist/src/index.d.ts +0 -24
  124. package/dist/src/index.d.ts.map +0 -1
  125. package/dist/src/index.js +0 -24
  126. package/dist/src/index.js.map +0 -1
  127. package/dist/src/keyboard/index.d.ts +0 -46
  128. package/dist/src/keyboard/index.d.ts.map +0 -1
  129. package/dist/src/keyboard/index.js +0 -55
  130. package/dist/src/keyboard/index.js.map +0 -1
  131. package/dist/src/middleware/compose.d.ts +0 -5
  132. package/dist/src/middleware/compose.d.ts.map +0 -1
  133. package/dist/src/middleware/compose.js +0 -17
  134. package/dist/src/middleware/compose.js.map +0 -1
  135. package/dist/src/observability/logger.d.ts +0 -78
  136. package/dist/src/observability/logger.d.ts.map +0 -1
  137. package/dist/src/observability/logger.js +0 -285
  138. package/dist/src/observability/logger.js.map +0 -1
  139. package/dist/src/plugins/plugin.d.ts +0 -38
  140. package/dist/src/plugins/plugin.d.ts.map +0 -1
  141. package/dist/src/plugins/plugin.js +0 -59
  142. package/dist/src/plugins/plugin.js.map +0 -1
  143. package/dist/src/queue/queue.d.ts +0 -77
  144. package/dist/src/queue/queue.d.ts.map +0 -1
  145. package/dist/src/queue/queue.js +0 -213
  146. package/dist/src/queue/queue.js.map +0 -1
  147. package/dist/src/router/router.d.ts +0 -61
  148. package/dist/src/router/router.d.ts.map +0 -1
  149. package/dist/src/router/router.js +0 -183
  150. package/dist/src/router/router.js.map +0 -1
  151. package/dist/src/state/conversation.d.ts +0 -56
  152. package/dist/src/state/conversation.d.ts.map +0 -1
  153. package/dist/src/state/conversation.js +0 -133
  154. package/dist/src/state/conversation.js.map +0 -1
  155. package/dist/src/state/forms.d.ts +0 -34
  156. package/dist/src/state/forms.d.ts.map +0 -1
  157. package/dist/src/state/forms.js +0 -44
  158. package/dist/src/state/forms.js.map +0 -1
  159. package/dist/src/state/menu.d.ts +0 -78
  160. package/dist/src/state/menu.d.ts.map +0 -1
  161. package/dist/src/state/menu.js +0 -127
  162. package/dist/src/state/menu.js.map +0 -1
  163. package/dist/src/storage/storage.d.ts +0 -146
  164. package/dist/src/storage/storage.d.ts.map +0 -1
  165. package/dist/src/storage/storage.js +0 -195
  166. package/dist/src/storage/storage.js.map +0 -1
  167. package/dist/src/telegram-features.d.ts +0 -33
  168. package/dist/src/telegram-features.d.ts.map +0 -1
  169. package/dist/src/telegram-features.js +0 -71
  170. package/dist/src/telegram-features.js.map +0 -1
  171. package/dist/src/testing.d.ts +0 -24
  172. package/dist/src/testing.d.ts.map +0 -1
  173. package/dist/src/testing.js +0 -38
  174. package/dist/src/testing.js.map +0 -1
  175. package/dist/src/utils/concurrency.d.ts +0 -25
  176. package/dist/src/utils/concurrency.d.ts.map +0 -1
  177. package/dist/src/utils/concurrency.js +0 -52
  178. package/dist/src/utils/concurrency.js.map +0 -1
  179. package/dist/src/utils/files.d.ts +0 -45
  180. package/dist/src/utils/files.d.ts.map +0 -1
  181. package/dist/src/utils/files.js +0 -53
  182. package/dist/src/utils/files.js.map +0 -1
  183. package/dist/src/utils/text.d.ts +0 -39
  184. package/dist/src/utils/text.d.ts.map +0 -1
  185. package/dist/src/utils/text.js +0 -56
  186. package/dist/src/utils/text.js.map +0 -1
  187. package/dist/src/webhook/handler.d.ts +0 -19
  188. package/dist/src/webhook/handler.d.ts.map +0 -1
  189. package/dist/src/webhook/handler.js +0 -141
  190. package/dist/src/webhook/handler.js.map +0 -1
  191. package/dist-cjs/generated/api.js +0 -194
  192. package/dist-cjs/package.json +0 -3
  193. package/dist-cjs/src/api/client.js +0 -107
  194. package/dist-cjs/src/api/errors.js +0 -74
  195. package/dist-cjs/src/api/index.js +0 -21
  196. package/dist-cjs/src/api/telegram-types/LICENSE +0 -21
  197. package/dist-cjs/src/api/telegram-types/api.d.ts +0 -22
  198. package/dist-cjs/src/api/telegram-types/checklist.d.ts +0 -72
  199. package/dist-cjs/src/api/telegram-types/inline.d.ts +0 -692
  200. package/dist-cjs/src/api/telegram-types/langs.d.ts +0 -193
  201. package/dist-cjs/src/api/telegram-types/manage.d.ts +0 -1144
  202. package/dist-cjs/src/api/telegram-types/markup.d.ts +0 -268
  203. package/dist-cjs/src/api/telegram-types/message.d.ts +0 -1537
  204. package/dist-cjs/src/api/telegram-types/methods.d.ts +0 -2870
  205. package/dist-cjs/src/api/telegram-types/mod.d.ts +0 -14
  206. package/dist-cjs/src/api/telegram-types/passport.d.ts +0 -163
  207. package/dist-cjs/src/api/telegram-types/payment.d.ts +0 -570
  208. package/dist-cjs/src/api/telegram-types/rich.d.ts +0 -1010
  209. package/dist-cjs/src/api/telegram-types/settings.d.ts +0 -120
  210. package/dist-cjs/src/api/telegram-types/story.d.ts +0 -89
  211. package/dist-cjs/src/api/telegram-types/update.d.ts +0 -84
  212. package/dist-cjs/src/api/telegram.js +0 -2
  213. package/dist-cjs/src/api/transport.js +0 -267
  214. package/dist-cjs/src/api/types.js +0 -2
  215. package/dist-cjs/src/branding/terminal.js +0 -338
  216. package/dist-cjs/src/broadcast/broadcast.js +0 -58
  217. package/dist-cjs/src/cache/cache.js +0 -45
  218. package/dist-cjs/src/cli.js +0 -86
  219. package/dist-cjs/src/context/context.js +0 -305
  220. package/dist-cjs/src/core/bot.js +0 -510
  221. package/dist-cjs/src/core/events.js +0 -38
  222. package/dist-cjs/src/core/webhook-reply.js +0 -42
  223. package/dist-cjs/src/index.js +0 -47
  224. package/dist-cjs/src/keyboard/index.js +0 -61
  225. package/dist-cjs/src/middleware/compose.js +0 -20
  226. package/dist-cjs/src/observability/logger.js +0 -293
  227. package/dist-cjs/src/plugins/plugin.js +0 -63
  228. package/dist-cjs/src/queue/queue.js +0 -219
  229. package/dist-cjs/src/router/router.js +0 -186
  230. package/dist-cjs/src/state/conversation.js +0 -139
  231. package/dist-cjs/src/state/forms.js +0 -47
  232. package/dist-cjs/src/state/menu.js +0 -133
  233. package/dist-cjs/src/storage/storage.js +0 -202
  234. package/dist-cjs/src/telegram-features.js +0 -76
  235. package/dist-cjs/src/testing.js +0 -45
  236. package/dist-cjs/src/utils/concurrency.js +0 -57
  237. package/dist-cjs/src/utils/files.js +0 -58
  238. package/dist-cjs/src/utils/text.js +0 -63
  239. package/dist-cjs/src/webhook/handler.js +0 -144
  240. package/docs/API.id.md +0 -1935
  241. package/docs/API.md +0 -1969
  242. package/docs/API.zh-CN.md +0 -1929
  243. package/docs/COOKBOOK.id.md +0 -321
  244. package/docs/COOKBOOK.md +0 -321
  245. package/docs/COOKBOOK.zh-CN.md +0 -321
  246. package/docs/ERRORS.id.md +0 -194
  247. package/docs/ERRORS.md +0 -194
  248. package/docs/ERRORS.zh-CN.md +0 -194
  249. package/docs/FILES.id.md +0 -243
  250. package/docs/FILES.md +0 -243
  251. package/docs/FILES.zh-CN.md +0 -243
  252. package/docs/GETTING_STARTED.id.md +0 -89
  253. package/docs/GETTING_STARTED.md +0 -89
  254. package/docs/GETTING_STARTED.zh-CN.md +0 -89
  255. package/docs/GITHUB_PACKAGES.id.md +0 -82
  256. package/docs/GITHUB_PACKAGES.md +0 -82
  257. package/docs/GITHUB_PACKAGES.zh-CN.md +0 -82
  258. package/docs/MIGRATION_TELEGRAF.id.md +0 -147
  259. package/docs/MIGRATION_TELEGRAF.md +0 -154
  260. package/docs/MIGRATION_TELEGRAF.zh-CN.md +0 -147
  261. package/docs/README.md +0 -67
  262. package/docs/STORAGE.id.md +0 -105
  263. package/docs/STORAGE.md +0 -105
  264. package/docs/STORAGE.zh-CN.md +0 -105
  265. package/docs/TESTING.id.md +0 -203
  266. package/docs/TESTING.md +0 -203
  267. package/docs/TESTING.zh-CN.md +0 -203
  268. package/docs/WEBHOOK.id.md +0 -212
  269. package/docs/WEBHOOK.md +0 -215
  270. package/docs/WEBHOOK.zh-CN.md +0 -212
  271. package/examples/README.md +0 -37
  272. package/examples/files.ts +0 -35
  273. package/examples/minimal.ts +0 -12
  274. package/examples/tsconfig.json +0 -9
  275. package/examples/webhook.ts +0 -42
  276. package/examples/wizard-registration.ts +0 -42
package/README.id.md DELETED
@@ -1,306 +0,0 @@
1
- # telebibz
2
-
3
- ![telebibz logo](https://imgbs.com/uploads/telebibz-d7b30671.png)
4
-
5
- [![CI](https://github.com/XbibzOfficial777/telebibz/actions/workflows/ci.yml/badge.svg)](https://github.com/XbibzOfficial777/telebibz/actions/workflows/ci.yml)
6
- [![npm version](https://img.shields.io/npm/v/@xbibzlibrary/telebibz)](https://www.npmjs.com/package/@xbibzlibrary/telebibz)
7
- [![npm downloads](https://img.shields.io/npm/dm/@xbibzlibrary/telebibz)](https://www.npmjs.com/package/@xbibzlibrary/telebibz)
8
- [![Node.js](https://img.shields.io/node/v/@xbibzlibrary/telebibz)](https://www.npmjs.com/package/@xbibzlibrary/telebibz)
9
-
10
- **`@xbibzlibrary/telebibz`** adalah SDK dan framework Telegram Bot untuk Node.js dan TypeScript. Paket ini menyediakan API client, polling, router, middleware, context, keyboard builder, state/session, webhook handler, queue, scheduler, cache, plugin lifecycle, CLI, dan utilitas pengujian.
11
-
12
- [English](README.md) · **Bahasa Indonesia** · [简体中文](README.zh-CN.md)
13
-
14
- Referensi API lengkap: [English](docs/API.md) · **Indonesia** · [中文](docs/API.zh-CN.md)
15
-
16
- Panduan GitHub Packages: [English](docs/GITHUB_PACKAGES.md) · [Bahasa Indonesia](docs/GITHUB_PACKAGES.id.md) · [简体中文](docs/GITHUB_PACKAGES.zh-CN.md)
17
-
18
- Panduan cepat storage (Memory/JSON/Redis/SQL/Mongo): [English](docs/STORAGE.md) · [Bahasa Indonesia](docs/STORAGE.id.md) · [简体中文](docs/STORAGE.zh-CN.md)
19
-
20
- Panduan mulai: [English](docs/GETTING_STARTED.md) · [Bahasa Indonesia](docs/GETTING_STARTED.id.md) · [简体中文](docs/GETTING_STARTED.zh-CN.md)
21
-
22
- File (upload & download): [English](docs/FILES.md) · [Bahasa Indonesia](docs/FILES.id.md) · [简体中文](docs/FILES.zh-CN.md)
23
-
24
- Error & rate limit: [English](docs/ERRORS.md) · [Bahasa Indonesia](docs/ERRORS.id.md) · [简体中文](docs/ERRORS.zh-CN.md)
25
-
26
- Deployment webhook: [English](docs/WEBHOOK.md) · [Bahasa Indonesia](docs/WEBHOOK.id.md) · [简体中文](docs/WEBHOOK.zh-CN.md)
27
-
28
- Testing (offline dengan MockTransport): [English](docs/TESTING.md) · [Bahasa Indonesia](docs/TESTING.id.md) · [简体中文](docs/TESTING.zh-CN.md)
29
-
30
- Migrasi dari Telegraf: [English](docs/MIGRATION_TELEGRAF.md) · [Bahasa Indonesia](docs/MIGRATION_TELEGRAF.id.md) · [简体中文](docs/MIGRATION_TELEGRAF.zh-CN.md)
31
-
32
- Cookbook produksi (13 resep): [English](docs/COOKBOOK.md) · [Bahasa Indonesia](docs/COOKBOOK.id.md) · [简体中文](docs/COOKBOOK.zh-CN.md)
33
-
34
- Katalog dokumentasi lengkap: [docs/README.md](docs/README.md)
35
-
36
- Showcase komunitas: [SHOWCASE.md](SHOWCASE.md)
37
-
38
- ![overview telebibz](https://cdn.jsdelivr.net/npm/@xbibzlibrary/telebibz@latest/assets/telebibz-readme-preview.png)
39
-
40
- ## Instalasi
41
-
42
- ```bash
43
- npm install @xbibzlibrary/telebibz
44
- ```
45
-
46
- Node.js **22 atau lebih baru** diperlukan.
47
-
48
- ## Bot sederhana
49
-
50
- ```ts
51
- import { Bot } from "@xbibzlibrary/telebibz";
52
-
53
- const bot = new Bot(process.env.TELEGRAM_BOT_TOKEN!);
54
-
55
- bot.command("start", async (ctx) => { await ctx.reply("Bot aktif."); });
56
- bot.onText("ping", async (ctx) => { await ctx.reply("pong"); });
57
-
58
- await bot.start();
59
- ```
60
-
61
- `Bot.start()` menjalankan long polling. Untuk siklus hidup manual, gunakan `init()`, `launch({ mode: "polling" })`, `health()`, `stop()`, atau `restart()`.
62
-
63
- ## Starter resmi
64
-
65
- Repository menyediakan starter yang bisa langsung dijalankan untuk bot minimal, registration wizard multi-langkah, dan webhook Node.js. Lihat [`examples/README.md`](examples/README.md), atau jalankan starter minimal setelah mengatur `TELEGRAM_BOT_TOKEN`:
66
-
67
- ```bash
68
- export TELEGRAM_BOT_TOKEN="<token-bot-kamu>"
69
- npx tsx examples/minimal.ts
70
- ```
71
-
72
- Semua examples di-typecheck oleh CI melalui `npm run test:examples` dan tidak berisi credential asli.
73
-
74
- ## Router dan middleware
75
-
76
- ```ts
77
- bot.use(async (ctx, next) => {
78
- const started = Date.now();
79
- await next();
80
- console.log(`processed in ${Date.now() - started}ms`);
81
- });
82
-
83
- bot.command("help", async (ctx) => { await ctx.reply("Bantuan tersedia."); });
84
- bot.onRegex(/^order:(\d+)$/, async (ctx) => { await ctx.reply("Order diterima."); });
85
- bot.callback("profile:*", async (ctx) => { await ctx.answerCallbackQuery("Dibuka."); });
86
- bot.action("menu:open", async (ctx) => { await ctx.answerCallbackQuery("Menu dibuka."); });
87
- bot.on("message:photo", async (ctx) => { await ctx.reply("Foto yang bagus."); });
88
- bot.on(["message:text", "callback_query:data"], async (ctx) => { await ctx.reply("Diterima."); });
89
- bot.hears("ping", async (ctx) => { await ctx.reply("pong"); });
90
- bot.catch(async (error, ctx) => { await ctx.reply("Terjadi kesalahan."); });
91
- ```
92
-
93
- Router mendukung command, text, regex, pola callback, filter tipe update (`on`), predikat kustom, router bersarang, middleware per rute, dan prioritas rute. `bot.catch()` mendaftarkan error boundary: kegagalan handler diarahkan ke sana alih-alih menolak update.
94
-
95
- ## Telegram API
96
-
97
- Generated method access dan raw access tersedia melalui API client:
98
-
99
- ```ts
100
- await bot.api.methods.getMe();
101
- await bot.api.methods.sendMessage({ chat_id: 123456789, text: "Halo." });
102
- await bot.api.call("sendMessage", { chat_id: 123456789, text: "Halo." });
103
- await bot.api.raw("futureTelegramMethod", { value: true });
104
- ```
105
-
106
- Transport bawaan menggunakan `fetch`, timeout, retry, exponential backoff, JSON payload, dan multipart upload.
107
-
108
- Referensi API lengkap untuk setiap class, function, method, type, error, lifecycle, CLI command, dan generated Telegram method tersedia di [`docs/API.id.md`](docs/API.id.md).
109
-
110
- ## Keyboard
111
-
112
- ```ts
113
- import { InlineKeyboard } from "@xbibzlibrary/telebibz";
114
-
115
- const keyboard = new InlineKeyboard()
116
- .text("Profil", "profile")
117
- .url("Dokumentasi", "https://core.telegram.org/bots/api")
118
- .build();
119
-
120
- await ctx.reply("Pilih menu:", { reply_markup: keyboard });
121
- ```
122
-
123
- Builder hanya menghasilkan payload keyboard native Telegram. UI HTML/CSS memerlukan Mini App atau Web App terpisah.
124
-
125
- ## Startup dan log terminal
126
-
127
- Logger mengeluarkan baris terminal yang ringkas dan mudah dibaca dengan level berwarna serta konteks terstruktur. Level log: `silent`, `error`, `warn`, `info`, `debug`, dan `trace`; nilai sensitif di-redact; error dicetak merah lengkap dengan stack. Gunakan `format: "json"` untuk log terstruktur, dan `includeUpdateContent: true` hanya bila teks pesan atau data callback memang diperlukan.
128
-
129
- ## Wizard dan conversation multi-langkah
130
-
131
- Gunakan `Wizard` bersama `bot.useWizard()` sehingga setiap balasan teks berikutnya dari chat/user yang sama otomatis diarahkan ke langkah yang sedang aktif. Key dihasilkan dari chat dan pengirim Telegram; tidak perlu key manual.
132
-
133
- ```ts
134
- import { Bot, Wizard } from "@xbibzlibrary/telebibz";
135
-
136
- const wizard = new Wizard()
137
- .step({ id: "prompt-name", run: async (flow) => { flow.next(); await flow.ctx.reply("Siapa nama kamu?"); } })
138
- .step({ id: "name", run: async (flow) => { flow.set("name", flow.ctx.message?.text?.trim()); flow.next(); await flow.ctx.reply("Berapa umur kamu?"); } })
139
- .step({ id: "age", run: (flow) => { const age = Number(flow.ctx.message?.text?.trim()); if (!Number.isInteger(age)) return; flow.set("age", age); flow.next(); } });
140
-
141
- const bot = new Bot(process.env.TELEGRAM_BOT_TOKEN!);
142
- bot.useWizard(wizard);
143
- bot.command("start", async (ctx) => { await wizard.run(ctx); });
144
- await bot.start();
145
- ```
146
-
147
- `Wizard` mempertahankan `ConversationManager` defaultnya antar update dan menandai conversation selesai tepat setelah langkah terakhir. Gunakan `/cancel` untuk membatalkan wizard yang sedang berjalan.
148
-
149
- ## Webhook
150
-
151
- ```ts
152
- import { Bot, createWebhookHandler } from "@xbibzlibrary/telebibz";
153
-
154
- const bot = new Bot(process.env.TELEGRAM_BOT_TOKEN!);
155
- const handler = createWebhookHandler(bot, {
156
- secretToken: process.env.TELEGRAM_WEBHOOK_SECRET,
157
- });
158
- ```
159
-
160
- `createWebhookHandler` menerima Request Web standar dan menghasilkan Response. Secret token, ukuran body, parsing JSON, dan penanganan update duplikat diverifikasi oleh handler.
161
-
162
- ## Update beban tinggi dan broadcast
163
-
164
- telebibz dibangun untuk burst 1000+ pesan tanpa cooldown buatan:
165
-
166
- - **Paralel antar chat, berurutan per chat.** Setiap batch `getUpdates` (dan setiap request webhook) diproses secara konkuren — update dari chat berbeda tidak pernah saling mengantre, sementara update dari chat yang sama menjaga urutan kedatangannya sehingga session, wizard, dan conversation tetap benar dan penulisan session tidak pernah hilang. Burst konkuren hanya memicu satu inisialisasi `getMe`. Jika Anda mengelola loop polling sendiri, umpankan batch yang sudah diambil lewat `bot.handleUpdates()`.
167
- - **Tidak ada throttling proaktif.** Permintaan keluar tidak pernah ditunda oleh library. Ketika Telegram menjawab 429, transport menunggu tepat jendela `retry_after` yang diperintahkan Telegram ("flood gate" global melindungi seluruh trafik) lalu otomatis retry — sehingga burst tetap terkirim lengkap, bukan gagal. Untuk batasan downstream Anda sendiri, `Limiter` dan `mapWithConcurrency()` mengatur laju beban kerja apa pun.
168
- - **Broadcast ke 1000+ user sekaligus.** `bot.broadcast()` langsung mencoba semua chat, me-retry 429 sesuai `retry_after` dari Telegram sendiri, dan mengembalikan laporan lengkap.
169
- - **Shutdown yang anggun.** `bot.stop()` lebih dulu menunggu handler yang sedang berjalan selesai (dibatasi `handlerTimeout`) dan baru kemudian menghentikan plugin manager — conversation yang aktif tidak pernah terpotong di tengah penulisan.
170
-
171
- ```ts
172
- const report = await bot.broadcast(
173
- subscriberIds,
174
- (chatId) => bot.api.methods.sendMessage({ chat_id: chatId, text: "Newsletter #42" }),
175
- { onProgress: (p) => console.log(`${p.delivered}/${p.total} terkirim`) },
176
- );
177
- console.log(`Terkirim ${report.delivered}/${report.total} dalam ${report.durationMs}ms`);
178
- ```
179
-
180
- Batasi pekerjaan simultan dengan `new Bot({ ..., updates: { concurrency: 64 } })` atau `broadcast(..., { concurrency: 64 })` jika downstream Anda (database, API) membutuhkannya — secara default keduanya berjalan sepenuhnya paralel.
181
-
182
- ## Paritas penuh Telegraf di permukaan context
183
-
184
- Semua shortcut context Telegraf tersedia, ditambah tambahan yang menutupi apa yang oleh inti Telegraf diserahkan ke ekosistem plugin-nya:
185
-
186
- - **Moderasi & admin** — `ctx.banChatMember`, `ctx.unbanChatMember`, `ctx.restrictChatMember`, `ctx.promoteChatMember`, `ctx.banChatSenderChat`, `ctx.unbanChatSenderChat`
187
- - **Manajemen chat** — `ctx.setChatTitle/Description/Photo`, `ctx.setChatPermissions`, `ctx.leaveChat`, `ctx.unpinAllChatMessages`, `ctx.setChatStickerSet`, `ctx.deleteChatStickerSet`
188
- - **Info** — `ctx.getChatAdministrators`, `ctx.getChatMemberCount`, `ctx.getChatMember`
189
- - **Invite link & join request** — `ctx.exportChatInviteLink`, `ctx.createChatInviteLink`, `ctx.editChatInviteLink`, `ctx.revokeChatInviteLink`, `ctx.approveChatJoinRequest`, `ctx.declineChatJoinRequest`
190
- - **Poll, game, pembayaran** — `ctx.replyWithQuiz`, `ctx.stopPoll`, `ctx.editMessageLiveLocation`, `ctx.stopMessageLiveLocation`, `ctx.replyWithGame`, `ctx.setGameScore`, `ctx.getGameHighScores`, `ctx.replyWithInvoice`
191
- - **Forum topic** — `ctx.createForumTopic`, `ctx.closeForumTopic`, `ctx.editGeneralForumTopic`, dan sembilan lainnya
192
- - **Opsi launch** — `handlerTimeout` (default 90 detik, seperti Telegraf) melempar `UpdateTimeoutError` untuk update yang menggantung sementara handler tetap berjalan; `0` menonaktifkan timeout; `contextType` memasang subclass `Context` Anda sendiri; `dropPendingUpdates` di `start()`/`launch()`
193
- - **Webhook reply** — opt-in `webhookReply: true` menjawab panggilan API pertama lewat respons HTTP webhook itu sendiri (ala Telegraf), dengan `getMe` malas yang tidak pernah mengklaim slot
194
- - **Alias handler drop-in** — `bot.action(...)` mendaftarkan handler callback query sama seperti `bot.callback(...)`, sehingga handler yang ditulis untuk Telegraf bisa dipindahkan tanpa perubahan
195
-
196
- ## State, queue, scheduler, dan cache
197
-
198
- Paket menyediakan `MemoryStorage` dengan TTL dan pembaruan atomik, `JsonFileStorage`, `RedisStorage`, `SqlStorage`, `MongoStorage`, persistent application state storage, session bot, conversation dan form berbasis Storage, menu berbasis permission, pagination `MenuController`, `MemoryCache`, token-bucket limiter, task queue dengan retry/backoff/concurrency/delay/cancel, serta scheduler interval, one-shot, dan cron lima field lengkap. Adapter Redis, SQL, dan Mongo memakai driver kecil sehingga core package tetap tanpa runtime dependency vendor.
199
-
200
- ## Pengalaman terminal
201
-
202
- Saat bot dinyalakan di terminal interaktif (`npm start`, `node index.js`, `telebibz start`), telebibz memainkan urutan startup: efek ketik `Installing Dependencies......`, glass progress bar dengan kilau menyapu, dan banner ASCII rainbow animasi **Tele Bibz** (font figlet `Speed`) yang terus mengalir sampai bot terhubung, lalu diam dengan `✓ Connected as @<username>`.
203
-
204
- Setelah itu, setiap update yang masuk ditampilkan dalam baris log yang mudah dibaca, dan error otomatis berwarna merah lengkap dengan stack-nya:
205
-
206
- ```text
207
- [ => ] Message From 123456789 John Doe 29/08/2026 15:04:05
208
- ↳ Text: /start
209
- [ => ] Callback From 123456789 John Doe 29/08/2026 15:04:07
210
- ↳ Data: menu:open
211
- ```
212
-
213
- Teks pesan/command biasa dibatasi 50 karakter; data tombol callback ditampilkan penuh. Matikan dengan `branding: false` pada `Bot`, atau pakai `logger.format: "json"` untuk log terstruktur. Output non-interaktif (pipe, Docker, CI) otomatis fallback ke teks polos tanpa animasi.
214
-
215
- ## CLI
216
-
217
- Command CLI seperti `telebibz doctor`, `init`, dan `webhook` diawali banner rainbow `Tele Bibz`. Animasi startup otomatis fallback ke output statis bersih saat stdout bukan TTY.
218
-
219
- ```bash
220
- npx telebibz init my-bot
221
- npx telebibz doctor
222
- npx telebibz build
223
- npx telebibz test
224
- ```
225
-
226
- Branding terminal juga dapat dicetak dari aplikasi:
227
-
228
- ```ts
229
- import { printTeleBibzBanner, printTerminalBranding } from "@xbibzlibrary/telebibz";
230
-
231
- printTeleBibzBanner({ subtitle: "Bot saya" });
232
- printTerminalBranding();
233
- ```
234
-
235
- ## Testing
236
-
237
- ```bash
238
- npm run typecheck
239
- npm run test:types
240
- npm run lint
241
- npm test
242
- npm run build
243
- npm run security
244
- npm run release:check
245
- ```
246
-
247
- E2E Telegram nyata memerlukan `TELEGRAM_BOT_TOKEN` dan `TELEGRAM_TEST_CHAT_ID`. Tanpa kredensial, E2E akan dilewati dan tidak dihitung sebagai lulus.
248
-
249
- ## Web App dan pembayaran
250
-
251
- `validateWebAppInitData()` memverifikasi signature dan expiration Telegram Web App. `PaymentsClient` menyediakan wrapper invoice link, invoice, jawaban pre-checkout, jawaban Web App query, transaksi Stars, dan refund Stars. Gunakan `TelegramTypes` serta alias seperti `TelegramUser`, `TelegramMessage`, dan `TelegramUpdate` untuk full Telegram declaration surface yang divendor.
252
-
253
- ## Permukaan API
254
-
255
- Semua yang tercantum di bawah diekspor dari entry point package kecuali disebutkan subpath-nya. Signature lengkap setiap export terdokumentasi di [docs/API.id.md](docs/API.id.md) (juga [docs/API.md](docs/API.md) dan [docs/API.zh-CN.md](docs/API.zh-CN.md)).
256
-
257
- | Area | Export |
258
- |---|---|
259
- | Bot & lifecycle | `Bot` dengan `on`, `onText`, `onRegex`, `command`, `hears`, `callback`, `action`, `catch`, `use`, `usePlugin`, `useWizard`, `handleUpdate`, `handleUpdates`, `start`/`launch`, `stop`, `restart`, `init`, `health`, `broadcast`, `getMe`, `setCommands`, `deleteCommands`, `downloadFile`; `UpdateTimeoutError` |
260
- | Context | `Context`, `ContextOptions`, opsi launch `contextType`; ~80 shortcut di `ctx` untuk balasan, aksi admin, manajemen chat, invite link, poll, game, pembayaran, dan forum topic |
261
- | Telegram API | `ApiClient` dengan `call()`, `request()`, `raw()`, `downloadFile()`, dan `methods` (seluruh generated Bot API method); `FetchTransport` dengan retry 429/5xx otomatis, flood gate global, upload multipart (Blob/byte/path/stream), dan unduhan file |
262
- | Error | `TelegramError` dengan taksonomi `kind` (`retryable`, `rate-limit`, `authentication`, `validation`, `network`, `server`, `unknown`) dan `retryAfter`, plus `TelegramRateLimitError`, `TelegramAuthError`, `TelegramValidationError`, `TelegramNetworkError` |
263
- | Router & middleware | `Router`, `compose`, 24 filter update (`message:photo`, `callback_query:data`, …), `matchMode` (`first`/`all`) |
264
- | Keyboard | `InlineKeyboard`, `ReplyKeyboard`, `removeKeyboard()`, `forceReply()` |
265
- | Storage | `MemoryStorage` (TTL, serialisasi per-key), `JsonFileStorage`, `RedisStorage`, `SqlStorage`, `MongoStorage`, beserta driver interface kecil yang menjadi dasarnya |
266
- | Cache & limiting | `MemoryCache`, `TokenBucketLimiter`, `Limiter`, `mapWithConcurrency()` |
267
- | Queue & scheduler | `TaskQueue` (prioritas, retry, backoff, delay, cancel), `Scheduler` (interval, one-shot, cron), `parseCronExpression()`, `nextCronOccurrence()` |
268
- | State & dialog | `Wizard`, `ConversationManager`, `ConversationFlow`, `Form` dengan `validators`, `Menu` berbasis permission, `MenuController`, `paginate()` |
269
- | Webhook | `createWebhookHandler()` (Request/Response Web), `webhookCallback()` untuk Express/Koa/Fastify/Node `http`, `runWithWebhookReply()`, `claimWebhookReply()` |
270
- | Web App & pembayaran | `parseWebAppInitData()`, `validateWebAppInitData()`, `PaymentsClient`, `TelegramTypes` (deklarasi Telegram yang dibundel) |
271
- | Observability | `Logger` (level, redaction, format JSON), `EventBus` dengan event map `update:*`, `bot:*`, `broadcast:*`, `redact()` |
272
- | Terminal | `printTeleBibzBanner()`, `printTerminalBranding()`, `buildTerminalBranding()`, `runStartupSequence()`, `startTeleBibzBanner()`, `paintRainbow()`, `printStatusLine()` |
273
- | Utilitas teks | `splitMessage()`, `splitCaption()`, `escapeMarkdownV2()`, `escapeHtml()`, `md`, `html`, `template()` |
274
- | Utilitas file | `validateUpload()`, `assertValidUpload()`, `UploadValidationError` (aturan ukuran, MIME, ekstensi) |
275
- | Testing (`@xbibzlibrary/telebibz/testing`) | `MockTransport` (dengan unduhan mock), `createTestBot()`, `createMockUpdate()`, `createMockCallbackUpdate()`, `createMockContext()` |
276
- | CLI (`telebibz …`) | `init`, `doctor`, `build`, `test`, `start`, `webhook`, `generate` |
277
-
278
- ## API target dan batasan
279
-
280
- Daftar method dihasilkan dari dokumentasi Telegram Bot API saat skema diperbarui. Akses runtime tersedia untuk method resmi yang terdeteksi, sedangkan inferensi parameter/result khusus dipusatkan pada core method map. Full declaration Telegram untuk object, union, enum, dan method tersedia melalui `TelegramTypes`. Lihat [FEATURE_MATRIX.md](FEATURE_MATRIX.md) untuk status implementasi dan `docs/API.id.md` untuk referensi API lengkap.
281
-
282
- ## Otomatisasi release
283
-
284
- Repository GitHub menyediakan CI dan workflow auto-publish. Setiap push ke `main` menjalankan quality gates lalu menurunkan versi berikutnya dari Conventional Commits yang didorong: commit `feat:` dan breaking change menaikkan minor selama package belum 1.0 (footer `BREAKING-CHANGE` atau subjek `type!:` menaikkan major mulai 1.0.0), sisanya menaikkan patch. Versi yang sudah dideklarasikan di `package.json` lebih tinggi dari npm diterbitkan persis apa adanya, dan workflow tidak pernah menerbitkan versi yang kurang dari atau sama dengan rilis npm terbaru. Workflow membuat commit versi, tag, menerbitkan ke npm (dengan provenance dinonaktifkan lewat `--provenance=false`), lalu membuat GitHub Release. Commit yang memuat `[skip release]` tidak memicu penerbitan. Konfigurasikan secret `NPM_TOKEN` pada GitHub Actions sebelum mengandalkan publish otomatis. Lihat [RELEASE_AUTOMATION.md](RELEASE_AUTOMATION.md) dan panduan [GitHub Packages](docs/GITHUB_PACKAGES.id.md).
285
-
286
- ## Policy project dan kontribusi
287
-
288
- | Dokumen | Tujuan |
289
- |---|---|
290
- | [CODE_OF_CONDUCT.md](CODE_OF_CONDUCT.md) | Perilaku komunitas, penegakan, pelaporan, dan banding. |
291
- | [CONTRIBUTING.md](CONTRIBUTING.md) | Setup lokal, branch/commit, test, review, dan release workflow. |
292
- | [CONTRIBUTION_RULES.md](CONTRIBUTION_RULES.md) | Aturan API, compatibility, testing, dependency, security, dan release. |
293
- | [GOVERNANCE.md](GOVERNANCE.md) | Peran, pengambilan keputusan, triage, perlindungan repository, dan perubahan aturan. |
294
- | [SECURITY.md](SECURITY.md) | Pelaporan vulnerability privat, batas security, dan rotasi credential. |
295
- | [SUPPORT.md](SUPPORT.md) | Channel support, aturan laporan aman, dan ekspektasi response. |
296
- | [RELEASE_AUTOMATION.md](RELEASE_AUTOMATION.md) | Automation GitHub-to-npm dan setup `NPM_TOKEN`. |
297
- | [RELEASE_POLICY.md](RELEASE_POLICY.md) | Kontrol immutable release dan hardening. |
298
- | [NOTICE.md](NOTICE.md) | Atribusi declaration pihak ketiga. |
299
-
300
- ## Keamanan
301
-
302
- Jangan commit token Telegram atau npm. Gunakan variabel lingkungan atau secret manager. Untuk kebijakan keamanan dan peningkatan keamanan rilis, lihat [SECURITY.md](SECURITY.md) dan [RELEASE_POLICY.md](RELEASE_POLICY.md).
303
-
304
- ## Lisensi
305
-
306
- MIT. Lihat [LICENSE](LICENSE).
package/README.zh-CN.md DELETED
@@ -1,306 +0,0 @@
1
- # telebibz
2
-
3
- ![telebibz 徽标](https://imgbs.com/uploads/telebibz-d7b30671.png)
4
-
5
- [![CI](https://github.com/XbibzOfficial777/telebibz/actions/workflows/ci.yml/badge.svg)](https://github.com/XbibzOfficial777/telebibz/actions/workflows/ci.yml)
6
- [![npm version](https://img.shields.io/npm/v/@xbibzlibrary/telebibz)](https://www.npmjs.com/package/@xbibzlibrary/telebibz)
7
- [![npm downloads](https://img.shields.io/npm/dm/@xbibzlibrary/telebibz)](https://www.npmjs.com/package/@xbibzlibrary/telebibz)
8
- [![Node.js](https://img.shields.io/node/v/@xbibzlibrary/telebibz)](https://www.npmjs.com/package/@xbibzlibrary/telebibz)
9
-
10
- **`@xbibzlibrary/telebibz`** 是一个面向 Node.js 和 TypeScript 的 Telegram Bot SDK 和框架。该包提供 API 客户端、轮询、路由器、中间件、上下文、键盘构造器、状态/会话、Webhook 处理、队列、调度器、缓存、插件生命周期、CLI 以及测试工具。
11
-
12
- [English](README.md) · [Bahasa Indonesia](README.id.md) · **简体中文**
13
-
14
- 完整 API 参考:[English](docs/API.md) · [Indonesia](docs/API.id.md) · **中文**
15
-
16
- GitHub Packages 指南:[English](docs/GITHUB_PACKAGES.md) · [Bahasa Indonesia](docs/GITHUB_PACKAGES.id.md) · [简体中文](docs/GITHUB_PACKAGES.zh-CN.md)
17
-
18
- 存储快速上手(Memory/JSON/Redis/SQL/Mongo):[English](docs/STORAGE.md) · [Bahasa Indonesia](docs/STORAGE.id.md) · [简体中文](docs/STORAGE.zh-CN.md)
19
-
20
- 入门指南:[English](docs/GETTING_STARTED.md) · [Bahasa Indonesia](docs/GETTING_STARTED.id.md) · [简体中文](docs/GETTING_STARTED.zh-CN.md)
21
-
22
- 文件(上传与下载):[English](docs/FILES.md) · [Bahasa Indonesia](docs/FILES.id.md) · [简体中文](docs/FILES.zh-CN.md)
23
-
24
- 错误与限流:[English](docs/ERRORS.md) · [Bahasa Indonesia](docs/ERRORS.id.md) · [简体中文](docs/ERRORS.zh-CN.md)
25
-
26
- Webhook 部署:[English](docs/WEBHOOK.md) · [Bahasa Indonesia](docs/WEBHOOK.id.md) · [简体中文](docs/WEBHOOK.zh-CN.md)
27
-
28
- 测试(用 MockTransport 离线进行):[English](docs/TESTING.md) · [Bahasa Indonesia](docs/TESTING.id.md) · [简体中文](docs/TESTING.zh-CN.md)
29
-
30
- 从 Telegraf 迁移:[English](docs/MIGRATION_TELEGRAF.md) · [Bahasa Indonesia](docs/MIGRATION_TELEGRAF.id.md) · [简体中文](docs/MIGRATION_TELEGRAF.zh-CN.md)
31
-
32
- 生产实战手册(13 个配方):[English](docs/COOKBOOK.md) · [Bahasa Indonesia](docs/COOKBOOK.id.md) · [简体中文](docs/COOKBOOK.zh-CN.md)
33
-
34
- 完整文档目录:[docs/README.md](docs/README.md)
35
-
36
- 社区 showcase:[SHOWCASE.md](SHOWCASE.md)
37
-
38
- ![telebibz 概览](https://cdn.jsdelivr.net/npm/@xbibzlibrary/telebibz@latest/assets/telebibz-readme-preview.png)
39
-
40
- ## 安装
41
-
42
- ```bash
43
- npm install @xbibzlibrary/telebibz
44
- ```
45
-
46
- 需要 Node.js **22 或更高版本**。
47
-
48
- ## 简单机器人
49
-
50
- ```ts
51
- import { Bot } from "@xbibzlibrary/telebibz";
52
-
53
- const bot = new Bot(process.env.TELEGRAM_BOT_TOKEN!);
54
-
55
- bot.command("start", async (ctx) => { await ctx.reply("机器人已启动。"); });
56
- bot.onText("ping", async (ctx) => { await ctx.reply("pong"); });
57
-
58
- await bot.start();
59
- ```
60
-
61
- `Bot.start()` 会运行长轮询。要手动管理生命周期,请使用 `init()`, `launch({ mode: "polling" })`, `health()`, `stop()`, 或 `restart()`。
62
-
63
- ## 官方 starter examples
64
-
65
- repository 提供可直接运行的 minimal bot、多步骤 registration wizard 和 Node.js webhook starter。请查看 [`examples/README.md`](examples/README.md),或设置 `TELEGRAM_BOT_TOKEN` 后运行 minimal starter:
66
-
67
- ```bash
68
- export TELEGRAM_BOT_TOKEN="<your-bot-token>"
69
- npx tsx examples/minimal.ts
70
- ```
71
-
72
- 所有 examples 都会通过 `npm run test:examples` 在 CI 中进行类型检查,并且不包含真实 credential。
73
-
74
- ## 路由器与中间件
75
-
76
- ```ts
77
- bot.use(async (ctx, next) => {
78
- const started = Date.now();
79
- await next();
80
- console.log(`processed in ${Date.now() - started}ms`);
81
- });
82
-
83
- bot.command("help", async (ctx) => { await ctx.reply("可以查看帮助。"); });
84
- bot.onRegex(/^order:(\d+)$/, async (ctx) => { await ctx.reply("订单已收到。"); });
85
- bot.callback("profile:*", async (ctx) => { await ctx.answerCallbackQuery("已打开。"); });
86
- bot.action("menu:open", async (ctx) => { await ctx.answerCallbackQuery("菜单已打开。"); });
87
- bot.on("message:photo", async (ctx) => { await ctx.reply("照片不错。"); });
88
- bot.on(["message:text", "callback_query:data"], async (ctx) => { await ctx.reply("收到。"); });
89
- bot.hears("ping", async (ctx) => { await ctx.reply("pong"); });
90
- bot.catch(async (error, ctx) => { await ctx.reply("出错了。"); });
91
- ```
92
-
93
- 路由器支持命令、文本、正则、回调模式、更新类型过滤器(`on`)、自定义谓词、嵌套路由器、每条路由的中间件,以及路由优先级。`bot.catch()` 注册错误边界:处理器失败会转发到那里,而不是拒绝整个 update。
94
-
95
- ## Telegram API
96
-
97
- 通过 API 客户端可以使用生成的方法调用和原始调用:
98
-
99
- ```ts
100
- await bot.api.methods.getMe();
101
- await bot.api.methods.sendMessage({ chat_id: 123456789, text: "你好。" });
102
- await bot.api.call("sendMessage", { chat_id: 123456789, text: "你好。" });
103
- await bot.api.raw("futureTelegramMethod", { value: true });
104
- ```
105
-
106
- 内置传输使用 `fetch`,支持超时、重试、指数退避、JSON 载荷和多部分上传。
107
-
108
- 关于每个 class、function、method、type、error、lifecycle、CLI 命令和生成的 Telegram 方法的完整 API 参考请参见 [`docs/API.zh-CN.md`](docs/API.zh-CN.md)。
109
-
110
- ## 键盘
111
-
112
- ```ts
113
- import { InlineKeyboard } from "@xbibzlibrary/telebibz";
114
-
115
- const keyboard = new InlineKeyboard()
116
- .text("个人资料", "profile")
117
- .url("文档", "https://core.telegram.org/bots/api")
118
- .build();
119
-
120
- await ctx.reply("请选择菜单:", { reply_markup: keyboard });
121
- ```
122
-
123
- 构造器仅生成 Telegram 原生键盘的 payload。HTML/CSS 的 UI 需要单独的 Mini App 或 Web App。
124
-
125
- ## 启动与终端日志
126
-
127
- Logger 输出紧凑易读的终端日志行,带彩色级别和结构化上下文。日志级别为 `silent`、`error`、`warn`、`info`、`debug` 和 `trace`;敏感值会被 redact;错误以红色打印并带完整堆栈。使用 `format: "json"` 做机器摄取,仅在明确需要消息文本或回调数据时才开启 `includeUpdateContent: true`。
128
-
129
- ## Wizard 与多步会话
130
-
131
- 将 `Wizard` 与 `bot.useWizard()` 配合使用,来自同一 chat/user 的后续每条文本回复都会自动路由到当前步骤。Key 由 Telegram chat 和发送者生成,无需手动指定。
132
-
133
- ```ts
134
- import { Bot, Wizard } from "@xbibzlibrary/telebibz";
135
-
136
- const wizard = new Wizard()
137
- .step({ id: "prompt-name", run: async (flow) => { flow.next(); await flow.ctx.reply("你叫什么名字?"); } })
138
- .step({ id: "name", run: async (flow) => { flow.set("name", flow.ctx.message?.text?.trim()); flow.next(); await flow.ctx.reply("你多大了?"); } })
139
- .step({ id: "age", run: (flow) => { const age = Number(flow.ctx.message?.text?.trim()); if (!Number.isInteger(age)) return; flow.set("age", age); flow.next(); } });
140
-
141
- const bot = new Bot(process.env.TELEGRAM_BOT_TOKEN!);
142
- bot.useWizard(wizard);
143
- bot.command("start", async (ctx) => { await wizard.run(ctx); });
144
- await bot.start();
145
- ```
146
-
147
- `Wizard` 在 update 之间保持其默认的 `ConversationManager`,并在最后一步完成后立即标记会话完成。使用 `/cancel` 可取消正在进行的 wizard。
148
-
149
- ## Webhook
150
-
151
- ```ts
152
- import { Bot, createWebhookHandler } from "@xbibzlibrary/telebibz";
153
-
154
- const bot = new Bot(process.env.TELEGRAM_BOT_TOKEN!);
155
- const handler = createWebhookHandler(bot, {
156
- secretToken: process.env.TELEGRAM_WEBHOOK_SECRET,
157
- });
158
- ```
159
-
160
- `createWebhookHandler` 接受标准 Web `Request` 并返回 `Response`。处理程序会验证 secret token、body 大小、JSON 解析以及重复更新处理。
161
-
162
- ## 高负载更新与广播
163
-
164
- telebibz 为 1000+ 条消息的突发场景而生,没有任何人为冷却:
165
-
166
- - **跨 chat 并行,同一 chat 内按序。** 每个 `getUpdates` 批次(以及每个 webhook 请求)都并发处理——不同 chat 的 update 不会互相排队,而同一 chat 的 update 保持到达顺序,因此会话、wizard 和 conversation 始终正确,会话写入永不丢失。并发突发只触发一次 `getMe` 初始化。如果你自己持有轮询循环,可用 `bot.handleUpdates()` 直接喂入已拉取的批次。
167
- - **没有主动限流。** 库永远不会延迟外发请求。当 Telegram 返回 429 时,transport 会严格按照 Telegram 指定的 `retry_after` 窗口等待(全局 "flood gate" 保护所有进行中的流量)并自动重试——因此突发流量会完整送达而不是失败。针对你自己的下游限制,`Limiter` 与 `mapWithConcurrency()` 可为任意工作负载整形速率。
168
- - **一次性向 1000+ 用户广播。** `bot.broadcast()` 立即尝试所有 chat,按照 Telegram 自己的 `retry_after` 重试 429,并返回完整报告。
169
- - **优雅停机。** `bot.stop()` 会先等待进行中的 handler 完成(受 `handlerTimeout` 约束),然后才停止 plugin manager——进行中的会话绝不会在写入途中被截断。
170
-
171
- ```ts
172
- const report = await bot.broadcast(
173
- subscriberIds,
174
- (chatId) => bot.api.methods.sendMessage({ chat_id: chatId, text: "Newsletter #42" }),
175
- { onProgress: (p) => console.log(`${p.delivered}/${p.total} delivered`) },
176
- );
177
- console.log(`Delivered ${report.delivered}/${report.total} in ${report.durationMs}ms`);
178
- ```
179
-
180
- 当你自己的下游(数据库、API)需要时,可以用 `new Bot({ ..., updates: { concurrency: 64 } })` 或 `broadcast(..., { concurrency: 64 })` 限制并发——默认情况下两者都完全并行。
181
-
182
- ## Context 表面与 Telegraf 完全对齐
183
-
184
- Telegraf 的每一个 context 快捷方法都可用,还包含补齐 Telegraf 核心交给其插件生态的部分:
185
-
186
- - **管理与封禁** — `ctx.banChatMember`、`ctx.unbanChatMember`、`ctx.restrictChatMember`、`ctx.promoteChatMember`、`ctx.banChatSenderChat`、`ctx.unbanChatSenderChat`
187
- - **聊天管理** — `ctx.setChatTitle/Description/Photo`、`ctx.setChatPermissions`、`ctx.leaveChat`、`ctx.unpinAllChatMessages`、`ctx.setChatStickerSet`、`ctx.deleteChatStickerSet`
188
- - **信息** — `ctx.getChatAdministrators`、`ctx.getChatMemberCount`、`ctx.getChatMember`
189
- - **邀请链接与加群申请** — `ctx.exportChatInviteLink`、`ctx.createChatInviteLink`、`ctx.editChatInviteLink`、`ctx.revokeChatInviteLink`、`ctx.approveChatJoinRequest`、`ctx.declineChatJoinRequest`
190
- - **投票、游戏、支付** — `ctx.replyWithQuiz`、`ctx.stopPoll`、`ctx.editMessageLiveLocation`、`ctx.stopMessageLiveLocation`、`ctx.replyWithGame`、`ctx.setGameScore`、`ctx.getGameHighScores`、`ctx.replyWithInvoice`
191
- - **论坛主题** — `ctx.createForumTopic`、`ctx.closeForumTopic`、`ctx.editGeneralForumTopic` 等九个
192
- - **启动选项** — `handlerTimeout`(默认 90 秒,与 Telegraf 一致)以 `UpdateTimeoutError` 拒绝挂起的 update,同时 handler 继续运行;传 `0` 可禁用超时;`contextType` 接入你自己的 `Context` 子类;`start()`/`launch()` 的 `dropPendingUpdates`
193
- - **Webhook 应答** — 选择性开启的 `webhookReply: true` 让第一个 API 调用直接通过 webhook HTTP 响应本身应答(Telegraf 风格),懒加载的 `getMe` 永远不会占用槽位
194
- - **即插即用的 handler 别名** — `bot.action(...)` 与 `bot.callback(...)` 一样注册回调查询 handler,为 Telegraf 编写的 handler 可以原样迁移
195
-
196
- ## 状态、队列、调度器和缓存
197
-
198
- 该包提供带 TTL 和原子更新的 `MemoryStorage`、`JsonFileStorage`、`RedisStorage`、`SqlStorage`、`MongoStorage`、bot session、基于 Storage 的 conversation/form、基于 permission 的菜单、`MenuController` 分页、`MemoryCache`、令牌桶限流器、支持重试/退避/并发/延迟/取消的任务队列,以及间隔、一次性和完整五字段 cron 的调度器。Redis、SQL 和 Mongo 适配器使用小型 driver interface,因此 core package 不需要 vendor runtime dependency。
199
-
200
- ## 终端体验
201
-
202
- 当 bot 在交互式终端启动时(`npm start`、`node index.js`、`telebibz start`),telebibz 会播放启动序列:`Installing Dependencies......` 打字效果、带扫过高光的 glass 进度条,以及动画彩虹 ASCII 横幅 **Tele Bibz**(figlet `Speed` 字体)——彩虹持续流动直到 bot 连接成功,随后定格并显示 `✓ Connected as @<username>`。
203
-
204
- 之后,每一条进入的 update 都会以易读的格式输出,错误自动以红色打印并附带完整堆栈:
205
-
206
- ```text
207
- [ => ] Message From 123456789 John Doe 29/08/2026 15:04:05
208
- ↳ Text: /start
209
- [ => ] Callback From 123456789 John Doe 29/08/2026 15:04:07
210
- ↳ Data: menu:open
211
- ```
212
-
213
- 普通消息与命令文本截断为 50 个字符;回调按钮数据完整显示。向 `Bot` 传入 `branding: false` 可关闭启动序列,或设置 `logger.format: "json"` 获取结构化日志。非交互 stdout(管道、Docker、CI)会自动回退到无动画的纯文本输出。
214
-
215
- ## CLI
216
-
217
- `telebibz doctor`、`init`、`webhook` 等 CLI command 以彩虹 `Tele Bibz` 横幅开始。当 stdout 不是 TTY 时,启动动画自动回退为干净的静态输出。
218
-
219
- ```bash
220
- npx telebibz init my-bot
221
- npx telebibz doctor
222
- npx telebibz build
223
- npx telebibz test
224
- ```
225
-
226
- 也可以在应用中打印相同的 terminal branding:
227
-
228
- ```ts
229
- import { printTeleBibzBanner, printTerminalBranding } from "@xbibzlibrary/telebibz";
230
-
231
- printTeleBibzBanner({ subtitle: "My bot" });
232
- printTerminalBranding();
233
- ```
234
-
235
- ## 测试
236
-
237
- ```bash
238
- npm run typecheck
239
- npm run test:types
240
- npm run lint
241
- npm test
242
- npm run build
243
- npm run security
244
- npm run release:check
245
- ```
246
-
247
- 真实的 Telegram E2E 需要 `TELEGRAM_BOT_TOKEN` 和 `TELEGRAM_TEST_CHAT_ID`。没有凭证时,E2E 将被跳过且不计为通过。
248
-
249
- ## Web App 和支付
250
-
251
- `validateWebAppInitData()` 会验证 Telegram Web App 的 signature 和 expiration。`PaymentsClient` 提供 invoice link、invoice、pre-checkout answer、Web App query answer、Stars transactions 和 Stars refunds 的 wrapper。使用 `TelegramTypes` 以及 `TelegramUser`、`TelegramMessage`、`TelegramUpdate` 等 alias 来访问完整的 vendored Telegram declaration surface。
252
-
253
- ## API 表面
254
-
255
- 除注明 subpath 外,以下所有内容都从 package 入口导出。每个导出的完整签名见 [docs/API.zh-CN.md](docs/API.zh-CN.md)(另有 [docs/API.md](docs/API.md) 与 [docs/API.id.md](docs/API.id.md))。
256
-
257
- | 领域 | 导出 |
258
- |---|---|
259
- | Bot 与生命周期 | `Bot` 的 `on`、`onText`、`onRegex`、`command`、`hears`、`callback`、`action`、`catch`、`use`、`usePlugin`、`useWizard`、`handleUpdate`、`handleUpdates`、`start`/`launch`、`stop`、`restart`、`init`、`health`、`broadcast`、`getMe`、`setCommands`、`deleteCommands`、`downloadFile`;`UpdateTimeoutError` |
260
- | Context | `Context`、`ContextOptions`、launch 选项 `contextType`;`ctx` 上约 80 个快捷方法,覆盖回复、管理员操作、聊天管理、邀请链接、投票、游戏、支付与论坛主题 |
261
- | Telegram API | `ApiClient` 的 `call()`、`request()`、`raw()`、`downloadFile()` 与 `methods`(全部生成的 Bot API 方法);`FetchTransport` 自带 429/5xx 自动重试、全局 flood gate、multipart 上传(Blob/字节/路径/流)以及文件下载 |
262
- | 错误 | `TelegramError` 带 `kind` 分类(`retryable`、`rate-limit`、`authentication`、`validation`、`network`、`server`、`unknown`)与 `retryAfter`,另有 `TelegramRateLimitError`、`TelegramAuthError`、`TelegramValidationError`、`TelegramNetworkError` |
263
- | 路由器与中间件 | `Router`、`compose`、24 个 update 过滤器(`message:photo`、`callback_query:data` 等)、`matchMode`(`first`/`all`) |
264
- | 键盘 | `InlineKeyboard`、`ReplyKeyboard`、`removeKeyboard()`、`forceReply()` |
265
- | 存储 | `MemoryStorage`(TTL、按 key 串行化)、`JsonFileStorage`、`RedisStorage`、`SqlStorage`、`MongoStorage`,以及它们所基于的小型 driver interface |
266
- | 缓存与限流 | `MemoryCache`、`TokenBucketLimiter`、`Limiter`、`mapWithConcurrency()` |
267
- | 队列与调度器 | `TaskQueue`(优先级、重试、退避、延迟、取消)、`Scheduler`(间隔、一次性、cron)、`parseCronExpression()`、`nextCronOccurrence()` |
268
- | 状态与对话 | `Wizard`、`ConversationManager`、`ConversationFlow`、带 `validators` 的 `Form`、基于 permission 的 `Menu`、`MenuController`、`paginate()` |
269
- | Webhook | `createWebhookHandler()`(Web `Request`/`Response`)、面向 Express/Koa/Fastify/Node `http` 的 `webhookCallback()`、`runWithWebhookReply()`、`claimWebhookReply()` |
270
- | Web App 与支付 | `parseWebAppInitData()`、`validateWebAppInitData()`、`PaymentsClient`、`TelegramTypes`(内置的 Telegram 声明) |
271
- | 可观测性 | `Logger`(级别、redaction、JSON 格式)、带 `update:*`、`bot:*`、`broadcast:*` 事件映射的 `EventBus`、`redact()` |
272
- | 终端 | `printTeleBibzBanner()`、`printTerminalBranding()`、`buildTerminalBranding()`、`runStartupSequence()`、`startTeleBibzBanner()`、`paintRainbow()`、`printStatusLine()` |
273
- | 文本工具 | `splitMessage()`、`splitCaption()`、`escapeMarkdownV2()`、`escapeHtml()`、`md`、`html`、`template()` |
274
- | 文件工具 | `validateUpload()`、`assertValidUpload()`、`UploadValidationError`(大小、MIME、扩展名规则) |
275
- | 测试(`@xbibzlibrary/telebibz/testing`) | `MockTransport`(含 mock 下载)、`createTestBot()`、`createMockUpdate()`、`createMockCallbackUpdate()`、`createMockContext()` |
276
- | CLI(`telebibz …`) | `init`、`doctor`、`build`、`test`、`start`、`webhook`、`generate` |
277
-
278
- ## API 目标与限制
279
-
280
- 方法列表会在 schema 更新时根据 Telegram Bot API 文档生成。检测到的官方方法都可以运行时访问,而专门的参数/结果推断主要集中在 core method map。完整的 Telegram object、union、enum 和 method declaration 可通过 `TelegramTypes` 使用。有关实现状态请参见 [FEATURE_MATRIX.md](FEATURE_MATRIX.md),完整 API 请参见 `docs/API.zh-CN.md`。
281
-
282
- ## 发布自动化
283
-
284
- GitHub repository 提供 CI 和自动发布 workflow。每次推送到 `main` 都会运行 quality gates,并从推送的 Conventional Commits 推导下一个版本:`feat:` 提交和破坏性变更在 package 处于 1.0 之前提升 minor(`BREAKING-CHANGE` footer 或 `type!:` 主题自 1.0.0 起提升 major),其余提升 patch。`package.json` 中已声明且高于 npm 的版本会按声明原样发布,workflow 绝不会发布低于或等于 npm 最新版的版本。workflow 会创建版本 commit 和 tag,发布到 npm(通过 `--provenance=false` 禁用 provenance),并创建 GitHub Release。包含 `[skip release]` 的提交不会触发发布。依赖自动发布前,请在 GitHub Actions 中配置 `NPM_TOKEN` secret。请参阅 [RELEASE_AUTOMATION.md](RELEASE_AUTOMATION.md) 和 [GitHub Packages 指南](docs/GITHUB_PACKAGES.zh-CN.md)。
285
-
286
- ## 项目 policy 和贡献
287
-
288
- | 文档 | 用途 |
289
- |---|---|
290
- | [CODE_OF_CONDUCT.md](CODE_OF_CONDUCT.md) | 社区行为、执行、报告和申诉。 |
291
- | [CONTRIBUTING.md](CONTRIBUTING.md) | 本地 setup、branch/commit、测试、review 和 release workflow。 |
292
- | [CONTRIBUTION_RULES.md](CONTRIBUTION_RULES.md) | API、兼容性、测试、依赖、安全和 release 规则。 |
293
- | [GOVERNANCE.md](GOVERNANCE.md) | 角色、决策、triage、repository protection 和规则修改。 |
294
- | [SECURITY.md](SECURITY.md) | 私密漏洞报告、security boundary 和 credential rotation。 |
295
- | [SUPPORT.md](SUPPORT.md) | Support channel、安全报告规则和 response 预期。 |
296
- | [RELEASE_AUTOMATION.md](RELEASE_AUTOMATION.md) | GitHub-to-npm automation 和 `NPM_TOKEN` setup。 |
297
- | [RELEASE_POLICY.md](RELEASE_POLICY.md) | Immutable release 和 hardening 控制。 |
298
- | [NOTICE.md](NOTICE.md) | 第三方 declaration attribution。 |
299
-
300
- ## 安全
301
-
302
- 不要将 Telegram token 或 npm 凭证提交到版本控制。使用环境变量或机密管理器。有关安全策略和发布加固,请参见 [SECURITY.md](SECURITY.md) 和 [RELEASE_POLICY.md](RELEASE_POLICY.md)。
303
-
304
- ## 许可证
305
-
306
- MIT。参见 [LICENSE](LICENSE)。