231 lines
10 KiB
TypeScript
231 lines
10 KiB
TypeScript
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, 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';
|
||
import { RoleModel } from '@db/Role';
|
||
import { getFriendRelationType } from '../../../services/friendService';
|
||
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) {
|
||
new HandlerService(app, {});
|
||
return new ChatHandler(app);
|
||
}
|
||
|
||
export class ChatHandler {
|
||
constructor(private app: Application) {
|
||
}
|
||
|
||
/**
|
||
* @description 群聊发送接口
|
||
* @param {{ channel: string, type: number, content: string, targetRoleId: string, targetMsgCode: string }} msg
|
||
* @param {BackendSession} session
|
||
* @memberof ChatHandler
|
||
*/
|
||
async sendGroupMessage(msg: { channel: string, type: number, content: string, targetRoleId: string, targetMsgCode: string }, session: BackendSession) {
|
||
const { channel, type, content, targetRoleId, targetMsgCode } = msg;
|
||
if (channel === CHANNEL_PREFIX.SYS) return resResult(STATUS.SYS_CHANNEL_AUTH_NOT_ENOUGH);
|
||
const roleId = session.get('roleId');
|
||
const roleName = session.get('roleName');
|
||
const serverId = session.get('serverId');
|
||
const guildCode = session.get('guildCode');
|
||
|
||
const sid = session.get('sid');
|
||
let channelIds: (string|number)[] = [], otherInfo = '';
|
||
if (channel === CHANNEL_PREFIX.WORLD) channelIds.push(serverId);
|
||
if (channel === CHANNEL_PREFIX.GUILD) channelIds.push(guildCode);
|
||
if (channel === CHANNEL_PREFIX.GVG) {
|
||
let groupIds = await getAllGroupOfServer(serverId);
|
||
groupIds.forEach(groupId => channelIds.push(groupId));
|
||
otherInfo = genCode(10);
|
||
}
|
||
if (channel == CHANNEL_PREFIX.LEAGUE) {
|
||
let myLeague = await GVGLeagueModel.findLeagueByGuild(guildCode);
|
||
if(!myLeague) return resResult(STATUS.GVG_NOT_JOIN_LEAGUE);
|
||
channelIds.push(myLeague.leagueCode);
|
||
otherInfo = getGuildCodeString(myLeague);
|
||
}
|
||
let msgData: GroupMessageType;
|
||
for(let channelId of channelIds) {
|
||
msgData = await createGroupMsg(roleId, roleName, channel, `${channelId}`, type, MSG_SOURCE.ROLE_SEND_TEXT, content, targetRoleId, targetMsgCode, otherInfo);
|
||
if (!msgData) return resResult(STATUS.WRONG_PARMS);
|
||
await pushGroupMsgToRoom(msgData);
|
||
}
|
||
|
||
// 任务
|
||
await checkTask(serverId, roleId, sid, TASK_TYPE.CHAT, { chatType: getChannelType(channel) });
|
||
|
||
return resResult(STATUS.SUCCESS, msgData);
|
||
}
|
||
|
||
/**
|
||
* @description 私聊发送接口
|
||
* @param {{ type: number, content: string, targetRoleId: string, targetMsgCode: string }} msg
|
||
* @param {BackendSession} session
|
||
* @memberof ChatHandler
|
||
*/
|
||
async sendPrivateMessage(msg: { type: number, content: string, targetRoleId: string, targetMsgCode: string }, session: BackendSession) {
|
||
const { type, content, targetRoleId, targetMsgCode } = msg;
|
||
const roleId = session.get('roleId');
|
||
const serverId = session.get('serverId');
|
||
const roleName = session.get('roleName');
|
||
|
||
const sid = session.get('sid');
|
||
let relation = await getFriendRelationType(roleId, targetRoleId);
|
||
const msgData = await createPrivateMsg(roleId, roleName, type, MSG_SOURCE.ROLE_SEND_TEXT, content, targetRoleId, targetMsgCode, relation);
|
||
await pushMsgToRole(msgData);
|
||
if (!msgData) return resResult(STATUS.WRONG_PARMS);
|
||
|
||
// 任务
|
||
await checkTask(serverId, roleId, sid, TASK_TYPE.CHAT, { chatType: getChannelType('private') });
|
||
return resResult(STATUS.SUCCESS, msgData);
|
||
}
|
||
|
||
/**
|
||
* @description 获取初始聊天消息,数据和登录时返回的一致
|
||
* @param {{}} msg
|
||
* @memberof ChatHandler
|
||
*/
|
||
async getInitMessage(msg: {}, session: BackendSession) {
|
||
|
||
}
|
||
|
||
/**
|
||
* @description 获取最近私聊对象列表
|
||
* @param {{}} msg
|
||
* @param session
|
||
*/
|
||
async getRecentPrivateChats(msg: {}, session: BackendSession) {
|
||
|
||
const roleId = session.get('roleId');
|
||
const roleName = session.get('roleName');
|
||
|
||
const recentPrivateChats = await recentPrivateChatInfos(roleId, roleName) || [];
|
||
|
||
return resResult(STATUS.SUCCESS, {
|
||
recentPrivateChats
|
||
});
|
||
}
|
||
|
||
/**
|
||
* @description 获取群组聊天记录
|
||
* @param {{}} msg
|
||
* @param session
|
||
*/
|
||
async getGroupMessages(msg: {}, session: BackendSession) {
|
||
const serverId: number = session.get('serverId');
|
||
const guildCode: string = session.get('guildCode');
|
||
|
||
const worldMsgs = await recentWorldMsgs(serverId);
|
||
const sysMsgs = await recentSysMsgs(serverId);
|
||
const guildMsgs = await recentGuildMsgs(guildCode);
|
||
const gvgMsgs = await recentServerGroupMsgs(serverId);
|
||
const leagueMsgs = await recentLeagueMsgs(guildCode);
|
||
|
||
return resResult(STATUS.SUCCESS, { worldMsgs, sysMsgs, guildMsgs, gvgMsgs, leagueMsgs })
|
||
}
|
||
|
||
/**
|
||
* @description 获取私聊历史消息
|
||
* @param {{targetRoleId: string, fromSeqId: number, count: number}} msg 聊天对象;聊天消息的顺序 id,不传为从最新开始;count 为消息条数
|
||
* @memberof ChatHandler
|
||
*/
|
||
async getPrivateMessage(msg: { targetRoleId: string, fromSeqId: number, count: number }, session: BackendSession) {
|
||
const roleId = session.get('roleId');
|
||
const { targetRoleId, fromSeqId = Infinity, count = DEFAULT_MSG_PER_PAGE } = msg;
|
||
const msgs = await getPrivateMessages(roleId, targetRoleId, fromSeqId, count);
|
||
const targetRoleInfo = await getSimpleRoleInfo(targetRoleId);
|
||
return resResult(STATUS.SUCCESS, { targetRoleId, msgs, targetRoleInfo });
|
||
}
|
||
|
||
/**
|
||
* @description 查看私聊,主要用于更新最后查看时间和未读消息数
|
||
* @param {{ targetRoleId: string }} msg
|
||
* @param {BackendSession} session
|
||
* @returns
|
||
* @memberof ChatHandler
|
||
*/
|
||
async readPrivateMessage(msg: { targetRoleId: string }, session: BackendSession) {
|
||
const roleId = session.get('roleId');
|
||
const { targetRoleId } = msg;
|
||
const result = await updatePrivateMsgReadInfo(roleId, targetRoleId);
|
||
if (!result) {
|
||
return resResult(STATUS.UPDATE_PRIVATE_MSG_READ_TIME_ERR);
|
||
}
|
||
return resResult(STATUS.SUCCESS, result);
|
||
}
|
||
|
||
/**
|
||
* @description 设置置顶
|
||
* @param {{ targetRoleId: string, isTop: boolean }} msg
|
||
* @param {BackendSession} session
|
||
* @returns
|
||
* @memberof ChatHandler
|
||
*/
|
||
async setPrivateMessageTop(msg: { targetRoleId: string, isTop: boolean }, session: BackendSession) {
|
||
const roleId = session.get('roleId');
|
||
const { targetRoleId, isTop } = msg;
|
||
const result = await updatePrivateMsgIsTop(roleId, targetRoleId, isTop);
|
||
if (!result) {
|
||
return resResult(STATUS.SET_PRIVATE_MSG_TOP_ERR);
|
||
}
|
||
return resResult(STATUS.SUCCESS, result);
|
||
}
|
||
|
||
/**
|
||
* @description 删除私聊
|
||
* @param {{ targetRoleId: string }} msg
|
||
* @param {BackendSession} session
|
||
* @returns
|
||
* @memberof ChatHandler
|
||
*/
|
||
async delPrivateMessage(msg: { targetRoleId: string }, session: BackendSession) {
|
||
const roleId = session.get('roleId');
|
||
const { targetRoleId } = msg;
|
||
const result = await delPrivateMsg(roleId, targetRoleId);
|
||
if (!result) {
|
||
return resResult(STATUS.DEL_PRIVATE_MSG_ERR);
|
||
}
|
||
return resResult(STATUS.SUCCESS, result);
|
||
}
|
||
|
||
/**
|
||
* @description 举报玩家的消息
|
||
* @param {{targetRoleId: string, targetMsgCode: string; reason: number}} msg 被举报玩家的 Id,被举报的消息编号,举报原因
|
||
* @param {BackendSession} session
|
||
* @returns
|
||
* @memberof ChatHandler
|
||
*/
|
||
async accuse(msg: { targetRoleId: string, targetMsgCode: string; reason: number }, session: BackendSession) {
|
||
const roleId = session.get('roleId');
|
||
const roleName = session.get('roleName');
|
||
const { targetRoleId, targetMsgCode, reason } = msg;
|
||
let targetRole = await RoleModel.findByRoleId(targetRoleId);
|
||
if(!targetRoleId) return resResult(STATUS.ROLE_NOT_FOUND);
|
||
const accuseRec = await createAccuseData(roleId, roleName, targetRoleId, targetRole.roleName, targetMsgCode, reason);
|
||
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().toString(), dic, SDK_PUSH_TARGET_TYPE.SINGLE, `${msg.uid}`);
|
||
|
||
// await pushClientMsg(SDK_PUSH_MSG_TYPE.AFK_ATTENTION);
|
||
|
||
return resResult(STATUS.SUCCESS, result);
|
||
}
|
||
}
|
||
|