@skroz/telegram-bot 1.0.2 → 1.0.4

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 CHANGED
@@ -1,11 +1,12 @@
1
- import { TG_Update, TG_User } from '@skroz/telegram-api/dist/TelegramTypes';
1
+ import { TG_CallbackQuery, TG_Message, TG_SendMessageResponse, TG_SendPhotoInput, TG_Update } from '@skroz/telegram-api/dist/TelegramTypes';
2
+ export declare const createCallbackData: (telegramId: number | string, data: string[]) => string;
3
+ export declare const getCallbackData: (data: string) => string[];
2
4
  declare class TelegramBot {
3
5
  private readonly botToken;
4
6
  constructor(botToken: string);
5
7
  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>;
8
+ handleUpdate(update: TG_Update, handleCallback: (callbackQuery: TG_CallbackQuery, callbackDataParams: string[]) => Promise<void>, handleMessage: (message: TG_Message) => void): Promise<void>;
9
+ sendPhoto(input: TG_SendPhotoInput, message?: TG_Message): Promise<TG_SendMessageResponse>;
9
10
  deleteWebhook(): Promise<void>;
10
11
  }
11
12
  export default TelegramBot;
@@ -1 +1 @@
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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,gBAAgB,EAChB,UAAU,EACV,sBAAsB,EACtB,iBAAiB,EACjB,SAAS,EACV,MAAM,wCAAwC,CAAC;AAUhD,eAAO,MAAM,kBAAkB,eACjB,MAAM,GAAG,MAAM,QACrB,MAAM,EAAE,KACb,MAC0E,CAAC;AAG9E,eAAO,MAAM,eAAe,SAAU,MAAM,KAAG,MAAM,EACxB,CAAC;AAE9B,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,CACd,aAAa,EAAE,gBAAgB,EAC/B,kBAAkB,EAAE,MAAM,EAAE,KACzB,OAAO,CAAC,IAAI,CAAC,EAClB,aAAa,EAAE,CAAC,OAAO,EAAE,UAAU,KAAK,IAAI,GAC3C,OAAO,CAAC,IAAI,CAAC;IAmCV,SAAS,CACb,KAAK,EAAE,iBAAiB,EACxB,OAAO,CAAC,EAAE,UAAU,GACnB,OAAO,CAAC,sBAAsB,CAAC;IA2C5B,aAAa;CAGpB;AAED,eAAe,WAAW,CAAC"}
package/dist/index.js CHANGED
@@ -3,13 +3,19 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.getCallbackData = exports.createCallbackData = void 0;
6
7
  const telegram_api_1 = __importDefault(require("@skroz/telegram-api"));
8
+ /* eslint-disable @typescript-eslint/naming-convention */
7
9
  /* хранит уникальные колбэки, чтобы исключить повторное нажатие */
8
10
  const processedCallbacks = new Set();
9
- /* разделитель для отслеживания повторных колбэков */
10
- const uniqueCallbackFilter = '&&';
11
11
  /* разделитель для параметров колбэка */
