191 lines
7.4 KiB
TypeScript
191 lines
7.4 KiB
TypeScript
import { Channel, pinus } from "pinus";
|
|
import { CHANNEL_PREFIX, PUSH_BATCH, PUSH_INTERVAL, PUSH_ROUTE, STATUS } from "../consts";
|
|
import { genCode, resResult } from "../pubUtils/util";
|
|
import { getCityChannelSid, getGuildChannelSid, getWorldChannelSid, groupRoomId } from "./chatService";
|
|
import { getAllOnlineRoles, getRoleOnlineInfo } from "./redisService";
|
|
import { errlogger, infologger } from '../util/logger';
|
|
import { MsgEncrypt } from "../pubUtils/sysUtil";
|
|
import { isSkipEncode } from "../pubUtils/sdkUtil";
|
|
import { isDevelopEnv } from "./utilService";
|
|
|
|
export async function sendMessageToAllWithSuc(route: string, data: any, filterCb?: ({ lv, topLineupCe }) => boolean) {
|
|
await sendMessageToAll(route, resResult(STATUS.SUCCESS, data), filterCb);
|
|
}
|
|
|
|
export async function sendMessageToAll(route: string, data: any, filterCb?: ({ lv, topLineupCe }) => boolean) {
|
|
let allOnlineUsers = await getAllOnlineRoles();
|
|
if(filterCb) {
|
|
allOnlineUsers = allOnlineUsers.filter(filterCb);
|
|
}
|
|
let n = Math.ceil(allOnlineUsers.length / PUSH_BATCH); // 一共多少批
|
|
let sendToUser = (i: number) => {
|
|
let users = allOnlineUsers.slice(i * PUSH_BATCH, (i + 1) * PUSH_BATCH - 1);
|
|
let uids = users.map(cur => ({ uid: cur.roleId, sid: cur.sid }));
|
|
sendMessageToUsers(route, data, uids);
|
|
}
|
|
let i = -1;
|
|
sendToUser(++i);
|
|
let interval = setInterval(() => {
|
|
if (++i < n) {
|
|
sendToUser(i);
|
|
} else {
|
|
clearInterval(interval);
|
|
}
|
|
}, PUSH_INTERVAL);
|
|
}
|
|
|
|
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 });
|
|
sendMessageToUsers(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) {
|
|
pinus.app.get('channelService').pushMessageByUids(route, encryptMsg(route, data), uids);
|
|
infologger.debug(`pushMessage route: ${route} data: ${JSON.stringify(data)} members: ${uids.map(obj => obj.uid).join()}`);
|
|
}
|
|
}
|
|
|
|
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, data, uids);
|
|
} else {
|
|
clearInterval(interval);
|
|
}
|
|
}, PUSH_INTERVAL);
|
|
} else {
|
|
sendMessageToChannel(channel, route, data);
|
|
}
|
|
}
|
|
|
|
// 抽下下来pushMessage收束
|
|
export function sendMessageToChannel(channel: Channel, route: string, data: any) {
|
|
channel.pushMessage(route, encryptMsg(route, data));
|
|
infologger.debug(`pushMessage route: ${route} data: ${JSON.stringify(data)} members: ${channel.getMembers().join()}`);
|
|
}
|
|
|
|
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);
|
|
}
|
|
}
|
|
|
|
function getKvFromMemory() {
|
|
let k = pinus.app.get('aeaKey');
|
|
let v = pinus.app.get('aesIV');
|
|
let kvRefTime = pinus.app.get('kvRefTime');
|
|
let now = new Date().setMinutes(0, 0, 0);
|
|
if(!kvRefTime || now - kvRefTime >= 60 * 60 * 1000) {
|
|
k = genCode(24);
|
|
v = genCode(16);
|
|
pinus.app.set('aeaKey', k);
|
|
pinus.app.set('aesIV', v);
|
|
pinus.app.set('kvRefTime', now);
|
|
}
|
|
return { k, v }
|
|
}
|
|
|
|
function encryptMsg(event: string, json: any) {
|
|
if(checkNotEncryptRoute(event)) return json
|
|
let kv = getKvFromMemory();
|
|
let msgEncrypt = new MsgEncrypt(kv);
|
|
let { aesKey, aesIV } = msgEncrypt.getEncodeKv();
|
|
let data = msgEncrypt.encryptMsg(json);
|
|
return { data, k: aesKey, v: aesIV }
|
|
}
|
|
|
|
function checkNotEncryptRoute(event: string) {
|
|
return isSkipEncode(isDevelopEnv()) || [
|
|
PUSH_ROUTE.PUSH_CURRENT_TIME,
|
|
PUSH_ROUTE.RACE_START,
|
|
PUSH_ROUTE.GUILD_ACTIVITY_END,
|
|
].indexOf(event) != -1
|
|
} |