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