Revert "Revert "✨ feat(消息): 添加推送消息sdk""
This reverts commit 918cc3415f.
This commit is contained in:
@@ -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;
|
||||
}
|
||||
Reference in New Issue
Block a user