plugins/iidx@asphyxia/handlers/ranking.ts
2025-09-28 23:45:40 +09:00

174 lines
4.5 KiB
TypeScript

import { expert, ranking } from "../models/ranking";
import { profile } from "../models/profile";
import { GetVersion, IDtoRef } from "../util";
export const rankingentry: EPR = async (info, data, send) => {
// pside //
const version = GetVersion(info);
const refid = await IDtoRef(Number($(data).attr().iidxid));
const coid = Number($(data).attr().coid);
const clid = Number($(data).attr().clid);
const opname = $(data).attr().opname;
const oppid = Number($(data).attr().oppid);
const pgnum = Number($(data).attr().pgnum);
const gnum = Number($(data).attr().gnum);
const opt = Number($(data).attr().opt);
const opt2 = Number($(data).attr().opt2);
const clr = Number($(data).attr().clr);
const exscore = (pgnum * 2 + gnum);
const cstage = Number($(data).attr().cstage);
const expert_data = await DB.FindOne<expert>(refid, {
collection: "expert",
version: version,
coid: coid,
});
let pgArray = Array<number>(6).fill(0); // PGREAT //
let gArray = Array<number>(6).fill(0); // GREAT //
let cArray = Array<number>(6).fill(0); // CLEAR FLAGS //
let optArray = Array<number>(6).fill(0); // USED OPTION (SP/DP) //
let opt2Array = Array<number>(6).fill(0); // USED OPTION (DP) //
let esArray = Array<number>(6).fill(0); // EXSCORE //
if (_.isNil(expert_data)) {
cArray[clid] = clr;
pgArray[clid] = pgnum;
gArray[clid] = gnum;
optArray[clid] = opt;
opt2Array[clid] = opt2;
esArray[clid] = exscore;
}
else {
cArray = expert_data.cArray;
pgArray = expert_data.pgArray;
gArray = expert_data.gArray;
optArray = expert_data.optArray;
opt2Array = expert_data.opt2Array;
esArray = expert_data.esArray;
const pExscore = esArray[clid];
if (exscore > pExscore) {
pgArray[clid] = pgnum;
gArray[clid] = gnum;
optArray[clid] = opt;
opt2Array[clid] = opt2;
esArray[clid] = exscore;
}
cArray[clid] = Math.max(cArray[clid], clr);
}
await DB.Upsert<expert>(
refid,
{
collection: "expert",
version: version,
coid: coid,
},
{
$set: {
cArray,
pgArray,
gArray,
optArray,
opt2Array,
esArray,
}
}
);
const profile = await DB.FindOne<profile>(refid, {
collection: "profile",
});
const name = profile.name;
await DB.Upsert<ranking>(
{
collection: "ranking",
version: version,
coid: coid,
clid: clid,
},
{
$set: {
pgnum: pgnum,
gnum: gnum,
name: name,
opname: opname,
pid: oppid,
udate: 0,
exscore: exscore,
maxStage: cstage,
}
}
);
let expertUser = await DB.Find<ranking>({
collection: "ranking",
version: version,
coid: coid,
clid: clid,
});
expertUser.sort((a: ranking, b: ranking) => b.exscore - a.exscore);
let rankPos = expertUser.findIndex((a: ranking) => a.name == name);
return send.object(K.ATTR({
anum: String(expertUser.length),
jun: String(rankPos + 1),
}));
};
export const rankingoentry: EPR = async (info, data, send) => {
const version = GetVersion(info);
const refid = await IDtoRef(Number($(data).attr().iidxid));
const coid = Number($(data).attr().coid);
const clid = Number($(data).attr().clid);
const pgnum = Number($(data).attr().pgnum);
const gnum = Number($(data).attr().gnum);
const opt = Number($(data).attr().opt);
const opt2 = Number($(data).attr().opt2);
const clr = Number($(data).attr().clr);
const exscore = (pgnum * 2 + gnum);
// TODO:: figure out what this does //
return send.success();
};
export const rankinggetranker: EPR = async (info, data, send) => {
const version = GetVersion(info);
const ranking = await DB.Find<ranking>({
collection: "ranking",
version: version,
coid: Number($(data).attr().coid),
clid: Number($(data).attr().clid),
});
let result = {
ranker: [],
}
if (_.isNil(ranking)) return send.success();
ranking.sort((a: ranking, b: ranking) => b.exscore - a.exscore);
ranking.forEach((res) => {
result.ranker.push(
K.ATTR({
gnum: String(res.gnum),
pgnum: String(res.pgnum),
name: res.name,
opname: res.opname,
pid: String(res.pid),
udate: String(res.udate),
})
);
});
return send.object(result);
};