12
- const callbackParamDivider = ':^:^:';
12
+ const callbackDivider = '^:^:^';
13
+ /* не больше 64 символов по документации, внутри защита от повторных кликов */
14
+ const createCallbackData = (telegramId, data) => [`${Date.now()}_${telegramId}`, ...data].join(callbackDivider).slice(0, 64);
15
+ exports.createCallbackData = createCallbackData;
16
+ /* не больше 64 символов по документации, внутри защита от повторных кликов */
17
+ const getCallbackData = (data) => data.split(callbackDivider);
18
+ exports.getCallbackData = getCallbackData;
13
19
  class TelegramBot {
14
20
  constructor(botToken) {
15
21
  this.botToken = botToken;
@@ -20,49 +26,64 @@ class TelegramBot {
20
26
  async handleUpdate(update, handleCallback, handleMessage) {
21
27
  const callbackQuery = update.callback_query;
22
28
  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);
29
+ const { data } = callbackQuery;
30
+ if (!data) {
31
+ // 1. Коллбэк пришел от WebApp
32
+ // 2. Игровая кнопка
33
+ // 3. Кнопка с удаленным сообщением
34
+ return; // todo sendError
44
35
  }
45
- const params = callback.split(callbackParamDivider);
46
- handleCallback(params);
47
- return { from };
36
+ // data - всегда уникален, потому что в начале стоит текущий Date.now()
37
+ if (processedCallbacks.has(data)) {
38
+ // чтобы избежать дублирования нажатия на кнопку
39
+ return; // Уже обработан
40
+ }
41
+ processedCallbacks.add(data);
42
+ // Удаляем из памяти через 60 секунд
43
+ setTimeout(() => {
44
+ processedCallbacks.delete(data);
45
+ }, 60 * 1000);
46
+ await handleCallback(callbackQuery, (0, exports.getCallbackData)(data));
48
47
  }
49
48
  /* обработаем сообщение */
50
49
  const { message } = update; // его нет, если это нажатие на кнопку callback_query или при редактировании предыдущего сообщения
51
50
  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 };
51
+ /* разбираем входящий текст */
52
+ await handleMessage(message);
53
+ }
54
+ }
55
+ async sendPhoto(input, message) {
56
+ const { chat_id, reply_markup, caption, photo } = input;
57
+ let sendResult;
58
+ const sendPhotoFunction = () => telegram_api_1.default.sendPhoto({
59
+ chat_id,
60
+ caption,
61
+ photo,
62
+ parse_mode: 'HTML',
63
+ reply_markup,
64
+ }, this.botToken);
65
+ if (message) {
66
+ try {
67
+ sendResult = await telegram_api_1.default.editMessageMedia({
68
+ media: {
69
+ type: 'photo',
70
+ media: photo,
71
+ caption,
72
+ parse_mode: 'HTML',
73
+ },
74
+ message_id: message.message_id,
75
+ reply_markup,
76
+ chat_id,
77
+ }, this.botToken);
63
78
  }
79
+ catch (e) {
80
+ sendResult = await sendPhotoFunction();
81
+ }
82
+ }
83
+ else {
84
+ sendResult = await sendPhotoFunction();
64
85
  }
65
- return undefined;
86
+ return sendResult;
66
87
  }
67
88
  async deleteWebhook() {
68
89
  return telegram_api_1.default.deleteWebhook(this.botToken);
package/dist/index.js.map CHANGED
@@ -1 +1 @@
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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@skroz/telegram-bot",
3
- "version": "1.0.2",
3
+ "version": "1.0.4",
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": "8c295f6b494f0fed2e05f97c444d8ae0f16a06c0"
24
+ "gitHead": "e88af73cb8dbea50c6ab195afd7b77b74ef585da"
25
25
  }
package/src/index.ts CHANGED
@@ -1,12 +1,29 @@
1
1
  import TelegramApi from '@skroz/telegram-api';
2
- import { TG_Update, TG_User } from '@skroz/telegram-api/dist/TelegramTypes';
2
+ import {
3
+ TG_CallbackQuery,
4
+ TG_Message,
5
+ TG_SendMessageResponse,
6
+ TG_SendPhotoInput,
7
+ TG_Update,
8
+ } from '@skroz/telegram-api/dist/TelegramTypes';
9
+
10
+ /* eslint-disable @typescript-eslint/naming-convention */
3
11
 
4
12
  /* хранит уникальные колбэки, чтобы исключить повторное нажатие */
5
13
  const processedCallbacks = new Set();
6
- /* разделитель для отслеживания повторных колбэков */
7
- const uniqueCallbackFilter = '&&';
8
14
  /* разделитель для параметров колбэка */
