Merge branch 'feature/pushgift' into dev

# Conflicts:
#	src/shared/protocols/serviceProto.ts
This commit is contained in:
dy 2023-12-20 14:50:58 +08:00
commit 47ebe4fe14
12 changed files with 718 additions and 414 deletions

View File

@ -9,6 +9,7 @@ import {ReqLottery, ResLottery} from "../../shared/protocols/jiuba/PtlLottery";
import {PublicShared} from '../../shared/public/public'; import {PublicShared} from '../../shared/public/public';
import {HongDianChange} from '../hongdian/fun'; import {HongDianChange} from '../hongdian/fun';
import {RankKfjs} from "../../public/rank/rank_kfjs"; import {RankKfjs} from "../../public/rank/rank_kfjs";
import {PushGiftFun} from "../../public/pushgift";
export default async function (call: ApiCall<ReqLottery, ResLottery>) { export default async function (call: ApiCall<ReqLottery, ResLottery>) {
@ -142,4 +143,8 @@ export default async function (call: ApiCall<ReqLottery, ResLottery>) {
valArr: [await rankKfjs.getRankScore(call.uid) + call.req.type] valArr: [await rankKfjs.getRankScore(call.uid) + call.req.type]
}); });
// 十连抽推送礼包
if (call.req.type == 10) {
PushGiftFun.chkRecruitGift(call.uid)
}
} }

View File

@ -0,0 +1,29 @@
import {ApiCall} from "tsrpc";
import {ReqOpen, ResOpen} from "../../shared/protocols/pushgift/PtlOpen";
import {PushGiftFun} from "../../public/pushgift";
import {Gift} from "../../module/collection_pushgift";
export default async function (call: ApiCall<ReqOpen, ResOpen>) {
let res: ResOpen = {gifts: []};
// 过滤过期的礼包 和购买完毕的礼包
(await PushGiftFun.getGift(call.uid)).forEach((gift) => {
if (gift.passTime > G.time && chkBuyNum(gift.id, gift)) {
res.gifts.push(gift)
}
})
call.succ(res)
}
function chkBuyNum(gift_id: string, gift_info: Gift) {
let conf = G.gc.tuisonglibao[gift_id];
for (let i = 0; i < conf.payId.length; i++) {
let pay = G.gc.pay[conf.payId[i]];
if (pay.buys > 0 && gift_info.buy[i] < pay.buys) {
return true
}
}
return false
}

View File

