@skroz/telegram-bot 1.0.1 → 1.0.2
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/dist/index.d.ts +6 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +62 -2
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
- package/src/index.ts +76 -2
package/dist/index.d.ts
CHANGED
|
@@ -1,7 +1,12 @@
|
|
|
1
|
+
import { TG_Update, TG_User } from '@skroz/telegram-api/dist/TelegramTypes';
|
|
1
2
|
declare class TelegramBot {
|
|
2
3
|
private readonly botToken;
|
|
3
4
|
constructor(botToken: string);
|
|
4
|
-
|
|
5
|
+
setWebhook(webhookUrl: string): Promise<import("@skroz/telegram-api/dist/ResultAndDescription").default>;
|
|
6
|
+
handleUpdate(update: TG_Update, handleCallback: (callbackParams: string[]) => void, handleMessage: (incomingText: string) => void): Promise<{
|
|
7
|
+
from: TG_User;
|
|
8
|
+
} | undefined>;
|
|
9
|
+
deleteWebhook(): Promise<void>;
|
|
5
10
|
}
|
|
6
11
|
export default TelegramBot;
|
|
7
12
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,wCAAwC,CAAC;AAS5E,cAAM,WAAW;IACH,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAAR,QAAQ,EAAE,MAAM;IAEvC,UAAU,CAAC,UAAU,EAAE,MAAM;IAI7B,YAAY,CAChB,MAAM,EAAE,SAAS,EACjB,cAAc,EAAE,CAAC,cAAc,EAAE,MAAM,EAAE,KAAK,IAAI,EAClD,aAAa,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,IAAI,GAC5C,OAAO,CAAC;QAAE,IAAI,EAAE,OAAO,CAAA;KAAE,GAAG,SAAS,CAAC;IAwDnC,aAAa;CAGpB;AAED,eAAe,WAAW,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,11 +1,71 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
2
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const telegram_api_1 = __importDefault(require("@skroz/telegram-api"));
|
|
7
|
+
/* хранит уникальные колбэки, чтобы исключить повторное нажатие */
|
|
8
|
+
const processedCallbacks = new Set();
|
|
9
|
+
/* разделитель для отслеживания повторных колбэков */
|
|
10
|
+
const uniqueCallbackFilter = '&&';
|
|
11
|
+
/* разделитель для параметров колбэка */
|
|
12
|
+
const callbackParamDivider = ':^:^:';
|
|
3
13
|
class TelegramBot {
|
|
4
14
|
constructor(botToken) {
|
|
5
15
|
this.botToken = botToken;
|
|
6
16
|
}
|
|
7
|
-
async
|
|
8
|
-
|
|
17
|
+
async setWebhook(webhookUrl) {
|
|
18
|
+
return telegram_api_1.default.setWebhook(this.botToken, webhookUrl);
|
|
19
|
+
}
|
|
20
|
+
async handleUpdate(update, handleCallback, handleMessage) {
|
|
21
|
+
const callbackQuery = update.callback_query;
|
|
22
|
+
if (callbackQuery) {
|
|
23
|
+
/* Обработаем этот callback */
|
|
24
|
+
/* Получаем Телеграм Юзера = from: TG_User */
|
|
25
|
+
const { from } = callbackQuery;
|
|
26
|
+
// В этом случае callbackQuery.message - это сообщение. На нём была кнопка, которую нажали
|
|
27
|
+
const telegramId = from.id;
|
|
28
|
+
if (!telegramId)
|
|
29
|
+
return undefined;
|
|
30
|
+
/* Найдем Callback */
|
|
31
|
+
const callback = callbackQuery.data;
|
|
32
|
+
if (!callback)
|
|
33
|
+
return undefined;
|
|
34
|
+
// const { message } = callbackQuery;
|
|
35
|
+
if (callback.includes(uniqueCallbackFilter)) {
|
|
36
|
+
if (processedCallbacks.has(callback)) {
|
|
37
|
+
return undefined; // Уже обработан
|
|
38
|
+
}
|
|
39
|
+
processedCallbacks.add(callback);
|
|
40
|
+
// Удаляем из памяти через 60 секунд
|
|
41
|
+
setTimeout(() => {
|
|
42
|
+
processedCallbacks.delete(callback);
|
|
43
|
+
}, 60 * 1000);
|
|
44
|
+
}
|
|
45
|
+
const params = callback.split(callbackParamDivider);
|
|
46
|
+
handleCallback(params);
|
|
47
|
+
return { from };
|
|
48
|
+
}
|
|
49
|
+
/* обработаем сообщение */
|
|
50
|
+
const { message } = update; // его нет, если это нажатие на кнопку callback_query или при редактировании предыдущего сообщения
|
|
51
|
+
if (!callbackQuery && message) {
|
|
52
|
+
/* точно не кнопка */
|
|
53
|
+
const { from } = message;
|
|
54
|
+
if (from) {
|
|
55
|
+
/* Есть пользователь, значит это сообщение от пользователя, либо сообщения боту, либо в группе, либо в канале */
|
|
56
|
+
const telegramId = from.id;
|
|
57
|
+
if (!telegramId)
|
|
58
|
+
return undefined;
|
|
59
|
+
/* Есть сообщение для бота */
|
|
60
|
+
const incomingText = message.text ?? '';
|
|
61
|
+
handleMessage(incomingText);
|
|
62
|
+
return { from };
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return undefined;
|
|
66
|
+
}
|
|
67
|
+
async deleteWebhook() {
|
|
68
|
+
return telegram_api_1.default.deleteWebhook(this.botToken);
|
|
9
69
|
}
|
|
10
70
|
}
|
|
11
71
|
exports.default = TelegramBot;
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;AAAA,uEAA8C;AAG9C,kEAAkE;AAClE,MAAM,kBAAkB,GAAG,IAAI,GAAG,EAAE,CAAC;AACrC,qDAAqD;AACrD,MAAM,oBAAoB,GAAG,IAAI,CAAC;AAClC,wCAAwC;AACxC,MAAM,oBAAoB,GAAG,OAAO,CAAC;AAErC,MAAM,WAAW;IACf,YAA6B,QAAgB;QAAhB,aAAQ,GAAR,QAAQ,CAAQ;IAAG,CAAC;IAEjD,KAAK,CAAC,UAAU,CAAC,UAAkB;QACjC,OAAO,sBAAW,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IAC3D,CAAC;IAED,KAAK,CAAC,YAAY,CAChB,MAAiB,EACjB,cAAkD,EAClD,aAA6C;QAE7C,MAAM,aAAa,GAAG,MAAM,CAAC,cAAc,CAAC;QAC5C,IAAI,aAAa,EAAE,CAAC;YAClB,8BAA8B;YAC9B,6CAA6C;YAC7C,MAAM,EAAE,IAAI,EAAE,GAAG,aAAa,CAAC;YAC/B,0FAA0F;YAC1F,MAAM,UAAU,GAAG,IAAI,CAAC,EAAE,CAAC;YAC3B,IAAI,CAAC,UAAU;gBAAE,OAAO,SAAS,CAAC;YAElC,qBAAqB;YACrB,MAAM,QAAQ,GAAuB,aAAa,CAAC,IAAI,CAAC;YACxD,IAAI,CAAC,QAAQ;gBAAE,OAAO,SAAS,CAAC;YAChC,qCAAqC;YAErC,IAAI,QAAQ,CAAC,QAAQ,CAAC,oBAAoB,CAAC,EAAE,CAAC;gBAC5C,IAAI,kBAAkB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;oBACrC,OAAO,SAAS,CAAC,CAAC,gBAAgB;gBACpC,CAAC;gBAED,kBAAkB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gBAEjC,oCAAoC;gBACpC,UAAU,CAAC,GAAG,EAAE;oBACd,kBAAkB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;gBACtC,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC;YAChB,CAAC;YAED,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;YACpD,cAAc,CAAC,MAAM,CAAC,CAAC;YACvB,OAAO,EAAE,IAAI,EAAE,CAAC;QAClB,CAAC;QAED,0BAA0B;QAC1B,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC,CAAC,kGAAkG;QAE9H,IAAI,CAAC,aAAa,IAAI,OAAO,EAAE,CAAC;YAC9B,qBAAqB;YACrB,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC;YACzB,IAAI,IAAI,EAAE,CAAC;gBACT,gHAAgH;gBAChH,MAAM,UAAU,GAAG,IAAI,CAAC,EAAE,CAAC;gBAC3B,IAAI,CAAC,UAAU;oBAAE,OAAO,SAAS,CAAC;gBAElC,6BAA6B;gBAC7B,MAAM,YAAY,GAAW,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC;gBAEhD,aAAa,CAAC,YAAY,CAAC,CAAC;gBAE5B,OAAO,EAAE,IAAI,EAAE,CAAC;YAClB,CAAC;QACH,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,KAAK,CAAC,aAAa;QACjB,OAAO,sBAAW,CAAC,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAClD,CAAC;CACF;AAED,kBAAe,WAAW,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@skroz/telegram-bot",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.2",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"repository": "git@gitlab.com:skroz/libs/utils.git",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -21,5 +21,5 @@
|
|
|
21
21
|
"dependencies": {
|
|
22
22
|
"@skroz/telegram-api": "^1.0.10"
|
|
23
23
|
},
|
|
24
|
-
"gitHead": "
|
|
24
|
+
"gitHead": "8c295f6b494f0fed2e05f97c444d8ae0f16a06c0"
|
|
25
25
|
}
|
package/src/index.ts
CHANGED
|
@@ -1,8 +1,82 @@
|
|
|
1
|
+
import TelegramApi from '@skroz/telegram-api';
|
|
2
|
+
import { TG_Update, TG_User } from '@skroz/telegram-api/dist/TelegramTypes';
|
|
3
|
+
|
|
4
|
+
/* хранит уникальные колбэки, чтобы исключить повторное нажатие */
|
|
5
|
+
const processedCallbacks = new Set();
|
|
6
|
+
/* разделитель для отслеживания повторных колбэков */
|
|
7
|
+
const uniqueCallbackFilter = '&&';
|
|
8
|
+
/* разделитель для параметров колбэка */
|
|
9
|
+
const callbackParamDivider = ':^:^:';
|
|
10
|
+
|
|
1
11
|
class TelegramBot {
|
|
2
12
|
constructor(private readonly botToken: string) {}
|
|
3
13
|
|
|
4
|
-
async
|
|
5
|
-
|
|
14
|
+
async setWebhook(webhookUrl: string) {
|
|
15
|
+
return TelegramApi.setWebhook(this.botToken, webhookUrl);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
async handleUpdate(
|
|
19
|
+
update: TG_Update,
|
|
20
|
+
handleCallback: (callbackParams: string[]) => void,
|
|
21
|
+
handleMessage: (incomingText: string) => void
|
|
22
|
+
): Promise<{ from: TG_User } | undefined> {
|
|
23
|
+
const callbackQuery = update.callback_query;
|
|
24
|
+
if (callbackQuery) {
|
|
25
|
+
/* Обработаем этот callback */
|
|
26
|
+
/* Получаем Телеграм Юзера = from: TG_User */
|
|
27
|
+
const { from } = callbackQuery;
|
|
28
|
+
// В этом случае callbackQuery.message - это сообщение. На нём была кнопка, которую нажали
|
|
29
|
+
const telegramId = from.id;
|
|
30
|
+
if (!telegramId) return undefined;
|
|
31
|
+
|
|
32
|
+
/* Найдем Callback */
|
|
33
|
+
const callback: string | undefined = callbackQuery.data;
|
|
34
|
+
if (!callback) return undefined;
|
|
35
|
+
// const { message } = callbackQuery;
|
|
36
|
+
|
|
37
|
+
if (callback.includes(uniqueCallbackFilter)) {
|
|
38
|
+
if (processedCallbacks.has(callback)) {
|
|
39
|
+
return undefined; // Уже обработан
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
processedCallbacks.add(callback);
|
|
43
|
+
|
|
44
|
+
// Удаляем из памяти через 60 секунд
|
|
45
|
+
setTimeout(() => {
|
|
46
|
+
processedCallbacks.delete(callback);
|
|
47
|
+
}, 60 * 1000);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
const params = callback.split(callbackParamDivider);
|
|
51
|
+
handleCallback(params);
|
|
52
|
+
return { from };
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/* обработаем сообщение */
|
|
56
|
+
const { message } = update; // его нет, если это нажатие на кнопку callback_query или при редактировании предыдущего сообщения
|
|
57
|
+
|
|
58
|
+
if (!callbackQuery && message) {
|
|
59
|
+
/* точно не кнопка */
|
|
60
|
+
const { from } = message;
|
|
61
|
+
if (from) {
|
|
62
|
+
/* Есть пользователь, значит это сообщение от пользователя, либо сообщения боту, либо в группе, либо в канале */
|
|
63
|
+
const telegramId = from.id;
|
|
64
|
+
if (!telegramId) return undefined;
|
|
65
|
+
|
|
66
|
+
/* Есть сообщение для бота */
|
|
67
|
+
const incomingText: string = message.text ?? '';
|
|
68
|
+
|
|
69
|
+
handleMessage(incomingText);
|
|
70
|
+
|
|
71
|
+
return { from };
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
return undefined;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
async deleteWebhook() {
|
|
79
|
+
return TelegramApi.deleteWebhook(this.botToken);
|
|
6
80
|
}
|
|
7
81
|
}
|
|
8
82
|
|