9
- const callbackParamDivider = ':^:^:';
15
+ const callbackDivider = '^:^:^';
16
+
17
+ /* не больше 64 символов по документации, внутри защита от повторных кликов */
18
+ export const createCallbackData = (
19
+ telegramId: number | string,
20
+ data: string[]
21
+ ): string =>
22
+ [`${Date.now()}_${telegramId}`, ...data].join(callbackDivider).slice(0, 64);
23
+
24
+ /* не больше 64 символов по документации, внутри защита от повторных кликов */
25
+ export const getCallbackData = (data: string): string[] =>
26
+ data.split(callbackDivider);
10
27
 
11
28
  class TelegramBot {
12
29
  constructor(private readonly botToken: string) {}
@@ -17,62 +34,90 @@ class TelegramBot {
17
34
 
18
35
  async handleUpdate(
19
36
  update: TG_Update,
20
- handleCallback: (callbackParams: string[]) => void,
21
- handleMessage: (incomingText: string) => void
22
- ): Promise<{ from: TG_User } | undefined> {
37
+ handleCallback: (
38
+ callbackQuery: TG_CallbackQuery,
39
+ callbackDataParams: string[]
40
+ ) => Promise<void>,
41
+ handleMessage: (message: TG_Message) => void
42
+ ): Promise<void> {
23
43
  const callbackQuery = update.callback_query;
24
44
  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);
45
+ const { data } = callbackQuery;
46
+
47
+ if (!data) {
48
+ // 1. Коллбэк пришел от WebApp
49
+ // 2. Игровая кнопка
50
+ // 3. Кнопка с удаленным сообщением
51
+ return; // todo sendError
48
52
  }
49
53
 
50
- const params = callback.split(callbackParamDivider);
51
- handleCallback(params);
52
- return { from };
53
- }
54
+ // data - всегда уникален, потому что в начале стоит текущий Date.now()
55
+ if (processedCallbacks.has(data)) {
56
+ // чтобы избежать дублирования нажатия на кнопку
57
+ return; // Уже обработан
58
+ }
59
+ processedCallbacks.add(data);
54
60
 
61
+ // Удаляем из памяти через 60 секунд
62
+ setTimeout(() => {
63
+ processedCallbacks.delete(data);
64
+ }, 60 * 1000);
65
+
66
+ await handleCallback(callbackQuery, getCallbackData(data));
67
+ }
55
68
  /* обработаем сообщение */
56
69
  const { message } = update; // его нет, если это нажатие на кнопку callback_query или при редактировании предыдущего сообщения
57
70
 
58
71
  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);
72
+ /* разбираем входящий текст */
73
+ await handleMessage(message);
74
+ }
75
+ }
70
76
 
71
- return { from };
77
+ async sendPhoto(
78
+ input: TG_SendPhotoInput,
79
+ message?: TG_Message
80
+ ): Promise<TG_SendMessageResponse> {
81
+ const { chat_id, reply_markup, caption, photo } = input;
82
+
83
+ let sendResult: TG_SendMessageResponse;
84
+
85
+ const sendPhotoFunction = () =>
86
+ TelegramApi.sendPhoto(
87
+ {
88
+ chat_id,
89
+ caption,
90
+ photo,
91
+ parse_mode: 'HTML',
92
+ reply_markup,
93
+ },
94
+ this.botToken
95
+ );
96
+
97
+ if (message) {
98
+ try {
99
+ sendResult = await TelegramApi.editMessageMedia(
100
+ {
101
+ media: {
102
+ type: 'photo',
103
+ media: photo as string,
104
+ caption,
105
+ parse_mode: 'HTML',
106
+ },
107
+ message_id: message.message_id,
108
+ reply_markup,
109
+ chat_id,
110
+ },
111
+ this.botToken
112
+ );
113
+ } catch (e) {
114
+ sendResult = await sendPhotoFunction();
72
115
  }
116
+ } else {
117
+ sendResult = await sendPhotoFunction();
73
118
  }
74
119
 
75
- return undefined;
120
+ return sendResult;
76
121
  }
77
122
 
78
123
  async deleteWebhook() {