koishi-plugin-tmp-bot
Version:
欧洲卡车模拟2 TMP查询插件,不会部署的可以直接使用此机器人->QQ:3523283907
120 lines (119 loc) • 3.44 kB
JavaScript
const truckyAppApi = require('../../api/truckyAppApi');
const evmOpenApi = require('../../api/evmOpenApi');
const baiduTranslate = require('../../util/baiduTranslate');
const { resolve } = require("path");
const common = require("../../util/common");
const { segment } = require("koishi");
/**
* 服务器别名
*/
const serverAlias = {
's1': {
name: 'sim1',
mapType: 'ets',
serverId: 2,
bounds: [[-94189, 93775], [79264, -78999]]
},
's2': {
name: 'sim2',
mapType: 'ets',
serverId: 41,
bounds: [[-94189, 93775], [79264, -78999]]
},
'p': {
name: 'eupromods1',
mapType: 'promods',
serverId: 50,
bounds: [[-96355, 16381], [205581, -70750]]
},
'a': {
name: 'arc1',
mapType: 'ets',
serverId: 7,
bounds: [[-94189, 93775], [79264, -78999]]
}
};
/**
* 路况程度转中文
*/
const severityToZh = {
'Fluid': {
text: '畅通',
color: '#00d26a'
},
'Moderate': {
text: '正常',
color: '#ff6723'
},
'Congested': {
text: '缓慢',
color: '#f8312f'
},
'Heavy': {
text: '拥堵',
color: '#8d67c5'
}
};
/**
* 位置类型转中文
*/
const typeToZh = {
'City': '城市',
'Road': '公路',
'Intersection': '十字路口'
};
/**
* 查询路况
*/
module.exports = async (ctx, cfg, serverName) => {
if (!ctx.puppeteer) {
return '未启用 puppeteer 服务';
}
// 根据别名获取服务器信息
let serverInfo = serverAlias[serverName];
if (!serverInfo) {
return '请输入正确的服务器名称 (s1, s2, p, a)';
}
// 查询路况信息
let trafficData = await truckyAppApi.trafficTop(ctx.http, serverInfo.name);
if (trafficData.error) {
return '查询路况信息失败';
}
// 查询地图玩家数据
let mapData = await evmOpenApi.mapPlayerList(ctx.http, serverInfo.serverId, serverInfo.bounds[0][0], serverInfo.bounds[0][1], serverInfo.bounds[1][0], serverInfo.bounds[1][1]);
// 构建路况数据
let data = {
mapType: serverInfo.mapType,
trafficList: [],
playerCoordinateList: mapData.error && mapData.data ? [] : mapData.data.map(item => [item.axisX, item.axisY])
};
for (const traffic of trafficData.data) {
data.trafficList.push({
country: await baiduTranslate(ctx, cfg, traffic.country),
province: await baiduTranslate(ctx, cfg, traffic.name.substring(0, traffic.name.lastIndexOf('(') - 1)),
playerCount: traffic.players,
severity: severityToZh[traffic.newSeverity] || { text: '未知', color: '#ffffff' }
});
}
let page;
try {
page = await ctx.puppeteer.page();
await page.setViewport({ width: 1000, height: 1000 });
await page.goto(`file:///${resolve(__dirname, '../../resource/traffic.html')}`);
await page.evaluate(`setData(${JSON.stringify(data)})`);
await common.sleep(100);
await page.waitForNetworkIdle();
const element = await page.$("#container");
return (segment.image(await element.screenshot({
encoding: "binary"
}), "image/jpg"));
}
catch {
return '渲染异常,请重试';
}
finally {
if (page) {
await page.close();
}
}
};