node-red-contrib-maxbot 0.5.2 → 0.5.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.
|
@@ -17,66 +17,111 @@ function default_1(RED) {
|
|
|
17
17
|
this.status({ fill: "red", shape: "ring", text: "invalid config" });
|
|
18
18
|
return;
|
|
19
19
|
}
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
const
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
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
|
+
data: ctx.message,
|
|
66
|
+
reply: (text) => ctx.reply(text)
|
|
67
|
+
},
|
|
68
|
+
topic: "max/action",
|
|
69
|
+
});
|
|
70
|
+
};
|
|
71
|
+
bot.on('message_created', messageHandler);
|
|
72
|
+
bot.command(/.*/, commandHandler);
|
|
73
|
+
bot.action(/.*/, actionHandler);
|
|
74
|
+
// Запускаем бота
|
|
75
|
+
bot.start()
|
|
76
|
+
.then(() => {
|
|
77
|
+
if (isActive) {
|
|
78
|
+
this.status({ fill: "green", shape: "dot", text: "listening" });
|
|
79
|
+
}
|
|
80
|
+
})
|
|
81
|
+
.catch((err) => {
|
|
82
|
+
// Ошибка во время работы или запуска
|
|
83
|
+
if (!isActive)
|
|
84
|
+
return;
|
|
85
|
+
this.error(`MAX Bot error: ${err.message}`);
|
|
86
|
+
this.status({ fill: "red", shape: "ring", text: "disconnected" });
|
|
87
|
+
// Если это текущий бот, сбрасываем ссылку
|
|
88
|
+
if (currentBot === bot) {
|
|
89
|
+
currentBot = null;
|
|
90
|
+
}
|
|
91
|
+
// Останавливаем бота
|
|
92
|
+
try {
|
|
93
|
+
bot.stop();
|
|
94
|
+
}
|
|
95
|
+
catch (e) { }
|
|
96
|
+
// Планируем перезапуск
|
|
97
|
+
if (restartTimer)
|
|
98
|
+
clearTimeout(restartTimer);
|
|
99
|
+
restartTimer = setTimeout(() => {
|
|
100
|
+
restartTimer = null;
|
|
101
|
+
if (isActive) {
|
|
102
|
+
startBot();
|
|
103
|
+
}
|
|
104
|
+
}, 5000);
|
|
33
105
|
});
|
|
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");
|
|
106
|
+
// Сразу после вызова start считаем, что бот запущен
|
|
69
107
|
this.status({ fill: "green", shape: "dot", text: "listening" });
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
});
|
|
108
|
+
};
|
|
109
|
+
// Первый запуск
|
|
110
|
+
startBot();
|
|
74
111
|
this.on("close", (done) => {
|
|
75
|
-
|
|
76
|
-
if (
|
|
77
|
-
|
|
112
|
+
isActive = false;
|
|
113
|
+
if (restartTimer) {
|
|
114
|
+
clearTimeout(restartTimer);
|
|
115
|
+
restartTimer = null;
|
|
116
|
+
}
|
|
117
|
+
if (currentBot && typeof currentBot.stop === 'function') {
|
|
118
|
+
try {
|
|
119
|
+
currentBot.stop();
|
|
120
|
+
}
|
|
121
|
+
catch (err) {
|
|
122
|
+
// ignore
|
|
123
|
+
}
|
|
78
124
|
}
|
|
79
|
-
// В библиотеке может не быть off, поэтому просто сбрасываем статус
|
|
80
125
|
this.status({});
|
|
81
126
|
done();
|
|
82
127
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"maxbot-receive.js","sourceRoot":"","sources":["../../src/nodes/maxbot-receive.ts"],"names":[],"mappings":";;AAOA,
|
|
1
|
+
{"version":3,"file":"maxbot-receive.js","sourceRoot":"","sources":["../../src/nodes/maxbot-receive.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "node-red-contrib-maxbot",
|
|
3
|
-
"version": "0.5.
|
|
3
|
+
"version": "0.5.3",
|
|
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,115 @@ export default function (RED: NodeAPI) {
|
|
|
23
23
|
return;
|
|
24
24
|
}
|
|
25
25
|
|
|
26
|
-
|
|
27
|
-
|
|
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
|
-
|
|
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
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
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
|
+
data: ctx.message,
|
|
73
|
+
reply: (text: string) => ctx.reply(text)
|
|
74
|
+
},
|
|
75
|
+
topic: "max/action",
|
|
76
|
+
});
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
bot.on('message_created', messageHandler);
|
|
80
|
+
bot.command(/.*/, commandHandler);
|
|
81
|
+
bot.action(/.*/, actionHandler);
|
|
70
82
|
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
83
|
+
// Запускаем бота
|
|
84
|
+
bot.start()
|
|
85
|
+
.then(() => {
|
|
86
|
+
if (isActive) {
|
|
87
|
+
this.status({ fill: "green", shape: "dot", text: "listening" });
|
|
88
|
+
}
|
|
89
|
+
})
|
|
90
|
+
.catch((err: any) => {
|
|
91
|
+
// Ошибка во время работы или запуска
|
|
92
|
+
if (!isActive) return;
|
|
75
93
|
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
);
|
|
94
|
+
this.error(`MAX Bot error: ${err.message}`);
|
|
95
|
+
this.status({ fill: "red", shape: "ring", text: "disconnected" });
|
|
79
96
|
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
97
|
+
// Если это текущий бот, сбрасываем ссылку
|
|
98
|
+
if (currentBot === bot) {
|
|
99
|
+
currentBot = null;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// Останавливаем бота
|
|
103
|
+
try { bot.stop(); } catch (e) {}
|
|
104
|
+
|
|
105
|
+
// Планируем перезапуск
|
|
106
|
+
if (restartTimer) clearTimeout(restartTimer);
|
|
107
|
+
restartTimer = setTimeout(() => {
|
|
108
|
+
restartTimer = null;
|
|
109
|
+
if (isActive) {
|
|
110
|
+
startBot();
|
|
111
|
+
}
|
|
112
|
+
}, 5000);
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
// Сразу после вызова start считаем, что бот запущен
|
|
83
116
|
this.status({ fill: "green", shape: "dot", text: "listening" });
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
117
|
+
};
|
|
118
|
+
|
|
119
|
+
// Первый запуск
|
|
120
|
+
startBot();
|
|
88
121
|
|
|
89
122
|
this.on("close", (done: () => void) => {
|
|
90
|
-
|
|
91
|
-
if (
|
|
92
|
-
|
|
123
|
+
isActive = false;
|
|
124
|
+
if (restartTimer) {
|
|
125
|
+
clearTimeout(restartTimer);
|
|
126
|
+
restartTimer = null;
|
|
127
|
+
}
|
|
128
|
+
if (currentBot && typeof currentBot.stop === 'function') {
|
|
129
|
+
try {
|
|
130
|
+
currentBot.stop();
|
|
131
|
+
} catch (err) {
|
|
132
|
+
// ignore
|
|
133
|
+
}
|
|
93
134
|
}
|
|
94
|
-
// В библиотеке может не быть off, поэтому просто сбрасываем статус
|
|
95
135
|
this.status({});
|
|
96
136
|
done();
|
|
97
137
|
});
|