@ -17,6 +17,7 @@ import { PublicShared } from './shared/public/public';
import { setGud } from './public/gud'; import { setGud } from './public/gud';
import {checkResetBuyLog} from "./api_s2c/event/zhoumolibao/ApiOpen"; import {checkResetBuyLog} from "./api_s2c/event/zhoumolibao/ApiOpen";
import {Christmasfun} from "./api_s2c/event/christmas/fun"; import {Christmasfun} from "./api_s2c/event/christmas/fun";
import {PushGiftFun} from "./public/pushgift";
export type gEventType = { export type gEventType = {
/**玩家断开连接 */ /**玩家断开连接 */
@ -196,6 +197,7 @@ export function addListener() {
{ $inc: { payNum: conf.money } }, { $inc: { payNum: conf.money } },
{ upsert: true } { upsert: true }
); );
PushGiftFun.buy(player.uid, payId) // 推送礼包
}); });
G.on("FIRST_LOGIN_EVERY_DAY", (gud, lastTime, curTime) => { G.on("FIRST_LOGIN_EVERY_DAY", (gud, lastTime, curTime) => {

View File

@ -1773,6 +1773,24 @@ type gc_yuyuemail = {
'prize': { "a": string, "t": string, "n": number, [x: string]: any }[] 'prize': { "a": string, "t": string, "n": number, [x: string]: any }[]
}; };
type gc_push_gift = {
[k: string]: {
/**礼包id*/
id: number
/**礼包类型*/
type: number
/**礼包参数*/
num: any[]
/**购买id*/
payId: string[]
/**持续时间*/
time: number
/**冷却时间*/
displayCD: number
/**显示返利比*/
scale: number
}
}
type gcType = { type gcType = {
[key: string]: any [key: string]: any
@ -1922,6 +1940,7 @@ type gcType = {
kfcb_content: gc_kfcb_content kfcb_content: gc_kfcb_content
kfcb_prize: gc_kfcb_prize kfcb_prize: gc_kfcb_prize
yuyuemail: gc_yuyuemail yuyuemail: gc_yuyuemail
tuisonglibao: gc_push_gift
} }

View File

@ -0,0 +1,13 @@
import {ObjectId} from "mongodb";
import {ResOpen} from "../shared/protocols/pushgift/PtlOpen";
export type Gift = {
id: string
uid: string
buy: number[]
ctime: number
passTime: number
ext_data: { [key: string]: any }
}
export type CollectionPushGift = Gift & { _id: ObjectId };

View File

@ -59,6 +59,7 @@ import {CollectionPlayerBehavior} from "./collection_player_behavior";
import {CollectionRmbuse} from "./collection_rmbuse"; import {CollectionRmbuse} from "./collection_rmbuse";
import {CollectionFightLog} from "./collection_fightLog"; import {CollectionFightLog} from "./collection_fightLog";
import {CollectionShop} from "./collection_shop"; import {CollectionShop} from "./collection_shop";
import {CollectionPushGift} from "./collection_pushgift";
export type MongodbCollections = { export type MongodbCollections = {
user: CollectionUser; user: CollectionUser;
@ -131,4 +132,5 @@ export type MongodbCollections = {
rmbuse: CollectionRmbuse rmbuse: CollectionRmbuse
fightLog: CollectionFightLog fightLog: CollectionFightLog
shop: CollectionShop shop: CollectionShop
pushgift:CollectionPushGift
}; };

View File

@ -9,6 +9,7 @@ import {HeroFun} from './hero';
import {UserFun} from './user'; import {UserFun} from './user';
import {re, string} from "mathjs"; import {re, string} from "mathjs";
import {getGud} from './gud'; import {getGud} from './gud';
import {PushGiftFun} from "./pushgift";
type fightType = 'tanxian' | 'pata' | 'jjc' | 'gbtx' | 'qjzzd' | 'meirishilian' | 'wzrycross'; type fightType = 'tanxian' | 'pata' | 'jjc' | 'gbtx' | 'qjzzd' | 'meirishilian' | 'wzrycross';
@ -86,9 +87,16 @@ export class FightFun {
/**挑战竞技场 */ /**挑战竞技场 */
static async fightJJc(call: ApiCall, rankInfo: rankInfo) { static async fightJJc(call: ApiCall, rankInfo: rankInfo) {
if (rankInfo.player.uid.indexOf('npc_') != -1) return await this.fightNpc(call, G.gc.jjc_npc[rankInfo.player.uid].npcId, 'jjc', await this.getPlayerFightData(call.conn.uid)); if (rankInfo.player.uid.indexOf('npc_') != -1) return await this.fightNpc(call, G.gc.jjc_npc[rankInfo.player.uid].npcId, 'jjc', await this.getPlayerFightData(call.conn.uid));
return this.fight([await this.getPlayerFightData(call.conn.uid), await this.getPlayerFightData(rankInfo.player.uid)]);
let result = this.fight([await this.getPlayerFightData(call.conn.uid), await this.getPlayerFightData(rankInfo.player.uid)]);
// 竞技场 战败触发推送礼包
if (result.winSide != 0) {
PushGiftFun.chkLoseGift(call.uid)
}
return result
} }
/**挑战npc */ /**挑战npc */
@ -106,7 +114,13 @@ export class FightFun {
let npc = formatNpcData(npcId); let npc = formatNpcData(npcId);
return this.fight([my, npc], 30, 'pve'); let result = this.fight([my, npc], 30, 'pve');
// 主线 爬塔 战败触发推送礼包
if (result.winSide != 0 && ["tanxian", "pata"].includes(type)) {
PushGiftFun.chkLoseGift(call.uid)
}
return result
} }
/** /**

View File

@ -17,6 +17,7 @@ import {UserFun} from './user';
import {getItemByItemId, getItemNum} from './item'; import {getItemByItemId, getItemNum} from './item';
import {getGud, setGud} from './gud'; import {getGud, setGud} from './gud';
import {addGameLog} from "../gameLog"; import {addGameLog} from "../gameLog";
import {PushGiftFun} from "./pushgift";
export type call = { export type call = {
@ -66,6 +67,8 @@ export class PlayerFun {
if (has < atn.n) { if (has < atn.n) {
if (err) { if (err) {
// 消耗不足 触发推送礼包
PushGiftFun.chkItemGift(call.uid, atn)
throw new TsrpcError('', {code: -104, atn: atn}); throw new TsrpcError('', {code: -104, atn: atn});
} else { } else {
return {isOk: false, atn: atn}; return {isOk: false, atn: atn};
@ -189,6 +192,16 @@ export class PlayerFun {
// 修改属性应在相关奖励领取之前,否则奖励内获取的用户数据是旧数据 // 修改属性应在相关奖励领取之前,否则奖励内获取的用户数据是旧数据
// await this.changeAttr(call.conn.uid, change); // await this.changeAttr(call.conn.uid, change);
call.addEventMsg('msg_s2c/PlayerChange', change); call.addEventMsg('msg_s2c/PlayerChange', change);
// 等级改变 触发推送礼包
if (change["lv"]) {
PushGiftFun.chkLvGift(call.uid, change["lv"])
}
// 关卡改变 触发推送礼包
if (change["mapId"]) {
PushGiftFun.chkLevelGift(call.uid, change["mapId"])
}
} }
static async changeAttrLog(uid: string, change, atn, before) { static async changeAttrLog(uid: string, change, atn, before) {
@ -290,7 +303,11 @@ export class PlayerFun {
G.mongodb.collection('item').updateOne(upObj.filter, upObj.update, upObj.options); G.mongodb.collection('item').updateOne(upObj.filter, upObj.update, upObj.options);
call.addEventMsg('msg_s2c/ItemChange', atn.t, data); call.addEventMsg('msg_s2c/ItemChange', atn.t, data);
addGameLog(call.uid, "_itemChange", {"additem":1}, {"filter": upObj.filter, "update": upObj.update, "options": upObj.options}) addGameLog(call.uid, "_itemChange", {"additem": 1}, {
"filter": upObj.filter,
"update": upObj.update,
"options": upObj.options
})
} else { } else {
if (item.num + atn.n <= 0) { if (item.num + atn.n <= 0) {
await Promise.all([ await Promise.all([
@ -318,7 +335,12 @@ export class PlayerFun {
num: item.num + atn.n, num: item.num + atn.n,
lastTime: upObj.update.$set.lastTime lastTime: upObj.update.$set.lastTime
}); });
addGameLog(call.uid, "_itemChange",{"attritem":1}, {"filter": upObj.filter, "update": upObj.update, "options": upObj.options,newNum:item.num + atn.n}) addGameLog(call.uid, "_itemChange", {"attritem": 1}, {
"filter": upObj.filter,
"update": upObj.update,
"options": upObj.options,
newNum: item.num + atn.n
})
} }
} }
} }

179
src/public/pushgift.ts Normal file
View File

@ -0,0 +1,179 @@
import {PayFun} from "./pay";
const PushGiftType = {
LevelGift: 1, // 关卡推送
ItemGift: 2, // 道具推送
LoseGift: 3, // 战败推送
RecruitGift: 4, // 十连推送
LvGift: 5, // 等级推送
}
export class PushGiftFun {
static async getGift(uid: string) {
// 查询所有礼包
return (await G.mongodb.collection("pushgift").find({
uid: uid
}).toArray()).map((i) => {
let {_id, ...gift} = i;
return gift
})
}
static async chkItemGift(uid: string, atn: atn) {
let gift_ids = [];
for (let id in G.gc.tuisonglibao) {
let conf = G.gc.tuisonglibao[id];
if (conf.type == PushGiftType.ItemGift && conf.num[0].a == atn.a && conf.num[0].t == atn.t) {
gift_ids.push(id);
}
}
if (gift_ids.length <= 0) {
return
} else {
this.pushGift(uid, gift_ids)
}
}
static async chkLevelGift(uid: string, level: number) {
let gift_ids = [];
for (let id in G.gc.tuisonglibao) {
let conf = G.gc.tuisonglibao[id];
if (conf.type == PushGiftType.LevelGift && conf.num[0] == level) {
gift_ids.push(id);
}
}
if (gift_ids.length <= 0) {
return
} else {
this.pushGift(uid, gift_ids)
}
}
static async chkLvGift(uid: string, lv: number) {
let gift_ids = [];
for (let id in G.gc.tuisonglibao) {
let conf = G.gc.tuisonglibao[id];
if (conf.type == PushGiftType.LvGift && conf.num[0] == lv) {
gift_ids.push(id);
}
}
if (gift_ids.length <= 0) {
return
} else {
this.pushGift(uid, gift_ids)
}
}
static async chkLoseGift(uid: string) {
let gift_ids = [];
for (let id in G.gc.tuisonglibao) {
let conf = G.gc.tuisonglibao[id];
if (conf.type == PushGiftType.LoseGift) {
gift_ids.push(id);
}
}
if (gift_ids.length <= 0) {
return
} else {
this.pushGift(uid, gift_ids)
}
}
static async chkRecruitGift(uid: string) {
let gift_ids = [];
for (let id in G.gc.tuisonglibao) {
let conf = G.gc.tuisonglibao[id];
if (conf.type == PushGiftType.RecruitGift) {
gift_ids.push(id);
}
}
if (gift_ids.length <= 0) {
return
} else {
this.pushGift(uid, gift_ids)
}
}
static async pushGift(uid: string, gift_ids: string[]) {
let gifts = {};
(await this.getGift(uid)).forEach(i => gifts[i.id] = i)
for (let gift_id of gift_ids) {
let conf = G.gc.tuisonglibao[gift_id];
if (gifts[gift_id] && conf.displayCD > 0 && gifts[gift_id].ctime + conf.displayCD > G.time) {
continue
}
if (conf.type == PushGiftType.RecruitGift) {
if (gifts[gift_id]) {
if (gift_ids[gift_id].ext_data.num + 1 >= conf.num[0]) {
this.addGift(uid, gift_id, {num: 0})
} else {
G.mongodb.collection("pushgift").updateOne({
uid: uid, id: gift_id
}, {"$inc": {"ext_data.num": 1}})
}
} else {
// 招募礼包不存在 初始化数据 记录招募次数
G.mongodb.collection("pushgift").updateOne({
uid: uid, id: gift_id
}, {
$set: {
ctime: 0,
passTime: 0,
ext_data: {num: 1},
buy: conf.payId.map(() => 0),
}
}, {upsert: true})
}
} else {
this.addGift(uid, gift_id, {})
}
}
}
static async addGift(uid: string, giftid: string, ext_data: { [key: string]: any }) {
let conf = G.gc.tuisonglibao[giftid];
// 更新礼包
G.mongodb.collection("pushgift").updateOne({
uid: uid, id: giftid
}, {
$set: {
ctime: G.time,
ext_data: ext_data,
passTime: G.time + conf.time,
buy: conf.payId.map(() => 0),
}
}, {upsert: true})
// 删除购买记录
PayFun.delPayLog(uid, ...conf.payId.map(i => {
return {payId: i, val: []}
}))
// 推送客户端消息
G.server.sendMsgByUid(uid, "msg_s2c/PushGiftChange", 1);
}
static async buy(uid: string, payId: string) {
// 购买礼包
let gift;
for (let gift_id in G.gc.tuisonglibao) {
let temp = G.gc.tuisonglibao[gift_id];
if (temp.payId.includes(payId)) {
gift = temp;
break
}
}
if (!gift) return;
let index = gift.payId.indexOf(payId);
let info = await G.mongodb.collection("pushgift").findOne({
uid: uid, id: gift.id.toString()
})
if (info.passTime >= G.time) {
await G.mongodb.collection("pushgift").updateOne({
uid: uid, id: gift.id.toString()
}, {$inc: {[`buy.${index}`]: 1}})
// 推送客户端消息
G.server.sendMsgByUid(uid, "msg_s2c/PushGiftChange", 1);
}
}
}

View File

@ -0,0 +1 @@
export type MsgPushGiftChange = 1;

View File

@ -0,0 +1,5 @@
import {Gift} from "../../../module/collection_pushgift";
export type ReqOpen = {}
export type ResOpen = { gifts: Gift[] }

File diff suppressed because it is too large Load Diff