@skroz/telegram-bot 1.0.3 → 1.0.5

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,16 @@
1
- import { TG_CallbackQuery, TG_Message, TG_Update } 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
2
  export declare const createCallbackData: (telegramId: number | string, data: string[]) => string;
3
3
  export declare const getCallbackData: (data: string) => string[];
4
+ type ExpiresInput = {
5
+ seconds?: number;
6
+ onExpire: () => void;
7
+ };
4
8
  declare class TelegramBot {
5
9
  private readonly botToken;
6
10
  constructor(botToken: string);
7
11
  setWebhook(webhookUrl: string): Promise<import("@skroz/telegram-api/dist/ResultAndDescription").default>;
8
12
  handleUpdate(update: TG_Update, handleCallback: (callbackQuery: TG_CallbackQuery, callbackDataParams: string[]) => Promise<void>, handleMessage: (message: TG_Message) => void): Promise<void>;
13
+ sendPhoto(input: TG_SendPhotoInput, message?: TG_Message, expires?: ExpiresInput): Promise<TG_SendMessageResponse>;
9
14
  deleteWebhook(): Promise<void>;
10
15
  }
11
16
  export default TelegramBot;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,gBAAgB,EAChB,UAAU,EACV,SAAS,EACV,MAAM,wCAAwC,CAAC;AAQhD,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,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;AAYhD,eAAO,MAAM,kBAAkB,eACjB,MAAM,GAAG,MAAM,QACrB,MAAM,EAAE,KACb,MAC0E,CAAC;AAG9E,eAAO,MAAM,eAAe,SAAU,MAAM,KAAG,MAAM,EACxB,CAAC;AA0D9B,KAAK,YAAY,GAAG;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,IAAI,CAAC;CACtB,CAAC;AAEF,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,EACpB,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,sBAAsB,CAAC;IAwD5B,aAAa;CAGpB;AAED,eAAe,WAAW,CAAC"}
package/dist/index.js CHANGED
@@ -5,16 +5,53 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.getCallbackData = exports.createCallbackData = void 0;
7
7
  const telegram_api_1 = __importDefault(require("@skroz/telegram-api"));
8
+ /* eslint-disable @typescript-eslint/naming-convention */
8
9
  /* хранит уникальные колбэки, чтобы исключить повторное нажатие */
9
10
  const processedCallbacks = new Set();
10
11
  /* разделитель для параметров колбэка */
11
12
  const callbackDivider = '^:^:^';
13
+ /* по умолчанию истекающее сообщение */
14
+ const expiresSecondsDefault = 5 * 60; // 5 минут
12
15
  /* не больше 64 символов по документации, внутри защита от повторных кликов */
13
16
  const createCallbackData = (telegramId, data) => [`${Date.now()}_${telegramId}`, ...data].join(callbackDivider).slice(0, 64);
14
17
  exports.createCallbackData = createCallbackData;
15
18
  /* не больше 64 символов по документации, внутри защита от повторных кликов */
16
19
  const getCallbackData = (data) => data.split(callbackDivider);
17
20
  exports.getCallbackData = getCallbackData;
