diff --git a/game-server/app/servers/chat/handler/chatHandler.ts b/game-server/app/servers/chat/handler/chatHandler.ts index 213c4c1e9..fb201b71c 100644 --- a/game-server/app/servers/chat/handler/chatHandler.ts +++ b/game-server/app/servers/chat/handler/chatHandler.ts @@ -216,11 +216,22 @@ export class ChatHandler { return resResult(STATUS.SUCCESS, accuseRec); } + async setPushMsgTrigger(msg: { isClosePush: boolean }, session: BackendSession) { + const roleId = session.get('roleId'); + const { isClosePush } = msg; + + let role = await RoleModel.setPushMsgOpen(roleId, isClosePush); + if(!role) return resResult(STATUS.ROLE_NOT_FOUND); + return resResult(STATUS.SUCCESS, { + isClosePushPush: role.isClosePush + }) + } + // 客户端推送消息 async debugPushMessage(msg: { uid: number }, session: BackendSession) { let dic = gameData.dicPushMessage.get(SDK_PUSH_MSG_TYPE.GUILD_ACTIVITY_START); if(!dic) return resResult(STATUS.WRONG_PARMS); - let result = await pushMsg37(Date.now(), dic, SDK_PUSH_TARGET_TYPE.SINGLE, `${msg.uid}`); + let result = await pushMsg37(Date.now().toString(), dic, SDK_PUSH_TARGET_TYPE.SINGLE, `${msg.uid}`); // await pushClientMsg(SDK_PUSH_MSG_TYPE.AFK_ATTENTION); diff --git a/game-server/app/services/checkParam.ts b/game-server/app/services/checkParam.ts index 0ebf52a5d..b447c41ba 100644 --- a/game-server/app/services/checkParam.ts +++ b/game-server/app/services/checkParam.ts @@ -1994,6 +1994,11 @@ export function checkRouteParam(route: string, msg: any) { if(!isDevelopEnv() && !checkNaturalNumbers(msg.id, msg.count)) return false; break; } + case "chat.chatHandler.setPushMsgTrigger": + { + if(!isBoolean(msg.isClosePush)) return false; + break; + } case 'activity.activityHandler.debugActivityMemory': case 'activity.popUpShopHandler.debugPushPopUpShop': case 'activity.popUpShopHandler.debugPushPopUpInterval': diff --git a/game-server/app/services/pushService.ts b/game-server/app/services/pushService.ts index f420c26e7..625b06bd9 100644 --- a/game-server/app/services/pushService.ts +++ b/game-server/app/services/pushService.ts @@ -12,6 +12,7 @@ import { pushMsg37 } from "./sdkService"; import { RoleModel, RoleType } from "../db/Role"; import { nowSeconds } from "../pubUtils/timeUtil"; import { GVGLeagueModel } from "../db/GVGLeague"; +import { resolve } from "bluebird"; export async function sendMessageToAllWithSuc(route: string, data: any, filterCb?: ({ lv, topLineupCe }) => boolean) { await sendMessageToAll(route, resResult(STATUS.SUCCESS, data), filterCb); @@ -281,12 +282,24 @@ export async function pushClientMsg(type: SDK_PUSH_MSG_TYPE) { if(!needPushMsg()) return; let { target, audiences } = targetObj; let t = Date.now(); - for(let audience of audiences) { + for(let i = 0; i < audiences.length; i++) { + let audience = audiences[i]; // console.log(target, audience) - if(audience) await pushMsg37(t, dicPushMessage, target, audience); + if(audience) { + await timeoutAsync(i * 10) + await pushMsg37(t.toString(), dicPushMessage, target, audience); + } } } +function timeoutAsync(time: number) { + return new Promise((resolve) => { + setTimeout(() => { + resolve(); + }, time); + }) +} + async function getPushTarget(playerType: number): Promise<{ target: SDK_PUSH_TARGET_TYPE, audiences: string[] }> { let uids: number[] = []; switch(playerType) { @@ -304,7 +317,7 @@ async function getPushTarget(playerType: number): Promise<{ target: SDK_PUSH_TAR if(len == 1) return { target: SDK_PUSH_TARGET_TYPE.SINGLE, audiences: [uids.join()] }; let audiences: string[] = []; for(let i = 0; i < Math.ceil(len/200); i++) { - audiences.push(uids.slice(i * 200, i * 200 + 200 - 1).join()) + audiences.push(uids.slice(i * 200, i * 200 + 200).join()) } return { target: SDK_PUSH_TARGET_TYPE.LIST, audiences }; } @@ -318,7 +331,7 @@ async function getHasGuildPlayers() { if(players.length == 0) break; createdAt = players[players.length -1].createdAt; players.forEach(player => { - if(player.userInfo && player.userInfo.channelInfo && player.quitTime != player.loginTime) uids.push(player.userInfo.channelInfo.uid); + if(player.userInfo && player.userInfo.channelInfo && player.quitTime != player.loginTime && !player.isClosePush) uids.push(player.userInfo.channelInfo.uid); }); } return uids; @@ -331,10 +344,10 @@ async function getHasLeaguePlayers() { for(let { members } of leagues) roleIds.push(...members.map(member => member.roleId)); let len = roleIds.length; for(let i = 0; i < Math.ceil(len/1000); i++) { - let curRoleIds = roleIds.slice(i * 1000, i * 1000 + 1000 - 1); - let players = await RoleModel.findByRoleIds(curRoleIds, 'userInfo.channelInfo'); + let curRoleIds = roleIds.slice(i * 1000, i * 1000 + 1000); + let players = await RoleModel.findByRoleIds(curRoleIds, 'userInfo.channelInfo isClosePush'); players.forEach(player => { - if(player.userInfo && player.userInfo.channelInfo && player.quitTime != player.loginTime) uids.push(player.userInfo.channelInfo.uid); + if(player.userInfo && player.userInfo.channelInfo && player.quitTime != player.loginTime && !player.isClosePush) uids.push(player.userInfo.channelInfo.uid); }); } return uids; @@ -349,7 +362,7 @@ async function getAfkPlayers() { if(players.length == 0) break; createdAt = players[players.length -1].createdAt; players.forEach(player => { - if(player.userInfo && player.userInfo.channelInfo && player.quitTime != player.loginTime) uids.push(player.userInfo.channelInfo.uid); + if(player.userInfo && player.userInfo.channelInfo && player.quitTime != player.loginTime && !player.isClosePush) uids.push(player.userInfo.channelInfo.uid); }); } return uids; diff --git a/game-server/app/services/sdkService.ts b/game-server/app/services/sdkService.ts index 8a96807ba..97c10b877 100644 --- a/game-server/app/services/sdkService.ts +++ b/game-server/app/services/sdkService.ts @@ -167,8 +167,8 @@ export async function treatGuildName(content: string) { } // 37接口 消息推送 -export async function pushMsg37(time: number, dic: DicPushMessage, target: SDK_PUSH_TARGET_TYPE, audience: string) { - let body = new PushMsg37Param(time); +export async function pushMsg37(code: string, dic: DicPushMessage, target: SDK_PUSH_TARGET_TYPE, audience: string) { + let body = new PushMsg37Param(code); body.setMsgInfo(dic, target, audience); return await request37PushMessage(SDK_37_ADDR.PUSH_MSG, body, SDK_37_CONST.PUSH_KEY); } diff --git a/shared/consts/constModules/selectConst.ts b/shared/consts/constModules/selectConst.ts index d85ed3ba3..3afa7e90f 100644 --- a/shared/consts/constModules/selectConst.ts +++ b/shared/consts/constModules/selectConst.ts @@ -57,7 +57,7 @@ export enum FRIEND_SHIP_SELECT { GET_FRIEND_VALUE = 'friendValue friendLv' } -export const ENTERY_ROLE_PICK = ['roleId', 'roleName', 'serverId', 'ce', 'topLineupCe', 'coin', 'lv', 'exp', 'vLv', 'gold', 'heros', 'jewels', 'artifacts', 'consumeGoods', 'title', 'teraphs', 'showLineup', 'heads', 'head', 'frames', 'frame', 'spines', 'spine', 'hasGuild', 'guildCode', 'todayZeroPoint', 'apJson', 'skins', 'totalPay', 'guide', 'hasInit', 'renameCnt', 'totalCost', 'guildName', 'isVip', 'createTime', 'ipLocation', 'activityItems', 'customerLink']; +export const ENTERY_ROLE_PICK = ['roleId', 'roleName', 'serverId', 'ce', 'topLineupCe', 'coin', 'lv', 'exp', 'vLv', 'gold', 'heros', 'jewels', 'artifacts', 'consumeGoods', 'title', 'teraphs', 'showLineup', 'heads', 'head', 'frames', 'frame', 'spines', 'spine', 'hasGuild', 'guildCode', 'todayZeroPoint', 'apJson', 'skins', 'totalPay', 'guide', 'hasInit', 'renameCnt', 'totalCost', 'guildName', 'isVip', 'createTime', 'ipLocation', 'activityItems', 'customerLink', 'isClosePush']; export enum SURVEY_SELECT { FIND = '-__v -_id -surveyName -roleIndex -reward -mailContent -receivedRole -createdAt -updatedAt' diff --git a/shared/db/Role.ts b/shared/db/Role.ts index 1d9bbcc62..c6223170e 100644 --- a/shared/db/Role.ts +++ b/shared/db/Role.ts @@ -348,6 +348,9 @@ export default class Role extends BaseModel { // 是否发送过推送 @prop({ required: false }) hasPushMsg: boolean; + // 是否打开推送 + @prop({ required: false }) + isClosePush: boolean; public static async findAllByUid(uid: number, getters = false, virtuals = true) { const role: RoleType[] = await RoleModel.find({ 'userInfo.uid': uid }).select('roleId roleName serverId head frame spine heads frames spines lv updatedAt createTime').lean({ getters, virtuals }); @@ -826,22 +829,27 @@ export default class Role extends BaseModel { public static async findHasGuildPlayers(createdAt?: Date) { let filter = createdAt? { createdAt: { $gt: createdAt } }: {}; - let roles: RoleType[] = await RoleModel.find({ loginTime: { $gte: nowSeconds() - 24 * 60 * 60 }, ...filter, hasGuild: true }).sort({ createdAt: 1 }).select('userInfo.channelInfo quitTime loginTime createdAt').lean(); + let roles: RoleType[] = await RoleModel.find({ loginTime: { $gte: nowSeconds() - 24 * 60 * 60 }, ...filter, hasGuild: true }).sort({ createdAt: 1 }).select('userInfo.channelInfo quitTime loginTime isClosePush createdAt').lean(); return roles; } public static async findAfkPlayers(createdAt?: Date) { let filter = createdAt? { createdAt: { $gt: createdAt } }: {}; - let roles: RoleType[] = await RoleModel.find({ loginTime: { $lt: nowSeconds() - 48 * 60 * 60 }, lv: { $gte: 20 }, hasPushMsg: { $exists: false }, ...filter }).sort({ createdAt: 1 }).select('userInfo.channelInfo quitTime loginTime createdAt').lean(); + let roles: RoleType[] = await RoleModel.find({ loginTime: { $lt: nowSeconds() - 48 * 60 * 60 }, lv: { $gte: 20 }, hasPushMsg: { $exists: false }, ...filter }).sort({ createdAt: 1 }).select('userInfo.channelInfo quitTime loginTime isClosePush createdAt').lean(); await RoleModel.updateMany({ _id: roles.map(cur => cur._id) }, { $set: { hasPushMsg: true } }); return roles; } public static async findActivePlayers(createdAt?: Date) { let filter = createdAt? { createdAt: { $gt: createdAt } }: {}; - let roles: RoleType[] = await RoleModel.find({ loginTime: { $gte: nowSeconds() - 24 * 60 * 60 }, ...filter }).sort({ createdAt: 1 }).select('userInfo.channelInfo quitTime loginTime createdAt').lean(); + let roles: RoleType[] = await RoleModel.find({ loginTime: { $gte: nowSeconds() - 24 * 60 * 60 }, ...filter }).sort({ createdAt: 1 }).select('userInfo.channelInfo quitTime loginTime isClosePush createdAt').lean(); return roles; } + + public static async setPushMsgOpen(roleId: string, isClosePush: boolean) { + let role: RoleType = await RoleModel.findOneAndUpdate({ roleId }, { $set: { isClosePush } }, { new: true }).select('-_id roleId isClosePush').lean(); + return role; + } } export const RoleModel = getModelForClass(Role); diff --git a/shared/domain/sdk.ts b/shared/domain/sdk.ts index 4e667d9d3..261622d8d 100644 --- a/shared/domain/sdk.ts +++ b/shared/domain/sdk.ts @@ -397,11 +397,11 @@ export class PushMsg37Param { source: number; // 推送来源表 type: string; // 推送内容 - constructor(time: number) { - this.notify_id = time.toString(); + constructor(code: string) { + this.notify_id = code; this.game_id = SDK_37_CONST.PUSH_GAME_ID; // this.c_game_id = SDK_37_CONST.FX_C_GAME_ID; - this.time = Math.floor(time/1000).toString(); + this.time = Math.floor(Date.now()/1000).toString(); this.source = 0; // 0: 游戏内 }