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,7 +1,7 @@
import { CHANNEL_PREFIX, MSG_SOURCE, getChannelType } from './../../../consts/constModules/chatConst';
import { Application, BackendSession, HandlerService, } from 'pinus';
import { genCode, resResult } from '../../../pubUtils/util';
import { DEFAULT_MSG_PER_PAGE, STATUS, TASK_TYPE } from '../../../consts';
import { DEFAULT_MSG_PER_PAGE, SDK_PUSH_MSG_TYPE, SDK_PUSH_TARGET_TYPE, STATUS, TASK_TYPE } from '../../../consts';
import { createAccuseData, createGroupMsg, createPrivateMsg, getPrivateMessages, pushGroupMsgToRoom, pushMsgToRole, updatePrivateMsgReadInfo, recentPrivateChatInfos, recentWorldMsgs, recentSysMsgs, recentGuildMsgs, updatePrivateMsgIsTop, delPrivateMsg, recentServerGroupMsgs, recentLeagueMsgs } from '../../../services/chatService';
import { getSimpleRoleInfo } from '../../../services/roleService';
import { checkTask } from '../../../services/task/taskService';
@@ -11,6 +11,9 @@ import { GVGLeagueModel } from '../../../db/GVGLeague';
import { getAllGroupOfServer } from '../../../services/serverService';
import { getGuildCodeString } from '../../../services/gvg/gvgRecService';
import { GroupMessageType } from '../../../db/GroupMessage';
import { pushMsg37 } from '../../../services/sdkService';
import { gameData } from '../../../pubUtils/data';
import { pushClientMsg } from '../../../services/pushService';
export default function (app: Application) {
@@ -212,4 +215,15 @@ export class ChatHandler {
if (!accuseRec) return resResult(STATUS.WRONG_PARMS);
return resResult(STATUS.SUCCESS, accuseRec);
}
// 客户端推送消息
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}`);
pushClientMsg(SDK_PUSH_MSG_TYPE.GVG_BATTLE_START);
return resResult(STATUS.SUCCESS);
}
}

View File

@@ -2053,6 +2053,7 @@ export function checkRouteParam(route: string, msg: any) {
case "guild.gvgBattleHandler.debugAddRobots":
case "guild.gvgBattleHandler.debugMoveRobots":
case "guild.gvgBattleHandler.debugStopMoveRobot":
case "chat.chatHandler.debugPushMessage":
{
if (msg.magicWord !== DEBUG_MAGIC_WORD || !isDevelopEnv()) return false;

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;
}

View File

@@ -1,12 +1,12 @@
/********** 37sdk **********/
import { RoleModel, RoleType } from "../db/Role";
import { Chat37Params, CheckGuild37Params, CheckName37Params, GetWordParam } from "../domain/sdk";
import { Chat37Params, CheckGuild37Params, CheckName37Params, GetWordParam, PushMsg37Param } from "../domain/sdk";
import { sendMailByContent, sendMailToGuildByContent } from './mailService';
import { NAMEPLATE } from '../pubUtils/dicParam';
import { CHANNEL_PREFIX, FILENAME, getSdkChannelId, MAIL_TYPE, PUSH_ROUTE, REDIS_KEY, SDK_37_ADDR, SDK_37_CONST, SDK_TA_CONST, STATUS, TA_EVENT, TA_USERSET_TYPE, THINKING_DATA_MODE, THINKING_DATA_MODE_LIST } from "../consts";
import { CHANNEL_PREFIX, FILENAME, getSdkChannelId, MAIL_TYPE, PUSH_ROUTE, REDIS_KEY, SDK_37_ADDR, SDK_37_CONST, SDK_PUSH_TARGET_TYPE, SDK_TA_CONST, STATUS, TA_EVENT, TA_USERSET_TYPE, THINKING_DATA_MODE, THINKING_DATA_MODE_LIST } from "../consts";
import { UserModel } from "../db/User";
import { request37CheckChat, request37GetWord, request37Post } from "../pubUtils/httpUtil";
import { request37CheckChat, request37GetWord, request37Post, request37PushMessage } from "../pubUtils/httpUtil";
import { GuildModel } from "../db/Guild";
import { getRoleOnlineInfo, updateUserInfo } from "./redisService";
import { Application, pinus } from "pinus";
@@ -21,6 +21,7 @@ import { pushGuildInfoUpdate } from "./guildService";
import { sendMessageToUserWithSuc } from "./pushService";
import { GuildLeader } from "../domain/rank";
import { initTaLoggingMode } from "./sdk/ta";
import { DicPushMessage } from "../pubUtils/dictionary/DicPushMessage";
// 检查私聊是否合法
@@ -163,6 +164,13 @@ 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);
body.setMsgInfo(dic, target, audience);
return await request37PushMessage(SDK_37_ADDR.PUSH_MSG, body, SDK_37_CONST.PUSH_KEY);
}
export function connectThinkingData(app: Application) {
let ta;
if(app.get('env') != 'development') {

View File

@@ -5,7 +5,7 @@ import { nowSeconds, getTimeFun, getSeconds } from '../pubUtils/timeUtil';
import { getTodayGuildActivity, gameData } from '../pubUtils/data';
import { pvpSeasonEnd } from './pvpService';
import { getAllOnlineRoles, getAllServers, delGuildActivityRank, getServerCreateTime } from './redisService';
import { GUILD_ACTIVITY_TYPE, REFRESH_TIME, COUNTER, AUCTION_TIME, GM_MAIL_TYPE, SERVER_TIMER, ACTIVITY_TYPE, PUSH_ROUTE, STATUS, LADDER_STATUS, LADDER_SERVER_GAP_TIME, GVG_PERIOD } from '../consts';
import { GUILD_ACTIVITY_TYPE, REFRESH_TIME, COUNTER, AUCTION_TIME, GM_MAIL_TYPE, SERVER_TIMER, ACTIVITY_TYPE, PUSH_ROUTE, STATUS, LADDER_STATUS, LADDER_SERVER_GAP_TIME, GVG_PERIOD, SDK_PUSH_MSG_TYPE } from '../consts';
import { pinus } from 'pinus';
import { settleGuildWeekly } from './guildService';
import { SendMailFun, sendMailsByGmMail, } from './mailService';
@@ -31,7 +31,7 @@ import { ActivityModel, ActivityModelType } from '../db/Activity';
import { TimeLimitRankData } from '../domain/activityField/timeLimitRankField';
import { sendRankMail, takeSnapshot } from './activity/timeLimitRankService';
import { ActivityGroupModel } from '../db/ActivityGroup';
import { sendMessageToServer } from './pushService';
import { pushClientMsg, sendMessageToServer } from './pushService';
import { getRandEelm, getRandSingleEelm, resResult } from '../pubUtils/util';
import { checkPopUpConditionWhenGuildActivityEnd } from './activity/popUpShopService';
import { pushRefreshTime } from './connectorService';
@@ -113,6 +113,9 @@ export async function init() {
// gvg每周日
initGVGConfigSchedule();
// 定时推送消息
initPushMsgSchedule();
}
// 每日刷新
@@ -323,6 +326,7 @@ export async function guildActivityStart(dicGuildActivity?: DicGuildActivity) {
for (let serverId of servers) {
await sendGuildActivityStatus(serverId);
}
pushClientMsg(SDK_PUSH_MSG_TYPE.GUILD_ACTIVITY_START);
return true;
}
@@ -963,6 +967,9 @@ export async function gvgBattleStartSchedule() {
if(gvgBattleCatapultJob) gvgBattleCatapultJob.cancel();
gvgBattleCatapultJob = scheduleJob('gvgBattleCatapult', `*/${GVG.GVG_CATAPULT_TIME} * * * * *`, gvgBattleCatapult);
setTimeout(() => {
pushClientMsg(SDK_PUSH_MSG_TYPE.GVG_BATTLE_START);
}, GVG.GVG_GUARD_START_TIME * 1000);
}
// 每隔5秒的积分计算定时器
@@ -994,4 +1001,14 @@ export async function gvgBattleEndSchedule() {
}
}
// —————————————— gvg end —————————————— //
// —————————————— gvg end —————————————— //
async function initPushMsgSchedule() {
scheduleJob('sendAfkPlayers', '0 0 19 * * ?', async () => {
pushClientMsg(SDK_PUSH_MSG_TYPE.AFK_ATTENTION);
pushClientMsg(SDK_PUSH_MSG_TYPE.AP_DINNER);
});
scheduleJob('sendAfkPlayers', '0 0 12 * * ?', async () => {
pushClientMsg(SDK_PUSH_MSG_TYPE.AP_LUNCH);
});
}