telemeister 0.3.0 → 0.3.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +17 -11
- package/bin/telemeister-cli.js +1 -6
- package/dist/cli/create-bot.d.ts.map +1 -1
- package/dist/cli/create-bot.js +2 -7
- package/dist/cli/create-bot.js.map +1 -1
- package/dist/core/bot/polling.d.ts.map +1 -1
- package/dist/core/bot/polling.js +18 -4
- package/dist/core/bot/polling.js.map +1 -1
- package/dist/core/bot/session.d.ts +1 -1
- package/dist/core/bot/session.d.ts.map +1 -1
- package/dist/core/bot/session.js +2 -1
- package/dist/core/bot/session.js.map +1 -1
- package/dist/core/bot/types.d.ts +2 -0
- package/dist/core/bot/types.d.ts.map +1 -1
- package/dist/core/bot/webhook.d.ts.map +1 -1
- package/dist/core/bot/webhook.js +18 -12
- package/dist/core/bot/webhook.js.map +1 -1
- package/dist/core/builder.d.ts +59 -2
- package/dist/core/builder.d.ts.map +1 -1
- package/dist/core/builder.js +108 -0
- package/dist/core/builder.js.map +1 -1
- package/dist/core/types.d.ts +7 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js +0 -1
- package/dist/core/types.js.map +1 -1
- package/dist/templates/commands.ts.example +70 -0
- package/dist/templates/database.ts.ejs +6 -0
- package/dist/templates/handler.ts.ejs +7 -7
- package/dist/templates/prisma-schema.prisma.ejs +1 -0
- package/package.json +1 -1
- package/src/templates/commands.ts.example +70 -0
- package/src/templates/database.ts.ejs +6 -0
- package/src/templates/handler.ts.ejs +7 -7
- package/src/templates/prisma-schema.prisma.ejs +1 -0
package/README.md
CHANGED
|
@@ -218,20 +218,20 @@ import type { MenuTransitions } from './bot-state-types.js';
|
|
|
218
218
|
appBuilder
|
|
219
219
|
.forState('menu')
|
|
220
220
|
.onEnter(async (context: AppContext): MenuTransitions => {
|
|
221
|
-
await context.
|
|
221
|
+
await context.reply('Welcome to menu!');
|
|
222
222
|
// Can only return 'idle', 'welcome', or void
|
|
223
223
|
})
|
|
224
224
|
.onResponse(async (context: AppContext): MenuTransitions => {
|
|
225
225
|
// Handle text messages
|
|
226
226
|
if (context.ctx.message?.text === 'back') return 'welcome'; // ✅ Valid
|
|
227
227
|
if (context.ctx.message?.text === 'exit') return 'idle'; // ✅ Valid
|
|
228
|
-
|
|
228
|
+
|
|
229
229
|
// Handle inline button callbacks
|
|
230
230
|
if (context.ctx.callbackQuery?.data === 'go_back') {
|
|
231
231
|
await context.ctx.answerCallbackQuery();
|
|
232
232
|
return 'welcome';
|
|
233
233
|
}
|
|
234
|
-
|
|
234
|
+
|
|
235
235
|
// return 'invalid'; // ❌ Type error - not in transitions
|
|
236
236
|
});
|
|
237
237
|
```
|
|
@@ -255,24 +255,29 @@ interface BotHandlerContext<TState> {
|
|
|
255
255
|
|
|
256
256
|
// State transition
|
|
257
257
|
transition: (toState: TState) => Promise<void>;
|
|
258
|
+
|
|
259
|
+
// Universal reply - works with messages, callbacks, and poll answers
|
|
260
|
+
reply: (text: string, extra?) => Promise<Message>;
|
|
258
261
|
}
|
|
259
262
|
```
|
|
260
263
|
|
|
261
264
|
The `ctx` property provides full access to Grammy's Context API:
|
|
262
|
-
- `ctx.reply()`, `ctx.replyWithPhoto()`, `ctx.replyWithPoll()`, etc.
|
|
263
265
|
- `ctx.message?.text` - Text messages
|
|
264
|
-
- `ctx.callbackQuery?.data` - Inline button callbacks
|
|
266
|
+
- `ctx.callbackQuery?.data` - Inline button callbacks
|
|
265
267
|
- `ctx.message?.photo` - Photo messages
|
|
266
268
|
- `ctx.pollAnswer` - Poll responses
|
|
269
|
+
- `ctx.api.sendMessage()`, `ctx.replyWithPoll()`, `ctx.replyWithPhoto()`, etc. - Send messages
|
|
267
270
|
- See [Grammy docs](https://grammy.dev/guide/context) for full API
|
|
268
271
|
|
|
272
|
+
**Note:** Use `context.reply()` instead of `context.ctx.reply()` for universal reply that works with all update types (messages, callbacks, poll answers).
|
|
273
|
+
|
|
269
274
|
### Handler Types
|
|
270
275
|
|
|
271
276
|
```typescript
|
|
272
277
|
// Called when entering a state
|
|
273
278
|
.onEnter(async (context) => {
|
|
274
|
-
//
|
|
275
|
-
await context.
|
|
279
|
+
// Use context.reply() for universal reply
|
|
280
|
+
await context.reply("Welcome!", {
|
|
276
281
|
reply_markup: {
|
|
277
282
|
inline_keyboard: [[{ text: 'Click', callback_data: 'click' }]]
|
|
278
283
|
}
|
|
@@ -285,14 +290,14 @@ The `ctx` property provides full access to Grammy's Context API:
|
|
|
285
290
|
.onResponse(async (context) => {
|
|
286
291
|
// Text message
|
|
287
292
|
if (context.ctx.message?.text === "yes") {
|
|
288
|
-
await context.
|
|
293
|
+
await context.reply("Confirmed!");
|
|
289
294
|
return "confirmed";
|
|
290
295
|
}
|
|
291
|
-
|
|
296
|
+
|
|
292
297
|
// Inline button callback
|
|
293
298
|
if (context.ctx.callbackQuery?.data === "click") {
|
|
294
299
|
await context.ctx.answerCallbackQuery();
|
|
295
|
-
await context.
|
|
300
|
+
await context.reply("Button clicked!");
|
|
296
301
|
return "clicked";
|
|
297
302
|
}
|
|
298
303
|
|
|
@@ -303,7 +308,8 @@ The `ctx` property provides full access to Grammy's Context API:
|
|
|
303
308
|
|
|
304
309
|
// Poll response
|
|
305
310
|
if (context.ctx.pollAnswer) {
|
|
306
|
-
|
|
311
|
+
const optionIds = context.ctx.pollAnswer.option_ids;
|
|
312
|
+
await context.reply(`You selected options: ${optionIds.join(', ')}`);
|
|
307
313
|
}
|
|
308
314
|
|
|
309
315
|
// Return void to stay in current state
|
package/bin/telemeister-cli.js
CHANGED
|
@@ -1085,12 +1085,7 @@ function renderTemplate(templateName, data = {}) {
|
|
|
1085
1085
|
return ejs_default.render(template, data);
|
|
1086
1086
|
}
|
|
1087
1087
|
function getPackageManager() {
|
|
1088
|
-
|
|
1089
|
-
execSync("pnpm --version", { stdio: "ignore" });
|
|
1090
|
-
return "pnpm";
|
|
1091
|
-
} catch {
|
|
1092
|
-
return "npm";
|
|
1093
|
-
}
|
|
1088
|
+
return "npm";
|
|
1094
1089
|
}
|
|
1095
1090
|
async function createBot(botName) {
|
|
1096
1091
|
if (!botName) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-bot.d.ts","sourceRoot":"","sources":["../../src/cli/create-bot.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"create-bot.d.ts","sourceRoot":"","sources":["../../src/cli/create-bot.ts"],"names":[],"mappings":"AAAA;;GAEG;AA2CH,wBAAsB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CA6G1E"}
|
package/dist/cli/create-bot.js
CHANGED
|
@@ -32,13 +32,8 @@ function renderTemplate(templateName, data = {}) {
|
|
|
32
32
|
return ejs.render(template, data);
|
|
33
33
|
}
|
|
34
34
|
function getPackageManager() {
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
return 'pnpm';
|
|
38
|
-
}
|
|
39
|
-
catch {
|
|
40
|
-
return 'npm';
|
|
41
|
-
}
|
|
35
|
+
// Always use npm for native dependency compilation (better-sqlite3)
|
|
36
|
+
return 'npm';
|
|
42
37
|
}
|
|
43
38
|
export async function createBot(botName) {
|
|
44
39
|
if (!botName) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-bot.js","sourceRoot":"","sources":["../../src/cli/create-bot.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAE/C,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAE/D,SAAS,cAAc;IACrB,MAAM,UAAU,GAAG,SAAS,CAAC;IAC7B,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IAC3C,IAAI,QAAQ,KAAK,KAAK,IAAI,QAAQ,KAAK,MAAM,EAAE,CAAC;QAC9C,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IAC3C,CAAC;IACD,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;AACrC,CAAC;AAED,SAAS,iBAAiB;IACxB,MAAM,WAAW,GAAG,cAAc,EAAE,CAAC;IACrC,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;IAC/D,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC,CAAC;IAC1E,OAAO,WAAW,CAAC,OAAO,CAAC;AAC7B,CAAC;AAED,SAAS,YAAY,CAAC,YAAoB;IACxC,MAAM,WAAW,GAAG,cAAc,EAAE,CAAC;IACrC,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,YAAY,CAAC,CAAC;IAC/E,OAAO,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;AAChD,CAAC;AAED,SAAS,cAAc,CAAC,YAAoB,EAAE,OAAgC,EAAE;IAC9E,MAAM,QAAQ,GAAG,YAAY,CAAC,YAAY,CAAC,CAAC;IAC5C,OAAO,GAAG,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;AACpC,CAAC;AAED,SAAS,iBAAiB;IACxB,
|
|
1
|
+
{"version":3,"file":"create-bot.js","sourceRoot":"","sources":["../../src/cli/create-bot.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"polling.d.ts","sourceRoot":"","sources":["../../../src/core/bot/polling.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,GAAG,EAAW,KAAK,OAAO,EAAE,MAAM,QAAQ,CAAC;AAEpD,OAAO,EAA6C,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3F,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAGlD,UAAU,UAAW,SAAQ,OAAO;IAClC,OAAO,EAAE,WAAW,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,eAAe,CAAC;CAC3B;AAMD;;GAEG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,aAAa,GAAG,GAAG,CAAC,UAAU,CAAC,
|
|
1
|
+
{"version":3,"file":"polling.d.ts","sourceRoot":"","sources":["../../../src/core/bot/polling.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,GAAG,EAAW,KAAK,OAAO,EAAE,MAAM,QAAQ,CAAC;AAEpD,OAAO,EAA6C,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3F,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAGlD,UAAU,UAAW,SAAQ,OAAO;IAClC,OAAO,EAAE,WAAW,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,eAAe,CAAC;CAC3B;AAMD;;GAEG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,aAAa,GAAG,GAAG,CAAC,UAAU,CAAC,CA4FhE;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAW3E"}
|
package/dist/core/bot/polling.js
CHANGED
|
@@ -32,11 +32,12 @@ export function createBot(config) {
|
|
|
32
32
|
}
|
|
33
33
|
const telegramIdStr = telegramId.toString();
|
|
34
34
|
const chatId = ctx.chat?.id.toString() ?? ctx.session?.chatId;
|
|
35
|
+
const username = ctx.from?.username;
|
|
35
36
|
if (!chatId) {
|
|
36
37
|
return next();
|
|
37
38
|
}
|
|
38
39
|
// Get or create user session
|
|
39
|
-
const { session: userSession, isNew } = await getOrCreateSession(telegramIdStr, chatId, database);
|
|
40
|
+
const { session: userSession, isNew } = await getOrCreateSession(telegramIdStr, username, chatId, database);
|
|
40
41
|
ctx.session = userSession;
|
|
41
42
|
// Call onEnter for initial state if this is a new session
|
|
42
43
|
if (isNew) {
|
|
@@ -61,8 +62,17 @@ export function createBot(config) {
|
|
|
61
62
|
const session = ctx.session;
|
|
62
63
|
// Create handler context compatible with existing handlers
|
|
63
64
|
const handlerContext = createHandlerContext(ctx, session, database);
|
|
64
|
-
//
|
|
65
|
-
const
|
|
65
|
+
// Check for commands first
|
|
66
|
+
const text = ctx.message?.text?.trim();
|
|
67
|
+
let nextState = undefined;
|
|
68
|
+
if (text && text.startsWith('/')) {
|
|
69
|
+
const command = text.split(' ')[0].slice(1).toLowerCase(); // Remove leading slash
|
|
70
|
+
nextState = await appBuilder.executeCommand(command, session.currentState, handlerContext);
|
|
71
|
+
}
|
|
72
|
+
// If no command handled or command returned void, execute onResponse handler
|
|
73
|
+
if (nextState === undefined) {
|
|
74
|
+
nextState = await appBuilder.executeOnResponse(session.currentState, handlerContext);
|
|
75
|
+
}
|
|
66
76
|
// Handle state transition (call onEnter even for same state)
|
|
67
77
|
if (nextState) {
|
|
68
78
|
await transitionToState(ctx, session, nextState, handlerContext, database);
|
|
@@ -93,10 +103,11 @@ export async function startPollingMode(config) {
|
|
|
93
103
|
*/
|
|
94
104
|
function createHandlerContext(ctx, session, database) {
|
|
95
105
|
const localStateData = { ...session.stateData };
|
|
106
|
+
const chatId = ctx.chat?.id ?? (session.chatId ? parseInt(session.chatId, 10) : 0);
|
|
96
107
|
return {
|
|
97
108
|
userId: session.userId || 0,
|
|
98
109
|
telegramId: extractUserId(ctx) || 0,
|
|
99
|
-
chatId
|
|
110
|
+
chatId,
|
|
100
111
|
currentState: session.currentState,
|
|
101
112
|
ctx: ctx,
|
|
102
113
|
setData: (key, value) => {
|
|
@@ -111,6 +122,9 @@ function createHandlerContext(ctx, session, database) {
|
|
|
111
122
|
transition: async (toState) => {
|
|
112
123
|
await transitionToState(ctx, session, toState, createHandlerContext(ctx, session, database), database);
|
|
113
124
|
},
|
|
125
|
+
reply: (text, extra) => {
|
|
126
|
+
return ctx.api.sendMessage(chatId, text, extra);
|
|
127
|
+
},
|
|
114
128
|
};
|
|
115
129
|
}
|
|
116
130
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"polling.js","sourceRoot":"","sources":["../../../src/core/bot/polling.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,GAAG,EAAE,OAAO,EAAgB,MAAM,QAAQ,CAAC;AACpD,OAAO,EAAE,UAAU,EAA0B,MAAM,kBAAkB,CAAC;AACtE,OAAO,EAAE,qBAAqB,EAAE,kBAAkB,EAAoB,MAAM,cAAc,CAAC;AAa3F,SAAS,aAAa,CAAC,GAAY;IACjC,OAAO,GAAG,CAAC,IAAI,EAAE,EAAE,IAAI,GAAG,CAAC,UAAU,EAAE,IAAI,EAAE,EAAE,CAAC;AAClD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,MAAqB;IAC7C,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC;IACnC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAa,KAAK,CAAC,CAAC;IAEvC,kDAAkD;IAClD,GAAG,CAAC,GAAG,CACL,OAAO,CAAC;QACN,OAAO,EAAE,GAAgB,EAAE,CAAC,CAAC;YAC3B,YAAY,EAAE,MAAM;YACpB,SAAS,EAAE,EAAE;SACd,CAAC;QACF,OAAO,EAAE,IAAI,qBAAqB,CAAC,QAAQ,CAAC;QAC5C,aAAa,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE;KACvD,CAAC,CACH,CAAC;IAEF,gDAAgD;IAChD,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QAC1B,MAAM,UAAU,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;QACtC,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,OAAO,IAAI,EAAE,CAAC;QAChB,CAAC;QAED,MAAM,aAAa,GAAG,UAAU,CAAC,QAAQ,EAAE,CAAC;QAC5C,MAAM,MAAM,GAAG,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,EAAE,IAAI,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"polling.js","sourceRoot":"","sources":["../../../src/core/bot/polling.ts"],"names":[],"mappings":"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"}
|
|
@@ -34,5 +34,5 @@ export declare class SessionStorageAdapter implements StorageAdapter<SessionData
|
|
|
34
34
|
* Get or create user session
|
|
35
35
|
* This helper ensures a user exists in the database before processing
|
|
36
36
|
*/
|
|
37
|
-
export declare function getOrCreateSession(telegramId: string, chatId: string, database: DatabaseAdapter): Promise<SessionResult>;
|
|
37
|
+
export declare function getOrCreateSession(telegramId: string, username: string | undefined, chatId: string, database: DatabaseAdapter): Promise<SessionResult>;
|
|
38
38
|
//# sourceMappingURL=session.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../../src/core/bot/session.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC;AAC7C,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAG9E,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,CAAC;AAE3C;;GAEG;AACH,qBAAa,qBAAsB,YAAW,cAAc,CAAC,WAAW,CAAC;IACvE,OAAO,CAAC,QAAQ,CAAkB;gBAEtB,QAAQ,EAAE,eAAe;IAIrC;;;OAGG;IACG,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC;IAgBzD;;;;OAIG;IACG,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAI3D;;;OAGG;IACG,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAIzC;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CACtC,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,eAAe,GACxB,OAAO,CAAC,aAAa,CAAC,
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../../src/core/bot/session.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC;AAC7C,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAG9E,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,CAAC;AAE3C;;GAEG;AACH,qBAAa,qBAAsB,YAAW,cAAc,CAAC,WAAW,CAAC;IACvE,OAAO,CAAC,QAAQ,CAAkB;gBAEtB,QAAQ,EAAE,eAAe;IAIrC;;;OAGG;IACG,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC;IAgBzD;;;;OAIG;IACG,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAI3D;;;OAGG;IACG,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAIzC;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CACtC,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,eAAe,GACxB,OAAO,CAAC,aAAa,CAAC,CAqCxB"}
|
package/dist/core/bot/session.js
CHANGED
|
@@ -51,7 +51,7 @@ export class SessionStorageAdapter {
|
|
|
51
51
|
* Get or create user session
|
|
52
52
|
* This helper ensures a user exists in the database before processing
|
|
53
53
|
*/
|
|
54
|
-
export async function getOrCreateSession(telegramId, chatId, database) {
|
|
54
|
+
export async function getOrCreateSession(telegramId, username, chatId, database) {
|
|
55
55
|
const existing = await database.getUserByTelegramId(telegramId);
|
|
56
56
|
if (existing) {
|
|
57
57
|
const stateData = existing.info?.stateData
|
|
@@ -70,6 +70,7 @@ export async function getOrCreateSession(telegramId, chatId, database) {
|
|
|
70
70
|
// Create new user
|
|
71
71
|
const newUser = await database.createOrUpdateUser({
|
|
72
72
|
telegramId,
|
|
73
|
+
username,
|
|
73
74
|
chatId,
|
|
74
75
|
currentState: 'idle',
|
|
75
76
|
stateData: {},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../../src/core/bot/session.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAQH;;GAEG;AACH,MAAM,OAAO,qBAAqB;IACxB,QAAQ,CAAkB;IAElC,YAAY,QAAyB;QACnC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,IAAI,CAAC,GAAW;QACpB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;QAC1D,IAAI,CAAC,IAAI;YAAE,OAAO,SAAS,CAAC;QAE5B,MAAM,SAAS,GAA4B,IAAI,CAAC,IAAI,EAAE,SAAS;YAC7D,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC;YACjC,CAAC,CAAC,EAAE,CAAC;QAEP,OAAO;YACL,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,SAAS;YACT,MAAM,EAAE,IAAI,CAAC,EAAE;YACf,MAAM,EAAE,IAAI,CAAC,MAAM;SACpB,CAAC;IACJ,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,KAAK,CAAC,GAAW,EAAE,KAAkB;QACzC,MAAM,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,GAAG,EAAE,KAAK,CAAC,YAAY,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;IAChF,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,MAAM,CAAC,GAAW;QACtB,0CAA0C;QAC1C,MAAM,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;IACvD,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,UAAkB,EAClB,MAAc,EACd,QAAyB;IAEzB,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,mBAAmB,CAAC,UAAU,CAAC,CAAC;IAEhE,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,SAAS,GAA4B,QAAQ,CAAC,IAAI,EAAE,SAAS;YACjE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC;YACrC,CAAC,CAAC,EAAE,CAAC;QAEP,OAAO;YACL,OAAO,EAAE;gBACP,YAAY,EAAE,QAAQ,CAAC,YAAY;gBACnC,SAAS;gBACT,MAAM,EAAE,QAAQ,CAAC,EAAE;gBACnB,MAAM,EAAE,QAAQ,CAAC,MAAM;aACxB;YACD,KAAK,EAAE,KAAK;SACb,CAAC;IACJ,CAAC;IAED,kBAAkB;IAClB,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,kBAAkB,CAAC;QAChD,UAAU;QACV,MAAM;QACN,YAAY,EAAE,MAAM;QACpB,SAAS,EAAE,EAAE;KACd,CAAC,CAAC;IAEH,OAAO;QACL,OAAO,EAAE;YACP,YAAY,EAAE,MAAM;YACpB,SAAS,EAAE,EAAE;YACb,MAAM,EAAE,OAAO,CAAC,EAAE;YAClB,MAAM,EAAE,OAAO,CAAC,MAAM;SACvB;QACD,KAAK,EAAE,IAAI;KACZ,CAAC;AACJ,CAAC"}
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../../src/core/bot/session.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAQH;;GAEG;AACH,MAAM,OAAO,qBAAqB;IACxB,QAAQ,CAAkB;IAElC,YAAY,QAAyB;QACnC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,IAAI,CAAC,GAAW;QACpB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;QAC1D,IAAI,CAAC,IAAI;YAAE,OAAO,SAAS,CAAC;QAE5B,MAAM,SAAS,GAA4B,IAAI,CAAC,IAAI,EAAE,SAAS;YAC7D,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC;YACjC,CAAC,CAAC,EAAE,CAAC;QAEP,OAAO;YACL,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,SAAS;YACT,MAAM,EAAE,IAAI,CAAC,EAAE;YACf,MAAM,EAAE,IAAI,CAAC,MAAM;SACpB,CAAC;IACJ,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,KAAK,CAAC,GAAW,EAAE,KAAkB;QACzC,MAAM,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,GAAG,EAAE,KAAK,CAAC,YAAY,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;IAChF,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,MAAM,CAAC,GAAW;QACtB,0CAA0C;QAC1C,MAAM,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;IACvD,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,UAAkB,EAClB,QAA4B,EAC5B,MAAc,EACd,QAAyB;IAEzB,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,mBAAmB,CAAC,UAAU,CAAC,CAAC;IAEhE,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,SAAS,GAA4B,QAAQ,CAAC,IAAI,EAAE,SAAS;YACjE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC;YACrC,CAAC,CAAC,EAAE,CAAC;QAEP,OAAO;YACL,OAAO,EAAE;gBACP,YAAY,EAAE,QAAQ,CAAC,YAAY;gBACnC,SAAS;gBACT,MAAM,EAAE,QAAQ,CAAC,EAAE;gBACnB,MAAM,EAAE,QAAQ,CAAC,MAAM;aACxB;YACD,KAAK,EAAE,KAAK;SACb,CAAC;IACJ,CAAC;IAED,kBAAkB;IAClB,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,kBAAkB,CAAC;QAChD,UAAU;QACV,QAAQ;QACR,MAAM;QACN,YAAY,EAAE,MAAM;QACpB,SAAS,EAAE,EAAE;KACd,CAAC,CAAC;IAEH,OAAO;QACL,OAAO,EAAE;YACP,YAAY,EAAE,MAAM;YACpB,SAAS,EAAE,EAAE;YACb,MAAM,EAAE,OAAO,CAAC,EAAE;YAClB,MAAM,EAAE,OAAO,CAAC,MAAM;SACvB;QACD,KAAK,EAAE,IAAI;KACZ,CAAC;AACJ,CAAC"}
|
package/dist/core/bot/types.d.ts
CHANGED
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
export interface UserData {
|
|
11
11
|
id: number;
|
|
12
12
|
telegramId: string;
|
|
13
|
+
username?: string | null;
|
|
13
14
|
chatId: string;
|
|
14
15
|
currentState: string;
|
|
15
16
|
info?: {
|
|
@@ -33,6 +34,7 @@ export interface DatabaseAdapter {
|
|
|
33
34
|
*/
|
|
34
35
|
createOrUpdateUser(data: {
|
|
35
36
|
telegramId: string;
|
|
37
|
+
username?: string;
|
|
36
38
|
chatId: string;
|
|
37
39
|
currentState?: string;
|
|
38
40
|
stateData?: Record<string, unknown>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/core/bot/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE;QACL,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,GAAG,IAAI,CAAC;CACV;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B;;;;OAIG;IACH,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC;IAElE;;;;OAIG;IACH,kBAAkB,CAAC,IAAI,EAAE;QACvB,UAAU,EAAE,MAAM,CAAC;QACnB,MAAM,EAAE,MAAM,CAAC;QACf,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KACrC,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IAEtB;;;;;OAKG;IACH,eAAe,CACb,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,MAAM,EACpB,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAClC,OAAO,CAAC,IAAI,CAAC,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,WAAW,CAAC;IACrB,KAAK,EAAE,OAAO,CAAC;CAChB"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/core/bot/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE;QACL,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,GAAG,IAAI,CAAC;CACV;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B;;;;OAIG;IACH,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC;IAElE;;;;OAIG;IACH,kBAAkB,CAAC,IAAI,EAAE;QACvB,UAAU,EAAE,MAAM,CAAC;QACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,MAAM,EAAE,MAAM,CAAC;QACf,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KACrC,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IAEtB;;;;;OAKG;IACH,eAAe,CACb,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,MAAM,EACpB,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAClC,OAAO,CAAC,IAAI,CAAC,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,WAAW,CAAC;IACrB,KAAK,EAAE,OAAO,CAAC;CAChB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webhook.d.ts","sourceRoot":"","sources":["../../../src/core/bot/webhook.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,GAAG,EAA4B,KAAK,OAAO,EAAE,MAAM,QAAQ,CAAC;AAErE,OAAO,EAA6C,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3F,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAGlD,UAAU,UAAW,SAAQ,OAAO;IAClC,OAAO,EAAE,WAAW,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,eAAe,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;CACd;AAMD;;GAEG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,aAAa,EAAE,YAAY,GAAG,MAAM,CAAC,GAAG,GAAG,CAAC,UAAU,CAAC,
|
|
1
|
+
{"version":3,"file":"webhook.d.ts","sourceRoot":"","sources":["../../../src/core/bot/webhook.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,GAAG,EAA4B,KAAK,OAAO,EAAE,MAAM,QAAQ,CAAC;AAErE,OAAO,EAA6C,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3F,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAGlD,UAAU,UAAW,SAAQ,OAAO;IAClC,OAAO,EAAE,WAAW,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,eAAe,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;CACd;AAMD;;GAEG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,aAAa,EAAE,YAAY,GAAG,MAAM,CAAC,GAAG,GAAG,CAAC,UAAU,CAAC,CA4F7F;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CA+C3E;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAyBjF;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAUhE;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAUpE"}
|
package/dist/core/bot/webhook.js
CHANGED
|
@@ -33,11 +33,12 @@ export function createBot(config) {
|
|
|
33
33
|
}
|
|
34
34
|
const telegramIdStr = telegramId.toString();
|
|
35
35
|
const chatId = ctx.chat?.id.toString() ?? ctx.session?.chatId;
|
|
36
|
+
const username = ctx.from?.username;
|
|
36
37
|
if (!chatId) {
|
|
37
38
|
return next();
|
|
38
39
|
}
|
|
39
40
|
// Get or create user session
|
|
40
|
-
const { session: userSession, isNew } = await getOrCreateSession(telegramIdStr, chatId, database);
|
|
41
|
+
const { session: userSession, isNew } = await getOrCreateSession(telegramIdStr, username, chatId, database);
|
|
41
42
|
ctx.session = userSession;
|
|
42
43
|
// Call onEnter for initial state if this is a new session
|
|
43
44
|
if (isNew) {
|
|
@@ -62,8 +63,17 @@ export function createBot(config) {
|
|
|
62
63
|
const session = ctx.session;
|
|
63
64
|
// Create handler context compatible with existing handlers
|
|
64
65
|
const handlerContext = createHandlerContext(ctx, session, database);
|
|
65
|
-
//
|
|
66
|
-
const
|
|
66
|
+
// Check for commands first
|
|
67
|
+
const text = ctx.message?.text?.trim();
|
|
68
|
+
let nextState = undefined;
|
|
69
|
+
if (text && text.startsWith('/')) {
|
|
70
|
+
const command = text.split(' ')[0].slice(1).toLowerCase(); // Remove leading slash
|
|
71
|
+
nextState = await appBuilder.executeCommand(command, session.currentState, handlerContext);
|
|
72
|
+
}
|
|
73
|
+
// If no command handled or command returned void, execute onResponse handler
|
|
74
|
+
if (nextState === undefined) {
|
|
75
|
+
nextState = await appBuilder.executeOnResponse(session.currentState, handlerContext);
|
|
76
|
+
}
|
|
67
77
|
// Handle state transition (call onEnter even for same state)
|
|
68
78
|
if (nextState) {
|
|
69
79
|
await transitionToState(ctx, session, nextState, handlerContext, database);
|
|
@@ -74,14 +84,6 @@ export function createBot(config) {
|
|
|
74
84
|
handlerContext.getData('__all') || session.stateData;
|
|
75
85
|
}
|
|
76
86
|
});
|
|
77
|
-
// Handle /start command
|
|
78
|
-
bot.command('start', async (ctx) => {
|
|
79
|
-
const session = ctx.session;
|
|
80
|
-
// Create handler context
|
|
81
|
-
const handlerContext = createHandlerContext(ctx, session, database);
|
|
82
|
-
// Transition to welcome state
|
|
83
|
-
await transitionToState(ctx, session, 'welcome', handlerContext, database);
|
|
84
|
-
});
|
|
85
87
|
return bot;
|
|
86
88
|
}
|
|
87
89
|
/**
|
|
@@ -194,10 +196,11 @@ export async function getWebhookInfo(token) {
|
|
|
194
196
|
*/
|
|
195
197
|
function createHandlerContext(ctx, session, database) {
|
|
196
198
|
const localStateData = { ...session.stateData };
|
|
199
|
+
const chatId = ctx.chat?.id ?? (session.chatId ? parseInt(session.chatId, 10) : 0);
|
|
197
200
|
return {
|
|
198
201
|
userId: session.userId || 0,
|
|
199
202
|
telegramId: extractUserId(ctx) || 0,
|
|
200
|
-
chatId
|
|
203
|
+
chatId,
|
|
201
204
|
currentState: session.currentState,
|
|
202
205
|
ctx: ctx,
|
|
203
206
|
setData: (key, value) => {
|
|
@@ -212,6 +215,9 @@ function createHandlerContext(ctx, session, database) {
|
|
|
212
215
|
transition: async (toState) => {
|
|
213
216
|
await transitionToState(ctx, session, toState, createHandlerContext(ctx, session, database), database);
|
|
214
217
|
},
|
|
218
|
+
reply: (text, extra) => {
|
|
219
|
+
return ctx.api.sendMessage(chatId, text, extra);
|
|
220
|
+
},
|
|
215
221
|
};
|
|
216
222
|
}
|
|
217
223
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webhook.js","sourceRoot":"","sources":["../../../src/core/bot/webhook.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,OAA8B,MAAM,SAAS,CAAC;AACrD,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,eAAe,EAAgB,MAAM,QAAQ,CAAC;AACrE,OAAO,EAAE,UAAU,EAA0B,MAAM,kBAAkB,CAAC;AACtE,OAAO,EAAE,qBAAqB,EAAE,kBAAkB,EAAoB,MAAM,cAAc,CAAC;AAe3F,SAAS,aAAa,CAAC,GAAY;IACjC,OAAO,GAAG,CAAC,IAAI,EAAE,EAAE,IAAI,GAAG,CAAC,UAAU,EAAE,IAAI,EAAE,EAAE,CAAC;AAClD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,MAAkD;IAC1E,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC;IACnC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAa,KAAK,CAAC,CAAC;IAEvC,kDAAkD;IAClD,GAAG,CAAC,GAAG,CACL,OAAO,CAAC;QACN,OAAO,EAAE,GAAgB,EAAE,CAAC,CAAC;YAC3B,YAAY,EAAE,MAAM;YACpB,SAAS,EAAE,EAAE;SACd,CAAC;QACF,OAAO,EAAE,IAAI,qBAAqB,CAAC,QAAQ,CAAC;QAC5C,aAAa,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE;KACvD,CAAC,CACH,CAAC;IAEF,gDAAgD;IAChD,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QAC1B,MAAM,UAAU,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;QACtC,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,OAAO,IAAI,EAAE,CAAC;QAChB,CAAC;QAED,MAAM,aAAa,GAAG,UAAU,CAAC,QAAQ,EAAE,CAAC;QAC5C,MAAM,MAAM,GAAG,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,EAAE,IAAI,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"webhook.js","sourceRoot":"","sources":["../../../src/core/bot/webhook.ts"],"names":[],"mappings":"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"}
|
package/dist/core/builder.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { BotHandlerContext, BotState, EnterHandler, ResponseHandler, StateHandlers } from './types.js';
|
|
1
|
+
import type { BotHandlerContext, BotState, EnterHandler, ResponseHandler, StateHandlers, CommandHandler } from './types.js';
|
|
2
2
|
/**
|
|
3
3
|
* State Builder - Fluent API for configuring a single state
|
|
4
4
|
*
|
|
@@ -34,6 +34,17 @@ declare class StateBuilder<TState extends BotState = BotState> {
|
|
|
34
34
|
* })
|
|
35
35
|
*/
|
|
36
36
|
onResponse(handler: ResponseHandler<TState>): this;
|
|
37
|
+
/**
|
|
38
|
+
* Set a command handler for this state (overrides global commands)
|
|
39
|
+
* Called when user sends this command while in this state
|
|
40
|
+
*
|
|
41
|
+
* Example:
|
|
42
|
+
* .onCommand('cancel', async (context) => {
|
|
43
|
+
* await context.reply('Operation cancelled');
|
|
44
|
+
* return 'mainMenu';
|
|
45
|
+
* })
|
|
46
|
+
*/
|
|
47
|
+
onCommand(command: string, handler: CommandHandler<TState>): this;
|
|
37
48
|
}
|
|
38
49
|
/**
|
|
39
50
|
* Multi-State Builder - Registers handlers for multiple states at once
|
|
@@ -46,6 +57,10 @@ declare class MultiStateBuilder<TState extends BotState = BotState> {
|
|
|
46
57
|
constructor(states: TState[], handlers: Map<TState, StateHandlers<TState>>);
|
|
47
58
|
onEnter(handler: EnterHandler<TState>): this;
|
|
48
59
|
onResponse(handler: ResponseHandler<TState>): this;
|
|
60
|
+
/**
|
|
61
|
+
* Set a command handler for all these states (overrides global commands)
|
|
62
|
+
*/
|
|
63
|
+
onCommand(command: string, handler: CommandHandler<TState>): this;
|
|
49
64
|
}
|
|
50
65
|
/**
|
|
51
66
|
* Bot Builder - Main API for registering state handlers
|
|
@@ -75,6 +90,7 @@ declare class MultiStateBuilder<TState extends BotState = BotState> {
|
|
|
75
90
|
*/
|
|
76
91
|
export declare class BotBuilder<TState extends BotState = BotState> {
|
|
77
92
|
private handlers;
|
|
93
|
+
private globalCommandHandlers;
|
|
78
94
|
/**
|
|
79
95
|
* Register handlers for one or more states using chaining
|
|
80
96
|
* @param state - State name(s) to configure
|
|
@@ -96,6 +112,32 @@ export declare class BotBuilder<TState extends BotState = BotState> {
|
|
|
96
112
|
* @returns this for chaining
|
|
97
113
|
*/
|
|
98
114
|
onResponse(state: TState, handler: ResponseHandler<TState>): this;
|
|
115
|
+
/**
|
|
116
|
+
* Register a global command handler (works in all states unless overridden)
|
|
117
|
+
* @param command - Command name without leading slash (e.g., 'start', 'help')
|
|
118
|
+
* @param handler - Handler function
|
|
119
|
+
* @returns this for chaining
|
|
120
|
+
* @example
|
|
121
|
+
* .onCommand('start', async (context) => {
|
|
122
|
+
* await context.reply('Welcome!');
|
|
123
|
+
* return 'welcome';
|
|
124
|
+
* })
|
|
125
|
+
*/
|
|
126
|
+
onCommand(command: string, handler: CommandHandler<TState>): this;
|
|
127
|
+
/**
|
|
128
|
+
* Register a command handler for a specific state (overrides global)
|
|
129
|
+
* @param state - State name
|
|
130
|
+
* @param command - Command name without leading slash
|
|
131
|
+
* @param handler - Handler function
|
|
132
|
+
* @returns this for chaining
|
|
133
|
+
* @example
|
|
134
|
+
* .onCommand('cancel', 'order', async (context) => {
|
|
135
|
+
* // Only works when user is in 'order' state
|
|
136
|
+
* await context.reply('Order cancelled');
|
|
137
|
+
* return 'mainMenu';
|
|
138
|
+
* })
|
|
139
|
+
*/
|
|
140
|
+
onCommandForState(state: TState, command: string, handler: CommandHandler<TState>): this;
|
|
99
141
|
/**
|
|
100
142
|
* Execute the onEnter handler for a given state
|
|
101
143
|
* @internal Called by the bot handlers
|
|
@@ -124,6 +166,21 @@ export declare class BotBuilder<TState extends BotState = BotState> {
|
|
|
124
166
|
* Get handlers for a specific state
|
|
125
167
|
*/
|
|
126
168
|
getHandlers(state: TState): StateHandlers<TState> | undefined;
|
|
169
|
+
/**
|
|
170
|
+
* Execute a command handler
|
|
171
|
+
* @internal Called by the bot handlers
|
|
172
|
+
* @returns The next state to transition to, or void
|
|
173
|
+
*
|
|
174
|
+
* Priority order:
|
|
175
|
+
* 1. State-specific command handler (if exists)
|
|
176
|
+
* 2. Global command handler (if exists)
|
|
177
|
+
* 3. None - let state onResponse handle it
|
|
178
|
+
*/
|
|
179
|
+
executeCommand(command: string, currentState: TState, context: BotHandlerContext<TState>): Promise<TState | void>;
|
|
180
|
+
/**
|
|
181
|
+
* Check if a command has a registered handler (global or for specific state)
|
|
182
|
+
*/
|
|
183
|
+
hasCommandHandler(command: string, state?: TState): boolean;
|
|
127
184
|
}
|
|
128
185
|
/**
|
|
129
186
|
* Global bot builder instance (untyped - accepts any string state)
|
|
@@ -134,5 +191,5 @@ export declare class BotBuilder<TState extends BotState = BotState> {
|
|
|
134
191
|
* ```
|
|
135
192
|
*/
|
|
136
193
|
export declare const botBuilder: BotBuilder<string>;
|
|
137
|
-
export type { BotHandlerContext, BotState, EnterHandler, ResponseHandler } from './types.js';
|
|
194
|
+
export type { BotHandlerContext, BotState, EnterHandler, ResponseHandler, CommandHandler, } from './types.js';
|
|
138
195
|
//# sourceMappingURL=builder.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../../src/core/builder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,EACjB,QAAQ,EACR,YAAY,EACZ,eAAe,EACf,aAAa,
|
|
1
|
+
{"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../../src/core/builder.ts"],"names":[],"mappings":"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"}
|
package/dist/core/builder.js
CHANGED
|
@@ -46,6 +46,25 @@ class StateBuilder {
|
|
|
46
46
|
this.handlers.set(this.state, existing);
|
|
47
47
|
return this;
|
|
48
48
|
}
|
|
49
|
+
/**
|
|
50
|
+
* Set a command handler for this state (overrides global commands)
|
|
51
|
+
* Called when user sends this command while in this state
|
|
52
|
+
*
|
|
53
|
+
* Example:
|
|
54
|
+
* .onCommand('cancel', async (context) => {
|
|
55
|
+
* await context.reply('Operation cancelled');
|
|
56
|
+
* return 'mainMenu';
|
|
57
|
+
* })
|
|
58
|
+
*/
|
|
59
|
+
onCommand(command, handler) {
|
|
60
|
+
const existing = this.handlers.get(this.state) || {};
|
|
61
|
+
if (!existing.onCommand) {
|
|
62
|
+
existing.onCommand = new Map();
|
|
63
|
+
}
|
|
64
|
+
existing.onCommand.set(command.toLowerCase(), handler);
|
|
65
|
+
this.handlers.set(this.state, existing);
|
|
66
|
+
return this;
|
|
67
|
+
}
|
|
49
68
|
}
|
|
50
69
|
/**
|
|
51
70
|
* Multi-State Builder - Registers handlers for multiple states at once
|
|
@@ -75,6 +94,20 @@ class MultiStateBuilder {
|
|
|
75
94
|
}
|
|
76
95
|
return this;
|
|
77
96
|
}
|
|
97
|
+
/**
|
|
98
|
+
* Set a command handler for all these states (overrides global commands)
|
|
99
|
+
*/
|
|
100
|
+
onCommand(command, handler) {
|
|
101
|
+
for (const state of this.states) {
|
|
102
|
+
const existing = this.handlers.get(state) || {};
|
|
103
|
+
if (!existing.onCommand) {
|
|
104
|
+
existing.onCommand = new Map();
|
|
105
|
+
}
|
|
106
|
+
existing.onCommand.set(command.toLowerCase(), handler);
|
|
107
|
+
this.handlers.set(state, existing);
|
|
108
|
+
}
|
|
109
|
+
return this;
|
|
110
|
+
}
|
|
78
111
|
}
|
|
79
112
|
/**
|
|
80
113
|
* Bot Builder - Main API for registering state handlers
|
|
@@ -104,6 +137,7 @@ class MultiStateBuilder {
|
|
|
104
137
|
*/
|
|
105
138
|
export class BotBuilder {
|
|
106
139
|
handlers = new Map();
|
|
140
|
+
globalCommandHandlers = new Map();
|
|
107
141
|
forState(state) {
|
|
108
142
|
if (Array.isArray(state)) {
|
|
109
143
|
return new MultiStateBuilder(state, this.handlers);
|
|
@@ -134,6 +168,43 @@ export class BotBuilder {
|
|
|
134
168
|
this.handlers.set(state, existing);
|
|
135
169
|
return this;
|
|
136
170
|
}
|
|
171
|
+
/**
|
|
172
|
+
* Register a global command handler (works in all states unless overridden)
|
|
173
|
+
* @param command - Command name without leading slash (e.g., 'start', 'help')
|
|
174
|
+
* @param handler - Handler function
|
|
175
|
+
* @returns this for chaining
|
|
176
|
+
* @example
|
|
177
|
+
* .onCommand('start', async (context) => {
|
|
178
|
+
* await context.reply('Welcome!');
|
|
179
|
+
* return 'welcome';
|
|
180
|
+
* })
|
|
181
|
+
*/
|
|
182
|
+
onCommand(command, handler) {
|
|
183
|
+
this.globalCommandHandlers.set(command.toLowerCase(), handler);
|
|
184
|
+
return this;
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Register a command handler for a specific state (overrides global)
|
|
188
|
+
* @param state - State name
|
|
189
|
+
* @param command - Command name without leading slash
|
|
190
|
+
* @param handler - Handler function
|
|
191
|
+
* @returns this for chaining
|
|
192
|
+
* @example
|
|
193
|
+
* .onCommand('cancel', 'order', async (context) => {
|
|
194
|
+
* // Only works when user is in 'order' state
|
|
195
|
+
* await context.reply('Order cancelled');
|
|
196
|
+
* return 'mainMenu';
|
|
197
|
+
* })
|
|
198
|
+
*/
|
|
199
|
+
onCommandForState(state, command, handler) {
|
|
200
|
+
const existing = this.handlers.get(state) || {};
|
|
201
|
+
if (!existing.onCommand) {
|
|
202
|
+
existing.onCommand = new Map();
|
|
203
|
+
}
|
|
204
|
+
existing.onCommand.set(command.toLowerCase(), handler);
|
|
205
|
+
this.handlers.set(state, existing);
|
|
206
|
+
return this;
|
|
207
|
+
}
|
|
137
208
|
/**
|
|
138
209
|
* Execute the onEnter handler for a given state
|
|
139
210
|
* @internal Called by the bot handlers
|
|
@@ -182,6 +253,43 @@ export class BotBuilder {
|
|
|
182
253
|
getHandlers(state) {
|
|
183
254
|
return this.handlers.get(state);
|
|
184
255
|
}
|
|
256
|
+
/**
|
|
257
|
+
* Execute a command handler
|
|
258
|
+
* @internal Called by the bot handlers
|
|
259
|
+
* @returns The next state to transition to, or void
|
|
260
|
+
*
|
|
261
|
+
* Priority order:
|
|
262
|
+
* 1. State-specific command handler (if exists)
|
|
263
|
+
* 2. Global command handler (if exists)
|
|
264
|
+
* 3. None - let state onResponse handle it
|
|
265
|
+
*/
|
|
266
|
+
async executeCommand(command, currentState, context) {
|
|
267
|
+
const normalizedCommand = command.toLowerCase();
|
|
268
|
+
// First check for state-specific command handler
|
|
269
|
+
const stateHandlers = this.handlers.get(currentState);
|
|
270
|
+
const stateCommandHandler = stateHandlers?.onCommand?.get(normalizedCommand);
|
|
271
|
+
if (stateCommandHandler) {
|
|
272
|
+
return await stateCommandHandler(context);
|
|
273
|
+
}
|
|
274
|
+
// Fall back to global command handler
|
|
275
|
+
const globalHandler = this.globalCommandHandlers.get(normalizedCommand);
|
|
276
|
+
if (globalHandler) {
|
|
277
|
+
return await globalHandler(context);
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* Check if a command has a registered handler (global or for specific state)
|
|
282
|
+
*/
|
|
283
|
+
hasCommandHandler(command, state) {
|
|
284
|
+
const normalizedCommand = command.toLowerCase();
|
|
285
|
+
if (state) {
|
|
286
|
+
const stateHandlers = this.handlers.get(state);
|
|
287
|
+
if (stateHandlers?.onCommand?.has(normalizedCommand)) {
|
|
288
|
+
return true;
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
return this.globalCommandHandlers.has(normalizedCommand);
|
|
292
|
+
}
|
|
185
293
|
}
|
|
186
294
|
/**
|
|
187
295
|
* Global bot builder instance (untyped - accepts any string state)
|
package/dist/core/builder.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"builder.js","sourceRoot":"","sources":["../../src/core/builder.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"builder.js","sourceRoot":"","sources":["../../src/core/builder.ts"],"names":[],"mappings":"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"}
|
package/dist/core/types.d.ts
CHANGED
|
@@ -12,12 +12,19 @@ export interface BotHandlerContext<TState extends BotState = BotState> {
|
|
|
12
12
|
setData: <T>(key: string, value: T) => void;
|
|
13
13
|
getData: <T>(key: string) => T | undefined;
|
|
14
14
|
transition: (toState: TState) => Promise<void>;
|
|
15
|
+
reply: (text: string, extra?: Parameters<Context['reply']>[1]) => ReturnType<Context['reply']>;
|
|
15
16
|
}
|
|
16
17
|
export type EnterHandler<TState extends BotState = BotState> = (context: BotHandlerContext<TState>) => Promise<TState | void>;
|
|
17
18
|
export type ResponseHandler<TState extends BotState = BotState> = (context: BotHandlerContext<TState>) => Promise<TState | void>;
|
|
19
|
+
export type CommandHandler<TState extends BotState = BotState> = (context: BotHandlerContext<TState>) => Promise<TState | void>;
|
|
18
20
|
export interface StateHandlers<TState extends BotState = BotState> {
|
|
19
21
|
onEnter?: EnterHandler<TState>;
|
|
20
22
|
onResponse?: ResponseHandler<TState>;
|
|
23
|
+
onCommand?: Map<string, CommandHandler<TState>>;
|
|
24
|
+
}
|
|
25
|
+
export interface CommandHandlers<TState extends BotState = BotState> {
|
|
26
|
+
global: Map<string, CommandHandler<TState>>;
|
|
27
|
+
byState: Map<TState, Map<string, CommandHandler<TState>>>;
|
|
21
28
|
}
|
|
22
29
|
export type ExtractStates<T> = T extends StateHandlers<infer S> ? S : never;
|
|
23
30
|
export interface BotContext {
|
package/dist/core/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"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"}
|
package/dist/core/types.js
CHANGED
package/dist/core/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,MAAM,CAAC,MAAM,UAAU,GAAG,IAAI,UAAU,EAAU,CAAC"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Global Command Handlers
|
|
3
|
+
*
|
|
4
|
+
* These commands work across all states unless overridden by state-specific
|
|
5
|
+
* command handlers defined in individual state handlers.
|
|
6
|
+
*
|
|
7
|
+
* Command handlers are checked BEFORE onResponse handlers and take priority.
|
|
8
|
+
* If a command handler returns a state, the bot transitions to that state.
|
|
9
|
+
* If a command handler returns void/undefined, the onResponse handler runs.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import { appBuilder, type AppContext } from 'telemeister/core';
|
|
13
|
+
import type { BotStateTransitions } from '../bot-state-types.js';
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Global /start command
|
|
17
|
+
* Works in all states, returns user to welcome state
|
|
18
|
+
*/
|
|
19
|
+
appBuilder.onCommand('start', async (context: AppContext): Promise<BotStateTransitions> => {
|
|
20
|
+
await context.reply('Welcome back! 👋');
|
|
21
|
+
return 'welcome';
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Global /help command
|
|
26
|
+
* Shows help text but doesn't change state
|
|
27
|
+
*/
|
|
28
|
+
appBuilder.onCommand('help', async (context: AppContext): Promise<void> => {
|
|
29
|
+
await context.reply(`
|
|
30
|
+
🤖 *Available Commands*
|
|
31
|
+
|
|
32
|
+
/start - Start the bot
|
|
33
|
+
/help - Show this help message
|
|
34
|
+
/cancel - Cancel current operation
|
|
35
|
+
/settings - Open settings menu
|
|
36
|
+
|
|
37
|
+
Navigate using the buttons below.
|
|
38
|
+
`, { parse_mode: 'Markdown' });
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Global /cancel command
|
|
43
|
+
* Cancels current operation and returns to main menu
|
|
44
|
+
*/
|
|
45
|
+
appBuilder.onCommand('cancel', async (context: AppContext): Promise<BotStateTransitions | void> => {
|
|
46
|
+
// Different behavior based on current state
|
|
47
|
+
if (context.currentState === 'welcome') {
|
|
48
|
+
await context.reply('Nothing to cancel here!');
|
|
49
|
+
return; // Stay in current state
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
await context.reply('Operation cancelled. Returning to main menu...');
|
|
53
|
+
return 'mainMenu';
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Example: State-specific command override
|
|
58
|
+
* In 'orderForm' state, /cancel behaves differently
|
|
59
|
+
*
|
|
60
|
+
* This would go in src/handlers/orderForm/index.ts:
|
|
61
|
+
*
|
|
62
|
+
* appBuilder
|
|
63
|
+
* .forState('orderForm')
|
|
64
|
+
* .onCommand('cancel', async (context) => {
|
|
65
|
+
* await context.reply('Cancel order? Your progress will be lost.');
|
|
66
|
+
* return 'confirmCancel';
|
|
67
|
+
* });
|
|
68
|
+
*/
|
|
69
|
+
|
|
70
|
+
console.log('✅ Global commands registered: /start, /help, /cancel');
|
|
@@ -62,6 +62,7 @@ export async function getUserByTelegramId(telegramId: string): Promise<UserWithI
|
|
|
62
62
|
*/
|
|
63
63
|
export async function createOrUpdateUser(data: {
|
|
64
64
|
telegramId: string;
|
|
65
|
+
username?: string;
|
|
65
66
|
chatId: string;
|
|
66
67
|
currentState?: string;
|
|
67
68
|
stateData?: Record<string, unknown>;
|
|
@@ -74,6 +75,7 @@ export async function createOrUpdateUser(data: {
|
|
|
74
75
|
where: { telegramId: data.telegramId },
|
|
75
76
|
data: {
|
|
76
77
|
chatId: data.chatId,
|
|
78
|
+
...(data.username !== undefined && { username: data.username }),
|
|
77
79
|
...(data.currentState && { currentState: data.currentState }),
|
|
78
80
|
},
|
|
79
81
|
include: { info: true },
|
|
@@ -102,6 +104,7 @@ export async function createOrUpdateUser(data: {
|
|
|
102
104
|
const newUser = await prisma.user.create({
|
|
103
105
|
data: {
|
|
104
106
|
telegramId: data.telegramId,
|
|
107
|
+
username: data.username,
|
|
105
108
|
chatId: data.chatId,
|
|
106
109
|
currentState: data.currentState || 'idle',
|
|
107
110
|
info: {
|
|
@@ -172,6 +175,7 @@ export const databaseAdapter: DatabaseAdapter = {
|
|
|
172
175
|
return {
|
|
173
176
|
id: user.id,
|
|
174
177
|
telegramId: user.telegramId,
|
|
178
|
+
username: user.username,
|
|
175
179
|
chatId: user.chatId,
|
|
176
180
|
currentState: user.currentState,
|
|
177
181
|
info: user.info,
|
|
@@ -180,6 +184,7 @@ export const databaseAdapter: DatabaseAdapter = {
|
|
|
180
184
|
|
|
181
185
|
createOrUpdateUser: async (data: {
|
|
182
186
|
telegramId: string;
|
|
187
|
+
username?: string;
|
|
183
188
|
chatId: string;
|
|
184
189
|
currentState?: string;
|
|
185
190
|
stateData?: Record<string, unknown>;
|
|
@@ -188,6 +193,7 @@ export const databaseAdapter: DatabaseAdapter = {
|
|
|
188
193
|
return {
|
|
189
194
|
id: user.id,
|
|
190
195
|
telegramId: user.telegramId,
|
|
196
|
+
username: user.username,
|
|
191
197
|
chatId: user.chatId,
|
|
192
198
|
currentState: user.currentState,
|
|
193
199
|
info: user.info,
|
|
@@ -19,14 +19,14 @@ appBuilder
|
|
|
19
19
|
|
|
20
20
|
// Access Grammy context via context.ctx
|
|
21
21
|
// See Grammy docs: https://grammy.dev/guide/context
|
|
22
|
-
await context.
|
|
22
|
+
await context.reply("Hello from <%= stateName %> state!");
|
|
23
23
|
|
|
24
24
|
// === INLINE KEYBOARD EXAMPLE ===
|
|
25
25
|
// import { InlineKeyboard } from 'grammy';
|
|
26
26
|
// const keyboard = new InlineKeyboard()
|
|
27
27
|
// .text('Button 1', 'btn1')
|
|
28
28
|
// .text('Button 2', 'btn2');
|
|
29
|
-
// await context.
|
|
29
|
+
// await context.reply('Choose:', { reply_markup: keyboard });
|
|
30
30
|
|
|
31
31
|
// === POLL EXAMPLE ===
|
|
32
32
|
// await context.ctx.replyWithPoll(
|
|
@@ -66,7 +66,7 @@ appBuilder
|
|
|
66
66
|
// const data = context.ctx.callbackQuery.data;
|
|
67
67
|
// switch (data) {
|
|
68
68
|
// case 'btn1':
|
|
69
|
-
// await context.
|
|
69
|
+
// await context.reply('You clicked Button 1!');
|
|
70
70
|
// break;
|
|
71
71
|
// case 'btn2':
|
|
72
72
|
// return 'otherState'; // Transition to another state
|
|
@@ -79,7 +79,7 @@ appBuilder
|
|
|
79
79
|
// const optionIds = context.ctx.pollAnswer.option_ids;
|
|
80
80
|
// const options = ['Option A', 'Option B', 'Option C'];
|
|
81
81
|
// const selected = optionIds.map(id => options[id]).join(', ');
|
|
82
|
-
// await context.
|
|
82
|
+
// await context.reply(`You voted for: ${selected}`);
|
|
83
83
|
// return;
|
|
84
84
|
// }
|
|
85
85
|
|
|
@@ -89,19 +89,19 @@ appBuilder
|
|
|
89
89
|
// const command = text.split(' ')[0].toLowerCase();
|
|
90
90
|
// switch (command) {
|
|
91
91
|
// case '/start':
|
|
92
|
-
// await context.
|
|
92
|
+
// await context.reply('Welcome!');
|
|
93
93
|
// return 'welcome';
|
|
94
94
|
// case '/menu':
|
|
95
95
|
// return 'menu';
|
|
96
96
|
// default:
|
|
97
|
-
// await context.
|
|
97
|
+
// await context.reply(`Unknown command: ${command}`);
|
|
98
98
|
// }
|
|
99
99
|
// return;
|
|
100
100
|
// }
|
|
101
101
|
|
|
102
102
|
const text = context.ctx.message?.text?.trim();
|
|
103
103
|
if (text) {
|
|
104
|
-
await context.
|
|
104
|
+
await context.reply(`You said: ${text}`);
|
|
105
105
|
}
|
|
106
106
|
<% if (transitionStates.length > 0) { %>
|
|
107
107
|
// Available transitions: <%= transitionStates.join(', ') %>
|
package/package.json
CHANGED
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Global Command Handlers
|
|
3
|
+
*
|
|
4
|
+
* These commands work across all states unless overridden by state-specific
|
|
5
|
+
* command handlers defined in individual state handlers.
|
|
6
|
+
*
|
|
7
|
+
* Command handlers are checked BEFORE onResponse handlers and take priority.
|
|
8
|
+
* If a command handler returns a state, the bot transitions to that state.
|
|
9
|
+
* If a command handler returns void/undefined, the onResponse handler runs.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import { appBuilder, type AppContext } from 'telemeister/core';
|
|
13
|
+
import type { BotStateTransitions } from '../bot-state-types.js';
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Global /start command
|
|
17
|
+
* Works in all states, returns user to welcome state
|
|
18
|
+
*/
|
|
19
|
+
appBuilder.onCommand('start', async (context: AppContext): Promise<BotStateTransitions> => {
|
|
20
|
+
await context.reply('Welcome back! 👋');
|
|
21
|
+
return 'welcome';
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Global /help command
|
|
26
|
+
* Shows help text but doesn't change state
|
|
27
|
+
*/
|
|
28
|
+
appBuilder.onCommand('help', async (context: AppContext): Promise<void> => {
|
|
29
|
+
await context.reply(`
|
|
30
|
+
🤖 *Available Commands*
|
|
31
|
+
|
|
32
|
+
/start - Start the bot
|
|
33
|
+
/help - Show this help message
|
|
34
|
+
/cancel - Cancel current operation
|
|
35
|
+
/settings - Open settings menu
|
|
36
|
+
|
|
37
|
+
Navigate using the buttons below.
|
|
38
|
+
`, { parse_mode: 'Markdown' });
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Global /cancel command
|
|
43
|
+
* Cancels current operation and returns to main menu
|
|
44
|
+
*/
|
|
45
|
+
appBuilder.onCommand('cancel', async (context: AppContext): Promise<BotStateTransitions | void> => {
|
|
46
|
+
// Different behavior based on current state
|
|
47
|
+
if (context.currentState === 'welcome') {
|
|
48
|
+
await context.reply('Nothing to cancel here!');
|
|
49
|
+
return; // Stay in current state
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
await context.reply('Operation cancelled. Returning to main menu...');
|
|
53
|
+
return 'mainMenu';
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Example: State-specific command override
|
|
58
|
+
* In 'orderForm' state, /cancel behaves differently
|
|
59
|
+
*
|
|
60
|
+
* This would go in src/handlers/orderForm/index.ts:
|
|
61
|
+
*
|
|
62
|
+
* appBuilder
|
|
63
|
+
* .forState('orderForm')
|
|
64
|
+
* .onCommand('cancel', async (context) => {
|
|
65
|
+
* await context.reply('Cancel order? Your progress will be lost.');
|
|
66
|
+
* return 'confirmCancel';
|
|
67
|
+
* });
|
|
68
|
+
*/
|
|
69
|
+
|
|
70
|
+
console.log('✅ Global commands registered: /start, /help, /cancel');
|
|
@@ -62,6 +62,7 @@ export async function getUserByTelegramId(telegramId: string): Promise<UserWithI
|
|
|
62
62
|
*/
|
|
63
63
|
export async function createOrUpdateUser(data: {
|
|
64
64
|
telegramId: string;
|
|
65
|
+
username?: string;
|
|
65
66
|
chatId: string;
|
|
66
67
|
currentState?: string;
|
|
67
68
|
stateData?: Record<string, unknown>;
|
|
@@ -74,6 +75,7 @@ export async function createOrUpdateUser(data: {
|
|
|
74
75
|
where: { telegramId: data.telegramId },
|
|
75
76
|
data: {
|
|
76
77
|
chatId: data.chatId,
|
|
78
|
+
...(data.username !== undefined && { username: data.username }),
|
|
77
79
|
...(data.currentState && { currentState: data.currentState }),
|
|
78
80
|
},
|
|
79
81
|
include: { info: true },
|
|
@@ -102,6 +104,7 @@ export async function createOrUpdateUser(data: {
|
|
|
102
104
|
const newUser = await prisma.user.create({
|
|
103
105
|
data: {
|
|
104
106
|
telegramId: data.telegramId,
|
|
107
|
+
username: data.username,
|
|
105
108
|
chatId: data.chatId,
|
|
106
109
|
currentState: data.currentState || 'idle',
|
|
107
110
|
info: {
|
|
@@ -172,6 +175,7 @@ export const databaseAdapter: DatabaseAdapter = {
|
|
|
172
175
|
return {
|
|
173
176
|
id: user.id,
|
|
174
177
|
telegramId: user.telegramId,
|
|
178
|
+
username: user.username,
|
|
175
179
|
chatId: user.chatId,
|
|
176
180
|
currentState: user.currentState,
|
|
177
181
|
info: user.info,
|
|
@@ -180,6 +184,7 @@ export const databaseAdapter: DatabaseAdapter = {
|
|
|
180
184
|
|
|
181
185
|
createOrUpdateUser: async (data: {
|
|
182
186
|
telegramId: string;
|
|
187
|
+
username?: string;
|
|
183
188
|
chatId: string;
|
|
184
189
|
currentState?: string;
|
|
185
190
|
stateData?: Record<string, unknown>;
|
|
@@ -188,6 +193,7 @@ export const databaseAdapter: DatabaseAdapter = {
|
|
|
188
193
|
return {
|
|
189
194
|
id: user.id,
|
|
190
195
|
telegramId: user.telegramId,
|
|
196
|
+
username: user.username,
|
|
191
197
|
chatId: user.chatId,
|
|
192
198
|
currentState: user.currentState,
|
|
193
199
|
info: user.info,
|
|
@@ -19,14 +19,14 @@ appBuilder
|
|
|
19
19
|
|
|
20
20
|
// Access Grammy context via context.ctx
|
|
21
21
|
// See Grammy docs: https://grammy.dev/guide/context
|
|
22
|
-
await context.
|
|
22
|
+
await context.reply("Hello from <%= stateName %> state!");
|
|
23
23
|
|
|
24
24
|
// === INLINE KEYBOARD EXAMPLE ===
|
|
25
25
|
// import { InlineKeyboard } from 'grammy';
|
|
26
26
|
// const keyboard = new InlineKeyboard()
|
|
27
27
|
// .text('Button 1', 'btn1')
|
|
28
28
|
// .text('Button 2', 'btn2');
|
|
29
|
-
// await context.
|
|
29
|
+
// await context.reply('Choose:', { reply_markup: keyboard });
|
|
30
30
|
|
|
31
31
|
// === POLL EXAMPLE ===
|
|
32
32
|
// await context.ctx.replyWithPoll(
|
|
@@ -66,7 +66,7 @@ appBuilder
|
|
|
66
66
|
// const data = context.ctx.callbackQuery.data;
|
|
67
67
|
// switch (data) {
|
|
68
68
|
// case 'btn1':
|
|
69
|
-
// await context.
|
|
69
|
+
// await context.reply('You clicked Button 1!');
|
|
70
70
|
// break;
|
|
71
71
|
// case 'btn2':
|
|
72
72
|
// return 'otherState'; // Transition to another state
|
|
@@ -79,7 +79,7 @@ appBuilder
|
|
|
79
79
|
// const optionIds = context.ctx.pollAnswer.option_ids;
|
|
80
80
|
// const options = ['Option A', 'Option B', 'Option C'];
|
|
81
81
|
// const selected = optionIds.map(id => options[id]).join(', ');
|
|
82
|
-
// await context.
|
|
82
|
+
// await context.reply(`You voted for: ${selected}`);
|
|
83
83
|
// return;
|
|
84
84
|
// }
|
|
85
85
|
|
|
@@ -89,19 +89,19 @@ appBuilder
|
|
|
89
89
|
// const command = text.split(' ')[0].toLowerCase();
|
|
90
90
|
// switch (command) {
|
|
91
91
|
// case '/start':
|
|
92
|
-
// await context.
|
|
92
|
+
// await context.reply('Welcome!');
|
|
93
93
|
// return 'welcome';
|
|
94
94
|
// case '/menu':
|
|
95
95
|
// return 'menu';
|
|
96
96
|
// default:
|
|
97
|
-
// await context.
|
|
97
|
+
// await context.reply(`Unknown command: ${command}`);
|
|
98
98
|
// }
|
|
99
99
|
// return;
|
|
100
100
|
// }
|
|
101
101
|
|
|
102
102
|
const text = context.ctx.message?.text?.trim();
|
|
103
103
|
if (text) {
|
|
104
|
-
await context.
|
|
104
|
+
await context.reply(`You said: ${text}`);
|
|
105
105
|
}
|
|
106
106
|
<% if (transitionStates.length > 0) { %>
|
|
107
107
|
// Available transitions: <%= transitionStates.join(', ') %>
|