优化:抽象推送方法
This commit is contained in:
130
game-server/app/services/pushService.ts
Normal file
130
game-server/app/services/pushService.ts
Normal file
@@ -0,0 +1,130 @@
|
||||
import { Channel, pinus } from "pinus";
|
||||
import { CHANNEL_PREFIX, PUSH_BATCH, PUSH_INTERVAL, PUSH_ROUTE, STATUS } from "../consts";
|
||||
import { resResult } from "../pubUtils/util";
|
||||
import { getCityChannelSid, getGuildChannelSid, getWorldChannelSid, groupRoomId } from "./chatService";
|
||||
import { getRoleOnlineInfo } from "./redisService";
|
||||
import { errlogger, infologger } from '../util/logger';
|
||||
|
||||
export async function sendMessageToServerWithSuc(serverId: number, route: string, data: any, isBatch = false) {
|
||||
await sendMessageToServer(serverId, route, resResult(STATUS.SUCCESS, data), isBatch);
|
||||
}
|
||||
|
||||
export async function sendMessageToServer(serverId: number, route: string, data: any, isBatch = false) {
|
||||
let channelSid = await getWorldChannelSid(serverId);
|
||||
let roomId = groupRoomId(CHANNEL_PREFIX.WORLD, serverId);
|
||||
await pinus.app.rpc.chat.chatRemote.pushMessage.toServer(channelSid, roomId, route, data, isBatch);
|
||||
}
|
||||
|
||||
export async function sendMessageToGuildWithSuc(guildCode: string, route: string, data: any) {
|
||||
await sendMessageToGuild(guildCode, route, resResult(STATUS.SUCCESS, data));
|
||||
}
|
||||
|
||||
export async function sendMessageToGuild(guildCode: string, route: string, data: any) {
|
||||
let channelSid = await getGuildChannelSid(guildCode);
|
||||
let roomId = groupRoomId(CHANNEL_PREFIX.GUILD, guildCode);
|
||||
await pinus.app.rpc.chat.chatRemote.pushMessage.toServer(channelSid, roomId, route, data);
|
||||
}
|
||||
|
||||
export async function sendMessageToCityWithSuc(cityId: number, route: string, data: any) {
|
||||
await sendMessageToCity(cityId, route, resResult(STATUS.SUCCESS, data));
|
||||
}
|
||||
|
||||
export async function sendMessageToCity(cityId: number, route: string, data: any) {
|
||||
let channelSid = await getCityChannelSid(cityId);
|
||||
let roomId = groupRoomId(CHANNEL_PREFIX.CITY, cityId);
|
||||
await pinus.app.rpc.chat.chatRemote.pushMessage.toServer(channelSid, roomId, route, data);
|
||||
}
|
||||
|
||||
export async function sendMessageToUserWithSuc(roleId: string, route: string, data: any, sid?: string) {
|
||||
await sendMessageToUser(roleId, route, resResult(STATUS.SUCCESS, data), sid);
|
||||
}
|
||||
|
||||
export async function sendMessageToUser(roleId: string, route: string, data: any, sid?: string) {
|
||||
let uids = [];
|
||||
if (!sid) {
|
||||
let onlineUser = await getRoleOnlineInfo(roleId);
|
||||
sid = onlineUser.sid;
|
||||
}
|
||||
if (!!sid) {
|
||||
uids.push({ uid: roleId, sid });
|
||||
pinus.app.get('channelService').pushMessageByUids(route, data, uids);
|
||||
}
|
||||
}
|
||||
|
||||
export async function sendMessageToUsersWithSuc(route: string, data: any, uids: { uid: string, sid: string }[]) {
|
||||
await sendMessageToUsers(route, resResult(STATUS.SUCCESS, data), uids);
|
||||
}
|
||||
|
||||
// 推送给个人的方法收束于这个函数
|
||||
export async function sendMessageToUsers(route: string, data: any, uids: { uid: string, sid: string }[]) {
|
||||
if(uids.length > 0) {
|
||||
infologger.debug(`pushMessage route: ${route} data: ${data} members: ${uids.map(obj => obj.uid).join()}`);
|
||||
pinus.app.get('channelService').pushMessageByUids(route, data, uids);
|
||||
}
|
||||
}
|
||||
|
||||
export async function sendMessageToTeam(teamCode: string, route: string, data: any) {
|
||||
const channel = pinus.app.get('channelService').getChannel(teamCode);
|
||||
sendMessageToChannel(channel, route, resResult(STATUS.SUCCESS, data));
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param user
|
||||
*/
|
||||
export function addUserToTeamChannel(teamCode: string, isCreate: boolean, roleId: string, sid: string) {
|
||||
let channel = pinus.app.get('channelService').getChannel(teamCode, isCreate);
|
||||
addUserToChannel(channel, roleId, sid);
|
||||
return channel
|
||||
}
|
||||
|
||||
export function addUserToChannel(channel: Channel, roleId: string, sid: string) {
|
||||
const users = channel.getMembers();
|
||||
if (users.indexOf(roleId) === -1) {
|
||||
channel.add(roleId, sid);
|
||||
}
|
||||
}
|
||||
|
||||
export function sendMessgeToChannelByBatch(channel: Channel, route: string, data: any) {
|
||||
let members = channel.getMembers();
|
||||
if(members.length > PUSH_BATCH) {
|
||||
let n = Math.ceil(members.length / PUSH_BATCH); // 一共多少批
|
||||
// console.log(n)
|
||||
let i = -1;
|
||||
let interval = setInterval(() => {
|
||||
if (++i < n) {
|
||||
let uidlist = members.slice(i * PUSH_BATCH, (i + 1) * PUSH_BATCH - 1);
|
||||
let uids: { uid: string, sid: string }[] = [];
|
||||
for (let uid of uidlist) {
|
||||
uids.push(channel.getMember(uid));
|
||||
}
|
||||
sendMessageToUsers(route, resResult(STATUS.SUCCESS, data), uids);
|
||||
} else {
|
||||
clearInterval(interval);
|
||||
}
|
||||
}, PUSH_INTERVAL);
|
||||
} else {
|
||||
channel.pushMessage(route, resResult(STATUS.SUCCESS, data));
|
||||
}
|
||||
}
|
||||
|
||||
// 抽下下来pushMessage收束
|
||||
export function sendMessageToChannel(channel: Channel, route: string, data: any) {
|
||||
infologger.debug(`pushMessage route: ${route} data: ${data} members: ${channel.getMembers().join()}`);
|
||||
channel.pushMessage(route, data);
|
||||
}
|
||||
|
||||
export function delTeamChannel(teamCode: string) {
|
||||
let channel = pinus.app.get('channelService').getChannel(teamCode);
|
||||
if(!!channel) channel.destroy();
|
||||
}
|
||||
|
||||
export function removeFromTeamChannel(teamCode: string, roleId: string) {
|
||||
let channel = pinus.app.get('channelService').getChannel(teamCode);
|
||||
if(!channel) return null;
|
||||
|
||||
let users: string[] = channel.getMembers();
|
||||
if (users.indexOf(roleId) !== -1) {
|
||||
channel.removeMember(roleId);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user