koishi-plugin-beatsaber-bot
Version:
一个 用于 BeatSaber 的 koishi Bot 插件
61 lines (60 loc) • 3.09 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.BeatLeaderWS = void 0;
const koishi_1 = require("koishi");
const bl_filter_1 = require("./bl-filter");
const types_1 = require("../types");
function BeatLeaderWS(ctx, cfg, render, logger) {
const ws = ctx.http.ws("wss://sockets.api.beatleader.xyz/scores");
ws.on('open', (event) => {
logger.info("BeatleaderWS opened");
});
ws.on('message', async (message, isBinary) => {
try {
const data = JSON.parse(message.toString());
const playerId = data.player.id;
const ok = (0, bl_filter_1.BeatLeaderFilter)(data, ...cfg.BLScoreFilters);
if (!ok) {
return;
}
// logger.info('Received beatleader message',data.id, data.player.id);
const selection = ctx.database.join(['BSSubscribeMember', 'BSRelateOAuthAccount', 'user', 'BSBotSubscribe']);
const subscribe = await selection.where(row => koishi_1.$.and(koishi_1.$.eq(row.BSBotSubscribe.enable, true), koishi_1.$.eq(row.user.id, row.BSRelateOAuthAccount.uid), koishi_1.$.eq(row.user.id, row.BSSubscribeMember.memberUid), koishi_1.$.eq(row.BSSubscribeMember.subscribeId, row.BSBotSubscribe.id), koishi_1.$.eq(row.BSRelateOAuthAccount.platformUid, playerId), koishi_1.$.eq(row.BSBotSubscribe.type, 'beatleader'), koishi_1.$.eq(row.BSRelateOAuthAccount.platform, 'beatleader'))).execute();
const subscribes = subscribe.map(item => ({
sub: item.BSBotSubscribe,
member: item.BSSubscribeMember,
user: item.user,
account: item.BSRelateOAuthAccount
}));
// .filter(item=> {
// const channelFilters = item.sub.data as BLScoreFilter[]
// const memberFilters = item.member.subscribeData
// return BeatLeaderFilter(data, ...channelFilters, ...memberFilters)
// })
for (const item of subscribes) {
const bot = ctx.bots[`${item.sub.platform}:${item.sub.selfId}`];
if (!bot)
continue;
const img = await render.renderScore(data.id.toString(), types_1.Platform.BL);
const res = await ctx.database.get('binding', {
platform: item.sub.platform,
aid: item.member.memberUid
});
bot.sendMessage(item.sub.channelId, (0, koishi_1.h)('message', [
"恭喜",
(0, koishi_1.h)('at', { id: res[0].pid, }),
`刚刚在谱面「${data.leaderboard.song.name}」中打出了 ${(data.accuracy * 100).toFixed(2)}% 的好成绩`
]));
bot.sendMessage(item.sub.channelId, (0, koishi_1.h)('message', [img]));
}
}
catch (err) {
logger.info('err', err);
}
});
ws.on('close', (evt) => {
logger.info("BeatleaderWS closed");
});
return ws;
}
exports.BeatLeaderWS = BeatLeaderWS;