diff --git a/src/path_20231215.ts b/src/path_20231215.ts new file mode 100644 index 0000000..3775b04 --- /dev/null +++ b/src/path_20231215.ts @@ -0,0 +1,649 @@ +import {ctor} from '../../../heijiao/server/src/global'; +import {initMongoDB} from '../../../heijiao/server/src/setMongodb'; +import {EmailFun} from "../../../heijiao/server/src/public/email"; + + +// 首冲 +async function shouChongReSet() { + let shouchong = { + "shouchong1": { + "paynum": 6, + "cartoon": { + "hero": 5001 + }, + "prize": [ + [ + { + "a": "hero", + "t": "5001", + "n": 1 + }, + { + "a": "attr", + "t": "jinbi", + "n": 100000 + } + ], + [ + { + "a": "item", + "t": "12", + "n": 200 + }, + { + "a": "attr", + "t": "jinbi", + "n": 200000 + } + ], + [ + { + "a": "item", + "t": "12", + "n": 200 + }, + { + "a": "attr", + "t": "jinbi", + "n": 300000 + } + ] + ] + }, + "shouchong2": { + "paynum": 30, + "cartoon": { + "img": 5001 + }, + "prize": [ + [ + { + "a": "equip", + "t": "1009", + "n": 1 + }, + { + "a": "equip", + "t": "2009", + "n": 1 + } + ], + [ + { + "a": "equip", + "t": "3009", + "n": 1 + }, + { + "a": "item", + "t": "2", + "n": 1000 + } + ], + [ + { + "a": "equip", + "t": "4009", + "n": 1 + }, + { + "a": "item", + "t": "2", + "n": 1000 + } + ] + ] + }, + "shouchong3": { + "paynum": 98, + "cartoon": { + "hero": 5002 + }, + "prize": [ + [ + { + "a": "hero", + "t": "5002", + "n": 1 + }, + { + "a": "item", + "t": "4", + "n": 10 + } + ], + [ + { + "a": "equip", + "t": "1010", + "n": 1 + }, + { + "a": "item", + "t": "2", + "n": 2000 + } + ], + [ + { + "a": "equip", + "t": "3010", + "n": 1 + }, + { + "a": "item", + "t": "2", + "n": 2000 + } + ] + ] + } + }; + let users = await G.mongodb.collection("user").find({}, { + projection: {uid: 1, payExp: 1} + }).toArray(); + + for (let i = 0; i < users.length; i++) { + let user = users[i]; + let data = await G.mongodb.cEvent("shouchong").findOne({uid: user.uid}); + + let send_prize = []; + for (let key in shouchong) { + // 充值不足 + if (user.payExp < shouchong[key]["paynum"] * 10) { + continue + } + + // 奖励已经领取完毕 + if (data && data.receive[key] && data.receive[key].length >= shouchong[key]["prize"].length) { + continue + } + + // 补发未领取奖励 + for (let i = 0; i < shouchong[key]["prize"].length; i++) { + if (data.receive[key][i]) { + continue + } + data.receive[key][i] = G.time; + send_prize.concat(shouchong[key]["prize"][i]); + } + } + if (send_prize.length <= 0) continue; + + let title = "首充未领取奖励补发"; + let content = "首充未领取奖励补发"; + + // 发放邮件 + await EmailFun.addEmail({ + uid: user.uid, + type: "system", + title: title, + content: content, + prize: send_prize, + }); + // 设置奖励发放记录 + await G.mongodb.cEvent("shouchong").updateOne({ + uid: user.uid + }, {"$set": {receive: data.receive, patch: 1}}); + } +} + + +/*超值月卡、至尊月卡、永久卡的线上玩家脚本 +线上已购买超值月卡的玩家,脚本补发:招募卡*30 +线上已购买至尊月卡的玩家,脚本补发:钻石*10000 +线上已购买永久卡的玩家,脚本补发:汉塞尔*1,能量饮料*500w +* */ +async function yuekaSendPrize() { + let w = { + key: {$in: ["chaozhiyueka", "zhizunyueka", "zhongshenka"]}, + del_time: {$exists: false} + }; + let users = (await G.mongodb.collection("payLogNew").find(w).toArray()).filter( + // 过滤没有结束时间 或者 有结束时间 但是没有过期的 + (pay) => pay.values?.length > 0 && (!pay.values.slice(-1)[0].eTime || pay.values.slice(-1)[0].eTime > G.time) + ); + + let uid2Prize: { [uid: string]: { a: string, t: string, n: number }[] } = {}; + users.forEach(user => { + let uid = user.uid; + let proId = user.key; + if (!uid2Prize[uid]) uid2Prize[uid] = []; + + switch (proId) { + case "chaozhiyueka": + uid2Prize[uid].push({a: "item", t: "4", n: 30}); + break; + case "zhizunyueka": + uid2Prize[uid].push({a: "attr", t: "rmbmoney", n: 10000}) + break; + case "zhongshenka": + uid2Prize[uid].push({a: "item", t: "1", n: 5000000}) + uid2Prize[uid].push({a: "hero", t: "4012", n: 1}) + break; + } + }); + + let title = "月卡奖励发放"; + let content = "月卡奖励发放"; + for (const [uid, sendPrize] of Object.entries(uid2Prize)) { + // 发放邮件 + await EmailFun.addEmail({ + uid: uid, + type: "system", + title: title, + content: content, + prize: sendPrize, + }); + + // 处理重复执行 + await G.mongodb.collection("payLogNew").updateMany( + Object.assign({uid: uid}, w), {$set: {patch: 1, del_time: G.time}} + ) + } +} + + +/*特权礼包脚本需求 +1、特权内容:已购买特权的玩家,特权效果更新 +2、已购买情报特权的玩家,脚本补发:钻石*680,顶级紫色套装*1 +3、已购买快速特权的玩家,脚本补发:钻石*300,快速探险券*30 +4、已购买财富特权的玩家,脚本补发:钻石*300,美金*1000万 +5、已购买酒馆特权的玩家,脚本补发:钻石*680,招募卡*10 +* */ +async function tequanLiBaoSendPrize() { + let w = { + key: {$in: ["qingbaotequan", "zuozhantequan", "caifutequan", "jiubatequan"]}, + del_time: {$exists: false} + }; + let users = (await G.mongodb.collection("payLogNew").find(w).toArray()).filter( + // 过滤没有结束时间 或者 有结束时间 但是没有过期的 + (pay) => pay.values?.length > 0 && (!pay.values.slice(-1)[0].eTime || pay.values.slice(-1)[0].eTime > G.time) + ); + + let uid2Prize: { [uid: string]: { a: string, t: string, n: number }[] } = {}; + users.forEach(user => { + let uid = user.uid; + let proId = user.key; + + if (!uid2Prize[uid]) uid2Prize[uid] = []; + switch (proId) { + case "qingbaotequan": + uid2Prize[uid].push({"a": "attr", "t": "rmbmoney", "n": 680}); + uid2Prize[uid].push({"a": "item", "t": "609", "n": 1}); + break; + case "zuozhantequan": + uid2Prize[uid].push({"a": "attr", "t": "rmbmoney", "n": 300}); + uid2Prize[uid].push({"a": "item", "t": "24", "n": 30}); + break; + case "caifutequan": + uid2Prize[uid].push({"a": "attr", "t": "rmbmoney", "n": 300}) + uid2Prize[uid].push({"a": "attr", "t": "jinbi", "n": 10000000}) + break; + case "jiubatequan": + uid2Prize[uid].push({"a": "attr", "t": "rmbmoney", "n": 680}); + uid2Prize[uid].push({"a": "item", "t": "4", "n": 10}); + break; + } + }); + + let title = "特权奖励发放"; + let content = "特权奖励发放"; + for (const [uid, sendPrize] of Object.entries(uid2Prize)) { + // 发放邮件 + await EmailFun.addEmail({ + uid: uid, + type: "system", + title: title, + content: content, + prize: sendPrize, + }); + await G.mongodb.collection("payLogNew").updateMany( + Object.assign({uid: uid}, w), {$set: {patch: 1, del_time: G.time}} + ) + } +} + + +/* +刷新所有玩家各档位VIP礼包到未购买状态 +* */ +async function resetVipLiBao() { + let w = {"type": "chongzhi"}; + await G.mongodb.collection("playerInfo").updateMany(w, {"giftBy": {}}); +} + + +/* +人才计划调整 +1、线上已有该活动的玩家,保留次数进度;达到新加档位可领取的奖励则直接领取 +2、线上已购买该活动328计费点的玩家,每次购买记录补发招募卡*20,; +3、线上已购买该活动648计费点的玩家,每次购买记录补发招募卡*40,; +* */ +async function rcjhReSet() { + let proId328 = ["ycmb_1_5", "ycmb_2_4", "ycmb_3_5", "ycmb_4_5", "ycmb_5_5"]; + let proId648 = ["ycmb_1_6", "ycmb_2_5", "ycmb_3_6", "ycmb_4_6", "ycmb_5_6"]; + let w = { + key: {$in: [].concat(proId328, proId648)}, + del_time: {$exists: false} + }; + let users = (await G.mongodb.collection("payLogNew").find(w).toArray()).filter( + // 过滤没有结束时间 或者 有结束时间 但是没有过期的 + (pay) => pay.values?.length > 0 && (!pay.values.slice(-1)[0].eTime || pay.values.slice(-1)[0].eTime > G.time) + ); + + + let uid2Prize: { [uid: string]: { a: string, t: string, n: number }[] } = {}; + users.forEach(user => { + let uid = user.uid; + let proId = user.key; + + if (!uid2Prize[uid]) { + uid2Prize[uid] = [] + } + if (proId328.includes(proId)) { + uid2Prize[uid].push({"a": "item", "t": "4", "n": 20}) + } else if (proId648.includes(proId)) { + uid2Prize[uid].push({"a": "item", "t": "4", "n": 40}) + } + }); + + let title = "人才计划奖励发放"; + let content = "人才计划奖励发放"; + for (const [uid, sendPrize] of Object.entries(uid2Prize)) { + // 发放邮件 + await EmailFun.addEmail({ + uid: uid, + type: "system", + title: title, + content: content, + prize: sendPrize, + }); + await G.mongodb.collection("payLogNew").updateMany( + Object.assign({uid: uid}, w), {$set: {patch: 1, del_time: G.time}} + ) + } +} + + +/*等级基金调整 +1、已购买等级基金的玩家且未领取完成的玩家,剩余奖励邮件一次性补发; +2、未购买的玩家活动刷新到新版本; +3、刷新等级基金到未购买状态; +* */ +async function dengjiJiJinReSet() { + let w = {key: "dengjijijin", del_time: {$exists: false}} + // 激活了的玩家 + let _payList = (await G.mongodb.collection("payLogNew").find(w).toArray()).filter( + // 过滤没有结束时间 或者 有结束时间 但是没有过期的 + (pay) => pay.values?.length > 0 && (!pay.values.slice(-1)[0].eTime || pay.values.slice(-1)[0].eTime > G.time) + ); + + let title = "等级基金未领取奖励发放"; + let content = "等级基金未领取奖励发放"; + let prizeList = G.gc.jijin["dengjijijin"]; + let _users = await G.mongodb.cEvent("dengjijijin").find( + {"uid": {"$in": _payList.map(pay => pay.uid)}} + ).toArray() + + let uid2Prize: { [uid: string]: { a: string, t: string, n: number }[] } = {}; + _users.forEach((user) => { + let uid = user.uid; + let idx2Type2Bool = user.rec; + if (!uid2Prize[uid]) uid2Prize[uid] = []; + + // 没领的全发 + prizeList.forEach((con, idx) => { + // 普通奖励没领 + if (!idx2Type2Bool[idx]?.pt) { + uid2Prize[uid].push(...con.pt) + } + // 高级奖励没领 + if (!idx2Type2Bool[idx]?.tq) { + uid2Prize[uid].push(...con.pt) + } + }); + }) + + for (const [uid, sendPrize] of Object.entries(uid2Prize)) { + // 发放邮件 + await EmailFun.addEmail({ + uid: uid, + type: "system", + title: title, + content: content, + prize: sendPrize, + }); + await G.mongodb.collection("payLogNew").updateMany( + Object.assign({uid: uid}, w), {$set: {patch: 1, del_time: G.time}} + ) + // 基金数据清除 + await G.mongodb.collection("event").updateMany( + {type: "dengjijijin", uid: uid}, {"$set": {uid: `${uid}_patch_del`}} + ); + } +} + + +/*关卡基金调整 +1、已购买关卡基金的玩家且未领取完成的玩家,剩余奖励邮件一次性补发; +2、未购买的玩家活动刷新到新版本; +3、刷新关卡基金到未购买状态; +* */ +async function guanqiaJiJinReSet() { + let w = {key: "guanqiajijin"}; + // 激活了的玩家 + let _payList = (await G.mongodb.collection("payLogNew").find(w).toArray()).filter( + // 过滤没有结束时间 或者 有结束时间 但是没有过期的 + (pay) => pay.values?.length > 0 && (!pay.values.slice(-1)[0].eTime || pay.values.slice(-1)[0].eTime > G.time) + ); + + let title = "关卡基金未领取奖励发放"; + let content = "关卡基金未领取奖励发放"; + let prizeList = G.gc.jijin["guanqiajijin"]; + + // 没激活不处理 + let _users = await G.mongodb.cEvent("guanqiajijin").find( + { + "uid": {"$in": _payList.map(pay => pay.uid)} + }, + {projection: {_id: 0}} + ).toArray(); + + let uid2Prize: { [uid: string]: { a: string, t: string, n: number }[] } = {}; + _users.forEach(user => { + let uid = user.uid; + let idx2Type2Bool = user.rec; + if (!uid2Prize[uid]) uid2Prize[uid] = []; + + // 没领的全发 + prizeList.forEach((con, idx) => { + // 普通奖励没领 + if (!idx2Type2Bool[idx]?.pt) { + uid2Prize[uid].push(...con.pt) + } + // 高级奖励没领 + if (!idx2Type2Bool[idx]?.tq) { + uid2Prize[uid].push(...con.tq) + } + }); + }) + + for (const [uid, sendPrize] of Object.entries(uid2Prize)) { + // 发放邮件 + await EmailFun.addEmail({ + uid: uid, + type: "system", + title: title, + content: content, + prize: sendPrize, + }); + await G.mongodb.collection("payLogNew").updateMany( + Object.assign({uid: uid}, w), {$set: {patch: 1, del_time: G.time}} + ) + // 基金数据清除 + await G.mongodb.collection("event").updateMany( + {type: "guanqiajijin", uid: uid}, {"$set": {uid: `${uid}_patch_del`}} + ); + } +} + + +/*通行证基金调整 +1、已购买通行证基金的玩家且未领取完成的玩家,剩余奖励邮件一次性补发; +2、未购买的玩家活动刷新到新版本; +3、刷新通行证基金到未购买状态; +* */ +async function dayjiJiJinReSet() { + let w = {key: "dayjijin"}; + + // 激活了的玩家 + let _payList = (await G.mongodb.collection("payLogNew").find(w).toArray()).filter( + // 过滤没有结束时间 或者 有结束时间 但是没有过期的 + (pay) => pay.values?.length > 0 && (!pay.values.slice(-1)[0].eTime || pay.values.slice(-1)[0].eTime > G.time) + ); + + let title = "通行证基金未领取奖励发放"; + let content = "通行证基金未领取奖励发放"; + let prizeList = G.gc.jijin["dayjijin"]; + // 没激活不处理 + let _users = await G.mongodb.cEvent("dayjijin").find( + {uid: {$in: _payList.map(pay => pay.uid)}} + ).toArray(); + + let uid2Prize: { [uid: string]: { a: string, t: string, n: number }[] } = {}; + _users.forEach(user => { + let uid = user.uid; + let idx2Type2Bool = user.rec; + if (!uid2Prize[uid]) uid2Prize[uid] = []; + + // 没领的全发 + prizeList.forEach((con, idx) => { + // 普通奖励没领 + if (!idx2Type2Bool[idx]?.pt) { + uid2Prize[uid].push(...con.pt) + } + // 高级奖励没领 + if (!idx2Type2Bool[idx]?.tq) { + uid2Prize[uid].push(...con.tq) + } + }); + }) + + for (const [uid, sendPrize] of Object.entries(uid2Prize)) { + // 发放邮件 + await EmailFun.addEmail({ + uid: uid, + type: "system", + title: title, + content: content, + prize: sendPrize, + }); + await G.mongodb.collection("payLogNew").updateMany( + Object.assign({uid: uid}, w), {$set: {patch: 1, del_time: G.time}} + ) + // 基金数据清除 + await G.mongodb.collection("event").updateMany( + {type: "dayjijin", uid: uid}, {"$set": {uid: `${uid}_patch_del`}} + ); + } +} + +/*月基金调整 +1、已购买128、328月基金的玩家且未领取完成的玩家,剩余奖励邮件一次性补发; +2、未购买的玩家活动刷新到新版本; +3、刷新月基金到未购买状态; +* */ +async function yueJiJinReSet() { + let proIdList = [ + "128jijin", + "328jijin", + ]; + let w = {key: {$in: proIdList}}; + // 激活了的玩家 + let _payList = (await G.mongodb.collection("payLogNew").find(w).toArray()).filter( + // 过滤没有结束时间 或者 有结束时间 但是没有过期的 + (pay) => pay.values?.length > 0 && (!pay.values.slice(-1)[0].eTime || pay.values.slice(-1)[0].eTime > G.time) + ); + + // 没激活不处理 + let _users = await G.mongodb.collection("event").find( + { + "type": {"$in": proIdList}, + "uid": {"$in": _payList.map(pay => pay.uid)} + } + ).toArray(); + + let uid2Prize: { [uid: string]: { a: string, t: string, n: number }[] } = {}; + let prizeList128 = G.gc.yuedujijin.find(v => v.payId == "128jijin"); + let prizeList328 = G.gc.yuedujijin.find(v => v.payId == "328jijin"); + _users.forEach(user => { + let uid = user.uid; + let gotarr = user.rec; + if (!uid2Prize[uid]) uid2Prize[uid] = []; + + let prizeList = user.type == "128jijin" ? prizeList128.prize : prizeList328.prize; + // 没领的全发 + prizeList.forEach((onePrize, idx) => { + // 领过了 + if (gotarr.includes(idx)) { + return + } + uid2Prize[uid].push(onePrize) + }); + }) + + let title = "月度基金未领取奖励发放"; + let content = "月度基金未领取奖励发放"; + for (const [uid, sendPrize] of Object.entries(uid2Prize)) { + // 发放邮件 + await EmailFun.addEmail({ + uid: uid, + type: "system", + title: title, + content: content, + prize: sendPrize, + }); + + await G.mongodb.collection("payLogNew").updateMany( + Object.assign({uid: uid}, w), {$set: {patch: 1, del_time: G.time}} + ) + // 基金数据清除 + await G.mongodb.collection("event").updateMany( + {type: {$in: proIdList}, uid: uid}, {"$set": {uid: `${uid}_patch_del`}} + ); + } +} + +async function start() { + //连接mongodb + await initMongoDB(); + + // 首冲调整 + await shouChongReSet(); + // 超值月卡、至尊月卡、永久卡的线上玩家脚本 + await yuekaSendPrize(); + // 特权礼包脚本需求 + await tequanLiBaoSendPrize(); + // 刷新所有玩家各档位VIP礼包到未购买状态 + await resetVipLiBao(); + // 人才计划调整 + await rcjhReSet(); + // 等级基金调整 + await dengjiJiJinReSet(); + // 关卡基金调整 + await guanqiaJiJinReSet(); + // 通行证基金调整 + await dayjiJiJinReSet(); + // 月基金调整 + await yueJiJinReSet(); +} + +//定义全局变量 +ctor(); +//启动服务 +start().then(() => { + process.exit() +}); + +