Files
mir_server/server/LogicServer/base/ChatManager.h
aixianling 5c9f1dae4a init
2025-01-09 17:45:40 +08:00

229 lines
6.5 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#pragma once
#include "CFilter.h" //屏蔽字库
#include "AcAuto.h"
/***************************************************************/
/*
/* 聊天管理器
/* 管理屏蔽字符库,管理踢人屏蔽玩家发言的功能
/***************************************************************/
enum
{
eCS_CHATRECORDSREQ_NULL = 0,
eCS_CHATRECORDSREQ_BEGIN = 100,
eCS_CHATRECORDSREQ_MID = 99,
};
enum
{
eCS_CHATRCS_TYPE_NULL = 0,
eCS_CHATRCS_TYPE_SYS = 1,//原系统消息
eCS_CHATRCS_TYPE_FIGHT = 2,//战斗消息
};
class CChatManager:
public CComponent
{
public:
typedef struct NoticeData
{
char* sMsg; //公告内容
int nPos; //公告位置
int nId ; //公告id
int nMins; //时间间隔
unsigned int nStartTime;//开始时间
unsigned int nEndTime;//结束时间
//下面的数据不需保存
unsigned int nHitTime;//下次触发的时间
NoticeData()
{
memset(this,0,sizeof(*this));
}
}NOTICEDATA;
typedef struct ChatRecord
{
union
{
struct
{
LONGLONG llId;
};
struct
{
unsigned int msgTime; //创建时间
int intVal;
};
};
byte msgType; //有系统消息 和 战斗消息
int msgCount; //内容长度
char msg[1024]; //公告内容
ChatRecord()
{
memset(this,0,sizeof(*this));
}
}CHATRECORD;
CChatManager()
#ifndef USE_HASK_FILTER
: m_pForbitWords(nullptr)
, m_pFilterWords(nullptr)
#endif
{
m_nPos = 0;
}
virtual bool Initialize(); //初始化组件
static bool ChatCsRecordSort(CHATRECORD tmp1, CHATRECORD tmp2);
VOID Destroy();
//定期发送全服公告
VOID RunOne(TICKCOUNT nTickCount);
/*
* Comments:屏蔽一个字符
* Param INOUT char * pInput:输入的字符串
* @Return int:返回屏蔽了的字符的个数
*/
int Filter( char *pInput);
/*
* Comments: 一个字符串是否和谐
* Param char * pInput:字符串指针
* @param nMode 1敏感词库 2 禁言库
@param pLen 返回匹配的长度,
* @Return bool:和谐返回true否则返回false
*/
bool IsStrInvalid(char * pInput, UINT_PTR nMode = 1, int* pLen = nullptr);
/*
* Comments:重新装载内存管理器
* Param int nHashFunCount:hash函数的格式
* Param int nMemory:内存的数目单位byte
* @Return bool:成功返回true否则返回false
*/
bool ReloadFilterDb(int nHashFunCount=4,int nMemoryBytes=2500000); //重新装载屏蔽字符库
void ParseNotice( LPCTSTR sPtr );
//************************************
// Method: AddNotice
// Comments: 根据id新加一个公告如果已经存在则更新
// Parameter: int nId 公告id
// Parameter: unsigned int nStartTime 开始时间
// Parameter: unsigned int nEndTime 结束时间
// Parameter: int nMins 间隔时间
// Parameter: INT_PTR nDisplayPos 显示位置
// Parameter: LPCSTR sMemo 公告
//************************************
bool AddNotice(int nId, unsigned int nStartTime, unsigned int nEndTime, int nMins, int nDisplayPos, LPCSTR sMemo);
//获取公告
NOTICEDATA* GetNotice(int nId);
//根据索引删除notice该函数时在m_GameNotice正序循环中调用时需注意索引问题
void RemoveNoticeByIndex(INT_PTR index);
void SendNoticeToBackMgr();
/*
* Comments:删除指定的公告
* Param LPCSTR sMemo:必须全文匹配才能成功删除
* @Return void:
*/
bool DeleteNotice(LPCSTR sMemo);
/*
* Comments:保存公告到文件中
* @Return void:
*/
void SaveNotice();
//后台给玩家直接发送离线消息 nActorName 玩家名称 nMsg 消息类容
void GmSendOffMsgToActor(LPCSTR nActorName,LPCSTR nMsg);
//后台添加屏蔽字 strWords:屏蔽字nParam1表示添加2 表示删除 nTag: 1 表示添加或删除发言的屏蔽字 2 表示添加或删除创建角色的屏蔽字
void MgrAddFilterWords(char* strWords,int nParam,int nTag,int nRecog);
bool AddKeyword( char* pKeyword, int mode);
static bool AppendLine2File(const char* pFileName, const char* pLine);
//获取公告列表
inline CVector<NOTICEDATA> & GetNoticeList() { return m_GameNotice;}
/*
* Comments:数据服务器返回数据
* Param INT_PTR nCmd:
* Param INT_PTR nErrorCode:
* Param CDataPacketReader & inPacket:
* @Return VOID:
*/
VOID OnDbReturnData(INT_PTR nCmd,char * data,SIZE_T size);
/*
* Comments:后台删除所有公告
* @Return void:
*/
bool DeleteAllNotice();
/*
* Comments:根据id删除指定的公告
* Param id
* @Return void:
*/
bool DeleteNoticeById(int nId);
//聊天禁言ip次数
int GetChatShutUpIpCount(unsigned long);
//ip禁言次数增加
void AddChatShutUpIpCount(unsigned long nIp);
void AddChatRecord(const char* msg, int nSize);
void sendHistoryChatMsg(CActor* pActor);
void addShowItem(CUserItem* pUserItem);
void GetShowItem(CUserItem& userItem, LONG64 iid);
//系统聊天信息入包
void OnMakeChatRecordPacket(CDataPacket &pdata, int nPageNum, UINT nNow);
void OnAddChatRecordPacketByCs(CDataPacketReader &pdata);
bool AddChatCsRecord(CHATRECORD& Record);
std::vector<CHATRECORD>& GetChatCsRecord(){ return m_nChatCsRecords;};
//void AddFightRecord(const char* msg, int nSize); //跨服战斗消息,逻辑服存储
void OnBroadTipToBranch(CHATRECORD& reocrd); //及时发送系统提示
bool OnCsAddPkMsgRecord(CDataPacketReader &pdata);//收到跨服来的系统消息
bool OnCsAddSysMsgRecord(CDataPacketReader &pdata);//收到跨服来的系统消息
void OnSendHistoryCsSysMsg(CActor* pActor);
bool OnSendPkCsChat(CHATRECORD& record);
bool OnSendCsSysChat(CHATRECORD& record);//系统消息 需要解包
bool OnCheckCanMsg();//是否可以跨服消息
bool OnBackClearAllMsg();//后台清理消息
private:
//2个屏蔽字管理器根据defile选取
#ifdef USE_HASK_FILTER
CFilter m_hashFilter; ///< 屏蔽字
CFilter m_forbitWards; ///< 禁言
#else
PFT_MBCS_CHAR m_pFilterWords; ///< 屏蔽词列表
PFT_MBCS_CHAR m_pForbitWords; ///< 禁言词列表
#endif
CVector<NOTICEDATA> m_GameNotice; //全服的公告列表
int m_nPos; //当前播放到第几条
CTimer<60000> m_timer; //1分钟
//CTimer<1800000> m_HalfTimer; //半个小时
CTimer<60000> m_HalfTimer; //半个小时
std::map<unsigned long,int> m_chatShutUpIpCountMap;//ip聊天禁言次数记录
std::vector<CHATRECORD> m_nChatRecords; //
std::vector<CUserItem> m_nShowItem; //展示物品
static int nMax_ChatRecord;
//新增跨服消息
std::vector<CHATRECORD> m_nChatCsRecords;
std::map<LONGLONG, unsigned int> m_mapChatCs;
//std::vector<CHATRECORD> m_nCsFightRecords;
};