import { Application, BackendSession, HandlerService, } from 'pinus'; import { resResult, splitString } from '../../../pubUtils/util'; import { ACTIVITY_RESOURCES_TYPE, CURRENCY_BY_TYPE, STATUS, CURRENCY_TYPE, 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 { ActivityModel, ActivityModelType } from '../../../db/Activity'; import { ActivityPopUpShopModel, ActivityPopUpShopModelType } from '../../../db/ActivityPopUpShop'; import { PopUpShopData } from '../../../domain/activityField/popUpShopField'; import { addReward, stringToConsumeParam, stringToRewardParam } from '../../../services/activity/giftPackageService'; import { RewardParam } from '../../../domain/activityField/rewardField'; import { handleCost } from '../../../services/role/rewardService'; import moment = require('moment'); import { getActivitiesByType, getActivityById, pushActivities } from '../../../services/activity/activityService'; import { setInterval } from 'timers'; import { sendMessageToUser, 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 ) { 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 = 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 debugPushPopUpShop(msg: { conditionType: number, magicWord: string, param: number }, 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: 0, newLv: param||100, quality: param||3, warId: param||128, score: 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); } }