95 lines
3.0 KiB
TypeScript
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
|
|
}
|
|
} |