HJ_Server/src/api_s2c/event/huangqijiuguan/fun.ts
2024-01-10 18:23:42 +08:00

337 lines
9.8 KiB
TypeScript

import { ApiCall } from "tsrpc"
import { ReqAddHuoDong } from "../../../monopoly/protocols/PtlAddHuoDong"
import { HuoDongFun } from "../../../public/huodongfun"
import { PublicShared } from "../../../shared/public/public"
import { EmailFun } from "../../../public/email"
// hddata.data
export interface Data {
show: 1
task: {
[k: `day${number}`]: {
[k: string]: { pval: number, stype: string, cond: string[], tiaozhuan: number, prize: atn[], des: string }
}
}
huobi: atn // 抽卡货币
boss: {
img: string
npcId: number
}
// boss排行邮件
bossRank_des: string
bossRank_title: string
// boss挑战等级奖励邮
bossLvReward_des: string
bossLvReward_title: string
chouka: { a: string, t: string, n: number, p: number, gailv: number, cishu: number }[]
choukajiangli: { num: number, prize?: any[], dlz: { [k: string]: atn } }[]
baodi: { num: number, prize: any[] }[]
gift: { id: number, free: boolean, payId: string, buynum: number, prize: atn[] }[]
duihuan: { id: number, need: atn[], prize: atn[], buyNum: number }[]
bossLvReward: { lv: number, need: number, prize: atn[] }[]
bossTask: { id: number, need: number, prize: atn[] }[]
bossRank: { id: string, rank: [number, number], prize: atn[] }
}
export interface PlayerData {
// 招募数据
zhaomu: {
// 招募次数
num: number
// 次数奖励领取记录
prize: number[]
};
// 任务计数
task: {
rec: { [k: `day${number}`]: number[] }
val: { [k: `day${number}`]: { [id: string]: number } }
},
// 礼包购买记录
giftbuy: { [id: string]: { num: number, select: number[] } }
// 兑换次数记录
duihuan: { [id: string]: number }
// boss挑战数据
bossres: {
// 历史最大伤害
maxdps: number
// 今日最大伤害
todaydps: {
[k: string]: number
}
// 今日奖励领取记录
recdpstask: number[]
}
// 最后修改数据时间
lasttime: number
}
export default class HQJGFun {
static get htype() {
return 15
};
static rankkey(hdid: number) {
return `rank:huangqijiuguan_${hdid}`
}
/** 默认数据 */
static get defaultData() {
return {
zhaomu: {
num: 0,
prize: []
},
task: {
val: {},
rec: {}
},
giftbuy: {},
duihuan: {},
bossres: {
maxdps: 0,
zhanli: 0,
todaydps: {},
recdpstask: []
},
lasttime: 0
}
}
static today(hdinfo: ReqAddHuoDong) {
/**
* 获取活动开启到第几天 从1开始
*/
return PublicShared.getDiff(hdinfo.stime, G.time)
}
/**
* 获取排行榜
*/
static async getRankList(hdid: number) {
let uids = await G.mongodb.collection("event").find(
{ type: this.dataType(hdid) },
{
sort: { "bossres.maxdps": -1, "bossres.zhanli": -1 },
projection: { uid: 1, bossres: 1 }
}
).limit(50).toArray();
let userinfo = await G.mongodb.collection('user').find(
{ uid: { $in: uids.map(v => v.uid) } },
).toArray();
let res = [];
for (let rank = 1; rank <= uids.length; rank++) {
let uid = uids[rank - 1].uid;
let user = userinfo.find(v => v.uid == uid);
if (user) {
res.push({ rank, ...user, valArr: [uids[rank - 1].bossres.maxdps] });
}
}
return res
}
/** 数据类型 */
static dataType(hdid: number) {
return `huangqijiuguan_${hdid}` as `huangqijiuguan_${number}`
}
/** 获取活动数据 */
static async HdInfo(call: ApiCall, hdid?: number): Promise<ReqAddHuoDong & { data: Data }> {
if (!hdid) {
let hdlist = await HuoDongFun.gethdList(
call, this.htype
);
return hdlist.length > 0 ? hdlist[0] : null
} else {
return await HuoDongFun.getHdidInfo(call, hdid) as any as ReqAddHuoDong & { data: Data }
}
}
/** 获取我的数据 */
static async getMydata(call: ApiCall, hdid?: number) {
if (!hdid) {
hdid = (await HQJGFun.HdInfo(call)).hdid;
}
let data = await G.mongodb.cEvent(this.dataType(hdid)).findOne({
uid: call.uid, type: this.dataType(hdid)
}, { projection: { _id: 0 } });
if (!data) {
data = (await G.mongodb.cEvent(this.dataType(hdid)).findOneAndUpdate({
uid: call.uid, type: this.dataType(hdid)
}, {
$set: this.defaultData
}, { upsert: true, returnDocument: 'after', projection: { _id: 0 } })).value;
}
return data
}
/** 设置我的数据 */
static async setMyData(uid: string, hdid: number, update: { [k in keyof Partial<PlayerData>]: PlayerData[k] }) {
if (!update.lasttime) {
update.lasttime = G.time;
}
let res = await G.mongodb.cEvent(this.dataType(hdid)).updateOne(
{ uid: uid, type: this.dataType(hdid) }, { $set: update }
);
if (res.upsertedCount <= 0) {
await G.mongodb.cEvent(this.dataType(hdid)).updateOne(
{ uid: uid, type: this.dataType(hdid) }, { $set: Object.assign(this.defaultData, update) }
);
}
}
static async buy(call: ApiCall, payId: string) {
let hddata = await this.HdInfo(call);
if (!hddata) { // 活动不存在
return
}
let mydata = await this.getMydata(call);
await this.setMyData(call.uid, (await this.HdInfo(call)).hdid, mydata);
}
/**
* 每日伤害等级奖励结算
*/
static async dayDpsLvPrize(time: number) {
console.log(
"黄旗酒馆 每日伤害等级奖励结算 开始执行。。。"
)
// 取stime小于当前时间的最后一条数据
let hdinfo = await G.mongodb.collection("hdinfo").find({
htype: this.htype, stime: { $lte: time }
}, { sort: { stime: -1 } }).limit(1).toArray();
// 没有活动数
if (hdinfo.length <= 0) {
return
}
let hd = hdinfo[0];
let hdid = hdinfo[0].hdid;
// 活动结束
if (hd.etime < G.time - 300) {
return
}
let today = PublicShared.getDiff(hd.stime, G.time - 300);
G.mongodb.collection("event").find({ type: `huangqijiuguan_${hdid}` }).toArray().then(datas => {
let hddata = hd.data as Data;
for (let i = 0; i < datas.length; i++) {
let data = datas[i];
let lvprize: { lv: number; need?: number; prize?: atn[] };
let dps = data.bossres.todaydps[today] || 0;
for (let lvinfo of hddata.bossLvReward) {
if (dps < lvinfo.need) {
continue;
}
if (!lvprize || lvprize.lv < lvinfo.lv) {
lvprize = lvinfo;
}
}
if (!lvprize) continue
let title = hddata.bossLvReward_title;
let content = hddata.bossLvReward_des;
EmailFun.addEmail({
uid: data.uid,
title: title,
type: "system",
content: content,
prize: lvprize.prize,
contentInsertArr: [lvprize.lv],
})
}
console.log(
"黄旗酒馆 每日伤害等级奖励结算 执行完成!!!"
)
})
}
/**
* 最大伤害排行奖励结算
*/
static async endDpsRankPrize(time: number) {
console.log(
"黄旗酒馆 最大伤害排行奖励结算 开始执行。。。"
)
let today = PublicShared.getToDayZeroTime(time + 300);
let yesterday = PublicShared.getToDayZeroTime(time - 300);
// 查询昨天23:59:00或者今天00:00:00结束的活动
let hdinfo = await G.mongodb.collection("hdinfo").find({
htype: this.htype, rtime: { $gt: yesterday, $lte: today }
}).toArray();
// 没有活动数
if (hdinfo.length <= 0) {
return
}
let hd = hdinfo[0];
let hdid = hdinfo[0].hdid;
if (hd.data.sendrank) {
return
}
let uids = await G.mongodb.collection("event").find(
{ type: this.dataType(hdid) },
{
sort: { "bossres.maxdps": -1, "bossres.zhanli": -1 },
projection: { uid: 1, bossres: 1 }
}
).toArray();
for (let rank = 1; rank <= uids.length; rank++) {
let con = hd.data.bossRank.filter(
(x: { rank: number[] }) => rank >= x.rank[0] && rank <= x.rank[1]
)[0];
if (!con) continue;
// 发送排名奖励
await EmailFun.addEmail({
uid: uids[rank - 1].uid,
title: hd.data.bossRank_title,
type: "system",
content: hd.data.bossRank_des,
prize: con.prize,
contentInsertArr: [rank],
})
}
// 标记已发送
await G.mongodb.collection("hdinfo").updateOne(
{ hdid: hdid }, { $set: { "data.sendrank": true } }
);
console.log(
"黄旗酒馆 最大伤害排行奖励结算 执行结束!!!"
)
}
}
G.on("NEW_DAY", HQJGFun.dayDpsLvPrize.bind(HQJGFun));
G.on("NEW_DAY", HQJGFun.endDpsRankPrize.bind(HQJGFun));