Revert "Revert " feat(消息): 添加推送消息sdk""

This reverts commit 918cc3415f.
This commit is contained in:
luying
2023-03-21 21:04:12 +08:00
parent 9115794b82
commit 5e15568f71
17 changed files with 406 additions and 16 deletions

View File

@@ -1,12 +1,17 @@
import { Channel, pinus } from "pinus";
import { CHANNEL_PREFIX, PUSH_BATCH, PUSH_INTERVAL, PUSH_ROUTE, STATUS } from "../consts";
import { CHANNEL_PREFIX, PUSH_BATCH, PUSH_INTERVAL, PUSH_ROUTE, SDK_PUSH_MSG_PLAYER_TYPE, SDK_PUSH_MSG_TYPE, SDK_PUSH_TARGET_TYPE, STATUS } from "../consts";
import { genCode, resResult } from "../pubUtils/util";
import { getCityChannelSid, getGuildChannelSid, getWorldChannelSid, groupRoomId, getGroupShopSid, getGVGAreaChannelSid, getGVGAreaTeamChannelSid, getGVGCityTeamChannelSid } from "./chatService";
import { getAllOnlineRoles, getAllServers, getRoleOnlineInfo } from "./redisService";
import { errlogger, infologger } from '../util/logger';
import { MsgEncrypt } from "../pubUtils/sysUtil";
import { isSkipEncode } from "../pubUtils/sdkUtil";
import { isSkipEncode, needPushMsg } from "../pubUtils/sdkUtil";
import { isDevelopEnv } from "./utilService";
import { gameData } from "../pubUtils/data";
import { pushMsg37 } from "./sdkService";
import { RoleModel, RoleType } from "../db/Role";
import { nowSeconds } from "../pubUtils/timeUtil";
import { GVGLeagueModel } from "../db/GVGLeague";
export async function sendMessageToAllWithSuc(route: string, data: any, filterCb?: ({ lv, topLineupCe }) => boolean) {
await sendMessageToAll(route, resResult(STATUS.SUCCESS, data), filterCb);
@@ -260,4 +265,106 @@ function checkNotEncryptRoute(event: string) {
PUSH_ROUTE.GVG_CITY_RANK_UPDATE, // onGVGCityRankUpdate 城池积分排名
PUSH_ROUTE.GVG_SPINE_ATTACKED, // onSpinesAttacked 队伍在地图上受到攻击
].indexOf(event) != -1
}
/**
* 推送客户端下拉消息
* @param type SDK_PUSH_MSG_TYPE
* @returns
*/
export async function pushClientMsg(type: SDK_PUSH_MSG_TYPE) {
let dicPushMessage = gameData.dicPushMessage.get(type);
if(!dicPushMessage) return;
let targetObj = await getPushTarget(dicPushMessage.playerType);
if(!targetObj) return;
if(!needPushMsg()) return;
let { target, audiences } = targetObj;
let t = Date.now();
for(let audience of audiences) {
if(audience) await pushMsg37(t, dicPushMessage, target, audience);
}
}
async function getPushTarget(playerType: number): Promise<{ target: SDK_PUSH_TARGET_TYPE, audiences: string[] }> {
let uids: number[] = [];
switch(playerType) {
case SDK_PUSH_MSG_PLAYER_TYPE.HAS_GUILD:
{ uids = await getHasGuildPlayers(); break; }
case SDK_PUSH_MSG_PLAYER_TYPE.HAS_LEAGUE:
{ uids = await getHasLeaguePlayers(); break; }
case SDK_PUSH_MSG_PLAYER_TYPE.AFK:
{ uids = await getAfkPlayers(); break; }
case SDK_PUSH_MSG_PLAYER_TYPE.HAS_LEAGUE:
{ uids = await getActivePlayers(); break; }
}
let len = uids.length;
if(len == 0) return null;
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())
}
return { target: SDK_PUSH_TARGET_TYPE.LIST, audiences };
}
// 有军团且24小时内登录过但当前未在线的玩家
async function getHasGuildPlayers() {
let uids: number[] = [], players: RoleType[] = [];
let createdAt: Date;
while(!createdAt || players.length > 0) {
players = await RoleModel.findHasGuildPlayers(createdAt);
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);
});
}
return uids;
}
// 有联军且48小时内登录过但当前未在线的玩家
async function getHasLeaguePlayers() {
let leagues = await GVGLeagueModel.findActiveLeagueMembers();
let uids: number[] = [], roleIds: string[] = [];
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');
players.forEach(player => {
if(player.userInfo && player.userInfo.channelInfo && player.quitTime != player.loginTime) uids.push(player.userInfo.channelInfo.uid);
});
}
return uids;
}
// 至少48小时未上线且等级>=20级的玩家
async function getAfkPlayers() {
let uids: number[] = [], players: RoleType[] = [];
let createdAt: Date;
while(!createdAt || players.length > 0) {
players = await RoleModel.findAfkPlayers(createdAt);
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);
});
}
return uids;
}
// 24小时内登录过但当前未在线的玩家
async function getActivePlayers() {
let uids: number[] = [], players: RoleType[] = [];
let createdAt: Date;
while(!createdAt || players.length > 0) {
players = await RoleModel.findActivePlayers(createdAt);
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);
});
}
return uids;
}