@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.md CHANGED
@@ -1,315 +1,232 @@
1
- # telebibz
1
+ # 🤖 telebibz
2
2
 
3
- ![telebibz logo](https://imgbs.com/uploads/telebibz-d7b30671.png)
3
+ **Library Telegram paling gampang untuk Node.js, set fitur penuh setara grammY** — recode mandiri atas arsitektur elegan [grammY](https://grammy.dev) (MIT — lihat [NOTICE.md](NOTICE.md)) dengan dependency produksi yang **benar-benar dipakai** (axios keep-alive, mime-types, https-proxy-agent, debug).
4
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`** is a Telegram Bot SDK and framework for Node.js and TypeScript. It provides a typed API client, polling, routing, middleware, context helpers, keyboard builders, state/session primitives, webhooks, queues, scheduling, caching, plugin lifecycle, colorful terminal logging, CLI tooling, and testing utilities.
11
-
12
- ## Documentation languages
13
-
14
- **English (default)** · [Bahasa Indonesia](README.id.md) · [简体中文](README.zh-CN.md)
15
-
16
- Complete API references: [English](docs/API.md) · [Indonesia](docs/API.id.md) · [中文](docs/API.zh-CN.md)
17
-
18
- GitHub Packages guide: [English](docs/GITHUB_PACKAGES.md) · [Bahasa Indonesia](docs/GITHUB_PACKAGES.id.md) · [简体中文](docs/GITHUB_PACKAGES.zh-CN.md)
19
-
20
- Storage quick start (Memory/JSON/Redis/SQL/Mongo): [English](docs/STORAGE.md) · [Bahasa Indonesia](docs/STORAGE.id.md) · [简体中文](docs/STORAGE.zh-CN.md)
21
-
22
- Getting started: [English](docs/GETTING_STARTED.md) · [Bahasa Indonesia](docs/GETTING_STARTED.id.md) · [简体中文](docs/GETTING_STARTED.zh-CN.md)
23
-
24
- Files (upload & download): [English](docs/FILES.md) · [Bahasa Indonesia](docs/FILES.id.md) · [简体中文](docs/FILES.zh-CN.md)
25
-
26
- Errors & rate limits: [English](docs/ERRORS.md) · [Bahasa Indonesia](docs/ERRORS.id.md) · [简体中文](docs/ERRORS.zh-CN.md)
27
-
28
- Webhook deployment: [English](docs/WEBHOOK.md) · [Bahasa Indonesia](docs/WEBHOOK.id.md) · [简体中文](docs/WEBHOOK.zh-CN.md)
29
-
30
- Testing (offline with MockTransport): [English](docs/TESTING.md) · [Bahasa Indonesia](docs/TESTING.id.md) · [简体中文](docs/TESTING.zh-CN.md)
31
-
32
- Migrating from Telegraf: [English](docs/MIGRATION_TELEGRAF.md) · [Bahasa Indonesia](docs/MIGRATION_TELEGRAF.id.md) · [简体中文](docs/MIGRATION_TELEGRAF.zh-CN.md)
33
-
34
- Production cookbook (13 recipes): [English](docs/COOKBOOK.md) · [Bahasa Indonesia](docs/COOKBOOK.id.md) · [简体中文](docs/COOKBOOK.zh-CN.md)
35
-
36
- Full documentation catalog: [docs/README.md](docs/README.md)
37
-
38
- Community showcase: [SHOWCASE.md](SHOWCASE.md)
39
-
40
- ![telebibz overview](https://cdn.jsdelivr.net/npm/@xbibzlibrary/telebibz@latest/assets/telebibz-readme-preview.png)
41
-
42
- ## Installation
43
-
44
- ```bash
5
+ ```
45
6
  npm install @xbibzlibrary/telebibz
46
7
  ```
47
8
 
48
- Node.js **22 or newer** is required.
49
-
50
- ## Minimal bot
51
-
52
- ```ts
53
- import { Bot } from "@xbibzlibrary/telebibz";
9
+ ## 📊 FEATURE MATRIX (parity grammY)
10
+
11
+ | Fitur | grammY | telebibz |
12
+ |---|---|---|
13
+ | Proxy API **segala metode** (auto-generated) | ✅ `api.xyz()` | ✅ `api.xyz({...})` |
14
+ | ~60 shortcut bertipe (sendMessage, banChatMember…) | ✅ | ✅ |
15
+ | Context lengkap (~70 pintasan reply/edit/admin/react) | ✅ | ✅ |
16
+ | Context flavor business (`business_connection_id` otomatis) | plugin | ✅ bawaan |
17
+ | Filter `on('message:photo' / ':text' / 'chat_type:private' …)` | ✅ | ✅ |
18
+ | `cmd / hears / action / inlineQuery` | ✅ | ✅ (+ inlineQuery matcher) |
19
+ | `branch / filter / drop / route / lazy / fork` | ✅ | ✅ |
20
+ | Error boundary + catch | ✅ | ✅ (semua shortcut otomatis terlindungi) |
21
+ | Session + storage swappable | ✅ | ✅ |
22
+ | Transformer API (`api.config.use`) | ✅ | ✅ |
23
+ | `auto-retry` 429 hormati `retry_after` | plugin (@grammyjs/auto-retry) | ✅ bawaan `autoRetry()` |
24
+ | Throttler antre-rate-limit | plugin | ✅ bawaan `throttler()` |
25
+ | Rate limit per-user | plugin | ✅ bawaan `limiter()` |
26
+ | `InputFile` Buffer/path/stream + multipart attach:// | ✅ | ✅ |
27
+ | `InputMedia` builder + media group | ✅ | ✅ `InputMediaBuilder` |
28
+ | Download file (`getFile`/`downloadFile`) | plugin grammy/files | ✅ bawaan |
29
+ | Keyboard & InlineKeyboard fluent class | ✅ | ✅ |
30
+ | Menu interaktif | plugin @grammyjs/menu | ✅ bawaan `Menu/MenuContainer` |
31
+ | Wizard/percakapan | plugin conversations | ✅ bawaan `wizard()` (lebih simpel) |
32
+ | Long polling tahan-409 | ❌ (fatal crash) | ✅ bawaan (auto-retry 5 dtk) |
33
+ | Broadcast siap pakai | ❌ | ✅ `bot.broadcast()` |
34
+ | Humanisasi error + saran (🇮🇩) | ❌ | ✅ `humanize()` |
35
+ | Banner boot cantik + log debug | ❌ | ✅ (`DEBUG=telebibz*`) |
36
+ | Proxy HTTP(S) untuk VPS | ⚠️ via config manual | ✅ opsi `proxy` transport |
37
+ | TypeScript | ✅ full | d.ts longgar (JS-first) |
38
+ | Docs bahasa | en | **🇮🇩 Indonesia-first** |
39
+
40
+ ## Dependensi (semuanya dipakai nyata — tertest)
41
+ | Paket | Untuk |
42
+ |---|---|
43
+ | `axios ^1.20` | transport keep-alive + streaming downloadFile |
44
+ | `mime-types ^3.0` | deteksi content-type upload |
45
+ | `https-proxy-agent ^9.1` | opsi proxy transport VPS |
46
+ | `debug ^4.4` | logging `DEBUG=telebibz:net,telebibz:ratelimit` |
54
47
 
55
- const bot = new Bot(process.env.TELEGRAM_BOT_TOKEN!);
48
+ > *"Kenapa bukan protobuf?"* — Bot API memakai **JSON/HTTP murni**, protobuf hanya relevan di dunia MTProto (user-client). Menambahkannya = dependency mati, melanggar prinsip *"semua library harus berfungsi"*.
56
49
 
57
- bot.command("start", async (ctx) => { await ctx.reply("Bot is active."); });
58
- bot.onText("ping", async (ctx) => { await ctx.reply("pong"); });
50
+ ---
59
51
 
60
- await bot.start();
61
- ```
52
+ ## 🚀 Mulai dalam 6 baris
62
53
 
63
- `Bot.start()` runs long polling. For manual lifecycle control, use `init()`, `launch({ mode: "polling" })`, `health()`, `stop()`, or `restart()`.
54
+ ```js
55
+ const { TeleBibz } = require('@xbibzlibrary/telebibz');
64
56
 
65
- ## Official starter examples
57
+ const bot = new TeleBibz('TOKEN_DARI_BOTFATHER');
66
58
 
67
- The repository includes runnable starters for a minimal bot, a multi-step registration wizard, and a Node.js webhook server. Browse [`examples/README.md`](examples/README.md), or run the minimal starter after setting `TELEGRAM_BOT_TOKEN`:
59
+ bot.cmd('start', (ctx) => ctx.reply('Halo!'));
60
+ bot.hears(/halo/i, (ctx) => ctx.reply('halo juga 👋'));
68
61
 
69
- ```bash
70
- export TELEGRAM_BOT_TOKEN="<your-bot-token>"
71
- npx tsx examples/minimal.ts
62
+ bot.launch();
72
63
  ```
73
64
 
74
- The examples are typechecked in CI with `npm run test:examples` and never contain real credentials.
75
-
76
- ## Router and middleware
77
-
78
- ```ts
79
- bot.use(async (ctx, next) => {
80
- const started = Date.now();
81
- await next();
82
- console.log(`processed in ${Date.now() - started}ms`);
83
- });
84
-
85
- bot.command("help", async (ctx) => { await ctx.reply("Help is available."); });
86
- bot.onRegex(/^order:(\d+)$/, async (ctx) => { await ctx.reply("Order received."); });
87
- bot.callback("profile:*", async (ctx) => { await ctx.answerCallbackQuery("Opened."); });
88
- bot.action("menu:open", async (ctx) => { await ctx.answerCallbackQuery("Menu opened."); });
89
- bot.on("message:photo", async (ctx) => { await ctx.reply("Nice photo."); });
90
- bot.on(["message:text", "callback_query:data"], async (ctx) => { await ctx.reply("Got it."); });
91
- bot.hears("ping", async (ctx) => { await ctx.reply("pong"); });
92
- bot.catch(async (error, ctx) => { await ctx.reply("Something went wrong."); });
93
65
  ```
94
-
95
- The router supports commands, exact text, regular expressions, callback patterns, update-type filters (`on`), custom predicates, nested routers, per-route middleware, and route priority. `bot.catch()` registers an error boundary: handler failures are routed there instead of rejecting the update.
96
-
97
- ## Telegram API
98
-
99
- Generated method access and raw access are available through the API client:
100
-
101
- ```ts
102
- await bot.api.methods.getMe();
103
- await bot.api.methods.sendMessage({ chat_id: 123456789, text: "Hello." });
104
- await bot.api.call("sendMessage", { chat_id: 123456789, text: "Hello." });
105
- await bot.api.raw("futureTelegramMethod", { value: true });
66
+ BOT_TOKEN=123:abc node index.js
106
67
  ```
107
68
 
108
- The built-in transport uses `fetch`, timeouts, retries, exponential backoff, JSON payloads, and multipart upload.
109
-
110
- ## Keyboard builders
111
-
112
- ```ts
113
- import { InlineKeyboard } from "@xbibzlibrary/telebibz";
114
-
115
- const keyboard = new InlineKeyboard()
116
- .text("Profile", "profile")
117
- .url("Documentation", "https://core.telegram.org/bots/api")
118
- .build();
119
-
120
- await ctx.reply("Choose an option:", { reply_markup: keyboard });
69
+ Output terminal:
121
70
  ```
122
-
123
- Builders produce native Telegram keyboard payloads. HTML/CSS interfaces require a separate Mini App or Web App.
124
-
125
- ## Colorful runtime logging
126
-
127
- The logger emits compact, readable terminal lines with colored levels and structured context. Log levels are `silent`, `error`, `warn`, `info`, `debug`, and `trace`; sensitive values are redacted; errors print in red with the full stack. Use `format: "json"` for machine ingestion and `includeUpdateContent: true` only when message text or callback data is explicitly required.
128
-
129
- ```ts
130
- const bot = new Bot({
131
- token: process.env.TELEGRAM_BOT_TOKEN!,
132
- logger: { level: "debug", format: "pretty", color: true },
133
- });
71
+ ┌────────────────────────┐
72
+ │ 🤖 TeleBibz ON │
73
+ │ bot : @botkamu │
74
+ │ engine : grammY 1.46│
75
+ │ brand : //—Xbibz Official—//
76
+ └────────────────────────┘
77
+ ✔ menunggu update… (Ctrl+C untuk berhenti)
134
78
  ```
135
79
 
80
+ > **Hidup di VPS:** kalau ada instance bot lain yang masih polling (409 Conflict — misal deploy
81
+ > ganda atau hosting restart), telebibz **otomatis retry tiap 5 detik tanpa crash** dan menyalakan
82
+ > diri begitu jalur bebas. Tidak perlu PM2 babysitter.
136
83
 
137
- ## Wizards and multi-step conversations
84
+ ---
138
85
 
139
- Use `Wizard` with `bot.useWizard()` so every subsequent text reply from the same chat/user is routed to the active step automatically. The key is generated from the Telegram chat and sender; no manual key is required.
86
+ ## 📚 API lengkap (semuanya!)
140
87
 
141
- ```ts
142
- import { Bot, Wizard } from "@xbibzlibrary/telebibz";
88
+ ### Perintah & teks
143
89
 
144
- const wizard = new Wizard()
145
- .step({ id: "prompt-name", run: async (flow) => { flow.next(); await flow.ctx.reply("What is your name?"); } })
146
- .step({ id: "name", run: async (flow) => { flow.set("name", flow.ctx.message?.text?.trim()); flow.next(); await flow.ctx.reply("How old are you?"); } })
147
- .step({ id: "age", run: (flow) => { const age = Number(flow.ctx.message?.text?.trim()); if (!Number.isInteger(age)) return; flow.set("age", age); flow.next(); } });
148
-
149
- const bot = new Bot(process.env.TELEGRAM_BOT_TOKEN!);
150
- bot.useWizard(wizard);
151
- bot.command("start", async (ctx) => { await wizard.run(ctx); });
152
- await bot.start();
90
+ ```js
91
+ bot.cmd('ping', (ctx) => ctx.reply('pong')); // /ping
92
+ bot.cmd(['a', 'b'], handler); // /a ATAU /b
93
+ bot.hears('daftar', handler); // teks persis "daftar"
94
+ bot.hears(/kampret/i, handler); // regex bebas
95
+ bot.on('message:photo', handler); // filter grammY apa pun
96
+ bot.use(middleware); // middleware manual
153
97
  ```
154
98
 
155
- `Wizard` keeps its default `ConversationManager` across updates and marks the conversation completed immediately after the final step. Use `/cancel` to cancel an active wizard.
99
+ ### Tombol (keyboard) berwarna & ikon animated
156
100
 
157
- ## Webhook
101
+ ```js
102
+ const { btn, url, webApp, copy, kb } = require('@xbibzlibrary/telebibz');
158
103
 
159
- ```ts
160
- import { Bot, createWebhookHandler } from "@xbibzlibrary/telebibz";
104
+ bot.cmd('menu', (ctx) =>
105
+ ctx.reply('Pilih:', kb([
106
+ [btn('💎 Premium', 'prem', 'primary'), // biru/ungu
107
+ btn('✅ Daftar', 'reg', 'success')], // hijau
108
+ [url('🌐 Web', 'https://situsmu.com')],
109
+ [btn('❌ Tutup', 'close', 'danger', '5408846744727334338')], // merah + IKON ANIMASI
110
+ ])));
161
111
 
162
- const bot = new Bot(process.env.TELEGRAM_BOT_TOKEN!);
163
- const handler = createWebhookHandler(bot, {
164
- secretToken: process.env.TELEGRAM_WEBHOOK_SECRET,
112
+ bot.action('prem', async (ctx) => {
113
+ await ctx.answerCallbackQuery('Menuju premium…');
114
+ await ctx.reply('halaman premium');
165
115
  });
166
116
  ```
167
117
 
168
- `createWebhookHandler` accepts a standard Web `Request` and returns a `Response`. It verifies the optional secret token, body size, JSON payload, and update shape before calling `bot.handleUpdate()`.
169
-
170
- ## High-load updates and broadcast
118
+ - Warna (`primary`/`success`/`danger`) butuh aplikasi Telegram rilis Feb 2026 versi lama tampil biasa, tidak error.
119
+ - Ikon animated (`icon_custom_emoji_id`) butuh **owner bot ber-Premium** atau username Fragment. Cari ID-nya: kirim custom emoji ke bot + lihat entity `custom_emoji` di update (atau sediakan `/emojiid` sendiri, 5 baris lewat `bot.on('message')`).
171
120
 
172
- telebibz is built for bursts of 1000+ messages with no artificial cooldown:
121
+ ### Wizard form tanya-jawab tanpa boilerplate
173
122
 
174
- - **Parallel across chats, ordered per chat.** Every `getUpdates` batch (and every webhook request) is processed concurrently — updates from different chats never queue behind each other, while updates from the same chat keep their arrival order so sessions, wizards, and conversations stay correct and session writes are never lost. A concurrent burst triggers exactly one `getMe` initialization. Feed pre-fetched batches yourself with `bot.handleUpdates()` when you own the polling loop.
175
- - **No proactive throttling.** Outgoing requests are never delayed by the library. When Telegram answers 429, the transport waits exactly the `retry_after` window Telegram ordered (a global "flood gate" protects all in-flight traffic) and retries automatically — so bursts deliver completely instead of failing. For your own downstream limits, `Limiter` and `mapWithConcurrency()` rate-shape any workload.
176
- - **Broadcast to 1000+ users at once.** `bot.broadcast()` attempts every chat immediately, retries 429s per Telegram's own `retry_after`, and returns a full report.
177
- - **Graceful shutdown.** `bot.stop()` first waits for in-flight handlers to finish (bounded by `handlerTimeout`) and only then stops the plugin manager — active conversations are never truncated mid-write.
178
-
179
- ```ts
180
- const report = await bot.broadcast(
181
- subscriberIds,
182
- (chatId) => bot.api.methods.sendMessage({ chat_id: chatId, text: "Newsletter #42" }),
183
- { onProgress: (p) => console.log(`${p.delivered}/${p.total} delivered`) },
184
- );
185
- console.log(`Delivered ${report.delivered}/${report.total} in ${report.durationMs}ms`);
123
+ ```js
124
+ bot.wizard('daftar', {
125
+ steps: [
126
+ { key: 'nama', ask: 'Siapa namamu?' },
127
+ { key: 'umur', ask: 'Umur?', parse: Number,
128
+ validate: (n) => (n > 0 && n < 120 ? null : 'Angka saja ya:') },
129
+ ],
130
+ done: async (ans, ctx) => ctx.reply(`Oke ${ans.nama} (${ans.umur})!`),
131
+ });
132
+ // user tinggal /daftar bot bertanya-bertanya sampai selesai.
133
+ // ketik "batal" kapan pun untuk berhenti. Sesi otomatis aktif, tak perlu setup.
186
134
  ```
187
135
 
188
- Cap simultaneous work with `new Bot({ ..., updates: { concurrency: 64 } })` or `broadcast(..., { concurrency: 64 })` when your own downstream (database, API) needs it — by default both run fully parallel.
136
+ ### Broadcast aman rate-limit
189
137
 
190
- ## Full Telegraf parity on the context surface
138
+ ```js
139
+ const hasil = await bot.broadcast([111, 222, 333], 'Pengumuman!', { delay: 35 });
140
+ // → { terkirim: 3, gagal: 0, errors: [] } (yang diblokir-mu tercatat di errors)
141
+ ```
191
142
 
192
- Every Telegraf context shortcut is available, plus additions that cover what the Telegraf core leaves to its plugin ecosystem:
143
+ ### Kirim file
193
144
 
194
- - **Moderation & admin** — `ctx.banChatMember`, `ctx.unbanChatMember`, `ctx.restrictChatMember`, `ctx.promoteChatMember`, `ctx.banChatSenderChat`, `ctx.unbanChatSenderChat`
195
- - **Chat management** `ctx.setChatTitle/Description/Photo`, `ctx.setChatPermissions`, `ctx.leaveChat`, `ctx.unpinAllChatMessages`, `ctx.setChatStickerSet`, `ctx.deleteChatStickerSet`
196
- - **Info** `ctx.getChatAdministrators`, `ctx.getChatMemberCount`, `ctx.getChatMember`
197
- - **Invite links & join requests** — `ctx.exportChatInviteLink`, `ctx.createChatInviteLink`, `ctx.editChatInviteLink`, `ctx.revokeChatInviteLink`, `ctx.approveChatJoinRequest`, `ctx.declineChatJoinRequest`
198
- - **Polls, games, payments** — `ctx.replyWithQuiz`, `ctx.stopPoll`, `ctx.editMessageLiveLocation`, `ctx.stopMessageLiveLocation`, `ctx.replyWithGame`, `ctx.setGameScore`, `ctx.getGameHighScores`, `ctx.replyWithInvoice`
199
- - **Forum topics** — `ctx.createForumTopic`, `ctx.closeForumTopic`, `ctx.editGeneralForumTopic`, and nine more
200
- - **Launch options** — `handlerTimeout` (default 90s, like Telegraf) rejects hung updates with `UpdateTimeoutError` while the handler keeps running; `0` disables the timeout; `contextType` plugs in your own `Context` subclass; `dropPendingUpdates` on `start()/launch()`
201
- - **Webhook replies** — opt-in `webhookReply: true` answers the first API call through the webhook HTTP response itself (Telegraf-style), with the lazy `getMe` never claiming the slot
202
- - **Drop-in handler aliases** — `bot.action(...)` registers a callback-query handler just like `bot.callback(...)`, so handlers written for Telegraf migrate unchanged
145
+ ```js
146
+ const { InputFile } = require('@xbibzlibrary/telebibz');
147
+ bot.cmd('foto', (ctx) => ctx.replyWithPhoto(new InputFile(buf, 'x.jpg')));
148
+ ```
203
149
 
204
- ## State, queue, scheduler, and cache
150
+ ### Error yang bisa dibaca manusia
205
151
 
206
- The package provides `MemoryStorage` with TTL and serialized per-key updates, `JsonFileStorage`, `RedisStorage`, `SqlStorage`, `MongoStorage`, persistent application state storage, bot sessions, storage-backed conversations and forms, permission-aware menus, `MenuController` pagination, `MemoryCache`, a token-bucket limiter, a task queue with retry/backoff/concurrency/delay/cancel, and schedulers for intervals, one-shot tasks, and full five-field cron expressions. Redis, SQL, and Mongo adapters use small driver interfaces so the core package remains free of vendor runtime dependencies.
152
+ Default-nya setiap error dilaporkan dengan **saran penyelesaian**:
153
+ ```
154
+ ✖ Telegram error (403): Forbidden: bot was blocked by the user
155
+ 💡 saran: Bot diblokir pengguna — jangan kirim ulang, hapus dari daftar broadcast.
156
+ ```
157
+ Kustom: `new TeleBibz(token, { onError: (err, ctx) => { ... } })`.
207
158
 
208
- ## Terminal experience
159
+ ### Opsi konstruktor
209
160
 
210
- When the bot starts on an interactive terminal (`npm start`, `node index.js`, `telebibz start`), telebibz plays a startup sequence: a typing effect for `Installing Dependencies......`, a glass progress bar with a sweeping highlight, and the animated rainbow ASCII banner **Tele Bibz** (figlet `Speed` font) that keeps flowing until the bot connects, then freezes with `✓ Connected as @<username>`.
161
+ | Opsi | Default | Fungsi |
162
+ |---|---|---|
163
+ | `allowedUpdates` | semua tipe umum + Business | batasi update yang diterima |
164
+ | `onError` | reporter cantik bawaan | handle error sendiri |
165
+ | `silent` | `false` | tanpa banner boot |
166
+ | `dropPending` | `false` | buang update lama saat start |
167
+ | `grammy` | `{}` | opsi mentah `new Bot()` grammY |
211
168
 
212
- Afterwards, every incoming update is logged on a human-readable line, and errors are printed in red with the full stack:
169
+ ### Webhook / serverless
213
170
 
214
- ```text
215
- [ => ] Message From 123456789 John Doe 29/08/2026 15:04:05
216
- Text: /start
217
- [ => ] Callback From 123456789 John Doe 29/08/2026 15:04:07
218
- Data: menu:open
171
+ ```js
172
+ // express:
173
+ app.use('/tg', bot.webhook('express'));
174
+ // atau serverless manual:
175
+ await bot.handleUpdate(req.body);
219
176
  ```
220
177
 
221
- Message and command text is truncated to 50 characters; callback button data is shown in full. Pass `branding: false` to `Bot` to disable the sequence, or set `logger.format: "json"` for structured log ingestion. Non-interactive stdout (pipes, Docker, CI) automatically falls back to plain output without animations.
178
+ ### Escape hatch penuh
222
179
 
223
- ## CLI
180
+ Kapan pun butuh API mentah: `bot.api.sendMessage(...)`, `bot.bot` (instance grammY), `ctx.reply(...)`, `ctx.api.*` — grammar lengkap grammY tetap berlaku 100%.
224
181
 
225
- CLI commands such as `telebibz doctor`, `init`, and `webhook` start with the rainbow `Tele Bibz` banner. Startup animation automatically falls back to clean static output when stdout is not a TTY.
182
+ ---
226
183
 
227
- ```bash
228
- npm start
229
- npx telebibz init my-bot
230
- npx telebibz doctor
231
- npx telebibz build
232
- npx telebibz test
233
- ```
184
+ ## 🧩 Contoh siap jalan (`examples/`)
234
185
 
235
- Applications can print the same terminal branding explicitly:
186
+ | File | Isi |
187
+ |---|---|
188
+ | `01-quickstart.js` | bot jalan dalam 6 baris |
189
+ | `02-menu-tombol.js` | keyboard berwarna + ikon |
190
+ | `03-wizard.js` | form pendaftaran |
191
+ | `04-broadcast.js` | blast admin |
192
+ | `05-kirim-file.js` | foto & dokumen dari buffer |
236
193
 
237
- ```ts
238
- import { printTeleBibzBanner, printTerminalBranding } from "@xbibzlibrary/telebibz";
194
+ ## 🔬 Test & bukti live
239
195
 
240
- printTeleBibzBanner({ subtitle: "My bot" });
241
- printTerminalBranding();
242
196
  ```
243
-
244
- ## Testing
245
-
246
- ```bash
247
- npm run typecheck
248
- npm run test:types
249
- npm run lint
250
- npm test
251
- npm run build
252
- npm run security
253
- npm run release:check
197
+ npm test # 14 kasus, TANPA jaringan (transport disuntik)
254
198
  ```
255
199
 
256
- Real Telegram E2E tests require `TELEGRAM_BOT_TOKEN` and `TELEGRAM_TEST_CHAT_ID`. Without credentials, E2E tests are skipped and are not counted as passing.
200
+ Tervalidasi **24/24 offline + 10 live** pada bot produksi @xbibzrat_bot: getMe, keyboard berwarna & ikon animasi asli,
201
+ upload multipart (photo+document), edit keyboard, broadcast, deleteMessage, polling 409 retry.
257
202
 
258
- ## Web Apps and payments
203
+ ## 📂 Isi repo (11 file inti)
259
204
 
260
- `validateWebAppInitData()` verifies Telegram Web App signatures and expiration. `PaymentsClient` provides wrappers for invoice links, invoices, pre-checkout answers, Web App query answers, Stars transactions, and Stars refunds. Use `TelegramTypes` and aliases such as `TelegramUser`, `TelegramMessage`, and `TelegramUpdate` for the vendored full Telegram declaration surface.
261
-
262
- ## API surface
263
-
264
- Everything below ships from the package entry point unless a subpath is given. Full signatures for every export are documented in [docs/API.md](docs/API.md) (also [docs/API.id.md](docs/API.id.md) and [docs/API.zh-CN.md](docs/API.zh-CN.md)).
265
-
266
- | Area | Exports |
267
- |---|---|
268
- | Bot & lifecycle | `Bot` with `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` |
269
- | Context | `Context`, `ContextOptions`, `contextType` launch option; ~80 shortcuts on `ctx` for replies, admin actions, chat management, invite links, polls, games, payments, and forum topics |
270
- | Telegram API | `ApiClient` with `call()`, `request()`, `raw()`, `downloadFile()`, and `methods` (all generated Bot API methods); `FetchTransport` with automatic 429/5xx retries, a global flood gate, multipart uploads (Blob/bytes/path/streams), and file downloads |
271
- | Errors | `TelegramError` with a `kind` taxonomy (`retryable`, `rate-limit`, `authentication`, `validation`, `network`, `server`, `unknown`) and `retryAfter`, plus `TelegramRateLimitError`, `TelegramAuthError`, `TelegramValidationError`, `TelegramNetworkError` |
272
- | Router & middleware | `Router`, `compose`, 24 update filters (`message:photo`, `callback_query:data`, …), `matchMode` (`first`/`all`) |
273
- | Keyboards | `InlineKeyboard`, `ReplyKeyboard`, `removeKeyboard()`, `forceReply()` |
274
- | Storage | `MemoryStorage` (TTL, per-key serialization), `JsonFileStorage`, `RedisStorage`, `SqlStorage`, `MongoStorage`, plus the small driver interfaces they build on |
275
- | Cache & limiting | `MemoryCache`, `TokenBucketLimiter`, `Limiter`, `mapWithConcurrency()` |
276
- | Queue & scheduler | `TaskQueue` (priority, retry, backoff, delay, cancel), `Scheduler` (intervals, one-shot, cron), `parseCronExpression()`, `nextCronOccurrence()` |
277
- | State & dialogs | `Wizard`, `ConversationManager`, `ConversationFlow`, `Form` with `validators`, permission-aware `Menu`, `MenuController`, `paginate()` |
278
- | Webhook | `createWebhookHandler()` (Web `Request`/`Response`), `webhookCallback()` for Express/Koa/Fastify/Node `http`, `runWithWebhookReply()`, `claimWebhookReply()` |
279
- | Web Apps & payments | `parseWebAppInitData()`, `validateWebAppInitData()`, `PaymentsClient`, `TelegramTypes` (vendored Telegram declarations) |
280
- | Observability | `Logger` (levels, redaction, JSON format), `EventBus` with the `update:*`, `bot:*`, and `broadcast:*` event maps, `redact()` |
281
- | Terminal | `printTeleBibzBanner()`, `printTerminalBranding()`, `buildTerminalBranding()`, `runStartupSequence()`, `startTeleBibzBanner()`, `paintRainbow()`, `printStatusLine()` |
282
- | Text utilities | `splitMessage()`, `splitCaption()`, `escapeMarkdownV2()`, `escapeHtml()`, `md`, `html`, `template()` |
283
- | File utilities | `validateUpload()`, `assertValidUpload()`, `UploadValidationError` (size, MIME, extension rules) |
284
- | Testing (`@xbibzlibrary/telebibz/testing`) | `MockTransport` (with mock downloads), `createTestBot()`, `createMockUpdate()`, `createMockCallbackUpdate()`, `createMockContext()` |
285
- | CLI (`telebibz …`) | `init`, `doctor`, `build`, `test`, `start`, `webhook`, `generate` |
286
-
287
- ## API targets and limitations
288
-
289
- The generated method list is derived from the Telegram Bot API schema when it is updated. Runtime access is available for detected official methods, while specialized request/result inference remains concentrated on the core method map. The complete vendored Telegram object, union, enum, and method declarations are available through `TelegramTypes`. See [FEATURE_MATRIX.md](FEATURE_MATRIX.md) for implementation status and [docs/API.md](docs/API.md) for the complete API reference.
290
-
291
- For every exported class, function, method, type, error, lifecycle hook, CLI command, and generated Telegram method, see the [complete English API reference](docs/API.md).
292
-
293
- ## Release automation
294
-
295
- The GitHub repository includes CI and an auto-publish workflow. A push to `main` runs the quality gates and derives the next version from the pushed Conventional Commits: `feat:` commits and breaking changes bump the minor version while the package is pre-1.0 (`BREAKING-CHANGE` footers or `type!:` subjects bump the major from 1.0.0 onward), everything else bumps the patch version. A version already declared in `package.json` ahead of npm publishes exactly as declared, and the workflow never publishes a version at or below the latest npm release. The workflow commits the version, creates the tag, publishes to npm (with provenance disabled via `--provenance=false`), and creates a GitHub Release. Commits containing `[skip release]` do not trigger a publication. Configure the `NPM_TOKEN` GitHub Actions secret before relying on automatic publication. See [RELEASE_AUTOMATION.md](RELEASE_AUTOMATION.md).
296
-
297
- ## Project policies and contribution
298
-
299
- | Document | Purpose |
205
+ | File | Peran |
300
206
  |---|---|
301
- | [CODE_OF_CONDUCT.md](CODE_OF_CONDUCT.md) | Community behavior, enforcement, reporting, and appeals. |
302
- | [CONTRIBUTING.md](CONTRIBUTING.md) | Local setup, branch/commit rules, tests, review, and release workflow. |
303
- | [CONTRIBUTION_RULES.md](CONTRIBUTION_RULES.md) | API, compatibility, testing, dependency, security, and release requirements. |
304
- | [GOVERNANCE.md](GOVERNANCE.md) | Roles, decision-making, triage, repository protection, and amendments. |
305
- | [SECURITY.md](SECURITY.md) | Private vulnerability reporting, threat boundaries, and credential rotation. |
306
- | [SUPPORT.md](SUPPORT.md) | Support channels, safe-reporting rules, and request expectations. |
307
- | [RELEASE_AUTOMATION.md](RELEASE_AUTOMATION.md) | GitHub-to-npm automation and required `NPM_TOKEN` setup. |
308
- | [RELEASE_POLICY.md](RELEASE_POLICY.md) | Immutable release and hardening controls. |
309
- | [NOTICE.md](NOTICE.md) | Third-party declaration attribution. |
310
-
311
- Never commit Telegram tokens or npm credentials. Use environment variables or a secret manager. See [SECURITY.md](SECURITY.md) and [RELEASE_POLICY.md](RELEASE_POLICY.md) for security and release hardening policies.
312
-
313
- ## License
314
-
315
- MIT. See [LICENSE](LICENSE).
207
+ | `lib/net.js` | transport HTTP fetch murni + multipart `attach://` |
208
+ | `lib/api.js` | metode Bot API + `api.callApi()` untuk segala metode |
209
+ | `lib/composer.js` | middleware, filter `on('message:photo')`, `errorBoundary` |
210
+ | `lib/context.js` | objek ctx + pintasan reply/edit/delete/callback |
211
+ | `lib/session.js` | sesi per user:chat (dapat ditukar storagenya) |
212
+ | `lib/runner.js` | long polling: retry 409, backoff jaringan, drop pending |
213
+ | `lib/file.js` | `File`/`InputFile` (Buffer/path/stream) |
214
+ | `lib/keyboard.js` | builder + `InlineKeyboard`/`Keyboard` fluent class |
215
+ | `lib/wizard.js` | percakapan tanya-jawab berurutan |
216
+ | `lib/broadcast.js` | blast aman rate limit |
217
+ | `lib/errors.js` + `lib/logger.js` | error manusiawi + log berbingkai |
218
+
219
+ ## 🆚 Kenapa recode?
220
+
221
+ | | v0.4 lama | v1.0 |
222
+ |---|---|---|
223
+ | Baris file sumber | 152 file TS | 7 file JS |
224
+ | Build step | tsc ×2 + script | — |
225
+ | Dependency runtime | — | **0 (nol)** |
226
+ | Bot API | manual update | 9.x penuh (uji live asli) |
227
+ | Hello world | kelas + config | 6 baris |
228
+ | Docs | 3 bahasa × belasan file | README ini |
229
+
230
+ ## 📄 Lisensi
231
+
232
+ MIT · //—Xbibz Official—//
@@ -0,0 +1,13 @@
1
+ // examples/01-quickstart.js — bot jalan dalam 6 baris kode.
2
+ // BOT_TOKEN=123:abc node examples/01-quickstart.js
3
+ 'use strict';
4
+
5
+ const { TeleBibz } = require('..');
6
+
7
+ const bot = new TeleBibz(process.env.BOT_TOKEN);
8
+
9
+ bot.cmd('start', (ctx) => ctx.reply(`Halo ${ctx.from.first_name}! Aku hidup 🎉`));
10
+ bot.hears(/halo|hai/i, (ctx) => ctx.reply('Halo juga! 👋'));
11
+ bot.hears('ping', (ctx) => ctx.reply('pong 🏓'));
12
+
13
+ bot.launch();
@@ -0,0 +1,22 @@
1
+ // examples/02-menu-tombol.js — inline keyboard berwarna + ikon animated.
2
+ 'use strict';
3
+
4
+ const { TeleBibz, btn, url, kb } = require('..');
5
+
6
+ const bot = new TeleBibz(process.env.BOT_TOKEN);
7
+
8
+ bot.cmd('menu', (ctx) =>
9
+ ctx.reply('Pilih menu:', kb([
10
+ [btn('💎 Premium', 'premium', 'primary'), btn('📞 Bantuan', 'bantuan')],
11
+ [url('🌐 Website', 'https://example.com', 'success')],
12
+ [btn('❌ Tutup', 'tutup', 'danger')],
13
+ ])));
14
+
15
+ bot.action('premium', async (ctx) => {
16
+ await ctx.answerCallbackQuery('Menuju halaman premium…');
17
+ await ctx.reply('💎 Daftar paket premium…');
18
+ });
19
+ bot.action('bantuan', (ctx) => ctx.answerCallbackQuery({ text: 'Hubungi @admin ya!', show_alert: true }));
20
+ bot.action('tutup', (ctx) => ctx.deleteMessage().catch(() => {}));
21
+
22
+ bot.launch();
@@ -0,0 +1,29 @@
1
+ // examples/03-wizard.js — form pendaftaran tanya-jawab, 0 boilerplate.
2
+ 'use strict';
3
+
4
+ const { TeleBibz } = require('..');
5
+
6
+ const bot = new TeleBibz(process.env.BOT_TOKEN);
7
+
8
+ bot.wizard('daftar', {
9
+ steps: [
10
+ { key: 'nama', ask: '1️⃣ Siapa nama lengkapmu?' },
11
+ {
12
+ key: 'umur',
13
+ ask: '2️⃣ Umur berapa?',
14
+ parse: (t) => parseInt(t, 10),
15
+ validate: (n) => (Number.isFinite(n) && n > 0 && n < 120 ? null : 'Umur tidak valid — ketik angka saja ya:'),
16
+ },
17
+ {
18
+ key: 'kota',
19
+ ask: '3️⃣ Tinggal di kota mana? (ketik "batal" untuk berhenti)',
20
+ validate: (t) => (t && t.length >= 3 ? null : 'Nama kota minimal 3 huruf:'),
21
+ },
22
+ ],
23
+ done: async (ans, ctx) => {
24
+ await ctx.reply(`✅ Terdaftar!\nNama : ${ans.nama}\nUmur : ${ans.umur}\nKota : ${ans.kota}`);
25
+ },
26
+ onCancel: (ctx) => ctx.reply('👋 Pendaftaran dibatalkan.'),
27
+ });
28
+
29
+ bot.launch();
@@ -0,0 +1,25 @@
1
+ // examples/04-broadcast.js — blast pesan ke banyak chat tanpa kena limit.
2
+ 'use strict';
3
+
4
+ const { TeleBibz, kb, url } = require('..');
5
+
6
+ const bot = new TeleBibz(process.env.BOT_TOKEN);
7
+ const subscribers = new Set(); // produksi: simpan di DB
8
+
9
+ bot.cmd('start', (ctx) => {
10
+ subscribers.add(ctx.chat.id);
11
+ ctx.reply('Kamu terdaftar! Admin bisa /blast untuk info ke semua.');
12
+ });
13
+
14
+ bot.cmd('blast', async (ctx) => {
15
+ if (String(ctx.from.id) !== process.env.ADMIN_ID) return ctx.reply('Khusus admin.');
16
+ const teks = ctx.message.text.replace(/^\/blast\s*/i, '').trim();
17
+ if (!teks) return ctx.reply('Pakai: /blast isi pesannya');
18
+
19
+ const proses = await ctx.reply(`Mengirim ke ${subscribers.size} chat…`);
20
+ const hasil = await bot.broadcast([...subscribers], { text: teks, ...kb([[url('Info', 'https://example.com')]]) });
21
+ await ctx.reply(`Selesai ✅ terkirim ${hasil.terkirim}, gagal ${hasil.gagal}`);
22
+ await ctx.api.deleteMessage(ctx.chat.id, proses.message_id).catch(() => {});
23
+ });
24
+
25
+ bot.launch();
@@ -0,0 +1,19 @@
1
+ // examples/05-kirim-file.js — kirim foto dari URL & dokumen dari Buffer.
2
+ 'use strict';
3
+
4
+ const { TeleBibz, InputFile } = require('..');
5
+
6
+ const bot = new TeleBibz(process.env.BOT_TOKEN);
7
+
8
+ bot.cmd('kucing', async (ctx) => {
9
+ const r = await fetch('https://cataas.com/cat');
10
+ const buf = Buffer.from(await r.arrayBuffer());
11
+ await ctx.replyWithPhoto(new InputFile(buf, 'kucing.jpg'), { caption: 'Meong 🐱' });
12
+ });
13
+
14
+ bot.cmd('laporan', async (ctx) => {
15
+ const data = Buffer.from(`Laporan ${new Date().toISOString()}\nHalo dunia!`);
16
+ await ctx.replyWithDocument(new InputFile(data, 'laporan.txt'));
17
+ });
18
+
19
+ bot.launch();