Files
mir_server/server/LogicServer/base/ChatManager.h

229 lines
6.5 KiB
C
Raw Normal View History

2025-01-09 17:45:40 +08:00

#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:truefalse
*/
bool IsStrInvalid(char * pInput, UINT_PTR nMode = 1, int* pLen = nullptr);
/*
* Comments:
* Param int nHashFunCount:hash函数的格式
* Param int nMemory:byte
* @Return bool:truefalse
*/
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;
};