node-red-contrib-maxbot 0.5.2 → 0.5.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.
@@ -17,66 +17,112 @@ function default_1(RED) {
17
17
  this.status({ fill: "red", shape: "ring", text: "invalid config" });
18
18
  return;
19
19
  }
20
- const bot = new max_bot_api_1.Bot(String(configNode.token));
21
- const handlers = [];
22
- // Обработчик всех сообщений
23
- const messageHandler = (ctx) => {
24
- this.send({
25
- payload: {
26
- chatId: ctx.message?.recipient.chat_id,
27
- userId: ctx.message?.recipient.user_id,
28
- text: ctx.message?.body?.text,
29
- data: ctx.message,
30
- reply: (text) => ctx.reply(text) // Передаём возможность ответа
31
- },
32
- topic: "max/message",
20
+ let isActive = true;
21
+ let currentBot = null;
22
+ let restartTimer = null;
23
+ const startBot = () => {
24
+ if (!isActive)
25
+ return;
26
+ const bot = new max_bot_api_1.Bot(String(configNode.token));
27
+ currentBot = bot;
28
+ // Обработчики событий
29
+ const messageHandler = (ctx) => {
30
+ if (!isActive)
31
+ return;
32
+ this.send({
33
+ payload: {
34
+ chatId: ctx.message?.recipient.chat_id,
35
+ userId: ctx.message?.recipient.user_id,
36
+ text: ctx.message?.body?.text,
37
+ data: ctx.message,
38
+ reply: (text) => ctx.reply(text)
39
+ },
40
+ topic: "max/message",
41
+ });
42
+ };
43
+ const commandHandler = (ctx) => {
44
+ if (!isActive)
45
+ return;
46
+ this.send({
47
+ payload: {
48
+ chatId: ctx.message?.recipient.chat_id,
49
+ userId: ctx.message?.recipient.user_id,
50
+ command: ctx.match[0],
51
+ data: ctx.message,
52
+ reply: (text) => ctx.reply(text)
53
+ },
54
+ topic: "max/command",
55
+ });
56
+ };
57
+ const actionHandler = (ctx) => {
58
+ if (!isActive)
59
+ return;
60
+ this.send({
61
+ payload: {
62
+ chatId: ctx.message?.recipient.chat_id,
63
+ userId: ctx.message?.recipient.user_id,
64
+ action: ctx.match[0],
65
+ callback: ctx.callback,
66
+ data: ctx.message,
67
+ reply: (text) => ctx.reply(text)
68
+ },
69
+ topic: "max/action",
70
+ });
71
+ };
72
+ bot.on('message_created', messageHandler);
73
+ bot.command(/.*/, commandHandler);
74
+ bot.action(/.*/, actionHandler);
75
+ // Запускаем бота
76
+ bot.start()
77
+ .then(() => {
78
+ if (isActive) {
79
+ this.status({ fill: "green", shape: "dot", text: "listening" });
80
+ }
81
+ })
82
+ .catch((err) => {
83
+ // Ошибка во время работы или запуска
84
+ if (!isActive)
85
+ return;
86
+ this.error(`MAX Bot error: ${err.message}`);
87
+ this.status({ fill: "red", shape: "ring", text: "disconnected" });
88
+ // Если это текущий бот, сбрасываем ссылку
89
+ if (currentBot === bot) {
90
+ currentBot = null;
91
+ }
92
+ // Останавливаем бота
93
+ try {
94
+ bot.stop();
95
+ }
96
+ catch (e) { }
97
+ // Планируем перезапуск
98
+ if (restartTimer)
99
+ clearTimeout(restartTimer);
100
+ restartTimer = setTimeout(() => {
101
+ restartTimer = null;
102
+ if (isActive) {
103
+ startBot();
104
+ }
105
+ }, 5000);
33
106
  });
34
- };
35
- // Обработчик команд
36
- const commandHandler = (ctx) => {
37
- this.send({
38
- payload: {
39
- chatId: ctx.message?.recipient.chat_id,
40
- userId: ctx.message?.recipient.user_id,
41
- command: ctx.match[0],
42
- data: ctx.message,
43
- reply: (text) => ctx.reply(text)
44
- },
45
- topic: "max/command",
46
- });
47
- };
48
- // Обработчик действий
49
- const actionHandler = (ctx) => {
50
- this.send({
51
- payload: {
52
- chatId: ctx.message?.recipient.chat_id,
53
- userId: ctx.message?.recipient.user_id,
54
- action: ctx.match[0],
55
- data: ctx.message,
56
- reply: (text) => ctx.reply(text)
57
- },
58
- topic: "max/action",
59
- });
60
- };
61
- // Подписываемся на события
62
- bot.on('message_created', messageHandler);
63
- bot.command(/.*/, commandHandler);
64
- bot.action(/.*/, actionHandler);
65
- handlers.push({ event: 'message_created', handler: messageHandler });
66
- // Запускаем бота
67
- bot.start().then(() => {
68
- this.log("MAX Bot started listening");
107
+ // Сразу после вызова start считаем, что бот запущен
69
108
  this.status({ fill: "green", shape: "dot", text: "listening" });
70
- }).catch((err) => {
71
- this.error("Failed to start bot: " + err.message);
72
- this.status({ fill: "red", shape: "ring", text: "start failed" });
73
- });
109
+ };
110
+ // Первый запуск
111
+ startBot();
74
112
  this.on("close", (done) => {
75
- // Остановка бота, если есть метод stop
76
- if (typeof bot.stop === 'function') {
77
- bot.stop();
113
+ isActive = false;
114
+ if (restartTimer) {
115
+ clearTimeout(restartTimer);
116
+ restartTimer = null;
117
+ }
118
+ if (currentBot && typeof currentBot.stop === 'function') {
119
+ try {
120
+ currentBot.stop();
121
+ }
122
+ catch (err) {
123
+ // ignore
124
+ }
78
125
  }
79
- // В библиотеке может не быть off, поэтому просто сбрасываем статус
80
126
  this.status({});
81
127
  done();
82
128
  });
@@ -1 +1 @@
1
- {"version":3,"file":"maxbot-receive.js","sourceRoot":"","sources":["../../src/nodes/maxbot-receive.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"maxbot-receive.js","sourceRoot":"","sources":["../../src/nodes/maxbot-receive.ts"],"names":[],"mappings":"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"}
@@ -7,7 +7,7 @@
7
7
  defaultChatId: { value: "" }
8
8
  },
9
9
  inputs: 1,
10
- outputs: 2,
10
+ outputs: 1,
11
11
  icon: "font-awesome/fa-send",
12
12
  label: function() {
13
13
  return this.name || "MAX Send";
package/package.json CHANGED
@@ -1,11 +1,11 @@
1
1
  {
2
2
  "name": "node-red-contrib-maxbot",
3
- "version": "0.5.2",
3
+ "version": "0.5.4",
4
4
  "description": "Node-RED nodes for MAX messenger",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
7
7
  "scripts": {
8
- "build": "tsc -p . && cp -r src/nodes/*.html dist/nodes/",
8
+ "build": "tsc -p . && shx mkdir -p dist/nodes && shx cp -r src/nodes/*.html dist/nodes/",
9
9
  "watch": "tsc -w",
10
10
  "lint": "eslint . --ext .ts",
11
11
  "prepublishOnly": "npm run build"
@@ -28,7 +28,8 @@
28
28
  "typescript": "^5.0.0",
29
29
  "eslint": "^8.0.0",
30
30
  "eslint-config-airbnb-base": "^15.0.0",
31
- "eslint-plugin-import": "^2.0.0"
31
+ "eslint-plugin-import": "^2.0.0",
32
+ "shx": "^0.3.4"
32
33
  },
33
34
  "node-red": {
34
35
  "nodes": {
@@ -23,75 +23,116 @@ export default function (RED: NodeAPI) {
23
23
  return;
24
24
  }
25
25
 
26
- const bot = new Bot(String(configNode.token));
27
- const handlers: Array<{ event: string; handler: (...args: any[]) => void }> = [];
28
-
29
- // Обработчик всех сообщений
30
- const messageHandler = (ctx: any) => {
31
- this.send({
32
- payload: {
33
- chatId: ctx.message?.recipient.chat_id,
34
- userId: ctx.message?.recipient.user_id,
35
- text: ctx.message?.body?.text,
36
- data: ctx.message,
37
- reply: (text: string) => ctx.reply(text) // Передаём возможность ответа
38
- },
39
- topic: "max/message",
40
- });
41
- };
26
+ let isActive = true;
27
+ let currentBot: Bot | null = null;
28
+ let restartTimer: NodeJS.Timeout | null = null;
42
29
 
43
- // Обработчик команд
44
- const commandHandler = (ctx: any) => {
45
- this.send({
46
- payload: {
47
- chatId: ctx.message?.recipient.chat_id,
48
- userId: ctx.message?.recipient.user_id,
49
- command: ctx.match[0],
50
- data: ctx.message,
51
- reply: (text: string) => ctx.reply(text)
52
- },
53
- topic: "max/command",
54
- });
55
- };
30
+ const startBot = () => {
31
+ if (!isActive) return;
56
32
 
57
- // Обработчик действий
58
- const actionHandler = (ctx: any) => {
59
- this.send({
60
- payload: {
61
- chatId: ctx.message?.recipient.chat_id,
62
- userId: ctx.message?.recipient.user_id,
63
- action: ctx.match[0],
64
- data: ctx.message,
65
- reply: (text: string) => ctx.reply(text)
66
- },
67
- topic: "max/action",
68
- });
69
- };
33
+ const bot = new Bot(String(configNode.token));
34
+ currentBot = bot;
35
+
36
+ // Обработчики событий
37
+ const messageHandler = (ctx: any) => {
38
+ if (!isActive) return;
39
+ this.send({
40
+ payload: {
41
+ chatId: ctx.message?.recipient.chat_id,
42
+ userId: ctx.message?.recipient.user_id,
43
+ text: ctx.message?.body?.text,
44
+ data: ctx.message,
45
+ reply: (text: string) => ctx.reply(text)
46
+ },
47
+ topic: "max/message",
48
+ });
49
+ };
50
+
51
+ const commandHandler = (ctx: any) => {
52
+ if (!isActive) return;
53
+ this.send({
54
+ payload: {
55
+ chatId: ctx.message?.recipient.chat_id,
56
+ userId: ctx.message?.recipient.user_id,
57
+ command: ctx.match[0],
58
+ data: ctx.message,
59
+ reply: (text: string) => ctx.reply(text)
60
+ },
61
+ topic: "max/command",
62
+ });
63
+ };
64
+
65
+ const actionHandler = (ctx: any) => {
66
+ if (!isActive) return;
67
+ this.send({
68
+ payload: {
69
+ chatId: ctx.message?.recipient.chat_id,
70
+ userId: ctx.message?.recipient.user_id,
71
+ action: ctx.match[0],
72
+ callback: ctx.callback,
73
+ data: ctx.message,
74
+ reply: (text: string) => ctx.reply(text)
75
+ },
76
+ topic: "max/action",
77
+ });
78
+ };
79
+
80
+ bot.on('message_created', messageHandler);
81
+ bot.command(/.*/, commandHandler);
82
+ bot.action(/.*/, actionHandler);
70
83
 
71
- // Подписываемся на события
72
- bot.on('message_created', messageHandler);
73
- bot.command(/.*/, commandHandler);
74
- bot.action(/.*/, actionHandler);
84
+ // Запускаем бота
85
+ bot.start()
86
+ .then(() => {
87
+ if (isActive) {
88
+ this.status({ fill: "green", shape: "dot", text: "listening" });
89
+ }
90
+ })
91
+ .catch((err: any) => {
92
+ // Ошибка во время работы или запуска
93
+ if (!isActive) return;
75
94
 
76
- handlers.push(
77
- { event: 'message_created', handler: messageHandler }
78
- );
95
+ this.error(`MAX Bot error: ${err.message}`);
96
+ this.status({ fill: "red", shape: "ring", text: "disconnected" });
79
97
 
80
- // Запускаем бота
81
- bot.start().then(() => {
82
- this.log("MAX Bot started listening");
98
+ // Если это текущий бот, сбрасываем ссылку
99
+ if (currentBot === bot) {
100
+ currentBot = null;
101
+ }
102
+
103
+ // Останавливаем бота
104
+ try { bot.stop(); } catch (e) {}
105
+
106
+ // Планируем перезапуск
107
+ if (restartTimer) clearTimeout(restartTimer);
108
+ restartTimer = setTimeout(() => {
109
+ restartTimer = null;
110
+ if (isActive) {
111
+ startBot();
112
+ }
113
+ }, 5000);
114
+ });
115
+
116
+ // Сразу после вызова start считаем, что бот запущен
83
117
  this.status({ fill: "green", shape: "dot", text: "listening" });
84
- }).catch((err: any) => {
85
- this.error("Failed to start bot: " + err.message);
86
- this.status({ fill: "red", shape: "ring", text: "start failed" });
87
- });
118
+ };
119
+
120
+ // Первый запуск
121
+ startBot();
88
122
 
89
123
  this.on("close", (done: () => void) => {
90
- // Остановка бота, если есть метод stop
91
- if (typeof bot.stop === 'function') {
92
- bot.stop();
124
+ isActive = false;
125
+ if (restartTimer) {
126
+ clearTimeout(restartTimer);
127
+ restartTimer = null;
128
+ }
129
+ if (currentBot && typeof currentBot.stop === 'function') {
130
+ try {
131
+ currentBot.stop();
132
+ } catch (err) {
133
+ // ignore
134
+ }
93
135
  }
94
- // В библиотеке может не быть off, поэтому просто сбрасываем статус
95
136
  this.status({});
96
137
  done();
97
138
  });
@@ -7,7 +7,7 @@
7
7
  defaultChatId: { value: "" }
8
8
  },
9
9
  inputs: 1,
10
- outputs: 2,
10
+ outputs: 1,
11
11
  icon: "font-awesome/fa-send",
12
12
  label: function() {
13
13
  return this.name || "MAX Send";