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 { getAllOnlineRoles, getRoleOnlineInfo } from "./redisService"; import { errlogger, infologger } from '../util/logger'; 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, 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, 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); } }