koishi-plugin-beatsaber-bot
Version:
一个 用于 BeatSaber 的 koishi Bot 插件
116 lines (115 loc) • 5.64 kB
JavaScript
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.RenderService = void 0;
const types_1 = require("../../types");
const remote_1 = require("./remote");
const result_1 = require("./result");
const qrcode_1 = __importDefault(require("./utils/qrcode"));
const renderImg_1 = require("./renderImg");
const noop = () => { };
class RenderService {
constructor(ctx, config, api) {
this._renderRank = async (accountId, platform, api, renderOpts) => {
if (renderOpts.type == 'remote') {
let remoteP = platform == types_1.Platform.SS ? 'score-saber' : 'beat-leader';
return (0, remote_1.renderRemoteRank)(accountId, remoteP, renderOpts);
}
if (platform == types_1.Platform.BL) {
const { scores, userInfo } = await api.BeatLeader.getPlayerScoresWithUserInfo(accountId);
return (0, result_1.renderBLPlayerImg)(renderOpts.puppeteer, scores, userInfo, renderOpts.onRenderStart, renderOpts.onRenderError);
}
const { scores, userInfo } = await api.ScoreSaber.getPlayerRecentScoreWithUserInfo(accountId);
return (0, result_1.renderSSPlayerImg)(renderOpts.puppeteer, scores, userInfo, renderOpts.onRenderStart, renderOpts.onRenderError);
};
this._renderScore = async (scoreId, platform, api, renderOpts) => {
let remoteP = 'beat-leader';
if (renderOpts.type == 'remote') {
let remoteP = platform == types_1.Platform.SS ? 'score-saber' : 'beat-leader';
return (0, remote_1.renderRemoteScore)(scoreId, remoteP, renderOpts);
}
const { score, statistic, bsor, bsMap } = await api.BeatLeader
.withRetry(3)
.onRetry((times, e) => {
console.log(`retrying ${times} due to ${e}`);
})
.getScoreAndBSMapByScoreId(scoreId)
.catch(e => {
throw Error('渲染错误');
});
const qrcodeUrl = await (0, qrcode_1.default)(`https://replay.beatleader.xyz/?scoreId=${score.id}`);
return (0, result_1.renderBLScoreImg)(renderOpts.puppeteer, score, bsMap, statistic, bsor, qrcodeUrl, renderOpts.onRenderStart, renderOpts.onRenderError);
};
this._renderMap = async (bsMap, renderOpts) => {
if (renderOpts.type == 'remote') {
for (let i = 0; i < 3; i++) {
const image = await (0, remote_1.renderRemoteMap)(bsMap.id, renderOpts);
if (image) {
return image;
}
}
}
const previewQrUrl = await (0, qrcode_1.default)(`https://allpoland.github.io/ArcViewer/?id=${bsMap.id}`);
const bsMapQrUrl = await (0, qrcode_1.default)(`https://beatsaver.com/maps/${bsMap.id}`);
return await (0, result_1.renderBSMapImg)(renderOpts.puppeteer, bsMap, bsMapQrUrl, previewQrUrl, renderOpts.onRenderStart, renderOpts.onRenderError);
};
this.puppeteer = ctx.puppeteer;
this.config = config;
this.api = api;
this.baseConfig = {
puppeteer: this.puppeteer,
renderBaseURL: this.config.remoteRenderURL,
waitTimeout: this.config.rankWaitTimeout,
};
}
static create(ctx, config, api) {
// let ins = new RenderService(ctx,config,api)
// const proxied = new Proxy<RenderService>(ins, {
// get(target, prop, receiver) {
// const member = target[prop];
// if(member) {
// return createProxiedAPIService(member)
// }
// return undefined
// },
// set(target, property, value, receiver) {
// return false
// }
// })
// return proxied
return new RenderService(ctx, config, api);
}
async renderRank(accountId, platform, onRenderStart, onRenderError, type = this.config.renderMode) {
return this._renderRank(accountId, platform, this.api, { ...this.baseConfig, type, onRenderError, onRenderStart });
}
async renderScore(scoreId, platform, onRenderStart, onRenderError, type = this.config.renderMode) {
return this._renderScore(scoreId, platform, this.api, { ...this.baseConfig, type, onRenderError, onRenderStart });
}
async renderMapById(mapId, onRenderStart, onRenderError, type = this.config.renderMode) {
const map = await this.api.BeatSaver.searchMapById(mapId);
return this._renderMap(map, { ...this.baseConfig, type, onRenderError, onRenderStart });
}
async renderMap(map, onRenderStart = noop, onRenderError = noop, type = this.config.renderMode) {
return this._renderMap(map, { ...this.baseConfig, type, onRenderError, onRenderStart });
}
async renderLBScore() {
return (0, renderImg_1.screenshotTmp)(this.puppeteer, 'https://aiobs.ktlab.io/tmp/lb/score', '#render-result', () => { }, 8000);
}
async renderLBHitCount() {
return (0, renderImg_1.screenshotTmp)(this.puppeteer, 'https://aiobs.ktlab.io/tmp/lb/hitcnt', '#render-result', () => { }, 8000);
}
}
exports.RenderService = RenderService;
class RenderHelper {
constructor() { }
onStart(func) {
this._onStart = func;
return this;
}
onRenderError(func) {
this._onRenderError = func;
return this;
}
}