21
+ const expiredMessagesList = [];
22
+ const pushMessageToExpireList = (
23
+ // from: TG_User,
24
+ message, expires) => {
25
+ const expiresAt = Date.now() + (expires.seconds || expiresSecondsDefault) * 1000;
26
+ expiredMessagesList.push({
27
+ message,
28
+ // from,
29
+ expiresAt,
30
+ onExpire: expires.onExpire,
31
+ });
32
+ };
33
+ // забирает и сразу удаляет
34
+ const shiftExpiredMessages = () => {
35
+ const now = Date.now();
36
+ const expired = expiredMessagesList.filter((msg) => msg.expiresAt <= now);
37
+ expiredMessagesList.splice(0, expired.length);
38
+ return expired;
39
+ };
40
+ // убираем из списка удаленные сообщения
41
+ const deleteMessageFromExpiringList = (message) => {
42
+ const index = expiredMessagesList.findIndex((msg) => msg.message.message_id === message.message_id);
43
+ if (index !== -1) {
44
+ expiredMessagesList.splice(index, 1);
45
+ }
46
+ };
47
+ setInterval(async () => {
48
+ const expired = shiftExpiredMessages();
49
+ if (expired.length > 0) {
50
+ await Promise.all(expired.map(async (ex) => {
51
+ await ex.onExpire();
52
+ }));
53
+ }
54
+ }, 15000);
18
55
  class TelegramBot {
19
56
  constructor(botToken) {
20
57
  this.botToken = botToken;
@@ -51,6 +88,50 @@ class TelegramBot {
51
88
  await handleMessage(message);
52
89
  }
53
90
  }
91
+ async sendPhoto(input, message, expires) {
92
+ const { chat_id, reply_markup, caption, photo } = input;
93
+ let sendResult;
94
+ const sendPhotoFunction = () => telegram_api_1.default.sendPhoto({
95
+ chat_id,
96
+ caption,
97
+ photo,
98
+ parse_mode: 'HTML',
99
+ reply_markup,
100
+ }, this.botToken);
101
+ if (message) {
102
+ try {
103
+ sendResult = await telegram_api_1.default.editMessageMedia({
104
+ media: {
105
+ type: 'photo',
106
+ media: photo,
107
+ caption,
108
+ parse_mode: 'HTML',
109
+ },
110
+ message_id: message.message_id,
111
+ reply_markup,
112
+ chat_id,
113
+ }, this.botToken);
114
+ }
115
+ catch (e) {
116
+ sendResult = await sendPhotoFunction();
117
+ }
118
+ }
119
+ else {
120
+ sendResult = await sendPhotoFunction();
121
+ }
122
+ if (sendResult.ok && sendResult.result) {
123
+ if (expires) {
124
+ pushMessageToExpireList(sendResult.result,
125
+ // sendResult.result,
126
+ // sendResult.result.from,
127
+ expires);
128
+ }
129
+ else {
130
+ deleteMessageFromExpiringList(sendResult.result);
131
+ }
132
+ }
133
+ return sendResult;
134
+ }
54
135
  async deleteWebhook() {
55
136
  return telegram_api_1.default.deleteWebhook(this.botToken);
56
137
  }
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;AAAA,uEAA8C;AAO9C,kEAAkE;AAClE,MAAM,kBAAkB,GAAG,IAAI,GAAG,EAAE,CAAC;AACrC,wCAAwC;AACxC,MAAM,eAAe,GAAG,OAAO,CAAC;AAEhC,8EAA8E;AACvE,MAAM,kBAAkB,GAAG,CAChC,UAA2B,EAC3B,IAAc,EACN,EAAE,CACV,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,UAAU,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAJjE,QAAA,kBAAkB,sBAI+C;AAE9E,8EAA8E;AACvE,MAAM,eAAe,GAAG,CAAC,IAAY,EAAY,EAAE,CACxD,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;AADjB,QAAA,eAAe,mBACE;AAE9B,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,cAGkB,EAClB,aAA4C;QAE5C,MAAM,aAAa,GAAG,MAAM,CAAC,cAAc,CAAC;QAC5C,IAAI,aAAa,EAAE,CAAC;YAClB,MAAM,EAAE,IAAI,EAAE,GAAG,aAAa,CAAC;YAE/B,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,8BAA8B;gBAC9B,oBAAoB;gBACpB,mCAAmC;gBACnC,OAAO,CAAC,iBAAiB;YAC3B,CAAC;YAED,uEAAuE;YACvE,IAAI,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBACjC,gDAAgD;gBAChD,OAAO,CAAC,gBAAgB;YAC1B,CAAC;YACD,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAE7B,oCAAoC;YACpC,UAAU,CAAC,GAAG,EAAE;gBACd,kBAAkB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAClC,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC;YAEd,MAAM,cAAc,CAAC,aAAa,EAAE,IAAA,uBAAe,EAAC,IAAI,CAAC,CAAC,CAAC;QAC7D,CAAC;QACD,0BAA0B;QAC1B,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC,CAAC,kGAAkG;QAE9H,IAAI,CAAC,aAAa,IAAI,OAAO,EAAE,CAAC;YAC9B,8BAA8B;YAC9B,MAAM,aAAa,CAAC,OAAO,CAAC,CAAC;QAC/B,CAAC;IACH,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.3",
3
+ "version": "1.0.5",
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": "f581017d2941a8fc89cee07fb7c39b5e1aae4218"
24
+ "gitHead": "027ab22a48e487c2c51bb86a0aacabc20109b7e0"
25
25
  }
package/src/index.ts CHANGED
@@ -2,13 +2,19 @@ import TelegramApi from '@skroz/telegram-api';
2
2
  import {
3
3
  TG_CallbackQuery,
4
4
  TG_Message,
5
+ TG_SendMessageResponse,
6
+ TG_SendPhotoInput,
5
7
  TG_Update,
6
8
  } from '@skroz/telegram-api/dist/TelegramTypes';
7
9
 
10
+ /* eslint-disable @typescript-eslint/naming-convention */
11
+
8
12
  /* хранит уникальные колбэки, чтобы исключить повторное нажатие */
9
13
  const processedCallbacks = new Set();
