|
@@ -4,6 +4,7 @@ const SpeedTester = require('./speedTester');
|
|
|
const TelegramNotifier = require('./notifier');
|
|
|
const MultiSubscriptionManager = require('./multiSubscriptionManager');
|
|
|
const { Node, TestResult } = require('../models');
|
|
|
+const { escapeMarkdown } = require('../utils/markdown');
|
|
|
|
|
|
class Scheduler {
|
|
|
constructor() {
|
|
@@ -295,11 +296,11 @@ class Scheduler {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- const title = `📊 订阅测试报告: ${subscription.name}`;
|
|
|
+ const title = `📊 订阅测试报告: ${escapeMarkdown(subscription.name)}`;
|
|
|
|
|
|
const lines = [
|
|
|
- `*订阅名称:* ${subscription.name}`,
|
|
|
- `*测试时间:* ${summary.testTime}`,
|
|
|
+ `*订阅名称:* ${escapeMarkdown(subscription.name)}`,
|
|
|
+ `*测试时间:* ${escapeMarkdown(summary.testTime)}`,
|
|
|
`*节点总数:* ${summary.totalNodes}个`,
|
|
|
`*在线节点:* ${summary.onlineNodes}个`,
|
|
|
`*离线节点:* ${summary.offlineNodes}个`,
|
|
@@ -317,14 +318,14 @@ class Scheduler {
|
|
|
if (summary.bestNodes.length > 0) {
|
|
|
lines.push(`\n🏆 *最佳节点:*`);
|
|
|
summary.bestNodes.forEach((node, index) => {
|
|
|
- lines.push(`${index + 1}. ${node.name} - ${node.latency}ms`);
|
|
|
+ lines.push(`${index + 1}. ${escapeMarkdown(node.name)} - ${node.latency}ms`);
|
|
|
});
|
|
|
}
|
|
|
|
|
|
if (summary.failedNodes.length > 0) {
|
|
|
lines.push(`\n❌ *故障节点:*`);
|
|
|
summary.failedNodes.forEach((node, index) => {
|
|
|
- lines.push(`${index + 1}. ${node.name}`);
|
|
|
+ lines.push(`${index + 1}. ${escapeMarkdown(node.name)}`);
|
|
|
});
|
|
|
}
|
|
|
|
|
@@ -353,7 +354,7 @@ class Scheduler {
|
|
|
|
|
|
const title = '📈 总体测试报告';
|
|
|
const lines = [
|
|
|
- `*测试时间:* ${new Date().toLocaleString('zh-CN')}`,
|
|
|
+ `*测试时间:* ${escapeMarkdown(new Date().toLocaleString('zh-CN'))}`,
|
|
|
`*订阅数量:* ${totalSubscriptions}个`,
|
|
|
`*节点总数:* ${totalNodes}个`,
|
|
|
`*在线节点:* ${totalOnlineNodes}个`,
|
|
@@ -370,7 +371,7 @@ class Scheduler {
|
|
|
subscriptionResults.forEach(result => {
|
|
|
const { subscription, summary } = result;
|
|
|
const status = summary.successRate >= 80 ? '🟢' : summary.successRate >= 50 ? '🟡' : '🔴';
|
|
|
- lines.push(`${status} ${subscription.name}: ${summary.onlineNodes}/${summary.totalNodes} (${summary.successRate}%)`);
|
|
|
+ lines.push(`${status} ${escapeMarkdown(subscription.name)}: ${summary.onlineNodes}/${summary.totalNodes} (${summary.successRate}%)`);
|
|
|
});
|
|
|
|
|
|
const message = lines.join('\n');
|