965 lines
37 KiB
TypeScript
965 lines
37 KiB
TypeScript
import {ApiCall} from 'tsrpc';
|
||
import {ReqAddHuoDong} from '../../monopoly/protocols/PtlAddHuoDong';
|
||
import {ActionLog} from '../../public/actionLog/actionLog';
|
||
import {HuoDongFun} from '../../public/huodongfun';
|
||
import {PataFun} from '../../public/pata';
|
||
import {PayFun} from '../../public/pay';
|
||
import {ZhanLingTasks} from '../../public/zhanling';
|
||
import {jijinType} from '../../shared/protocols/event/jijin/PtlOpen';
|
||
import {hongdianKey, hongdianVal} from '../../shared/protocols/hongdian/PtlGet';
|
||
import {payLog} from '../../shared/protocols/pay/PtlGetList';
|
||
import {PublicShared} from '../../shared/public/public';
|
||
import {clslDb} from '../conglinshoulie/ApiOpen';
|
||
import {getVal} from '../event/jijin/ApiOpen';
|
||
import {getTaskVal} from '../event/kaifukuanghuan/ApiOpen';
|
||
import {YangChengMuBiaofun} from '../event/yangchengmubiao/fun';
|
||
import {checkIsOpen} from '../hbzb/jfs/ApiOpen';
|
||
import {PlayerShared} from "../../shared/public/player";
|
||
import {kbzzUserDb} from '../kbzz/ApiOpen';
|
||
import {PlayerFun} from "../../public/player";
|
||
import kfjsFun from "../../public/kaifujingsai";
|
||
import {RankKfjs} from "../../public/rank/rank_kfjs";
|
||
import {ShopFun} from "../../public/shop";
|
||
import {Christmasfun} from '../event/christmas/fun';
|
||
|
||
export class HongDianFun {
|
||
/**黑榜争霸红点 */
|
||
static async hbzBgetHongDian(call: ApiCall) {
|
||
let _res: hongdianVal = {
|
||
show: false
|
||
};
|
||
if (!checkIsOpen()) return _res;
|
||
let data = await G.mongodb.cPlayerInfo('hbzb').findOne({uid: call.uid, type: 'hbzb'});
|
||
let _mydata = (data && data.data && data.data.refreshTime >= PublicShared.getToDayZeroTime()) ? data.data : {
|
||
winNum: 0,
|
||
buyFightNum: 0,
|
||
useFightNum: 0,
|
||
refreshTime: G.time,
|
||
winRecPrize: [],
|
||
useRefreshNum: 0
|
||
};
|
||
if (_mydata.useFightNum < _mydata.buyFightNum + G.gc.hbzb.jfsFightNum) {
|
||
_res.show = true;
|
||
}
|
||
if (!_res.show) {
|
||
let _con = JSON.parse(JSON.stringify(G.gc.hbzb.jfsFightWinNumPrize));
|
||
for (let index = 0; index < _con.length; index++) {
|
||
const element = _con[index];
|
||
if (_mydata.winRecPrize.includes(index)) continue;
|
||
if (_mydata.winNum < element.total) continue;
|
||
_res.show = true;
|
||
break;
|
||
}
|
||
}
|
||
return _res;
|
||
}
|
||
|
||
/**丛林狩猎红点 */
|
||
static async clslgetHongDian(call: ApiCall) {
|
||
let _res: hongdianVal = {
|
||
show: false
|
||
};
|
||
let weekZeroTime = PublicShared.getToWeekMondayZeroTime();
|
||
if (G.time < weekZeroTime + G.gc.clsl_com.fightTime[0] || G.time > weekZeroTime + G.gc.clsl_com.fightTime[1]) return _res;
|
||
let _mydata = await clslDb().findOne({uid: call.uid, type: 'clsl'});
|
||
let useNum = _mydata?.useFightNum || 0;
|
||
let buyNum = _mydata?.buyFightNum || 0;
|
||
if (useNum < buyNum + G.gc.clsl_com.fightNum) {
|
||
_res.show = true;
|
||
}
|
||
|
||
if (!_res.show) {
|
||
let fightWinNum = _mydata?.fightWinNum || 0;
|
||
let _con = JSON.parse(JSON.stringify(G.gc.clsl_com.fightWinPrize));
|
||
for (let index = 0; index < _con.length; index++) {
|
||
const element = _con[index];
|
||
if (_mydata?.recWinPrize?.includes(index)) continue;
|
||
if (fightWinNum < element.total) continue;
|
||
_res.show = true;
|
||
break;
|
||
}
|
||
}
|
||
return _res;
|
||
}
|
||
|
||
/**
|
||
* 每日试炼 物资筹集 红点
|
||
* types.money 休闲区
|
||
* types.exp 物资部
|
||
* types.qhs 加工仓库
|
||
* _mydata.data.numInfo.[type].['0'] 下标‘0’原本是根据难度设定次数,改为次数共享后,取‘0’值统一计算次数
|
||
**/
|
||
static async mrslGetHongDian(call: ApiCall) {
|
||
let _res = {
|
||
show: false
|
||
};
|
||
let _mydata = await G.mongodb.cPlayerInfo('meirishilian').findOne({uid: call.uid, type: 'meirishilian'});
|
||
let types = ['money', 'exp', 'qhs'];
|
||
for (let type of types) {
|
||
let buyNum = _mydata?.data?.numInfo?.[type]?.['0']?.buyFightNum || 0;
|
||
let useNum = _mydata?.data?.numInfo?.[type]?.['0']?.useFightNum || 0;
|
||
_res.show = useNum < buyNum + (PlayerShared.getMingDaoBuff(call.conn.gud, 'wzsj_free') || 0) + G.gc.meirishilian_com.fightNum
|
||
if (_res.show) break
|
||
}
|
||
return _res;
|
||
}
|
||
|
||
/**势力争夺 红点 */
|
||
static async slzdGetHongDian(call: ApiCall) {
|
||
let _res = {
|
||
show: false
|
||
};
|
||
let db = await G.mongodb.collection('slzdUser').findOne({uid: call.uid});
|
||
|
||
let _mydata = (db && db.data && db.data.refreshTime >= PublicShared.getToDayZeroTime()) ? db.data : {
|
||
fightNum: G.gc.slzd.ctorFightNum,
|
||
winNum: 0,
|
||
winRec: []
|
||
};
|
||
if (_mydata.fightNum >= 1) {
|
||
_res.show = true;
|
||
}
|
||
|
||
if (!_res.show) {
|
||
let _con = JSON.parse(JSON.stringify(G.gc.slzd.fightWinNumPrize));
|
||
for (let index = 0; index < _con.length; index++) {
|
||
const element = _con[index];
|
||
if (_mydata.winRec.includes(index)) continue;
|
||
if (_mydata.winNum < element.total) continue;
|
||
_res.show = true;
|
||
break;
|
||
}
|
||
}
|
||
return _res;
|
||
}
|
||
|
||
/**清缴真主党 红点 */
|
||
static async qjzzdGetHongDian(call: ApiCall) {
|
||
let _res = {
|
||
show: false
|
||
};
|
||
return _res
|
||
let data = await G.mongodb.collection('scheduler').findOne({type: 'qjzzd'});
|
||
if (!data) return _res; // 功能未开放
|
||
let db = await G.mongodb.cPlayerInfo('qjzzd').findOne({uid: call.uid, type: 'qjzzd'});
|
||
|
||
let myData = (db && db.refreshTime >= data.lastRunTime) ? db : {
|
||
refreshTime: data.lastRunTime,
|
||
useFightNum: 0,
|
||
maxDps: 0
|
||
};
|
||
if (myData.useFightNum < G.gc.qjzzd.fightNum) {
|
||
_res.show = true;
|
||
}
|
||
return _res;
|
||
}
|
||
|
||
/**恐怖战争 红点 */
|
||
static async kongbuzzHongDian(call: ApiCall) {
|
||
let _res = {
|
||
show: false
|
||
};
|
||
let second = G.time - PublicShared.getToWeekMondayZeroTime();
|
||
if (second >= G.gc.kbzz.time.apply[0] && second < G.gc.kbzz.time.apply[1]) {
|
||
// 报名时间
|
||
let state = await G.mongodb.cPlayerInfo('kbzzApply').findOne({uid: call.uid, type: 'kbzzApply'});
|
||
let apply = state?.apply || false;
|
||
if (!apply) {
|
||
_res.show = true;
|
||
return _res;
|
||
}
|
||
} else {
|
||
let dbData = await kbzzUserDb().findOne({uid: call.uid, type: 'kbzzUser'});
|
||
let myData = dbData ? dbData : {
|
||
score: G.gc.kbzz.playerScore,
|
||
recScorePrize: [],
|
||
toDayScore: 0,
|
||
fightNum: G.gc.kbzz.fightNum
|
||
};
|
||
let conf = G.gc.kbzz.scorePrize;
|
||
for (let index = 0; index < conf.length; index++) {
|
||
const element = conf[index];
|
||
if (myData.recScorePrize.includes(index)) continue;
|
||
if (myData.toDayScore < element.total) continue;
|
||
_res.show = true;
|
||
break;
|
||
}
|
||
}
|
||
return _res;
|
||
}
|
||
|
||
/**斩草除根(爬塔) 红点 */
|
||
static async pataHongDian(call: ApiCall) {
|
||
let _res = {
|
||
show: false,
|
||
val: {
|
||
shopItems: {
|
||
show: false
|
||
},
|
||
saodang: {
|
||
show: false
|
||
},
|
||
reward: {
|
||
show: false
|
||
}
|
||
}
|
||
};
|
||
let _conf = G.gc.patacom;
|
||
let _conList = Object.keys(_conf).sort((a, b) => Number(a) - Number(b));
|
||
let _myData = await PataFun.getInfo(call.uid);
|
||
for (let index = 0; index < _conList.length; index++) {
|
||
const element = Number(_conList[index]);
|
||
// 未通关 已经经过排序,可以直接 break
|
||
if (_myData.lv <= element) break
|
||
/**已经领取 */
|
||
if (_myData.gotarr.indexOf(element) != -1) continue
|
||
_res.show = true
|
||
_res.val.reward.show = true
|
||
}
|
||
// 扫荡判断
|
||
let max = G.gc.com.pata_saodang.value + (PlayerShared.getMingDaoBuff(call.conn.gud, "zccg_sd") || 0);
|
||
let prize = G.gc.pata[_myData.lv - 1]?.sdprize;
|
||
_res.val.saodang.show = max - (_myData.saodangNum || 0) > 0 && !!prize
|
||
_res.show = _res.show || _res.val.saodang.show
|
||
// 商店判断
|
||
// 个人爬塔商店购买情况
|
||
// let shopData = await G.redis.get('shop', call.uid, '7'); // 商店编号7,未理清商店id存放的数据表,后续该出尽量改为数据库读取
|
||
|
||
// 12.12策划确定爬塔id7的商店移除,此处商店不再需要红点
|
||
// let shopData = await ShopFun.getShopData(call.uid, "7")
|
||
// if (shopData) {
|
||
// let {buyNum, shopItems} = shopData
|
||
// // 获取爬塔商店商品
|
||
// for (let index in shopItems) {
|
||
// let x = shopItems[index]
|
||
// if (x.needZCCG > 0 && x.needZCCG < _myData.lv && (buyNum && !buyNum[index])) {
|
||
// // 验证是否达到购买条件
|
||
// let isOk = await (await PlayerFun.checkNeedIsMeet(call, x.buyNeed, false)).isOk
|
||
// if (isOk) {
|
||
// _res.show = true
|
||
// _res.val.shopItems.show = true
|
||
// }
|
||
// }
|
||
// }
|
||
// }
|
||
return _res;
|
||
}
|
||
|
||
/**名望免费礼包及特权领取 红点 */
|
||
static async renownHongDian(call: ApiCall) {
|
||
let _res = {
|
||
show: false
|
||
};
|
||
let _conf = G.gc.mw_com.gift
|
||
let _myData = await G.mongodb.collection('playerInfo', 'juewei').findOne({uid: call.conn.uid, type: 'juewei'});
|
||
// 无数据,有免费礼包
|
||
if (!_myData) {
|
||
_res.show = true
|
||
return _res
|
||
}
|
||
|
||
for (let index = 0; index < _conf.length; index++) {
|
||
const element = _conf[index];
|
||
if (index == 0 && PublicShared.getToDayZeroTime(_myData.tequan.recTime || 0) == PublicShared.getToDayZeroTime(G.time)) {
|
||
// 特权红点
|
||
let buyLog = await PayFun.getPayLog(call.uid, element.payId);
|
||
if (buyLog.length > 0) {
|
||
_res.show = true
|
||
return _res
|
||
}
|
||
}
|
||
|
||
// 不是免费
|
||
if (element.payId) continue
|
||
|
||
/**已经领取最大次数 */
|
||
if ((_myData.record?.[index] || 0) >= element.buyNum) continue
|
||
_res.show = true
|
||
break
|
||
}
|
||
return _res;
|
||
}
|
||
|
||
/**开服竞赛 */
|
||
static async kaifujingsai(call: ApiCall): Promise<hongdianVal> {
|
||
let status = kfjsFun.getStatus()
|
||
// 超过活动显示时间后,不查询直接返回false
|
||
if (status.type < 1 && PublicShared.getOpenServerDay() > R.values(G.gc.kfcb_content).slice(-1)[0].showDay[1] + 1) return {show: false}
|
||
let data = await G.mongodb.cEvent('kaifujingsai').findOne({uid: call.uid, type: 'kaifujingsai'})
|
||
let canGet = {}
|
||
for (let i = 1; i <= 7; i++) {
|
||
let prize = kfjsFun.getStatus(i)
|
||
if (PublicShared.getOpenServerDay() <= prize.conf.showDay[1]) continue
|
||
let rankKfjs = new RankKfjs(i)
|
||
let myRank = await rankKfjs.getRankSortByOne(call.uid)
|
||
if (prize.type > 0 && !data?.record?.[i] && myRank >= 0) {
|
||
canGet[i] = true
|
||
}
|
||
}
|
||
|
||
if (R.values(canGet).length == 0) return {show: false}
|
||
return {show: true, val: canGet}
|
||
}
|
||
|
||
/**周末礼包 */
|
||
static async zhoumolibao(call: ApiCall): Promise<hongdianVal> {
|
||
let _hd = (await HuoDongFun.gethdList(call, 9))[0]
|
||
let gift = _hd?.data?.gift?.find(i => i.free)
|
||
if (!gift) return {show: false}
|
||
|
||
let data = await G.mongodb.cEvent('zhoumolibao').findOne({uid: call.uid, type: 'zhoumolibao'})
|
||
let rec = data?.record?.[gift.id]
|
||
if (rec && rec >= gift?.buyNum) return {show: false}
|
||
return {show: true}
|
||
}
|
||
|
||
}
|
||
|
||
|
||
export class HuoDongHongDianFun {
|
||
/**所有可支持后台活动 红点 */
|
||
static async houtaihdHongDian(call: ApiCall) {
|
||
let _res = {
|
||
show: false,
|
||
val: {
|
||
hdid: [],
|
||
htype: [],
|
||
hdxq: {}
|
||
}
|
||
};
|
||
let _hdList = []
|
||
for (let i = 0; i < 8; i++) {
|
||
_hdList.push(...await HuoDongFun.gethdList(call, i + 1))
|
||
}
|
||
// let _hdList = await HuoDongFun.gethdList(call)
|
||
for (let index = 0; index < _hdList.length; index++) {
|
||
const element = _hdList[index];
|
||
let ishd: hongdianVal = {show: false}
|
||
if (element.htype == 1) {
|
||
// 检测 htype 1 养成目标活动红点
|
||
ishd = await this.yangchengmubiaoHongDian(call, element)
|
||
}
|
||
|
||
if (element.htype == 2) {
|
||
// 检测 htype 2 掉落兑换活动红点
|
||
ishd = await this.diaoluoduihuanHongDian(call, element)
|
||
}
|
||
|
||
if (element.htype == 3) {
|
||
// 检测 htype 3 传说之路活动红点
|
||
ishd = await this.chuanshuozhiluHongDian(call, element)
|
||
}
|
||
|
||
if (element.htype == 4) {
|
||
// 检测 htype 4 自选礼包活动红点
|
||
ishd = await this.zixuanlibaoHongDian(call, element)
|
||
}
|
||
|
||
if (element.htype == 5) {
|
||
// 检测 htype 5 累计充值活动红点
|
||
ishd = await this.leijichongzhiHongDian(call, element)
|
||
}
|
||
|
||
if (element.htype == 6) {
|
||
// 检测 htype 6 七日登录活动红点
|
||
ishd = await this.qiridengluHongDian(call, element)
|
||
}
|
||
if (element.htype == 8) {
|
||
// 检测 htype 8 圣诞活动红点
|
||
ishd = await this.christmasHongDian(call, element)
|
||
}
|
||
|
||
// 此活动有红点
|
||
if (ishd.show) {
|
||
_res.show = true
|
||
_res.val.hdid.push(element.hdid)
|
||
if (_res.val.htype.indexOf(element.htype) == -1) _res.val.htype.push(element.htype)
|
||
_res.val.hdxq[element.hdid] = ishd
|
||
}
|
||
}
|
||
return _res;
|
||
}
|
||
|
||
/**开服狂欢红点 */
|
||
static async kfkhHongDian(call: ApiCall) {
|
||
let _res: hongdianVal = {
|
||
show: false
|
||
};
|
||
let [isOpen, tips] = PublicShared.getOpenCond(call, "kaifukuanghuan")
|
||
if (!isOpen) return _res;
|
||
|
||
let db = await G.mongodb.cEvent('kaifukuanghuan').findOne({uid: call.uid, type: 'kaifukuanghuan'});
|
||
let data = db || {
|
||
receiveLogin: [],
|
||
receiveBox: [],
|
||
receiveTask: Object.fromEntries(Object.keys(G.gc.kaifukuanghuan.task).map(day => [day, []]))
|
||
};
|
||
// 登录奖励
|
||
let day = PublicShared.getOpenServerDay(call.conn.gud.cTime);
|
||
if (data.receiveLogin.length < day) _res.show = true;
|
||
|
||
// 宝箱奖励
|
||
if (!_res.show) {
|
||
let _con = G.gc.kaifukuanghuan.taskBoxPrize;
|
||
let finished = Object.values(data.receiveTask).map(fs => fs.length).reduce((a, b) => a + b);
|
||
for (let index = 0; index < _con.length; index++) {
|
||
const element = _con[index];
|
||
if (data.receiveBox.includes(index)) continue;
|
||
if (finished < element.total) continue;
|
||
_res.show = true;
|
||
}
|
||
}
|
||
|
||
// 任务奖励
|
||
if (!_res.show) {
|
||
let _taskcon = G.gc.kaifukuanghuan.task;
|
||
let tasks = Object.values(G.gc.kaifukuanghuan.task as k_v<_gcType['kaifukuanghuan']['task']['1']>).map(tasks => tasks.map(task => task.taskType)).reduce((a, b) => a.concat(b));
|
||
let taskFinished = await getTaskVal(call.conn.gud, [...new Set(tasks)]);
|
||
let _keys = Object.keys(_taskcon);
|
||
for (let index = 0; index < _keys.length; index++) {
|
||
const element = _taskcon[_keys[index]];
|
||
|
||
for (let indexTask = 0; indexTask < element.length; indexTask++) {
|
||
const _tmp = element[indexTask];
|
||
if (parseInt(_keys[index]) > day) break; // 未开放
|
||
if (data.receiveTask[_keys[index]].includes(indexTask)) continue;
|
||
// 重复领取 和 条件未满足
|
||
if (_tmp.taskType != 'jjc_rank') {
|
||
if ((taskFinished[_tmp.taskType] || 0) < _tmp.total) continue;
|
||
} else {
|
||
if ((taskFinished[_tmp.taskType] || 0) > _tmp.total) continue;
|
||
}
|
||
|
||
_res.show = true;
|
||
break;
|
||
}
|
||
|
||
if (_res.show) break;
|
||
}
|
||
}
|
||
return _res;
|
||
}
|
||
|
||
/**基金红点 */
|
||
static async jijinHongDian(call: ApiCall) {
|
||
let _res: hongdianVal = {
|
||
show: false,
|
||
val: {
|
||
keys: []
|
||
}
|
||
};
|
||
let jijintype: jijinType[] = ["dengjijijin", "guanqiajijin", "dayjijin", "tianshujijin"];
|
||
let logs = await PayFun.getPayLogs(call.uid);
|
||
for (let index = 0; index < jijintype.length; index++) {
|
||
const element = jijintype[index];
|
||
let conf = G.gc.jijin[element];
|
||
|
||
// 相关数据
|
||
let data = await G.mongodb.cEvent(element).findOne({uid: call.uid, type: element});
|
||
let rec = data?.rec || {}; // 领取数据
|
||
let val = await getVal(call, logs, element);
|
||
let payId = element == 'tianshujijin' ? 'zhongshenka' : element;
|
||
let isPay = logs?.[payId]?.length > 0;
|
||
for (let taskindex = 0; taskindex < conf.length; taskindex++) {
|
||
const elementtask = conf[taskindex];
|
||
|
||
if (val < elementtask.total) continue; // 未完成
|
||
let hasPt = elementtask.pt.length > 0;
|
||
let hasTq = elementtask.tq.length > 0;
|
||
let getPt = !hasPt || rec[taskindex]?.pt == true;
|
||
let getTq = !hasTq || rec[taskindex]?.tq == true;
|
||
|
||
if (getPt && !getTq && !isPay) continue; // 购买礼包后才可以领取奖励
|
||
if (getPt && getTq) continue; // 奖励已领取
|
||
|
||
_res.show = true;
|
||
_res.val.keys.push(element);
|
||
break;
|
||
}
|
||
// if (_res.show) break;
|
||
}
|
||
return _res;
|
||
}
|
||
|
||
/**追杀令红点 */
|
||
static async zhuishalingHongDian(call: ApiCall) {
|
||
let _res: hongdianVal = {
|
||
show: false,
|
||
val: {
|
||
"task": [],
|
||
"zhanling": 0
|
||
}
|
||
};
|
||
|
||
let [isOpen, tips] = PublicShared.getOpenCond(call, "zhanling")
|
||
if (!isOpen) return _res;
|
||
|
||
// 任务奖励
|
||
let conf = G.gc.zhanling.task;
|
||
let _mydata = await G.mongodb.cEvent('zhanling').findOne({uid: call.uid, type: 'zhanling'});
|
||
let tasks = G.gc.zhanling.task.map(t => {
|
||
return {type: t.type as 'day' | 'week' | 'round', key: t.taskId};
|
||
});
|
||
let taskFinished = await ZhanLingTasks.getLog(call.uid, tasks);
|
||
for (let index = 0; index < conf.length; index++) {
|
||
const element = conf[index];
|
||
if (element.taskId == 'tqexp' && !_mydata?.isPay) continue;
|
||
if ((_mydata?.taskRec || []).includes(index)) continue;
|
||
// let taskVal = await ActionLog.getDayLog(call.uid, element.taskId);
|
||
let _key = `${element.type}@${element.taskId}`;
|
||
let taskVal = taskFinished[_key];
|
||
if (taskVal < element.total) continue;
|
||
_res.show = true;
|
||
if (!_res.val["task"].includes(element.type)) {
|
||
_res.val["task"].push(element.type);
|
||
}
|
||
// break; 前端要求加 key
|
||
}
|
||
|
||
// 战令奖励
|
||
let rec = _mydata?.rec || {};
|
||
let val = _mydata?.lv || 0;
|
||
let isPay = _mydata?.isPay;
|
||
let _conf = G.gc.zhanling.prize;
|
||
for (let zlindex = 0; zlindex < _conf.length; zlindex++) {
|
||
const zlelement = _conf[zlindex];
|
||
if (val < zlelement.lv) continue; // 未完成
|
||
let hasPt = zlelement.pt.length > 0;
|
||
let hasTq = zlelement.tq.length > 0;
|
||
let getPt = !hasPt || rec[zlindex]?.pt == true;
|
||
let getTq = !hasTq || rec[zlindex]?.tq == true;
|
||
|
||
if (getPt && !getTq && !isPay) continue; // 购买礼包后才可以领取奖励
|
||
if (getPt && getTq) continue; // 奖励已领取
|
||
|
||
_res.show = true;
|
||
_res.val["zhanling"] = 1;
|
||
break;
|
||
}
|
||
return _res;
|
||
}
|
||
|
||
/**七日登录红点 */
|
||
static async qiridengluHongDian(call: ApiCall, hdCon: ReqAddHuoDong) {
|
||
let _res: hongdianVal = {
|
||
show: false
|
||
};
|
||
let _con = hdCon.data.arr;
|
||
let day = await ActionLog.getRetainLog(call.uid, `login_day_qiridenglu_${hdCon.hdid}`);
|
||
let _dbType: `qiridenglu${number}` = `qiridenglu${hdCon.hdid}`
|
||
let _mydata = await G.mongodb.cEvent(_dbType).findOne({uid: call.uid, type: _dbType});
|
||
for (let index = 0; index < _con.length; index++) {
|
||
const element = _con[index];
|
||
if (element.day > day) continue;
|
||
if (_mydata?.recPrize?.includes(index)) continue;
|
||
_res.show = true;
|
||
break;
|
||
}
|
||
return _res;
|
||
}
|
||
|
||
// 一百抽 子函数
|
||
static async yibaochouhd(conf, finish: number, recArr: number[]) {
|
||
let ishd: 0 | 1 = 0;
|
||
for (let index = 0; index < conf.length; index++) {
|
||
const element = conf[index];
|
||
if (finish < element.total) continue;
|
||
if (recArr.includes(index)) continue;
|
||
ishd = 1;
|
||
break;
|
||
}
|
||
return ishd;
|
||
}
|
||
|
||
/**一百抽红点 */
|
||
static async yibaichouHongDian(call: ApiCall) {
|
||
let _res: hongdianVal = {
|
||
show: false
|
||
};
|
||
let [isOpen, tips] = PublicShared.getOpenCond(call, "yibaichou")
|
||
if (!isOpen) return _res;
|
||
|
||
let _con = G.gc.yibaichou;
|
||
let _type = ['online', 'login'];
|
||
let _mydata = await G.mongodb.cEvent('yibaichou').findOne({uid: call.uid, type: 'yibaichou'});
|
||
for (let index = 0; index < _type.length; index++) {
|
||
const element = _type[index];
|
||
|
||
let conf = G.gc.yibaichou[element + 'Prize'];
|
||
let finish = element == 'login' ? call.conn.gud.loginDays : call.conn.gud.onlineTime;
|
||
let recArr: number[] = _mydata?.[element + 'Rec'] || [];
|
||
let ishd = await this.yibaochouhd(conf, finish, recArr);
|
||
if (ishd == 1) {
|
||
_res.show = true;
|
||
break;
|
||
}
|
||
}
|
||
return _res;
|
||
}
|
||
|
||
/**伙伴招募红点 */
|
||
static async huobanzhaomuHongDian(call: ApiCall) {
|
||
let _res: hongdianVal = {
|
||
show: false
|
||
};
|
||
|
||
let [isOpen, tips] = PublicShared.getOpenCond(call, "huobanzhaomu")
|
||
if (!isOpen) return _res;
|
||
|
||
let _con = G.gc.huobanzhaomu;
|
||
let _mydata = await G.mongodb.cEvent('huobanzhaomu').findOne({uid: call.uid, type: 'huobanzhaomu'});
|
||
for (let index = 0; index < _con.length; index++) {
|
||
const element = _con[index];
|
||
if (_mydata?.rec.includes(index)) continue; // 已领取
|
||
if (element.gudKey && call.conn.gud[element.gudKey] < element.total) continue; // 未达成
|
||
if (!element.gudKey && (_mydata?.rec?.length || 0) < _con.length - 1) continue; // 大奖资格不够
|
||
_res.show = true;
|
||
break;
|
||
}
|
||
return _res;
|
||
}
|
||
|
||
/**累计充值红点 */
|
||
static async leijichongzhiHongDian(call: ApiCall, hdCon: ReqAddHuoDong) {
|
||
let _res: hongdianVal = {
|
||
show: false
|
||
};
|
||
let _dbType: `leijichongzhi${number}` = `leijichongzhi${hdCon.hdid}`
|
||
let _con = hdCon.data.tasks;
|
||
let db = await G.mongodb.cEvent(_dbType).findOne({uid: call.uid, type: _dbType});
|
||
let _mydata = db || {sTime: PublicShared.getToDayZeroTime(G.time), recIndex: []};
|
||
let payNum = await PayFun.getPayDaysAllPayNum(call.uid, hdCon.stime, hdCon.rtime);
|
||
for (let index = 0; index < _con.length; index++) {
|
||
const element = _con[index];
|
||
if (_mydata.recIndex.includes(index)) continue;
|
||
if (payNum < element.total) continue;
|
||
_res.show = true;
|
||
break;
|
||
}
|
||
return _res;
|
||
}
|
||
|
||
/**七日累充红点 */
|
||
static async qirileichongHongDian(call: ApiCall) {
|
||
let _res: hongdianVal = {
|
||
show: false
|
||
};
|
||
let db = await G.mongodb.cEvent('qirichongzhi').findOne({uid: call.uid, type: 'qirichongzhi'});
|
||
let _mydata = db || {round: 0, sTime: PublicShared.getToDayZeroTime(G.time), recIndexs: []};
|
||
let _con = G.gc.qirichongzhi[_mydata.round];
|
||
let finished = await PayFun.getPayDaysAllPayNum(call.uid, _mydata.sTime, _mydata.sTime + G.gc.qirichongzhi[_mydata.round].time);
|
||
for (let index = 0; index < _con.tasks.length; index++) {
|
||
const element = _con.tasks[index];
|
||
if (_mydata.recIndexs.includes(index)) continue;
|
||
if (finished < element.total) continue;
|
||
_res.show = true;
|
||
break;
|
||
}
|
||
return _res;
|
||
}
|
||
|
||
/**节日 子函数 */
|
||
static async jieriHD(call: ApiCall, _conf, recIndex, _type, _finish: number) {
|
||
let ishd: 0 | 1 = 0;
|
||
for (let index = 0; index < _conf.length; index++) {
|
||
const element = _conf[index];
|
||
if (_type == 'task') _finish = await ActionLog.getDayLog(call.uid, element.taskId);
|
||
if (_finish < element.total) continue;
|
||
if (recIndex.includes(index)) continue;
|
||
ishd = 1;
|
||
break;
|
||
}
|
||
return ishd;
|
||
}
|
||
|
||
/**节日红点 */
|
||
static async jieriHongDian(call: ApiCall) {
|
||
let _res: hongdianVal = {
|
||
show: false
|
||
};
|
||
let db = await G.mongodb.cEvent('jierihuodong').findOne({uid: call.uid, type: 'jierihuodong'});
|
||
let _mydata = db || {refreshTime: G.time, recTask: [], recLogin: []};
|
||
let _types = ['login', 'task'];
|
||
let finish = call.conn.gud.loginDays;
|
||
for (let index = 0; index < _types.length; index++) {
|
||
const element = _types[index];
|
||
let _conf = element == 'login' ? G.gc.jierihuodong.denglufuli : G.gc.jierihuodong.huodongrenwu;
|
||
let recIndex = element == 'login' ? (_mydata?.recLogin || []) : (_mydata?.recTask || []);
|
||
let ishd = await this.jieriHD(call, _conf, recIndex, element, finish);
|
||
if (ishd == 1) {
|
||
_res.show = true;
|
||
break;
|
||
}
|
||
}
|
||
return _res;
|
||
}
|
||
|
||
/**圣诞节活动红点 */
|
||
static async christmasHongDian(call: ApiCall, hdCon: ReqAddHuoDong) {
|
||
let _res: hongdianVal = {
|
||
show: false,
|
||
};
|
||
|
||
let _hdCon = hdCon.data;
|
||
let stime = hdCon.stime
|
||
let _mydata = await Christmasfun.getMyData(call, hdCon.hdid);
|
||
let _tasks = hdCon.data.task; // 所有任务 taskid 为key
|
||
|
||
for (let indextask = 0; indextask < Object.keys(_tasks).length; indextask++) {
|
||
const elementtask = Object.keys(_tasks)[indextask];
|
||
let _tmp = _tasks[elementtask];
|
||
if (_tmp.pval <= (_mydata.taskval[elementtask] || 0) && !_mydata.taskfinish.includes(elementtask)) {
|
||
// 任务完成且没有领取
|
||
_res.show = true;
|
||
return _res;
|
||
}
|
||
}
|
||
|
||
let libaos = _hdCon.libao
|
||
for (let indexlibao = 0; indexlibao < Object.keys(libaos).length; indexlibao++) {
|
||
const elementlibao = Object.keys(libaos)[indexlibao];
|
||
let _tmp = _tasks[elementlibao];
|
||
if (_tmp.payid) continue
|
||
let _buyNum = _mydata.libao[elementlibao] || 0
|
||
if (_buyNum < _tmp.buynum) {
|
||
_res.show = true;
|
||
return _res;
|
||
}
|
||
}
|
||
let _diff = PublicShared.getDiff(stime)
|
||
// 循环判断是否有可以领取的
|
||
for (let i = 0; i < _diff; i++) {
|
||
if (_mydata.qiandao.includes(i)) continue
|
||
_res.show = true;
|
||
return _res;
|
||
}
|
||
let need = _hdCon.gameneed;
|
||
// 判断消耗是否满足
|
||
let meet = await PlayerFun.checkNeedIsMeet(call, need, false);
|
||
if (meet.isOk == true) {
|
||
_res.show = true;
|
||
return _res;
|
||
}
|
||
let zhanling = _hdCon.zhanling
|
||
for (let indexzhanling = 0; indexzhanling < zhanling.length; indexzhanling++) {
|
||
if (!_mydata.pt.includes(indexzhanling)) {
|
||
_res.show = true;
|
||
return _res;
|
||
}
|
||
if (_mydata.pay && !_mydata.gj.includes(indexzhanling)) {
|
||
_res.show = true;
|
||
return _res;
|
||
}
|
||
}
|
||
|
||
return _res;
|
||
}
|
||
|
||
|
||
/**养成目标红点 */
|
||
static async yangchengmubiaoHongDian(call: ApiCall, hdCon: ReqAddHuoDong) {
|
||
let _res: hongdianVal = {
|
||
show: false,
|
||
};
|
||
|
||
let _hdCon = hdCon.data;
|
||
let _mydata = await YangChengMuBiaofun.getMyData(call, hdCon.hdid);
|
||
|
||
let _tasks = {}; // 所有任务 taskid 为key
|
||
Object.values(_hdCon.tasklist).map(l => {
|
||
return Object.assign(_tasks, l);
|
||
});
|
||
|
||
let _ishd = 0;
|
||
for (let indextask = 0; indextask < Object.keys(_tasks).length; indextask++) {
|
||
const elementtask = Object.keys(_tasks)[indextask];
|
||
let _tmp = _tasks[elementtask];
|
||
if (_tmp.pval <= (_mydata.taskval[elementtask] || 0) && !_mydata.finishid[_tmp.type].includes(parseInt(elementtask))) {
|
||
// 任务完成且没有领取
|
||
_res.show = true;
|
||
_ishd = 1;
|
||
break;
|
||
}
|
||
}
|
||
|
||
if (_ishd != 1) {
|
||
let _gift = _hdCon.gift.filter(l => (!l.payId && l.need.length <= 0) || l.free);
|
||
for (let indexgift = 0; indexgift < _gift.length; indexgift++) {
|
||
const elementgift = _gift[indexgift];
|
||
let buyNum = _mydata.record?.[indexgift] || 0;
|
||
if (buyNum < elementgift.buyNum) {
|
||
_res.show = true;
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
return _res;
|
||
}
|
||
|
||
/**掉落兑换红点 */
|
||
static async diaoluoduihuanHongDian(call: ApiCall, hdCon: ReqAddHuoDong): Promise<hongdianVal> {
|
||
let _dbType: `diaoluoduihuan${number}` = `diaoluoduihuan${hdCon.hdid}`
|
||
// 取出用户已领取的数据
|
||
let data = await G.mongodb.cEvent(_dbType).findOne({uid: call.uid, type: _dbType})
|
||
// 循环活动商店,判断免费与领取
|
||
let confEvent = Object.keys(hdCon.data.event).filter(k => Array.isArray(hdCon.data.event[k]))
|
||
for (let key of confEvent) {
|
||
let item = hdCon.data.event[key]
|
||
for (let i in item) {
|
||
if (item[i].free && !(data && data.record && data.record[key] && data.record[key][i])) return {show: true}
|
||
}
|
||
}
|
||
return {show: false};
|
||
}
|
||
|
||
/**传说之路 */
|
||
static async chuanshuozhiluHongDian(call: ApiCall, hdCon: ReqAddHuoDong): Promise<hongdianVal> {
|
||
let _dbType: `chuanshuozhilu${number}` = `chuanshuozhilu${hdCon.hdid}`
|
||
|
||
let task = hdCon.data
|
||
let db = await G.mongodb.cEvent(_dbType).findOne({uid: call.uid, type: _dbType});
|
||
let info: Partial<typeof db.info['']> = db?.info?.[task.hid] || {};
|
||
|
||
for (let conf of task.task) {
|
||
if (info[conf.type] >= conf.total && !(info.rec || []).includes(conf.idx)) return {show: true};
|
||
}
|
||
|
||
if (info.rec?.length >= task.box.total && !info.box) return {show: true};
|
||
|
||
return {show: false};
|
||
}
|
||
|
||
/**自选礼包红点 */
|
||
static async zixuanlibaoHongDian(call: ApiCall, hdCon: ReqAddHuoDong): Promise<hongdianVal> {
|
||
let _dbType: `zixuanlibao${number}` = `zixuanlibao${hdCon.hdid}`
|
||
let db = await G.mongodb.cEvent(_dbType).findOne({uid: call.uid, type: _dbType});
|
||
if (!db?.record?.[0]) {
|
||
return {show: true}
|
||
}
|
||
|
||
return {show: false};
|
||
}
|
||
|
||
/**月度基金 */
|
||
static async yuedujijinHongDian(call: ApiCall): Promise<hongdianVal> {
|
||
let pays = 0;
|
||
let payIds = G.gc.yuedujijin.map(v => v.payId);
|
||
let obj: k_v<payLog[]> = {};
|
||
|
||
for (let id of payIds) {
|
||
let logs = obj[id] = await PayFun.getPayLog(call.uid, id);
|
||
if (logs.length > 0) pays++;
|
||
}
|
||
|
||
if (pays < 1) return {show: false};
|
||
|
||
for (let conf of G.gc.yuedujijin) {
|
||
let id = conf.payId;
|
||
let logs = obj[conf.payId];
|
||
if (logs.length < 1) continue;
|
||
let db = await G.mongodb.cEvent(id as `${number}jijin`).findOne({
|
||
uid: call.uid,
|
||
type: id as `${number}jijin`
|
||
});
|
||
let rec = db?.rec || [];
|
||
let days = db?.days || 0;
|
||
let round = db?.round || 0;
|
||
if (rec.length < days + 1 && rec.length < conf.prize.length * (round + 1)) return {show: true};
|
||
}
|
||
|
||
return {show: false};
|
||
}
|
||
|
||
/** 黑市活动 */
|
||
static async heiShihd(call: ApiCall): Promise<hongdianVal> {
|
||
let _res: hongdianVal = {
|
||
show: false,
|
||
val: {
|
||
meirijingxuan: {},
|
||
jitianhaoli: {},
|
||
niudanji: {}
|
||
}
|
||
};
|
||
_res.val.meirijingxuan = await this.heiShiHongDian(call)
|
||
// _res.val.jitianhaoli = await this.heiShiLCHongDian(call)
|
||
_res.val.niudanji = await this.heiShiNiuDanJi(call)
|
||
Object.values(_res.val).forEach(x => _res.show = _res.show || x.show)
|
||
return _res
|
||
}
|
||
|
||
/**黑市 每日精选 */
|
||
static async heiShiHongDian(call: ApiCall): Promise<hongdianVal> {
|
||
let payKey = "136Gift1"
|
||
let _res: hongdianVal = {
|
||
show: false,
|
||
val: {stask: []}
|
||
};
|
||
let db = await G.mongodb.cEvent('136Gift').findOne({uid: call.uid, type: '136Gift'});
|
||
let payData = await PayFun.getPayLogs(call.uid)
|
||
let payLen = (payData[payKey] || []).length
|
||
let isBuy = !(!payLen || payData[payKey][payLen - 1].eTime < G.time)
|
||
let _myData = (db && db.refreshTime >= PublicShared.getToDayZeroTime() && db.recIndex) ? db.recIndex : [];
|
||
let _con = G.gc["dixiaheishi"]['136Gift'];
|
||
for (let index = 1; index < _con.length; index++) {
|
||
const element = _con[index];
|
||
// if (element.payId && !isBuy) {
|
||
if (element.payId && !isBuy) {
|
||
continue;
|
||
}
|
||
if (_myData.includes(index)) {
|
||
continue;
|
||
}
|
||
_res.val.stask.push(index)
|
||
if (index > 1 && !_res.val.stask.includes(0)) _res.val.stask.push(0)
|
||
_res.show = true
|
||
}
|
||
return _res;
|
||
}
|
||
|
||
/**黑市 积天豪礼 */
|
||
// static async heiShiLCHongDian(call: ApiCall): Promise<hongdianVal> {
|
||
// let _res: hongdianVal = {
|
||
// show: false
|
||
// };
|
||
// let db = await G.mongodb.cEvent('15leichong').findOne({uid: call.uid, type: '15leichong'});
|
||
//
|
||
// if (!db) return _res;
|
||
//
|
||
// let _con = G.gc.shiwuleichong.data[db.index];
|
||
// let payDay = await PayFun.getPayDaysBuyPayNum(call.uid, db.sTime, db.sTime + _con.time, G.gc.shiwuleichong.dayPayNeed);
|
||
// for (let index = 0; index < _con.tasks.length; index++) {
|
||
// const element = _con.tasks[index];
|
||
// if (db.recIndex.includes(index)) continue;
|
||
// if (payDay < element.total) continue;
|
||
// _res.show = true;
|
||
// break;
|
||
// }
|
||
// return _res;
|
||
// }
|
||
|
||
/**黑市 扭蛋机 */
|
||
static async heiShiNiuDanJi(call: ApiCall): Promise<hongdianVal> {
|
||
// 查询配置,获取等级限制
|
||
let openCondConf = G.gc.openCond['hs_btn_ndj']
|
||
let _res: hongdianVal = {
|
||
show: false
|
||
};
|
||
// 等级不满足,上锁,不查询红点。
|
||
if (call.conn.gud.lv < openCondConf.display.lv) return _res
|
||
let db = await G.mongodb.cEvent('niudanji').findOne({uid: call.uid, type: 'niudanji'});
|
||
let useNum = db?.useNum || 0
|
||
let hasNum = Math.floor(call.conn.gud.payExp / G.gc.niudanji.pay2num)
|
||
_res.show = useNum < hasNum
|
||
return _res
|
||
}
|
||
}
|
||
|
||
|
||
export class HongDianChange {
|
||
/**红点 change */
|
||
static async sendChangeKey(uid: string, key: hongdianKey[]) {
|
||
G.server.sendMsgByUid(uid, 'msg_s2c/HongDianChange', key);
|
||
}
|
||
}
|
||
|