10
14
  /* разделитель для параметров колбэка */
11
15
  const callbackDivider = '^:^:^';
16
+ /* по умолчанию истекающее сообщение */
17
+ const expiresSecondsDefault = 5 * 60; // 5 минут
12
18
 
13
19
  /* не больше 64 символов по документации, внутри защита от повторных кликов */
14
20
  export const createCallbackData = (
@@ -21,6 +27,67 @@ export const createCallbackData = (
21
27
  export const getCallbackData = (data: string): string[] =>
22
28
  data.split(callbackDivider);
23
29
 
30
+ const expiredMessagesList: {
31
+ // from: TG_User;
32
+ message: TG_Message;
33
+ expiresAt: number;
34
+ onExpire: () => void;
35
+ }[] = [];
36
+
37
+ const pushMessageToExpireList = (
38
+ // from: TG_User,
39
+ message: TG_Message,
40
+ expires: ExpiresInput
41
+ ) => {
42
+ const expiresAt =
43
+ Date.now() + (expires.seconds || expiresSecondsDefault) * 1000;
44
+
45
+ expiredMessagesList.push({
46
+ message,
47
+ // from,
48
+ expiresAt,
49
+ onExpire: expires.onExpire,
50
+ });
51
+ };
52
+
53
+ // забирает и сразу удаляет
54
+ const shiftExpiredMessages = (): {
55
+ message: TG_Message;
56
+ // from: TG_User;
57
+ onExpire: () => void;
58
+ }[] => {
59
+ const now = Date.now();
60
+ const expired = expiredMessagesList.filter((msg) => msg.expiresAt <= now);
61
+ expiredMessagesList.splice(0, expired.length);
62
+ return expired;
63
+ };
64
+
65
+ // убираем из списка удаленные сообщения
66
+ const deleteMessageFromExpiringList = (message: TG_Message) => {
67
+ const index = expiredMessagesList.findIndex(
68
+ (msg) => msg.message.message_id === message.message_id
69
+ );
70
+ if (index !== -1) {
71
+ expiredMessagesList.splice(index, 1);
72
+ }
73
+ };
74
+
75
+ setInterval(async () => {
76
+ const expired = shiftExpiredMessages();
77
+ if (expired.length > 0) {
78
+ await Promise.all(
79
+ expired.map(async (ex) => {
80
+ await ex.onExpire();
81
+ })
82
+ );
83
+ }
84
+ }, 15000);
85
+
86
+ type ExpiresInput = {
87
+ seconds?: number;
88
+ onExpire: () => void;
89
+ };
90
+
24
91
  class TelegramBot {
25
92
  constructor(private readonly botToken: string) {}
26
93
 
@@ -70,6 +137,66 @@ class TelegramBot {
70
137
  }
71
138
  }
72
139
 
140
+ async sendPhoto(
141
+ input: TG_SendPhotoInput,
142
+ message?: TG_Message,
143
+ expires?: ExpiresInput
144
+ ): Promise<TG_SendMessageResponse> {
145
+ const { chat_id, reply_markup, caption, photo } = input;
146
+
147
+ let sendResult: TG_SendMessageResponse;
148
+
149
+ const sendPhotoFunction = () =>
150
+ TelegramApi.sendPhoto(
151
+ {
152
+ chat_id,
153
+ caption,
154
+ photo,
155
+ parse_mode: 'HTML',
156
+ reply_markup,
157
+ },
158
+ this.botToken
159
+ );
160
+
161
+ if (message) {
162
+ try {
163
+ sendResult = await TelegramApi.editMessageMedia(
164
+ {
165
+ media: {
166
+ type: 'photo',
167
+ media: photo as string,
168
+ caption,
169
+ parse_mode: 'HTML',
170
+ },
171
+ message_id: message.message_id,
172
+ reply_markup,
173
+ chat_id,
174
+ },
175
+ this.botToken
176
+ );
177
+ } catch (e) {
178
+ sendResult = await sendPhotoFunction();
179
+ }
180
+ } else {
181
+ sendResult = await sendPhotoFunction();
182
+ }
183
+
184
+ if (sendResult.ok && sendResult.result) {
185
+ if (expires) {
186
+ pushMessageToExpireList(
187
+ sendResult.result,
188
+ // sendResult.result,
189
+ // sendResult.result.from,
190
+ expires
191
+ );
192
+ } else {
193
+ deleteMessageFromExpiringList(sendResult.result);
194
+ }
195
+ }
196
+
197
+ return sendResult;
198
+ }
199
+
73
200
  async deleteWebhook() {
74
201
  return TelegramApi.deleteWebhook(this.botToken);
75
202
  }