Files
ZYZ/game-server/app/servers/activity/handler/popUpShopHandler.ts
2026-03-13 01:38:40 +00:00

199 lines
8.5 KiB
TypeScript

import { Application, BackendSession, HandlerService, } from 'pinus';
import { resResult, } from '@pubUtils/util';
import { STATUS, ITEM_CHANGE_REASON, POP_UP_SHOP_CONDITION_TYPE, ACTIVITY_TYPE, DEBUG_MAGIC_WORD, PUSH_ROUTE, } from '../../../consts';
import { checkPopUpCondition, getPopUpShopData, getPopUpShopDataShow } from '../../../services/activity/popUpShopService';
import { ActivityPopUpShopModel } from '@db/ActivityPopUpShop';
import { addReward, stringToConsumeParam, stringToRewardParam } from '../../../services/activity/giftPackageService';
import { RewardParam } from '@domain/activityField/rewardField';
import { handleCost } from '../../../services/role/rewardService';
import { setInterval } from 'timers';
import { sendMessageToUserWithSuc } from '../../../services/pushService';
export default function (app: Application) {
new HandlerService(app, {});
return new PopUpShopHandler(app);
}
export class PopUpShopHandler {
constructor(private app: Application) {
}
/************************弹出式商店****************************/
/**
* @description 获取弹出式商店数据
* @param {{ }} msg
* @param {{ activityId: number}} msg
* @param {BackendSession} session
* @memberof PopUpShopHandler
*/
async getPopUpShopActivity(msg: { activityId: number }, session: BackendSession) {
const { activityId } = msg;
const roleId = session.get('roleId');
const serverId = session.get('serverId');
let playerData = await getPopUpShopDataShow(activityId, serverId, roleId)
if (!playerData) return resResult(STATUS.ACTIVITY_THIRTY_DAYS_END);
return resResult(STATUS.SUCCESS, { playerData });
}
async checkPopUpCondition(msg: { conditionType: number }, session: BackendSession) {
const roleId = session.get('roleId');
const serverId = session.get('serverId');
let { conditionType } = msg;
if(
conditionType != POP_UP_SHOP_CONDITION_TYPE.GACHA_RES_NOT_ENOUGH &&
conditionType != POP_UP_SHOP_CONDITION_TYPE.TERAPH_RES_NOT_ENOUGH &&
conditionType != POP_UP_SHOP_CONDITION_TYPE.STONE_NOT_ENOUGH &&
conditionType != POP_UP_SHOP_CONDITION_TYPE.EQUIP_STAR_NOT_ENOUGH &&
conditionType != POP_UP_SHOP_CONDITION_TYPE.FAVOR_NOT_ENOUGH &&
conditionType != POP_UP_SHOP_CONDITION_TYPE.EXP_NOT_ENOUGH
) {
return resResult(STATUS.WRONG_PARMS);
}
await checkPopUpCondition(serverId, roleId, conditionType, {});
return resResult(STATUS.SUCCESS);
}
/**
* @description 购买礼包
* @param {{ activityId: number, id: number, beginTimeStamp: number}} msg
* @param {BackendSession} session
* @memberof PopUpShopHandler
*/
async buyGift(msg: { activityId: number, id: number, code: string }, session: BackendSession) {
const { activityId, code, id } = msg;
const roleId = session.get('roleId');
const serverId = session.get('serverId');
const sid = session.get('sid');
const roleName = session.get('roleName');
let playerData = await getPopUpShopData(activityId, serverId, roleId);
if (!playerData) {
return resResult(STATUS.ACTIVITY_MISSING);
}
if (playerData.type !== ACTIVITY_TYPE.POP_UP_SHOP) {
return resResult(STATUS.ACTIVITY_TYPE_ERROR);
}
let record = await ActivityPopUpShopModel.findByCode(serverId, activityId, roleId, code);
if(!record) return resResult(STATUS.ACTIVITY_TASK_NOT_COMPLETE);
let pkg = playerData.findPackageById(record.id);
let item = pkg?.findItemById(id);
if(!item) {
return resResult(STATUS.ACTIVITY_MISSING);
}
if(item.productID) {
return resResult(STATUS.ACTIVITY_POP_UP_MUST_BUY);
}
let consume = stringToConsumeParam(item.consume);
let consumeResult = await handleCost(roleId, sid, consume, ITEM_CHANGE_REASON.POP_UP_BUY_GIFT);
if(!consumeResult) return resResult(STATUS.ROLE_MATERIAL_NOT_ENOUGH);
record = await ActivityPopUpShopModel.addRecordById(serverId, activityId, roleId, code, id);
let showItem = playerData.updateRecordById(record, id);
let rewardParamArr: Array<RewardParam> = stringToRewardParam(item.reward);
let result = await addReward(roleId, roleName, sid, serverId, rewardParamArr, ITEM_CHANGE_REASON.POP_UP_BUY_GIFT)
return resResult(STATUS.SUCCESS, {
...result, param: { activityId, id },
item: showItem
});
}
// 客户端展示弹出礼包的通知
async showGift(msg: { code: string }, session: BackendSession) {
const { code } = msg;
let rec = await ActivityPopUpShopModel.show(code);
if (!rec) return resResult(STATUS.ACTIVITY_MISSING);
return resResult(STATUS.SUCCESS);
}
async debugPushPopUpShop(msg: { conditionType: number, magicWord: string, param: number, needDelete: boolean }, session: BackendSession) {
const roleId = session.get('roleId');
let serverId = session.get('serverId');
const { magicWord, conditionType, param } = msg;
if (magicWord !== DEBUG_MAGIC_WORD) {
return resResult(STATUS.TOKEN_ERR);
}
// let activities = await getActivitiesByType(serverId, ACTIVITY_TYPE.POP_UP_SHOP);
// for(let { activityId } of activities) {
// let playerData = await getPopUpShopData(activityId, serverId, roleId);
// for(let pkg of playerData.packages) {
// if(pkg.conditionType == conditionType) {
// await ActivityPopUpShopModel.deleteMany({ roleId, activityId, id: pkg.id });
// }
// }
// }
let arr = await checkPopUpCondition(serverId, roleId, conditionType, {
oldLv: param? param - 1: 0,
newLv: param||100,
quality: param||3,
warId: param||128,
seasonWinNum: param||10,
equipStar: param||10
});
return resResult(STATUS.SUCCESS, { activities:arr });
}
private interval: NodeJS.Timer;
private pushId = 0;
async debugPushPopUpInterval(msg: { magicWord: string }, session: BackendSession) {
const roleId = session.get('roleId');
let sid = session.get('sid');
const { magicWord } = msg;
if (magicWord !== DEBUG_MAGIC_WORD) {
return resResult(STATUS.TOKEN_ERR);
}
if(this.interval) {
clearInterval(this.interval);
}
let fun = async () => {
await sendMessageToUserWithSuc(roleId, PUSH_ROUTE.ACTIVITY_UPDATE, {
activities: [{
activityId: 25,
activityType: 24,
param: { popUpShopItems: [
{"code":"eefXmwD2","packageId":5,"endTime":Date.now() + 60000,"id":1,"name":"超值第一章通关礼包","price":6,"productID":"com.bantu.sgzzyz.yb34-20","consume":"&","reward":"2&11002&20|2&22001&2|2&31001&10000","rebate":1000,"buyCnt":1,"hasBoughtCnt":0},
{"code":"eefXmwD2","packageId":5,"endTime":Date.now() + 60000,"id":2,"name":"超值第一章通关礼包","price":30,"productID":"com.bantu.sgzzyz.yb34-21","consume":"&","reward":"2&11002&40|2&22001&10|2&31001&20000","rebate":850,"buyCnt":1,"hasBoughtCnt":0},
{"code":"eefXmwD2","packageId":5,"endTime":Date.now() + 60000,"id":3,"name":"超值第一章通关礼包","price":68,"productID":"com.bantu.sgzzyz.yb34-22","consume":"&","reward":"2&11003&20|2&22001&25|2&31001&40000","rebate":950,"buyCnt":1,"hasBoughtCnt":0}
]},
}],
pushId: ++this.pushId
}, sid);
};
await fun();
this.interval = setInterval(fun, 60000)
return resResult(STATUS.SUCCESS);
}
async debugStopPupUpInterval(msg: { magicWord: string }, session: BackendSession) {
const { magicWord } = msg;
if (magicWord !== DEBUG_MAGIC_WORD) {
return resResult(STATUS.TOKEN_ERR);
}
if(this.interval) {
clearInterval(this.interval);
}
this.pushId = 0;
return resResult(STATUS.SUCCESS);
}
}