184 lines
5.1 KiB
TypeScript
184 lines
5.1 KiB
TypeScript
import { Server } from '@/qqbot/plugins/bangDream/tsugu/models/server';
|
||
import { Event } from '@/qqbot/plugins/bangDream/tsugu/models/event';
|
||
import { BangDreamEventStatus } from '@/qqbot/plugins/bangDream/tsugu/models/bangdream-constants';
|
||
import {
|
||
cutoffEventTopRepository,
|
||
type CutoffEventTopPoint,
|
||
type CutoffEventTopUser,
|
||
} from '@/qqbot/plugins/bangDream/tsugu/models/cutoff-event-top-repository';
|
||
|
||
export class CutoffEventTop {
|
||
eventId: number;
|
||
server: Server;
|
||
startAt: number;
|
||
endAt: number;
|
||
status: BangDreamEventStatus;
|
||
isInitfull: boolean = false;
|
||
isExist = false;
|
||
points: CutoffEventTopPoint[];
|
||
users: CutoffEventTopUser[];
|
||
/**
|
||
* 构造 CutoffEventTop 实例,并初始化该模型的本地基础字段。
|
||
*
|
||
* @param eventId - 活动 ID。
|
||
* @param server - 目标服务器。
|
||
*/
|
||
constructor(eventId: number, server: Server) {
|
||
const event = new Event(eventId);
|
||
if (!event.isExist) {
|
||
this.isExist = false;
|
||
return;
|
||
}
|
||
this.eventId = eventId;
|
||
this.server = server;
|
||
this.isExist = true;
|
||
this.startAt = event.startAt[server];
|
||
this.endAt = event.endAt[server];
|
||
const time = new Date().getTime();
|
||
if (time < event.startAt[this.server]) {
|
||
this.status = BangDreamEventStatus.notStart;
|
||
} else if (time > event.endAt[this.server]) {
|
||
this.status = BangDreamEventStatus.ended;
|
||
} else {
|
||
this.status = BangDreamEventStatus.inProgress;
|
||
}
|
||
}
|
||
/**
|
||
* 在 CutoffEventTop 模型中加载远端完整详情并标记初始化状态。
|
||
*/
|
||
async initFull() {
|
||
if (!this.isExist) {
|
||
return;
|
||
}
|
||
if (this.isInitfull) {
|
||
return;
|
||
}
|
||
const topData = await cutoffEventTopRepository.getTopData(
|
||
this.eventId,
|
||
this.server,
|
||
);
|
||
if (topData == undefined) {
|
||
this.isExist = false;
|
||
return;
|
||
}
|
||
this.isExist = true;
|
||
this.points = topData.points;
|
||
this.users = topData.users;
|
||
if (this.points.length == 0 || this.users.length == 0) {
|
||
//如果没有数据,返回不存在
|
||
this.isExist = false;
|
||
return;
|
||
}
|
||
const latestRanking = this.getLatestRanking();
|
||
for (let i = 0; i < this.users.length; i++) {
|
||
for (let j = 0; j < latestRanking.length; j++) {
|
||
if (this.users[i].uid == latestRanking[j].uid) {
|
||
this.users[i].ranking = j + 1;
|
||
this.users[i].currentPt = latestRanking[j].point;
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
/**
|
||
* 在 CutoffEventTop 模型中获取谱面数据。
|
||
*
|
||
* @param setStartToZero - setStartToZero参数,未传入时使用默认值。
|
||
* @returns 计算后的数值。
|
||
*/
|
||
getChartData(setStartToZero = false): {
|
||
[key: number]: { x: Date; y: number }[];
|
||
} {
|
||
if (this.isExist == false) {
|
||
return;
|
||
}
|
||
const chartDate: { [key: number]: { x: Date; y: number }[] } = {};
|
||
for (let i = 0; i < this.points.length; i++) {
|
||
const element = this.points[i];
|
||
if (!(element.uid in chartDate)) {
|
||
chartDate[element.uid] = [];
|
||
if (setStartToZero) {
|
||
chartDate[element.uid].push({ x: new Date(0), y: 0 });
|
||
chartDate[element.uid].push({
|
||
x: new Date(element.time - this.startAt),
|
||
y: element.value,
|
||
});
|
||
} else {
|
||
chartDate[element.uid].push({ x: new Date(this.startAt), y: 0 });
|
||
chartDate[element.uid].push({
|
||
x: new Date(element.time),
|
||
y: element.value,
|
||
});
|
||
}
|
||
} else {
|
||
if (setStartToZero) {
|
||
chartDate[element.uid].push({
|
||
x: new Date(element.time - this.startAt),
|
||
y: element.value,
|
||
});
|
||
} else {
|
||
chartDate[element.uid].push({
|
||
x: new Date(element.time),
|
||
y: element.value,
|
||
});
|
||
}
|
||
}
|
||
}
|
||
return chartDate;
|
||
}
|
||
/**
|
||
* 在 CutoffEventTop 模型中获取LatestRanking。
|
||
*
|
||
* @returns 计算后的数值。
|
||
*/
|
||
getLatestRanking(): { uid: number; point: number }[] {
|
||
const result: { uid: number; point: number }[] = [];
|
||
let index = this.points.length - 10;
|
||
while (index < this.points.length) {
|
||
const element = this.points[index];
|
||
result.push({ uid: element.uid, point: element.value });
|
||
index++;
|
||
}
|
||
result.sort((a, b) => b.point - a.point);
|
||
return result;
|
||
}
|
||
/**
|
||
* 在 CutoffEventTop 模型中获取UserByUid。
|
||
*
|
||
* @param id - 业务实体 ID。
|
||
* @returns 格式化后的文本。
|
||
*/
|
||
getUserByUid(id: number): {
|
||
uid: number;
|
||
name: string;
|
||
introduction: string;
|
||
rank: number;
|
||
sid: number;
|
||
strained: number;
|
||
degrees: number[];
|
||
ranking: number;
|
||
currentPt: number;
|
||
} {
|
||
for (let i = 0; i < this.users.length; i++) {
|
||
if (this.users[i].uid == id) {
|
||
return this.users[i];
|
||
}
|
||
}
|
||
return;
|
||
}
|
||
/**
|
||
* 在 CutoffEventTop 模型中获取User名称ByID。
|
||
*
|
||
* @param id - 业务实体 ID。
|
||
* @returns 格式化后的文本。
|
||
*/
|
||
getUserNameById(id: number): string {
|
||
for (let i = 0; i < this.users.length; i++) {
|
||
if (this.users[i].uid == id) {
|
||
return this.users[i].name;
|
||
}
|
||
}
|
||
return;
|
||
}
|
||
}
|