337 lines
9.8 KiB
TypeScript
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)); |