402 lines
12 KiB
TypeScript
402 lines
12 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"
|
|
import { playerInfo } from "../../../shared/protocols/user/PtlLogin"
|
|
|
|
// hddata.data
|
|
export interface Data {
|
|
show: 1
|
|
task: {
|
|
[k: `day${number}`]: {
|
|
[k: string]: { pval: number, stype: number, 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[], dlz?: { [k: string]: 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 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(
|
|
"黄旗酒馆 最大伤害排行奖励结算 执行结束!!!"
|
|
)
|
|
}
|
|
|
|
/**设置任务 */
|
|
static async setTaskVal(call: ApiCall, stype: number, val: number, chkCall: Function, chkval: number = 0, isinc: number = 0, alchangeVal: Function, arg) {
|
|
// 活动过期,不计数
|
|
let hd = await this.HdInfo(call)
|
|
if (!hd) return
|
|
|
|
let today = this.today(hd);
|
|
await this.getMydata(call, hd.hdid)
|
|
|
|
let isset = 0;
|
|
let setData = {
|
|
$inc: {},
|
|
$set: {}
|
|
};
|
|
let tasks = hd.data.task[`day${today}`];
|
|
for (let taskid of Object.keys(tasks)) {
|
|
let taskCon = tasks[taskid];
|
|
if (taskCon.stype != stype) continue
|
|
|
|
// 不符合任务要求
|
|
if (!(await chkCall(taskCon["cond"], chkval, arg))) continue
|
|
|
|
// 根据需求改写
|
|
val = await alchangeVal(call, taskCon, val, arg)
|
|
|
|
isset = 1
|
|
if (isinc == 1) { // 累加
|
|
setData["$inc"][`task.val.day${today}.${taskid}`] = val
|
|
} else {
|
|
setData["$set"][`task.val.day${today}.${taskid}`] = val
|
|
}
|
|
}
|
|
|
|
// 设置任务
|
|
if (isset == 1) {
|
|
await G.mongodb.collection('event').updateOne({ uid: call.uid, type: this.dataType(hd.hdid) }, setData)
|
|
}
|
|
}
|
|
|
|
static async buy(player: playerInfo, payId: string, payArgs: any, call: ApiCall) {
|
|
let hd = await this.HdInfo(call);
|
|
|
|
if (!hd) { // 活动不存在
|
|
return
|
|
}
|
|
|
|
// 判断购买次数
|
|
let gift = hd.data.gift.filter(x => x.payId == payId)[0];
|
|
if (!gift) {
|
|
return
|
|
}
|
|
|
|
let mydata = await this.getMydata(call);
|
|
if (!mydata.giftbuy[gift.id]) {
|
|
mydata.giftbuy[gift.id] = { num: 0, select: [] };
|
|
}
|
|
|
|
let prize: atn[] = [];
|
|
if (mydata.giftbuy[gift.id].num + 1 > gift.buynum) {
|
|
let pay = G.gc.pay[payId];
|
|
prize.push({ a: "attr", t: "rmbmoney", n: pay.payExp[0].n })
|
|
} else {
|
|
prize = gift.prize;
|
|
for (let i = 0; i < gift.dlz.length; i++) {
|
|
if (!mydata.giftbuy[call.req.giftid].select[i]) {
|
|
let ids = Object.keys(gift.dlz[i])
|
|
prize.push(gift.dlz[i][ids[0]]);
|
|
mydata.giftbuy[call.req.giftid].select[i] = Number(ids[0]);
|
|
} else {
|
|
prize.push(gift.dlz[i][mydata.giftbuy.select[i]]);
|
|
}
|
|
}
|
|
}
|
|
|
|
mydata.giftbuy[gift.id].num++;
|
|
await this.setMyData(call.uid, hd.hdid, { giftbuy: mydata.giftbuy });
|
|
}
|
|
} |