gramstax 0.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 (61) hide show
  1. package/LICENSE +25 -0
  2. package/README.md +0 -0
  3. package/dist/package.json +52 -0
  4. package/dist/src/base/general.d.ts +7 -0
  5. package/dist/src/base/general.d.ts.map +1 -0
  6. package/dist/src/base/general.js +15 -0
  7. package/dist/src/base/guard.d.ts +13 -0
  8. package/dist/src/base/guard.d.ts.map +1 -0
  9. package/dist/src/base/guard.js +8 -0
  10. package/dist/src/base/index.d.ts +4 -0
  11. package/dist/src/base/index.d.ts.map +1 -0
  12. package/dist/src/base/index.js +3 -0
  13. package/dist/src/base/page.d.ts +263 -0
  14. package/dist/src/base/page.d.ts.map +1 -0
  15. package/dist/src/base/page.js +805 -0
  16. package/dist/src/cache/external.d.ts +10 -0
  17. package/dist/src/cache/external.d.ts.map +1 -0
  18. package/dist/src/cache/external.js +16 -0
  19. package/dist/src/cache/index.d.ts +2 -0
  20. package/dist/src/cache/index.d.ts.map +1 -0
  21. package/dist/src/cache/index.js +1 -0
  22. package/dist/src/core/bot.d.ts +804 -0
  23. package/dist/src/core/bot.d.ts.map +1 -0
  24. package/dist/src/core/bot.js +465 -0
  25. package/dist/src/core/ctx.d.ts +60 -0
  26. package/dist/src/core/ctx.d.ts.map +1 -0
  27. package/dist/src/core/ctx.js +175 -0
  28. package/dist/src/core/index.d.ts +3 -0
  29. package/dist/src/core/index.d.ts.map +1 -0
  30. package/dist/src/core/index.js +2 -0
  31. package/dist/src/grammy/index.d.ts +2 -0
  32. package/dist/src/grammy/index.d.ts.map +1 -0
  33. package/dist/src/grammy/index.js +1 -0
  34. package/dist/src/index.d.ts +5 -0
  35. package/dist/src/index.d.ts.map +1 -0
  36. package/dist/src/index.js +4 -0
  37. package/dist/src/template/engine.d.ts +34 -0
  38. package/dist/src/template/engine.d.ts.map +1 -0
  39. package/dist/src/template/engine.js +122 -0
  40. package/dist/src/template/index.d.ts +3 -0
  41. package/dist/src/template/index.d.ts.map +1 -0
  42. package/dist/src/template/index.js +2 -0
  43. package/dist/src/template/manager.d.ts +111 -0
  44. package/dist/src/template/manager.d.ts.map +1 -0
  45. package/dist/src/template/manager.js +237 -0
  46. package/package.json +51 -0
  47. package/src/base/general.ts +17 -0
  48. package/src/base/guard.ts +10 -0
  49. package/src/base/index.ts +3 -0
  50. package/src/base/page.ts +1111 -0
  51. package/src/cache/external.ts +15 -0
  52. package/src/cache/index.ts +1 -0
  53. package/src/core/bot.ts +535 -0
  54. package/src/core/ctx.ts +177 -0
  55. package/src/core/index.ts +2 -0
  56. package/src/grammy/index.ts +1 -0
  57. package/src/index.ts +4 -0
  58. package/src/template/engine.ts +167 -0
  59. package/src/template/index.ts +2 -0
  60. package/src/template/manager.ts +280 -0
  61. package/src/types/page.d.ts +4 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bot.d.ts","sourceRoot":"","sources":["../../../src/core/bot.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,OAAO,CAAA;AAI3B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAC7C,OAAO,EAAE,GAAG,EAAmB,KAAK,QAAQ,EAAE,KAAK,OAAO,EAAE,MAAM,QAAQ,CAAA;AAC1E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AACjD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AAE9C,qBAAa,QAAQ;IACZ,eAAe,EAAE,eAAe,CAAA;IAChC,aAAa,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;IAC5B,YAAY,EAAE,aAAa,CAAA;IAC3B,KAAK;aAqQG,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC;iBACrB,MAAM,EAAE;;;sBAzFiB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;;;sBAHd,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;;;;;;;MA1KvC;IACxB,GAAG,EAAE,aAAa,CAAA;IAClB,GAAG,EAAE,GAAG,CAAA;gBAEI,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,aAAa,CAAC;QAAC,YAAY,CAAC,EAAE,aAAa,CAAC;QAAC,aAAa,CAAC,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QAAC,eAAe,CAAC,EAAE,eAAe,CAAA;KAAE;IAgC1K,OAAO,CAAC,KAAK,EAAE,QAAQ,CAAC,OAAO,CAAC;IAIhC,OAAO,CAAC,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,SAAS,GAAG,SAAS,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IASlF,OAAO,CAAC,EAAE,EAAE,OAAO;IAIb,UAAU;IAQV,UAAU,CAAC,OAAO,EAAE,MAAM;IAoChC,WAAW,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,UAAO;IAW5C,aAAa,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM;IAO/C,SAAS,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,IAAI,CAAC,KAAK;IAkDnD,SAAS;aAgGD,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC;iBACrB,MAAM,EAAE;;;sBAzFiB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;;;sBAHd,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;sBAApB,MAAM;sBAAQ,MAAM;;;;;;;;;;IA4IzD,UAAU,CAAC,GAAG,EAAE,GAAG,EAAE,YAAY,EAAE,UAAU,GAAG,MAAM,OAAO,IAAI,CAAC,KAAK,CAAC,eAAe,GAAG,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC;IAqH7G,eAAe,CAAC,GAAG,EAAE,GAAG,EAAE,YAAY,EAAE,MAAM;IAK9C,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO;IAKzE,0BAA0B,CAAC,GAAG,EAAE,GAAG;IAKnC,SAAS,CAAC,EAAE,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiB3D,mBAAmB,CAAC,EAAE,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAiB/C,aAAa,CAAC,EAAE,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAIzC,cAAc,CAAC,EAAE,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAI1C,cAAc,CAAC,EAAE,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAI1C,cAAc,CAAC,EAAE,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAI1C,iBAAiB,CAAC,EAAE,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAI7C,kBAAkB,CAAC,EAAE,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAI9C,cAAc,CAAC,EAAE,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAI1C,kBAAkB,CAAC,EAAE,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAI9C,gBAAgB,CAAC,EAAE,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAI5C,iBAAiB,CAAC,EAAE,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAI7C,gBAAgB,CAAC,EAAE,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;CAG1D"}
