diff --git a/.gitignore b/.gitignore index c1b085f..98d22b9 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,5 @@ /node_modules /.idea -/.vscode /dist /doc diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..aea870d --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,50 @@ +{ + // 使用 IntelliSense 了解相关属性。 + // 悬停以查看现有属性的描述。 + // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "消息服", + "type": "node", + "request": "launch", + "args": [ + "${workspaceRoot}/src/index.ts", + "-serverType", + "msg", + "-logModel", + "debug" + ], + "runtimeArgs": [ + "--nolazy", + "-r", + "ts-node/register" + ], + "sourceMaps": true, + "cwd": "${workspaceRoot}", + "console": "integratedTerminal", + "internalConsoleOptions": "neverOpen" + }, + { + "name": "跨服", + "type": "node", + "request": "launch", + "args": [ + "${workspaceRoot}/src/index.ts", + "-serverType", + "cross", + "-logModel", + "debug" + ], + "runtimeArgs": [ + "--nolazy", + "-r", + "ts-node/register" + ], + "sourceMaps": true, + "cwd": "${workspaceRoot}", + "console": "integratedTerminal", + "internalConsoleOptions": "neverOpen" + } + ] +} \ No newline at end of file diff --git a/src/public/pay.ts b/src/public/pay.ts index 1a812d0..96451e1 100644 --- a/src/public/pay.ts +++ b/src/public/pay.ts @@ -206,19 +206,20 @@ export class PayFun { payArgs: payArgs, orderNo: orderNo } - if (payId.indexOf('zixuanlibao') != -1) { - // 后端唯一标识 htype 4 自选/定制 礼包 - // @ts-ignore - let _hdList = await HuoDongFun.gethdList(call, 4) - _hdList.forEach(ele => { - let selectPrize = ele.data.gift.find(v => v.payId == payId)?.prize; - if (prize) { - let index = payArgs instanceof Array ? payArgs : []; - let select = selectPrize.map((v, i) => v[index[i]] ? v[index[i]] : v[0]); - prize.push(...select); - } - }) - } + //改为统一方法,此处自选不这样用 + // if (payId.indexOf('zixuanlibao') != -1) { + // // 后端唯一标识 htype 4 自选/定制 礼包 + // // @ts-ignore + // let _hdList = await HuoDongFun.gethdList(call, 4) + // _hdList.forEach(ele => { + // let selectPrize = ele.data.gift.find(v => v.payId == payId)?.prize; + // if (prize) { + // let index = payArgs instanceof Array ? payArgs : []; + // let select = selectPrize.map((v, i) => v[index[i]] ? v[index[i]] : v[0]); + // prize.push(...select); + // } + // }) + // } if (payId.indexOf('ycmb') != -1) { // @ts-ignore // 养成活动充值礼包 let _hdids = await YangChengMuBiaofun.getCon(call); @@ -235,11 +236,26 @@ export class PayFun { let conf = await zmlbGetConf(call, {payId}) prize.push(...conf.prize) } + + /** + * todo 不要轻易改动这个方法,不允许集成业务逻辑在内部 + * todo 此方法仅仅是支付成功后的发奖 + * todo 如果有业务逻辑通过事件驱动,在支付成功后emit事件 + * todo 下面这个方法不应该这样写 + */ //圣诞节活动充值 - try{ + try { await Christmasfun.payChristmas(payId, call); - }catch (e) { - console.log("Christmasfun.payChristmas Error",e); + } catch (e) { + console.log("Christmasfun.payChristmas Error", e); + } + + if (payArgs.selectPrize) { + let selectPrize = await G.ioredis.get(`pay:${payId}:${player.uid}`); + if (selectPrize) { + prize.push(...JSON.parse(selectPrize)) + G.ioredis.del(`pay:${payId}:${player.uid}`) + } } let isReplaceConf = await this.checkBuysAfterPay(uid, payId, conf, payArgs, player) @@ -399,6 +415,31 @@ export class PayFun { if (conf.time != -1 && buyLog.slice(-1)[0]?.eTime > G.time && conf.buys == 0 && payId.indexOf('wkdlibao') == -1) { return G.server.sendMsgByUid(player.uid, 'msg_s2c/PayResult', {code: -2}); } + + /** + * 活动相关的自选礼包,目前htype 4、14支持此方法 + * payArgs里传相应参数,selectList选择的奖励列表 + * 往后所有自选类型,走这个方法,配置格式同4、14 + */ + if (payArgs.htype && payArgs.selectList) { + // @ts-ignore + let _hdInfo = (await HuoDongFun.gethdList(call, payArgs.htype))[0] + // 活动类购买不符合条件返回-5 + if (!_hdInfo) G.server.sendMsgByUid(player.uid, 'msg_s2c/PayResult', {code: -5}) + let giftInfo = _hdInfo.data.gift.find(v => v.payId == payId); + if (!giftInfo) G.server.sendMsgByUid(player.uid, 'msg_s2c/PayResult', {code: -5}) + + let dlzPrize = R.flatten(giftInfo.dlz.map(i => R.values(i))) + let selectPrize = payArgs.selectList.map(v => { + let sPrize = dlzPrize.find(o => o.a == v.a && o.t == v.t && o.n == v.n) + // 严格判断,自选奖励不存在奖励列表,返回-6 + if (!sPrize) return G.server.sendMsgByUid(player.uid, 'msg_s2c/PayResult', {code: -6}); + return sPrize + }) + // 自选奖励过判断后,存入redis,6小时内支付有效 todo 6小时可能有些长 + G.ioredis.setex(`pay:${payId}:${player.uid}`, 21600, JSON.stringify(selectPrize)); + } + //针对每日礼包的单独处理 let zeroTime = PublicShared.getToDayZeroTime(G.time) if (payId.indexOf('136Gift') != -1 && payId != '136GiftAll') { @@ -455,6 +496,7 @@ export class PayFun { /** * 当玩家购买过有时间期效性的礼包 并且在生效期内每天有邮件奖励时 每天首次登陆时根据时间补发邮件 玩家每天首次登陆会进入检查 + * @param player * @param lastTime 上一次登陆时间 * @param curTime 每日首次登陆时间 */