@xbibzlibrary/telebibz 0.4.4 → 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 (258) hide show
  1. package/CHANGELOG.md +35 -138
  2. package/LICENSE +1 -1
  3. package/NOTICE.md +9 -4
  4. package/README.md +173 -242
  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 -292
  37. package/README.zh-CN.md +0 -292
  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/GETTING_STARTED.id.md +0 -85
  244. package/docs/GETTING_STARTED.md +0 -85
  245. package/docs/GETTING_STARTED.zh-CN.md +0 -85
  246. package/docs/GITHUB_PACKAGES.id.md +0 -82
  247. package/docs/GITHUB_PACKAGES.md +0 -82
  248. package/docs/GITHUB_PACKAGES.zh-CN.md +0 -82
  249. package/docs/README.md +0 -48
  250. package/docs/STORAGE.id.md +0 -105
  251. package/docs/STORAGE.md +0 -105
  252. package/docs/STORAGE.zh-CN.md +0 -105
  253. package/examples/README.md +0 -37
  254. package/examples/files.ts +0 -35
  255. package/examples/minimal.ts +0 -12
  256. package/examples/tsconfig.json +0 -9
  257. package/examples/webhook.ts +0 -42
  258. package/examples/wizard-registration.ts +0 -42
@@ -1,328 +0,0 @@
1
- export const TERMINAL_BRAND_TEXT = "Library Bot Telegram By @xbibzofficial";
2
- /** "Tele Bibz" rendered with the figlet Speed font. */
3
- export const TELE_BIBZ_ASCII = [
4
- "________ ______ ___________________ _______",
5
- "___ __/_______ /____ ___ __ )__(_)__ /_______",
6
- "__ / _ _ \\_ /_ _ \\ __ __ |_ /__ __ \\__ /",
7
- "_ / / __/ / / __/ _ /_/ /_ / _ /_/ /_ /_",
8
- "/_/ \\___//_/ \\___/ /_____/ /_/ /_.___/_____/",
9
- ];
10
- const ANSI = {
11
- reset: "\u001b[0m",
12
- bold: "\u001b[1m",
13
- clearLine: "\u001b[2K",
14
- cursorUp: "\u001b[1A",
15
- hideCursor: "\u001b[?25l",
16
- showCursor: "\u001b[?25h",
17
- blue: "\u001b[34m",
18
- magenta: "\u001b[35m",
19
- cyan: "\u001b[36m",
20
- green: "\u001b[32m",
21
- yellow: "\u001b[33m",
22
- red: "\u001b[31m",
23
- white: "\u001b[97m",
24
- dim: "\u001b[2m",
25
- };
26
- function pad(value, width) {
27
- return `${value}${" ".repeat(Math.max(0, width - [...value].length))}`;
28
- }
29
- function useColor(options, stream) {
30
- return options.color ?? Boolean(stream.isTTY && !process.env.NO_COLOR);
31
- }
32
- function sleep(delayMs) {
33
- return new Promise((resolve) => setTimeout(resolve, delayMs));
34
- }
35
- function easeInOutCubic(progress) {
36
- return progress < 0.5 ? 4 * progress ** 3 : 1 - (-2 * progress + 2) ** 3 / 2;
37
- }
38
- function hslToRgb(hue, saturation, lightness) {
39
- const normalizedHue = ((hue % 360) + 360) % 360;
40
- const chroma = (1 - Math.abs(2 * lightness - 1)) * saturation;
41
- const hueSegment = normalizedHue / 60;
42
- const secondary = chroma * (1 - Math.abs((hueSegment % 2) - 1));
43
- let red = 0;
44
- let green = 0;
45
- let blue = 0;
46
- if (hueSegment < 1) {
47
- red = chroma;
48
- green = secondary;
49
- }
50
- else if (hueSegment < 2) {
51
- red = secondary;
52
- green = chroma;
53
- }
54
- else if (hueSegment < 3) {
55
- green = chroma;
56
- blue = secondary;
57
- }
58
- else if (hueSegment < 4) {
59
- green = secondary;
60
- blue = chroma;
61
- }
62
- else if (hueSegment < 5) {
63
- red = secondary;
64
- blue = chroma;
65
- }
66
- else {
67
- red = chroma;
68
- blue = secondary;
69
- }
70
- const shift = lightness - chroma / 2;
71
- return [Math.round((red + shift) * 255), Math.round((green + shift) * 255), Math.round((blue + shift) * 255)];
72
- }
73
- function rgbForegroundColor(red, green, blue) {
74
- return `\u001b[38;2;${red};${green};${blue}m`;
75
- }
76
- /**
77
- * Paints multi-line text with a rainbow gradient across columns (the classic
78
- * "Rainbow" color filter). Spaces stay unstyled so the art keeps its shape.
79
- */
80
- export function paintRainbow(text, options = {}) {
81
- if (!options.color)
82
- return text;
83
- const lines = text.split("\n");
84
- const width = Math.max(...lines.map((line) => [...line].length), 1);
85
- const offset = options.offset ?? 0;
86
- const spread = options.spread ?? 340;
87
- const saturation = options.saturation ?? 1;
88
- const lightness = options.lightness ?? 0.58;
89
- return lines
90
- .map((line) => {
91
- const characters = [...line];
92
- let painted = "";
93
- for (let index = 0; index < characters.length; index += 1) {
94
- const character = characters[index];
95
- if (character === " ") {
96
- painted += character;
97
- continue;
98
- }
99
- const hue = offset + (index / width) * spread;
100
- const [red, green, blue] = hslToRgb(hue, saturation, lightness);
101
- painted += `${rgbForegroundColor(red, green, blue)}${character}${ANSI.reset}`;
102
- }
103
- return painted;
104
- })
105
- .join("\n");
106
- }
107
- function renderGlassBar(progress, shinePosition, width, colored) {
108
- const filled = Math.round(progress * width);
109
- let bar = "";
110
- for (let index = 0; index < width; index += 1) {
111
- const isFilled = index < filled;
112
- const shineDistance = Math.abs(index - shinePosition);
113
- const isShine = shineDistance <= 1;
114
- const character = isFilled ? "█" : "░";
115
- if (!colored) {
116
- bar += character;
117
- continue;
118
- }
119
- if (isShine) {
120
- bar += `${ANSI.bold}${ANSI.white}${character === "█" ? "█" : "▒"}${ANSI.reset}`;
121
- continue;
122
- }
123
- if (isFilled) {
124
- const hue = 190 + (index / width) * 150;
125
- const [red, green, blue] = hslToRgb(hue, 0.85, 0.6);
126
- bar += `${rgbForegroundColor(red, green, blue)}${character}${ANSI.reset}`;
127
- }
128
- else {
129
- bar += `${ANSI.dim}${character}${ANSI.reset}`;
130
- }
131
- }
132
- return bar;
133
- }
134
- /**
135
- * Plays the startup sequence on a TTY: a typing effect for the label
136
- * (default "Installing Dependencies"), a trailing run of dots, and a
137
- * glass progress bar with a sweeping highlight that fills to 100%.
138
- * No-ops when the stream is not an interactive TTY.
139
- */
140
- export async function runStartupSequence(options = {}) {
141
- const stream = options.stream ?? process.stdout;
142
- if (!stream.isTTY)
143
- return;
144
- const colored = useColor(options, stream);
145
- const label = options.label ?? "Installing Dependencies";
146
- const typeDelayMs = options.typeDelayMs ?? 24;
147
- const dotDelayMs = options.dotDelayMs ?? 140;
148
- const dots = options.dots ?? 6;
149
- const barWidth = Math.max(10, options.barWidth ?? 44);
150
- const barDurationMs = Math.max(0, options.barDurationMs ?? 1_400);
151
- const barFrameMs = Math.max(16, options.barFrameMs ?? 40);
152
- if (colored)
153
- stream.write(`${ANSI.bold}${ANSI.cyan}`);
154
- for (const character of label) {
155
- stream.write(character);
156
- if (typeDelayMs > 0)
157
- await sleep(typeDelayMs);
158
- }
159
- for (let index = 0; index < dots; index += 1) {
160
- if (dotDelayMs > 0)
161
- await sleep(dotDelayMs);
162
- stream.write(".");
163
- }
164
- if (colored)
165
- stream.write(ANSI.reset);
166
- stream.write("\n");
167
- const startedAt = Date.now();
168
- let frameIndex = 0;
169
- while (true) {
170
- const elapsed = Date.now() - startedAt;
171
- const progress = barDurationMs === 0 ? 1 : Math.min(1, easeInOutCubic(elapsed / barDurationMs));
172
- const sweep = (frameIndex * barFrameMs) % 1_600;
173
- const triangle = sweep < 800 ? sweep / 800 : 2 - sweep / 800;
174
- const shinePosition = triangle * (barWidth - 1);
175
- const percentage = Math.round(progress * 100);
176
- stream.write(`\r${ANSI.clearLine}${renderGlassBar(progress, shinePosition, barWidth, colored)} ${ANSI.dim}${String(percentage).padStart(3, " ")}%${ANSI.reset}`);
177
- if (progress >= 1)
178
- break;
179
- frameIndex += 1;
180
- await sleep(barFrameMs);
181
- }
182
- stream.write(` ${ANSI.green}${ANSI.bold}✓${ANSI.reset}\n`);
183
- }
184
- function bannerFrame(subtitle, offset, colored) {
185
- const artWidth = Math.max(...TELE_BIBZ_ASCII.map((line) => [...line].length));
186
- const leading = Math.max(0, Math.floor((artWidth - [...TERMINAL_BRAND_TEXT].length) / 2));
187
- const tagline = " ".repeat(leading) + TERMINAL_BRAND_TEXT;
188
- const lines = paintRainbow(TELE_BIBZ_ASCII.join("\n"), { color: colored, offset }).split("\n");
189
- lines.push(colored ? `${ANSI.dim}${tagline}${ANSI.reset}` : tagline);
190
- if (subtitle)
191
- lines.push(colored ? `${ANSI.cyan}${ANSI.bold}${subtitle}${ANSI.reset}` : subtitle);
192
- return lines;
193
- }
194
- function tonePrefix(tone, colored) {
195
- if (!colored)
196
- return "";
197
- if (tone === "success")
198
- return ANSI.green;
199
- if (tone === "error")
200
- return ANSI.red;
201
- return ANSI.cyan;
202
- }
203
- /**
204
- * Prints the static "Tele Bibz" banner (rainbow-painted once, no animation).
205
- * Suitable for short-lived CLI commands and non-interactive streams.
206
- */
207
- export function printTeleBibzBanner(options = {}) {
208
- const stream = options.stream ?? process.stdout;
209
- const colored = useColor(options, stream);
210
- const lines = bannerFrame(options.subtitle, 0, colored);
211
- if (options.message) {
212
- const prefix = options.tone === "error" ? "✗ " : options.tone === "success" ? "✓ " : "";
213
- lines.push(colored ? `${tonePrefix(options.tone ?? "info", colored)}${prefix}${options.message}${ANSI.reset}` : `${prefix}${options.message}`);
214
- }
215
- stream.write(`${lines.join("\n")}\n`);
216
- }
217
- /**
218
- * Prints the animated rainbow "Tele Bibz" banner. The rainbow flows until
219
- * `stop()` is called (typically once the bot is connected), then the banner
220
- * freezes and an optional status line is printed.
221
- */
222
- export function startTeleBibzBanner(options = {}) {
223
- const stream = options.stream ?? process.stdout;
224
- const colored = useColor(options, stream);
225
- const frameMs = Math.max(16, options.frameMs ?? 70);
226
- const subtitle = options.subtitle;
227
- if (!stream.isTTY) {
228
- printTeleBibzBanner({ ...options, subtitle });
229
- return { stop: () => undefined };
230
- }
231
- let stopped = false;
232
- let linesPrinted = 0;
233
- const writeFrame = (offset) => {
234
- const lines = bannerFrame(subtitle, offset, colored);
235
- linesPrinted = lines.length;
236
- stream.write(lines.join("\n") + "\n");
237
- };
238
- const clearFrame = () => {
239
- for (let index = 0; index < linesPrinted; index += 1)
240
- stream.write(`${ANSI.cursorUp}${ANSI.clearLine}`);
241
- stream.write("\r");
242
- };
243
- stream.write(ANSI.hideCursor);
244
- writeFrame(0);
245
- void (async () => {
246
- let offset = 0;
247
- while (!stopped) {
248
- await sleep(frameMs);
249
- if (stopped)
250
- break;
251
- offset = (offset + 14) % 360;
252
- clearFrame();
253
- writeFrame(offset);
254
- }
255
- })();
256
- return {
257
- stop(message, tone = "success") {
258
- if (stopped)
259
- return;
260
- stopped = true;
261
- clearFrame();
262
- writeFrame(0);
263
- if (message) {
264
- const prefix = tone === "error" ? "✗ " : tone === "success" ? "✓ " : "";
265
- const line = colored ? `${tonePrefix(tone, colored)}${ANSI.bold}${prefix}${message}${ANSI.reset}` : `${prefix}${message}`;
266
- stream.write(`${line}\n`);
267
- }
268
- stream.write(ANSI.showCursor);
269
- },
270
- };
271
- }
272
- /** Prints a single dim status line (used for "Listening for updates..." style messages). */
273
- export function printStatusLine(text, options = {}) {
274
- const stream = options.stream ?? process.stdout;
275
- const colored = useColor(options, stream);
276
- stream.write(colored ? `${ANSI.dim}${text}${ANSI.reset}\n` : `${text}\n`);
277
- }
278
- export function buildTerminalBranding(options = {}) {
279
- const stream = process.stdout;
280
- const colored = useColor(options, stream);
281
- const color = (value, code) => colored ? `${code}${value}${ANSI.reset}` : value;
282
- const title = "TELEBIBZ CLI";
283
- const width = Math.max([...title].length, [...TERMINAL_BRAND_TEXT].length);
284
- const horizontal = "═".repeat(width + 2);
285
- const line = (value) => `║ ${pad(value, width)} ║`;
286
- return [
287
- color(`╔${horizontal}╗`, ANSI.cyan),
288
- color(line(title), ANSI.blue),
289
- color(line(TERMINAL_BRAND_TEXT), ANSI.magenta),
290
- color(`╚${horizontal}╝`, ANSI.cyan),
291
- color("Runtime logs: colorful structured output.", ANSI.dim),
292
- ].join("\n");
293
- }
294
- export function printTerminalBranding(options = {}) {
295
- process.stdout.write(`${buildTerminalBranding(options)}\n`);
296
- }
297
- export function startTerminalAnimation(message = "Starting telebibz", options = {}) {
298
- const stream = options.stream ?? process.stdout;
299
- const colored = useColor(options, stream);
300
- const frames = ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"];
301
- const intervalMs = Math.max(60, options.intervalMs ?? 90);
302
- let index = 0;
303
- let stopped = false;
304
- const paint = () => {
305
- if (stopped || !stream.isTTY)
306
- return;
307
- const frame = frames[index++ % frames.length] ?? "⠋";
308
- const text = `${frame} ${message}`;
309
- stream.write(`\r${ANSI.clearLine}${colored ? ANSI.cyan : ""}${text}${colored ? ANSI.reset : ""}`);
310
- };
311
- if (!stream.isTTY)
312
- return { stop: () => undefined };
313
- stream.write(ANSI.hideCursor);
314
- paint();
315
- const timer = setInterval(paint, intervalMs);
316
- timer.unref?.();
317
- return {
318
- stop(finalMessage = "Done") {
319
- if (stopped)
320
- return;
321
- stopped = true;
322
- clearInterval(timer);
323
- const prefix = finalMessage.toLowerCase().includes("error") ? ANSI.yellow : ANSI.green;
324
- stream.write(`\r${ANSI.clearLine}${colored ? prefix : ""}${finalMessage}${colored ? ANSI.reset : ""}\n${ANSI.showCursor}`);
325
- },
326
- };
327
- }
328
- //# sourceMappingURL=terminal.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"terminal.js","sourceRoot":"","sources":["../../../src/branding/terminal.ts"],"names":[],"mappings":"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"}
@@ -1,50 +0,0 @@
1
- import type { ChatId } from "../api/types.js";
2
- /** One chat the broadcast could not deliver to. */
3
- export interface BroadcastFailure {
4
- chatId: ChatId;
5
- attempts: number;
6
- error: string;
7
- errorKind?: string | undefined;
8
- }
9
- /** Live counters emitted through `onProgress` after each chat settles. */
10
- export interface BroadcastProgress {
11
- total: number;
12
- processed: number;
13
- delivered: number;
14
- failed: number;
15
- }
16
- /** Final result of a broadcast run. */
17
- export interface BroadcastReport {
18
- total: number;
19
- delivered: number;
20
- failed: number;
21
- durationMs: number;
22
- failures: BroadcastFailure[];
23
- }
24
- export interface BroadcastOptions {
25
- /**
26
- * How many chats are messaged at the same time. Default `Infinity` — every
27
- * chat is attempted immediately, with no proactive cooldown. Telegram's own
28
- * 429 answers are honored automatically per chat.
29
- */
30
- concurrency?: number;
31
- /**
32
- * Attempts per chat when Telegram answers 429 (rate limit). The wait between
33
- * attempts is exactly what Telegram orders via `retry_after`. Default `10`.
34
- */
35
- maxAttempts?: number;
36
- /** Called after each chat settles, regardless of outcome. */
37
- onProgress?: (progress: BroadcastProgress) => void;
38
- /** Aborts pending sends; chats already delivered stay delivered. */
39
- signal?: AbortSignal;
40
- }
41
- /**
42
- * Sends to many chats in parallel with automatic 429 retry.
43
- *
44
- * There is no proactive cooldown: all chats (up to `concurrency`) are attempted
45
- * at once. The only waiting ever done is the `retry_after` delay Telegram itself
46
- * returns with a 429 answer, so bursts of 1000+ chats still deliver completely
47
- * instead of failing.
48
- */
49
- export declare function runBroadcast(chatIds: readonly ChatId[], send: (chatId: ChatId) => Promise<unknown>, options?: BroadcastOptions): Promise<BroadcastReport>;
50
- //# sourceMappingURL=broadcast.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"broadcast.d.ts","sourceRoot":"","sources":["../../../src/broadcast/broadcast.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAG9C,mDAAmD;AACnD,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAChC;AAED,0EAA0E;AAC1E,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,uCAAuC;AACvC,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,gBAAgB,EAAE,CAAC;CAC9B;AAED,MAAM,WAAW,gBAAgB;IAC/B;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,6DAA6D;IAC7D,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,iBAAiB,KAAK,IAAI,CAAC;IACnD,oEAAoE;IACpE,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AASD;;;;;;;GAOG;AACH,wBAAsB,YAAY,CAChC,OAAO,EAAE,SAAS,MAAM,EAAE,EAC1B,IAAI,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,EAC1C,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,eAAe,CAAC,CAuC1B"}
@@ -1,56 +0,0 @@
1
- import { TelegramError } from "../api/errors.js";
2
- import { mapWithConcurrency } from "../utils/concurrency.js";
3
- function sleep(delayMs) { return new Promise((resolve) => setTimeout(resolve, delayMs)); }
4
- function describeError(error) {
5
- if (error instanceof TelegramError)
6
- return { message: error.message, kind: error.kind };
7
- return { message: error instanceof Error ? error.message : String(error), kind: undefined };
8
- }
9
- /**
10
- * Sends to many chats in parallel with automatic 429 retry.
11
- *
12
- * There is no proactive cooldown: all chats (up to `concurrency`) are attempted
13
- * at once. The only waiting ever done is the `retry_after` delay Telegram itself
14
- * returns with a 429 answer, so bursts of 1000+ chats still deliver completely
15
- * instead of failing.
16
- */
17
- export async function runBroadcast(chatIds, send, options = {}) {
18
- const startedAt = Date.now();
19
- const maxAttempts = options.maxAttempts ?? 10;
20
- const failures = [];
21
- let delivered = 0;
22
- let processed = 0;
23
- const total = chatIds.length;
24
- await mapWithConcurrency(chatIds, options.concurrency ?? Infinity, async (chatId) => {
25
- let attempts = 0;
26
- while (true) {
27
- if (options.signal?.aborted) {
28
- failures.push({ chatId, attempts, error: "aborted", errorKind: "aborted" });
29
- break;
30
- }
31
- attempts += 1;
32
- try {
33
- await send(chatId);
34
- delivered += 1;
35
- break;
36
- }
37
- catch (error) {
38
- const telegram = error instanceof TelegramError ? error : undefined;
39
- if (telegram?.kind === "rate-limit" && attempts < maxAttempts) {
40
- // Telegram told us exactly how long to wait; honor it (plus a small
41
- // jitter so retried chats do not fire as one synchronized wave).
42
- const retryAfterMs = Math.max(0, (telegram.retryAfter ?? 1) * 1000);
43
- await sleep(retryAfterMs + Math.random() * 250);
44
- continue;
45
- }
46
- const { message, kind } = describeError(error);
47
- failures.push({ chatId, attempts, error: message, errorKind: kind });
48
- break;
49
- }
50
- }
51
- processed += 1;
52
- options.onProgress?.({ total, processed, delivered, failed: failures.length });
53
- });
54
- return { total, delivered, failed: failures.length, durationMs: Date.now() - startedAt, failures };
55
- }
56
- //# sourceMappingURL=broadcast.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"broadcast.js","sourceRoot":"","sources":["../../../src/broadcast/broadcast.ts"],"names":[],"mappings":"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"}
@@ -1,34 +0,0 @@
1
- import { type Storage } from "../storage/storage.js";
2
- export interface Cache<K = string, V = unknown> {
3
- get(key: K): Promise<V | undefined>;
4
- set(key: K, value: V, ttlMs?: number): Promise<void>;
5
- delete(key: K): Promise<boolean>;
6
- invalidate(prefix?: string): Promise<void>;
7
- getOrSet(key: K, factory: () => V | Promise<V>, ttlMs?: number): Promise<V>;
8
- }
9
- export declare class MemoryCache<V = unknown> implements Cache<string, V> {
10
- private readonly storage;
11
- private readonly namespace;
12
- constructor(namespace?: string, storage?: Storage<string, V>);
13
- private key;
14
- get(key: string): Promise<V | undefined>;
15
- set(key: string, value: V, ttlMs?: number): Promise<void>;
16
- delete(key: string): Promise<boolean>;
17
- invalidate(prefix?: string): Promise<void>;
18
- getOrSet(key: string, factory: () => V | Promise<V>, ttlMs?: number): Promise<V>;
19
- }
20
- export interface RateLimitResult {
21
- allowed: boolean;
22
- remaining: number;
23
- resetAt: number;
24
- retryAfterMs?: number;
25
- }
26
- export declare class TokenBucketLimiter {
27
- private readonly capacity;
28
- private readonly refillPerSecond;
29
- private readonly buckets;
30
- constructor(capacity: number, refillPerSecond: number);
31
- consume(key: string, cost?: number): RateLimitResult;
32
- clear(key?: string): void;
33
- }
34
- //# sourceMappingURL=cache.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../../src/cache/cache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAEpE,MAAM,WAAW,KAAK,CAAC,CAAC,GAAG,MAAM,EAAE,CAAC,GAAG,OAAO;IAC5C,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC;IACpC,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrD,MAAM,CAAC,GAAG,EAAE,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACjC,UAAU,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3C,QAAQ,CAAC,GAAG,EAAE,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;CAC7E;AAED,qBAAa,WAAW,CAAC,CAAC,GAAG,OAAO,CAAE,YAAW,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;IAE3B,OAAO,CAAC,QAAQ,CAAC,OAAO;IAD5D,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;gBACvB,SAAS,SAAa,EAAmB,OAAO,GAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAkC;IACjH,OAAO,CAAC,GAAG;IACX,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;IACxC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IACzD,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAC/B,UAAU,CAAC,MAAM,SAAK,GAAG,OAAO,CAAC,IAAI,CAAC;IACtC,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC;CACvF;AAED,MAAM,WAAW,eAAe;IAAG,OAAO,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAA;CAAE;AAChH,qBAAa,kBAAkB;IAEjB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAAU,OAAO,CAAC,QAAQ,CAAC,eAAe;IAD/E,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA4D;gBACvD,QAAQ,EAAE,MAAM,EAAmB,eAAe,EAAE,MAAM;IACvF,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,SAAI,GAAG,eAAe;IAC/C,KAAK,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI;CAC1B"}
@@ -1,41 +0,0 @@
1
- import { MemoryStorage } from "../storage/storage.js";
2
- export class MemoryCache {
3
- storage;
4
- namespace;
5
- constructor(namespace = "telebibz", storage = new MemoryStorage()) {
6
- this.storage = storage;
7
- this.namespace = namespace;
8
- }
9
- key(key) { return `${this.namespace}:${key}`; }
10
- get(key) { return this.storage.get(this.key(key)); }
11
- set(key, value, ttlMs) { return this.storage.set(this.key(key), value, ttlMs === undefined ? {} : { ttlMs }); }
12
- delete(key) { return this.storage.delete(this.key(key)); }
13
- async invalidate(prefix = "") { const keys = []; for await (const key of this.storage.keys())
14
- if (key.startsWith(this.key(prefix)))
15
- keys.push(key); for (const key of keys)
16
- await this.storage.delete(key); }
17
- async getOrSet(key, factory, ttlMs) { const existing = await this.get(key); if (existing !== undefined)
18
- return existing; const value = await factory(); await this.set(key, value, ttlMs); return value; }
19
- }
20
- export class TokenBucketLimiter {
21
- capacity;
22
- refillPerSecond;
23
- buckets = new Map();
24
- constructor(capacity, refillPerSecond) {
25
- this.capacity = capacity;
26
- this.refillPerSecond = refillPerSecond;
27
- if (capacity <= 0 || refillPerSecond <= 0)
28
- throw new RangeError("capacity and refillPerSecond must be positive");
29
- }
30
- consume(key, cost = 1) { if (!Number.isFinite(cost) || cost <= 0)
31
- throw new RangeError("cost must be positive"); const now = Date.now(); const current = this.buckets.get(key) ?? { tokens: this.capacity, updatedAt: now }; const elapsedSeconds = (now - current.updatedAt) / 1000; current.tokens = Math.min(this.capacity, current.tokens + elapsedSeconds * this.refillPerSecond); current.updatedAt = now; if (current.tokens < cost) {
32
- const retryAfterMs = Math.ceil(((cost - current.tokens) / this.refillPerSecond) * 1000);
33
- this.buckets.set(key, current);
34
- return { allowed: false, remaining: Math.floor(current.tokens), resetAt: now + retryAfterMs, retryAfterMs };
35
- } current.tokens -= cost; this.buckets.set(key, current); return { allowed: true, remaining: Math.floor(current.tokens), resetAt: now + Math.ceil(((this.capacity - current.tokens) / this.refillPerSecond) * 1000) }; }
36
- clear(key) { if (key === undefined)
37
- this.buckets.clear();
38
- else
39
- this.buckets.delete(key); }
40
- }
41
- //# sourceMappingURL=cache.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"cache.js","sourceRoot":"","sources":["../../../src/cache/cache.ts"],"names":[],"mappings":"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"}
package/dist/src/cli.d.ts DELETED
@@ -1,2 +0,0 @@
1
- export declare function main(argv?: string[]): Promise<void>;
2
- //# sourceMappingURL=cli.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"AAyCA,wBAAsB,IAAI,CAAC,IAAI,WAAwB,GAAG,OAAO,CAAC,IAAI,CAAC,CAuBtE"}
package/dist/src/cli.js DELETED
@@ -1,84 +0,0 @@
1
- import { access, mkdir, writeFile } from "node:fs/promises";
2
- import { spawn } from "node:child_process";
3
- import { createWebhookHandler } from "./webhook/handler.js";
4
- import { Bot } from "./core/bot.js";
5
- import { printTeleBibzBanner } from "./branding/terminal.js";
6
- async function commandDoctor() {
7
- printTeleBibzBanner({ subtitle: "telebibz doctor" });
8
- const token = process.env.TELEGRAM_BOT_TOKEN;
9
- console.log(JSON.stringify({ node: process.version, tokenPresent: Boolean(token), cwd: process.cwd(), package: "@xbibzlibrary/telebibz" }, null, 2));
10
- if (token) {
11
- const bot = new Bot({ token, branding: false });
12
- const health = await bot.health();
13
- console.log(JSON.stringify(health, null, 2));
14
- if (!health.apiReachable)
15
- process.exitCode = 1;
16
- }
17
- }
18
- async function commandStart() {
19
- const token = process.env.TELEGRAM_BOT_TOKEN;
20
- if (!token)
21
- throw new Error("TELEGRAM_BOT_TOKEN is required");
22
- const bot = new Bot(token);
23
- await bot.start();
24
- }
25
- async function commandInit(name) {
26
- const dir = name || "my-telebibz-bot";
27
- printTeleBibzBanner({ subtitle: "telebibz init" });
28
- await mkdir(dir, { recursive: true });
29
- await writeFile(`${dir}/index.ts`, `import { Bot } from "@xbibzlibrary/telebibz";\n\nconst bot = new Bot(process.env.TELEGRAM_BOT_TOKEN!);\nbot.command("start", (ctx) => ctx.reply("Hello from telebibz"));\nawait bot.start();\n`);
30
- await writeFile(`${dir}/.env.example`, "TELEGRAM_BOT_TOKEN=\n");
31
- console.log(`Created ${dir}`);
32
- }
33
- async function run(name, args) {
34
- return new Promise((resolve) => {
35
- const child = spawn(name, args, { stdio: "inherit", shell: false });
36
- child.on("exit", (code, signal) => resolve(signal ? 1 : code ?? 1));
37
- });
38
- }
39
- export async function main(argv = process.argv.slice(2)) {
40
- const [command, argument] = argv;
41
- switch (command) {
42
- case "start":
43
- await commandStart();
44
- break;
45
- case "doctor":
46
- await commandDoctor();
47
- break;
48
- case "init":
49
- await commandInit(argument ?? "my-telebibz-bot");
50
- break;
51
- case "generate":
52
- process.exitCode = await run("node", ["scripts/generate-api.mjs"]);
53
- break;
54
- case "build":
55
- process.exitCode = await run("npm", ["run", "build"]);
56
- break;
57
- case "test":
58
- process.exitCode = await run("npm", ["test"]);
59
- break;
60
- case "webhook": {
61
- const token = process.env.TELEGRAM_BOT_TOKEN;
62
- if (!token)
63
- throw new Error("TELEGRAM_BOT_TOKEN is required");
64
- const bot = new Bot({ token, branding: false });
65
- printTeleBibzBanner({ subtitle: "telebibz webhook", message: "Webhook handler ready" });
66
- const webhookOptions = process.env.TELEGRAM_WEBHOOK_SECRET ? { secretToken: process.env.TELEGRAM_WEBHOOK_SECRET } : {};
67
- const handler = createWebhookHandler(bot, webhookOptions);
68
- await access(".");
69
- console.log(`Handler type: ${typeof handler}`);
70
- break;
71
- }
72
- case "inspect":
73
- console.log(JSON.stringify({ cwd: process.cwd(), node: process.version }, null, 2));
74
- break;
75
- default: console.log("telebibz commands: start, init, dev, generate, webhook, doctor, test, inspect, build");
76
- }
77
- }
78
- if (process.argv[1]?.endsWith("/cli.js") || process.argv[1]?.endsWith("/cli.ts"))
79
- void main().catch((error) => {
80
- const message = error instanceof Error ? error.message : "Unknown CLI error";
81
- console.error(`telebibz: ${message}`);
82
- process.exitCode = 1;
83
- });
84
- //# sourceMappingURL=cli.js.map