@@ -0,0 +1,465 @@
1
+ import { Ctx } from "./ctx";
2
+ import { serve } from "bun";
3
+ import { readdirSync } from "node:fs";
4
+ import { join, parse } from "node:path";
5
+ import { CacheExternal } from "../cache";
6
+ import { LoggingPretty } from "logging-pretty";
7
+ import { TemplateManager } from "../template";
8
+ import { Bot, webhookCallback } from "grammy";
9
+ export class Gramstax {
10
+ templateManager;
11
+ cacheKeyboard;
12
+ cacheSession;
13
+ pages = this.pageLoads();
14
+ log;
15
+ bot;
16
+ constructor(params) {
17
+ this.log = params.log || new LoggingPretty();
18
+ this.cacheSession = params.cacheSession || new CacheExternal(`memory`, `session`);
19
+ this.cacheKeyboard = params.cacheKeyboard || new Map();
20
+ this.templateManager = params.templateManager || new TemplateManager({ path: null });
21
+ this.bot = new Bot(params.token);
22
+ this.bot.catch(this.onCatch);
23
+ this.bot.on(`callback_query:data`, this.onCallbackQueryData.bind(this)); // Handle callback queries from inline keyboards
24
+ this.bot.on(`message:text`, this.onMessageText.bind(this)); // Handle global text messages
25
+ this.bot.on(`message:photo`, this.onMessagePhoto.bind(this)); // Handle global photo messages
26
+ this.bot.on(`message:video`, this.onMessageVideo.bind(this)); // Handle global video messages
27
+ this.bot.on(`message:audio`, this.onMessageAudio.bind(this)); // Handle global audio messages
28
+ this.bot.on(`message:document`, this.onMessageDocument.bind(this)); // Handle global document messages
29
+ this.bot.on(`message:animation`, this.onMessageAnimation.bind(this)); // Handle global animation messages
30
+ this.bot.on(`message:voice`, this.onMessageVoice.bind(this)); // Handle global voice messages
31
+ this.bot.on(`message:video_note`, this.onMessageVideoNote.bind(this)); // Handle global video note messages
32
+ this.bot.on(`message:sticker`, this.onMessageSticker.bind(this)); // Handle global sticker messages
33
+ this.bot.on(`message:location`, this.onMessageLocation.bind(this)); // Handle global location messages
34
+ this.bot.on(`message:contact`, this.onMessageContact.bind(this)); // Handle global contact messages
35
+ // Graceful shutdown
36
+ process.once(`SIGINT`, () => this.bot.stop());
37
+ process.once(`SIGTERM`, () => this.bot.stop());
38
+ if (params.deploy.startsWith(`polling`)) {
39
+ this.runPolling();
40
+ }
41
+ else if (params.deploy.startsWith(`webhook`)) {
42
+ this.runWebhook(params.deploy.split(`webhook:`)[1]);
43
+ }
44
+ }
45
+ onCatch(error) {
46
+ this.log.error(`[Bot.catch]: ${String(error)}`);
47
+ }
48
+ onStart(botInfo, method, data) {
49
+ const { username } = botInfo;
50
+ if (method == `polling`) {
51
+ this.log.success(`Telegram bot polling started: ${username}`);
52
+ }
53
+ else {
54
+ this.log.success(`Telegram bot webhook started: ${username} (${data})`);
55
+ }
56
+ }
57
+ initCtx(ct) {
58
+ return new Ctx(ct, this.templateManager, this.cacheSession, this.cacheKeyboard);
59
+ }
60
+ async runPolling() {
61
+ this.bot.start({
62
+ onStart: async (botInfo) => {
63
+ this.onStart(botInfo, `polling`, null);
64
+ }
65
+ });
66
+ }
67
+ async runWebhook(baseUrl) {
68
+ const handleUpdate = webhookCallback(this.bot, `bun`);
69
+ const pathWebhook = `/telegram-webhook`;
70
+ serve({
71
+ fetch(req) {
72
+ const { pathname } = new URL(req.url);
73
+ if (pathname === pathWebhook) {
74
+ if (req.method === `POST`) {
75
+ return handleUpdate(req);
76
+ }
77
+ return new Response(`OK`, { status: 200 });
78
+ }
79
+ if (pathname === `/` && req.method === `GET`) {
80
+ const timestamp = new Date().toISOString();
81
+ return new Response(JSON.stringify({ timestamp }), {
82
+ status: 200,
83
+ headers: { "Content-Type": `application/json` }
84
+ });
85
+ }
86
+ // Jika tidak cocok
87
+ return new Response(`Not found`, { status: 404 });
88
+ }
89
+ });
90
+ const data = await this.bot.api.getWebhookInfo();
91
+ const webhookUrl = baseUrl.endsWith(`/`) ? baseUrl.slice(0, -1) + pathWebhook : baseUrl + pathWebhook;
92
+ if (data.url != webhookUrl) {
93
+ await this.bot.api.setWebhook(webhookUrl);
94
+ }
95
+ const botInfo = await this.bot.api.getMe();
96
+ this.onStart(botInfo, `webhook`, webhookUrl);
97
+ }
98
+ pageCompile(Page, redacted = true) {
99
+ if (Page?.template !== undefined) {
100
+ this.templateManager.compile(Page.data.name, Page.template);
101
+ if (redacted) {
102
+ Page.template = undefined; // redacted to reduce memory
103
+ }
104
+ }
105
+ else {
106
+ Page.template = undefined;
107
+ }
108
+ }
109
+ pageBuildData(Page, filePath) {
110
+ if (Page?.data === undefined) {
111
+ Page.data = Page.buildData();
112
+ }
113
+ Page.data.name = parse(filePath).name;
114
+ }
115
+ pageSorts(Page, pages) {
116
+ const name = Page.data.name;
117
+ const proto = Page.prototype;
118
+ const partPayload = `Payload`;
119
+ const partCommand = `Command`;
120
+ const partCaption = `Caption`;
121
+ const partFree = `Free`;
122
+ const pd = pages.dynamic;
123
+ const pds = pages.dynamicSpesific;
124
+ const upFirst = (s) => s.charAt(0).toUpperCase() + s.slice(1);
125
+ const getPureFuncName = (func) => func.replace(partPayload, ``).replace(partCommand, ``).replace(partCaption, ``).replace(partFree, ``);
126
+ const buildSessionMethod = (func, name) => proto[`buildSessionMethod${upFirst(func)}`](name);
127
+ // all
128
+ pages.all[name] = Page;
129
+ for (let index = 0; index < pages.lenListFuncStaticSession; index++) {
130
+ const func = pages.listFuncStaticSession[index];
131
+ const ps = pages.static[func];
132
+ const psi = pages.staticIntent[func];
133
+ const pss = pages.staticSession[func];
134
+ const value = { name, func };
135
+ const p = ps || psi;
136
+ if (p !== undefined) {
137
+ const _name = func.includes(partCommand) ? `/${name}` : name;
138
+ p[proto.buildIntent(_name, func.startsWith(`callback`))] = value;
139
+ }
140
+ // staticSession
141
+ if (pss !== undefined) {
142
+ pss[buildSessionMethod(func, name)] = value;
143
+ }
144
+ // dynamicStatic
145
+ if (func.toLowerCase().endsWith(`free`)) {
146
+ pds[getPureFuncName(func)].push(value);
147
+ }
148
+ }
149
+ // all
150
+ if (proto.free) {
151
+ pd.push(name);
152
+ }
153
+ }
154
+ pageLoads() {
155
+ this.log.info(`Load pages..`);
156
+ const path = join(process.cwd(), `src`, `pages`);
157
+ const files = readdirSync(path);
158
+ const initStatic = {}; // { [page.data.name]: { name: Page.data.name, func: routeFunctionName } }
159
+ const initStaticIntent = initStatic; // { [intent]: { name: page.data.name, func: routeFunctionName } }
160
+ const initStaticSession = initStatic; // { [session.method]: { name: page.data.name, func: routeFunctionName } }
161
+ const initDynamicSpesific = []; //
162
+ const listFuncStatic = [
163
+ // callback
164
+ `callback`,
165
+ // text
166
+ `text`,
167
+ `textCommand`,
168
+ // photo
169
+ `photoCaption`,
170
+ `photoCaptionCommand`,
171
+ // video
172
+ `videoCaption`,
173
+ `videoCaptionCommand`,
174
+ // audio
175
+ `audioCaption`,
176
+ `audioCaptionCommand`,
177
+ // document
178
+ `documentCaption`,
179
+ `documentCaptionCommand`,
180
+ // animation
181
+ `animationCaption`,
182
+ `animationCaptionCommand`,
183
+ // voice
184
+ `voiceCaption`,
185
+ `voiceCaptionCommand`,
186
+ // videoNote
187
+ `videoNoteCaption`,
188
+ `videoNoteCaptionCommand`
189
+ ];
190
+ const listFuncStaticIntent = [
191
+ // callback
192
+ `callbackPayload`,
193
+ // text
194
+ `textPayload`,
195
+ `textCommandPayload`,
196
+ // photo
197
+ `photoCaptionPayload`,
198
+ `photoCaptionCommandPayload`,
199
+ // video
200
+ `videoCaptionPayload`,
201
+ `videoCaptionCommandPayload`,
202
+ // audio
203
+ `audioCaptionPayload`,
204
+ `audioCaptionCommandPayload`,
205
+ // document
206
+ `documentCaptionPayload`,
207
+ `documentCaptionCommandPayload`,
208
+ // animation
209
+ `animationCaptionPayload`,
210
+ `animationCaptionCommandPayload`,
211
+ // voice
212
+ `voiceCaptionPayload`,
213
+ `voiceCaptionCommandPayload`,
214
+ // video note
215
+ `videoNoteCaptionPayload`,
216
+ `videoNoteCaptionCommandPayload`
217
+ ];
218
+ const listFuncStaticSession = [
219
+ ...listFuncStatic,
220
+ ...listFuncStaticIntent,
221
+ // text
222
+ `textFree`,
223
+ // photo
224
+ `photoFree`,
225
+ // video
226
+ `videoFree`,
227
+ // audio
228
+ `audioFree`,
229
+ // document
230
+ `documentFree`,
231
+ // animation
232
+ `animationFree`,
233
+ // voice
234
+ `voiceFree`,
235
+ // videoNote
236
+ `videoNoteFree`,
237
+ // sticker
238
+ `stickerFree`,
239
+ // location
240
+ `locationFree`,
241
+ // contact
242
+ `contactFree`
243
+ ];
244
+ const makeObject = (keys, val) => Object.fromEntries(keys.map((k) => [k, { ...val }]));
245
+ const pages = {
246
+ all: {}, // (classes) all Page
247
+ dynamic: [], // (dynamic) all Page function free
248
+ dynamicSpesific: {
249
+ text: initDynamicSpesific,
250
+ photo: initDynamicSpesific,
251
+ video: initDynamicSpesific,
252
+ audio: initDynamicSpesific,
253
+ document: initDynamicSpesific,
254
+ animation: initDynamicSpesific,
255
+ voice: initDynamicSpesific,
256
+ videoNote: initDynamicSpesific,
257
+ sticker: initDynamicSpesific,
258
+ location: initDynamicSpesific,
259
+ contact: initDynamicSpesific
260
+ },
261
+ static: makeObject(listFuncStatic, initStatic),
262
+ staticIntent: makeObject(listFuncStaticIntent, initStaticIntent),
263
+ staticSession: makeObject(listFuncStaticSession, initStaticSession),
264
+ listFuncStatic,
265
+ listFuncStaticIntent,
266
+ listFuncStaticSession,
267
+ lenListFuncStatic: listFuncStatic.length,
268
+ lenListFuncStaticIntent: listFuncStaticIntent.length,
269
+ lenListFuncStaticSession: listFuncStaticSession.length
270
+ };
271
+ for (const file of files) {
272
+ const filePath = join(path, file);
273
+ const module = require(filePath); // eslint-disable-line
274
+ const exports = Object.values(module);
275
+ const Page = exports[0]; // like StartPage. not have default export
276
+ if (Page === undefined) {
277
+ throw `file ${parse(filePath).name} must have export (not default) class page`;
278
+ }
279
+ // create if not exist and set name (without ext) according filePath
280
+ this.pageBuildData(Page, filePath);
281
+ // if the raw template writes directly to the Page class, do a compile
282
+ this.pageCompile(Page);
283
+ // sort route method
284
+ this.pageSorts(Page, pages);
285
+ }
286
+ this.log.info(`Finish load pages with total (${Object.keys(pages.all).length})`);
287
+ return pages;
288
+ }
289
+ async pageRoutes(ctx, fromListener) {
290
+ // to be reassigned
291
+ let Page;
292
+ let res;
293
+ // (static) priority O(1)
294
+ if (Page === undefined) {
295
+ const cd = ctx.callbackData;
296
+ const mt = ctx.msgText;
297
+ const mc = ctx.msgCaption;
298
+ const ps = this.pages.static;
299
+ for (let index = 0; index < this.pages.lenListFuncStatic; index++) {
300
+ const funcName = this.pages.listFuncStatic[index];
301
+ res = ps[funcName][cd || mt || mc];
302
+ if (res) {
303
+ break;
304
+ }
305
+ }
306
+ if (res !== undefined) {
307
+ Page = this.pages.all[res.name];
308
+ }
309
+ }
310
+ // (staticSession) x = method; O(x)
311
+ if (Page === undefined) {
312
+ const session = await ctx.sessionGet();
313
+ if (session) {
314
+ const mtd = session.method;
315
+ const pss = this.pages.staticSession;
316
+ for (let index = 0; index < this.pages.lenListFuncStaticSession; index++) {
317
+ const funcName = this.pages.listFuncStaticSession[index];
318
+ res = pss[funcName][mtd];
319
+ if (res) {
320
+ break;
321
+ }
322
+ }
323
+ if (res !== undefined) {
324
+ Page = this.pages.all[res.name];
325
+ }
326
+ }
327
+ }
328
+ // (staticIntent) x = startsWith; O(x)
329
+ if (Page === undefined) {
330
+ const cdi = ctx.callbackDataIntent;
331
+ const mti = ctx.msgTextIntent;
332
+ const mci = ctx.msgCaptionIntent;
333
+ const psi = this.pages.staticIntent;
334
+ for (let index = 0; index < this.pages.lenListFuncStaticIntent; index++) {
335
+ const funcName = this.pages.listFuncStaticIntent[index];
336
+ res = psi[funcName][cdi || mti || mci];
337
+ if (res) {
338
+ break;
339
+ }
340
+ }
341
+ if (res !== undefined) {
342
+ Page = this.pages.all[res.name];
343
+ }
344
+ }
345
+ // run
346
+ if (Page !== undefined && res !== undefined) {
347
+ const initPage = new Page(ctx);
348
+ const initRoute = await initPage[res.func]?.();
349
+ return initRoute;
350
+ }
351
+ // (dynamicSpesific) O(n)
352
+ const arrFree = this.pages.dynamicSpesific[fromListener] || [];
353
+ for (let index = 0; index < arrFree.length; index++) {
354
+ const value = arrFree[index];
355
+ if (value === undefined) {
356
+ continue;
357
+ }
358
+ const Page = this.pages.all[value.func];
359
+ if (Page === undefined) {
360
+ continue;
361
+ }
362
+ const initPage = new Page(ctx);
363
+ const initRoute = await initPage[value.name]?.();
364
+ // const initRoute = await initPage.route(value.name)
365
+ if (initRoute !== null) {
366
+ return initRoute; // stop when return not null
367
+ }
368
+ }
369
+ // (dynamic) O(n)
370
+ for (let index = 0; index < this.pages.dynamic.length; index++) {
371
+ const value = this.pages.dynamic[index];
372
+ if (value === undefined) {
373
+ continue;
374
+ }
375
+ const Page = this.pages.all[value];
376
+ if (Page === undefined) {
377
+ continue;
378
+ }
379
+ const initPage = new Page(ctx);
380
+ const initRoute = await initPage.free?.();
381
+ // const initRoute = await initPage.route(`free`)
382
+ if (initRoute !== null) {
383
+ return initRoute; // stop when return not null
384
+ }
385
+ }
386
+ return null;
387
+ }
388
+ async hookBeforeRoute(ctx, listenerName) {
389
+ // must be override
390
+ return true;
391
+ }
392
+ async hookErrorPage(ctx, listenerName, error, isEdit) {
393
+ // must be override
394
+ return;
395
+ }
396
+ async hookErrorInputNotFoundPage(ctx) {
397
+ // must be override
398
+ return;
399
+ }
400
+ async onMessage(ct, listenerName) {
401
+ const ctx = this.initCtx(ct);
402
+ try {
403
+ const before = await this.hookBeforeRoute(ctx, listenerName);
404
+ if (before === false) {
405
+ return;
406
+ }
407
+ const route = await this.pageRoutes(ctx, listenerName);
408
+ if (route === null) {
409
+ await this.hookErrorInputNotFoundPage(ctx);
410
+ }
411
+ }
412
+ catch (error) {
413
+ await this.hookErrorPage(ctx, listenerName, error, false);
414
+ }
415
+ }
416
+ async onCallbackQueryData(ct) {
417
+ const ctx = this.initCtx(ct);
418
+ try {
419
+ // answer callback query first for fast response
420
+ await ctx.callbackQueryAnswer();
421
+ const before = await this.hookBeforeRoute(ctx, `onCallbackQueryData`);
422
+ if (before === false) {
423
+ return;
424
+ }
425
+ // Check all route
426
+ await this.pageRoutes(ctx, `callback`);
427
+ }
428
+ catch (error) {
429
+ await this.hookErrorPage(ctx, `onCallbackQueryData`, error, true);
430
+ }
431
+ }
432
+ async onMessageText(ct) {
433
+ await this.onMessage(ct, `onMessageText`);
434
+ }
435
+ async onMessagePhoto(ct) {
436
+ await this.onMessage(ct, `onMessagePhoto`);
437
+ }
438
+ async onMessageVideo(ct) {
439
+ await this.onMessage(ct, `onMessageVideo`);
440
+ }
441
+ async onMessageAudio(ct) {
442
+ await this.onMessage(ct, `onMessageAudio`);
443
+ }
444
+ async onMessageDocument(ct) {
445
+ await this.onMessage(ct, `onMessageDocument`);
446
+ }
447
+ async onMessageAnimation(ct) {
448
+ await this.onMessage(ct, `onMessageAnimation`);
449
+ }
450
+ async onMessageVoice(ct) {
451
+ await this.onMessage(ct, `onMessageVoice`);
452
+ }
453
+ async onMessageVideoNote(ct) {
454
+ await this.onMessage(ct, `onMessageVideoNote`);
455
+ }
456
+ async onMessageSticker(ct) {
457
+ await this.onMessage(ct, `onMessageSticker`);
458
+ }
459
+ async onMessageLocation(ct) {
460
+ await this.onMessage(ct, `onMessageLocation`);
461
+ }
462
+ async onMessageContact(ct) {
463
+ await this.onMessage(ct, `onMessageContact`);
464
+ }
465
+ }
@@ -0,0 +1,60 @@
1
+ import { CacheExternal } from "../cache";
2
+ import { BaseGeneral } from "../base";
3
+ import { TemplateManager } from "../template";
4
+ import { InlineKeyboard, Keyboard, type Context } from "grammy";
5
+ export declare class Ctx extends BaseGeneral {
6
+ ct: Context;
7
+ templateManager: TemplateManager;
8
+ cacheSession: CacheExternal;
9
+ cacheKeyboard: Map<any, any>;
10
+ data: {
11
+ name: string;
12
+ callbackData: (...args: any) => string | any;
13
+ };
14
+ get isPremium(): boolean;
15
+ get isBot(): boolean;
16
+ get userid(): number;
17
+ get username(): string;
18
+ get fullname(): string;
19
+ get firstname(): string;
20
+ get lastname(): string;
21
+ get msgText(): string;
22
+ get msgTextIntent(): string;
23
+ get msgTextPayloads(): any[];
24
+ get msgTextPayload(): string;
25
+ get msgCaption(): string;
26
+ get msgCaptionIntent(): string;
27
+ get msgPhoto(): import("grammy/types").PhotoSize[] | undefined;
28
+ get msgVideo(): import("grammy/types").Video | undefined;
29
+ get msgAudio(): import("grammy/types").Audio | undefined;
30
+ get callbackData(): string;
31
+ get callbackDataIntent(): string;
32
+ get callbackDataPayloads(): any[];
33
+ get callbackDataPayload(): string;
34
+ get callbackDataParts(): any[];
35
+ get languageCode(): any;
36
+ set languageCode(v: any);
37
+ session: {
38
+ method?: string;
39
+ params?: any;
40
+ };
41
+ constructor(ct: Context, templateManager: TemplateManager, cacheSession: CacheExternal, cacheKeyboard: Map<any, any>);
42
+ broadcast(ids: any[], languageCode: any[], keyboard?: Keyboard | InlineKeyboard, data?: Record<string, any>, baseId?: string, options?: any): Promise<void>;
43
+ reply(keyboard?: Keyboard | InlineKeyboard, data?: Record<string, any>, baseId?: string, options?: any): Promise<import("grammy/types").Message.TextMessage>;
44
+ replyAction(type: Parameters<typeof this.ct.replyWithChatAction>[0]): Promise<true>;
45
+ edit(keyboard?: Keyboard | InlineKeyboard, data?: Record<string, any>, baseId?: string, options?: any): Promise<true | (import("grammy/types").Update.Edited & import("grammy/types").Message.CommonMessage & {
46
+ text: string;
47
+ } & Partial<{
48
+ entities: import("grammy/types").MessageEntity[];
49
+ }>) | undefined>;
50
+ delete(): Promise<true>;
51
+ callbackQueryAnswer(options?: any): Promise<true | null>;
52
+ sessionSet(method: string, params: any, ...moreRoot: any): Promise<boolean | null>;
53
+ sessionGet(): Promise<{
54
+ method: string;
55
+ params: any;
56
+ [moreRoot: string]: any;
57
+ } | null>;
58
+ sessionClear(): Promise<boolean | null>;
59
+ }
60
+ //# sourceMappingURL=ctx.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ctx.d.ts","sourceRoot":"","sources":["../../../src/core/ctx.ts"],"names":[],"mappings":"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"}