HJ_Server/src/public/chat.ts
2024-01-04 15:51:40 +08:00

95 lines
3.0 KiB
TypeScript

import { ApiCall } from 'tsrpc';
import { MsgChat } from '../shared/protocols/msg_s2c/MsgChat';
import { player } from '../shared/protocols/user/type';
import { chatLog, chatMsgLog } from '../shared/protocols/type'
import { PublicShared } from '../shared/public/public';
const msgListLen = {
'cross': 30,
'local': 30,
'guild': 20
};
/**
* 通过开服天数,获取跨服聊天分组
*/
export function getCrossChatGroupByOpenDay(){
let openday = PublicShared.getOpenServerDay();
if(openday<=7){
return 1;
}else if(openday <= 30){
return 2;
}else{
return 3;
}
}
export class ChatFun {
/**新增消息 */
static async newMsg(sendData: MsgChat) {
G.mongodb.collection('chat').updateOne(
{ type: `${sendData.type}${sendData.type == 'guild' ? (sendData.sender as player)?.ghId : ''}` },
{ $push: { list: { $each: [sendData], $slice: -msgListLen[sendData.type] } } },
{ upsert: true }
);
if (sendData.type == 'guild') {
G.server.broadcastClusterMsg('msg_s2c/Chat', sendData,{ghId:(sendData.sender as player)?.ghId});
}else if(sendData.type == 'cross'){
//所有的子进程都会收到,不需要集群内分别广播
if(sendData?.otherData?.group == getCrossChatGroupByOpenDay()){
//如果时候同一个分组的
delete sendData?.otherData?.group;
G.server.broadcastMsg('msg_s2c/Chat', sendData);
}
}else{
G.server.broadcastClusterMsg('msg_s2c/Chat', sendData);
}
}
/**获取私聊列表 */
static async getPrivateList(uid: string) {
let privateIds = await G.redis.get('chatPrivate', uid) || [];
if (privateIds.length < 1) return {};
let privateList = await G.mongodb.collection('chat').find({ type: { $in: privateIds } }).toArray();
return Object.fromEntries(privateList.map((p, i) => [p?.type, p?.list || []]));
}
/**写入私聊id */
static async writePrivateId(uid: string, privateId: string) {
G.redis.get('chatPrivate', uid).then(v => {
if (v == null) {
G.redis.set('chatPrivate', uid, [privateId]);
} else {
if (!v.includes(privateId)) {
G.redis.arrAppend('chatPrivate', uid, privateId);
}
}
});
}
/**记录日志 */
static async setChatLog(call: ApiCall, data: chatMsgLog ){
// 整理数据
let logData:chatLog = {
uid: call.uid,
ip: call.conn.ip,
game: 'heijiao',
owner: call.conn.gud.bindUid,
name: call.conn.gud.name,
type: data.type,
toUid: data.toUid || '',
content: data.content,
ctime: G.time,
vip: call.conn.gud.vip,
lv: call.conn.gud.lv,
sid: call.conn.gud.sid
}
// 写入记录
G.mongodb.collection('chatLog').insertOne(logData)
return
}
}