229 lines
6.5 KiB
C++
229 lines
6.5 KiB
C++
|
||
#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:屏蔽字,nParam:1表示添加,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;
|
||
};
|