This commit is contained in:
aixianling
2025-01-09 17:45:40 +08:00
commit 5c9f1dae4a
3482 changed files with 1146531 additions and 0 deletions

View File

@@ -0,0 +1,887 @@
#include "StdAfx.h"
#include "ChatSystem.h"
#define NEXTSUBMITTIME 30 //提交建议的时间间隔限制
#define CHAT_BUFF_SIZE 256 //聊天读取buff大小
bool CChatSystem::CheckChannelCD(tagChannelID cid)
{
if ((cid < 0) || (cid >= ciChannelMax)) return false;
TICKCOUNT nCurrentTime = GetLogicCurrTickCount();
if (nCurrentTime >= m_nNextHitTime[cid])
{
int nChatCD = 0;
CLogicDataProvider *pDataProvider = GetLogicServer()->GetDataProvider();
/*
if (cid == ciChannelZhenying)
{
int nCampTitle = m_pEntity->GetProperty<int>(PROP_ACTOR_CAMP_TITLE);
if (nCampTitle != INVALID_CAMP_TITLE_ID)
{
const CampTitleNode* pNode = pDataProvider->GetCampConfig().m_CampTitleTree.GetTitleNode(nCampTitle);
if (pNode)
{
nChatCD = pNode->m_self.m_nChatCD;
m_nNextHitTime[cid] = nCurrentTime + nChatCD;
return true;
}
}
}
*/
//GLOBALCONFIG &gc = GetLogicServer()->GetDataProvider()->GetGlobalConfig();
CHATSYSTEMCONFIG &gc = GetLogicServer()->GetDataProvider()->GetChatSystemConfig();
int nChannelCD = gc.nChatChannelCD[cid];
m_nNextHitTime[cid] = nCurrentTime + nChannelCD;
return true;
}
return false;
}
void CChatSystem::OnEnterGame()
{
if(m_pEntity) {
((CActor*)m_pEntity)->SetProperty<unsigned int>(PROP_ACTOR_BANCHAT, m_nFreePostTime);
GetGlobalLogicEngine()->GetChatMgr().sendHistoryChatMsg(((CActor*)m_pEntity));
}
}
bool CChatSystem::CheckLimit(tagChannelID cid)
{
if ((cid < 0) || (cid >= ciChannelMax)) return false;
//GLOBALCONFIG &gc = GetLogicServer()->GetDataProvider()->GetGlobalConfig();
CHATSYSTEMCONFIG &gc = GetLogicServer()->GetDataProvider()->GetChatSystemConfig();
if(((CActor*)m_pEntity)->GetRechargeNum() > 0 && gc.nRechargeopen[cid] >= 1)
return true;
if( !( ((CActor*)m_pEntity)->CheckLevel((int)gc.ChatLimit[cid].wLevel, 0) && ((CActor*)m_pEntity)->CheckRecharge(gc.ChatLimit[cid].nRechargeAmount) ) )
{
m_pEntity->SendTipmsgFormatWithId(tmchatLevelLimit, tstFigthing, gc.ChatLimit[cid].wLevel, gc.ChatLimit[cid].nRechargeAmount);
return false;
}
return true;
}
void CChatSystem::SetGambleFlag(bool isClose)
{
//开启赌博
CDataPacket& dataPacket =GetLogicServer()->GetDbClient()->allocProtoPacket(jxInterSrvComm::DbServerProto::dcSetGambleFlag);
dataPacket <<(unsigned int ) (isClose ?1:0); //玩家ID
GetLogicServer()->GetDbClient()->flushProtoPacket(dataPacket);
}
bool CChatSystem::IsDigit(char * str)
{
if(str ==NULL) return false;
for (INT_PTR i=0; i < (INT_PTR)strlen(str); i++)
{
if( i==0 && str[i] == '-') continue;
if( str[i] < '0' || str[i] > '9' )
{
return false;
}
}
return true;
}
//网络数据处理
void CChatSystem::ProcessNetData(INT_PTR nCmd,CDataPacketReader &inPack )
{
bool result = false;
do
{
if (m_pEntity ==NULL) break;
unsigned int nSex = m_pEntity->GetProperty<unsigned int>(PROP_ACTOR_SEX); //获取玩家的性别
unsigned int nCircle = m_pEntity->GetProperty<unsigned int>(PROP_ACTOR_CIRCLE); //获取玩家的转数
if (nCmd == cSendReqCsChat)
{
OnCustomReqCsChat(inPack);
// BYTE nChannleID = 0;
// int nSvID = 0;
// unsigned int nMsgTime = 0;
// inPack >> nChannleID;
// inPack >> nSvID;
// inPack >> nMsgTime;
// char strBuff[10240];
// memset(strBuff, 0, sizeof(strBuff));
// CActorPacket ap;
// CDataPacket& outPack = m_pEntity->AllocPacket(ap);
// //CDataPacket outPack(strBuff, sizeof(strBuff));
// outPack << (BYTE) enChatSystemID << (BYTE)sSendReqCsChat <<(BYTE)ciChannelTipmsg;
// int ccount = 0;
// INT_PTR nOffer = outPack.getPosition();
// outPack << ccount;
// std::vector<CChatManager::CHATRECORD> & pCsRecord = GetGlobalLogicEngine()->GetChatMgr().GetChatCsRecord();
// for (size_t i = 0; i < pCsRecord.size(); i++)
// {
// if(nMsgTime != 0 && pCsRecord[i].msgTime <= nMsgTime)
// {
// continue;
// }
// outPack << (unsigned int) pCsRecord[i].msgTime;
// std::string sstr = pCsRecord[i].msg;
// outPack.writeString(sstr.c_str());
// ccount++;
// }
// INT_PTR nOffer2 = outPack.getPosition();
// outPack.setPosition(nOffer);
// outPack << ccount;
// outPack.setPosition(nOffer2);
// ap.flush();
}
else if (nCmd == cSendClearMsgRefresh)
{
OnEnterGame();
}
else if (nCmd == cSendChat)
{
BYTE nChannleID =0;
inPack >> nChannleID;
char msg[CHAT_BUFF_SIZE];
size_t nReadSize= inPack.readString( msg,sizeof(msg) );
if (!CheckChatLen(msg))
{
m_pEntity->SendTipmsgFormatWithId(tmchaToLength, tstFigthing);
break;
}
if (HaveCutChar(msg))
{
m_pEntity->SendTipmsgFormatWithId(tmchatillegal, tstFigthing);
break;
}
if('@' == msg[0]) //GM命令来了
{
if (m_pEntity->GetGmLevel() >= 0)
{
ProcessGmCommand(msg);
}
break; // 不是GM直接忽略该聊天
}
if (!CheckLimit((tagChannelID)nChannleID))
{
break;
}
if (IsForbit(nChannleID))
{
m_pEntity->SendTipmsgFormatWithId(tmThisChanalForbit, tstUI);
break;
}
if (!CheckChannelCD((tagChannelID)nChannleID) && !m_bIsTalkFree )
{
m_pEntity->SendTipmsgFormatWithId(tmchatCDLimit, tstFigthing);
break;
}
if (IsShutup())
{
m_pEntity->SendTipmsgFormatWithId(tmBanChat, tstChatSystem);
break;
}
byte nParam = 0;
std::string sendName = "";
ACTORNAME name;
inPack.readString(name,sizeof(name)); // 读取名字
sendName = name;
if(nChannleID == ciChannelSecret) //私聊
{
CActor * pActor = GetGlobalLogicEngine()->GetEntityMgr()->GetActorPtrByName(sendName.c_str()); //对方玩家
if(pActor ==NULL)
{
m_pEntity->SendTipmsgFormatWithId(tmpChatTargetOffLine, tstFigthing);
break;
}
if(pActor && pActor->GetId() == m_pEntity->GetId())
{
m_pEntity->SendTipmsgFormatWithId(tmChatnotaddSelf, tstFigthing);
break;
}
}
BYTE isItem = 0;
CUserItem::ItemSeries itemGuid;
inPack >>isItem;
if(isItem == 1)
{
inPack >> itemGuid.llId;
CUserItem* pUserIem= m_pEntity->GetBagSystem().FindItemByGuid(itemGuid);
if(pUserIem) {
GetGlobalLogicEngine()->GetChatMgr().addShowItem(pUserIem);
}
}
//发送消息
result = SendChat(nChannleID, msg, true, nParam, sendName, itemGuid.llId);
//发送聊天信息到日志
if (!IsShutup() && GetLogicServer()->GetLogClient())
{
LPCSTR sIp = ((CActor *)m_pEntity)->GetIp();
char sBuff[500];
sprintf_s(sBuff, ArrayCount(sBuff), "%s\b%s\b%s", sIp,m_pEntity->GetAccount(), msg);
GetLogicServer()->GetLogClient()->SendChatLog(nChannleID, (char*)m_pEntity->GetEntityName(),m_pEntity->GetId(), sBuff);
}
}
else if( nCmd == cGmBroadCast) //GM发公告
{
if(m_pEntity->GetGmLevel() <=0 ) break; //不是gm不能发
int nMask =0;
char buff[512];
inPack.readString(buff,sizeof(buff)); //读取消息
if (HaveCutChar(buff))
{
break;
}
inPack >> nMask; //需要显示的位置
GetGlobalLogicEngine()->GetEntityMgr()->BroadcastTipmsg(buff,nMask);
}
else if(nCmd == cSendHelp) //求救
{
BroadcastSendHelp(inPack);
}
else if(nCmd == cGetChatShowItem)
{
CUserItem::ItemSeries itemGuid;
inPack >> itemGuid.llId;
CActorPacket ap;
CDataPacket& data = m_pEntity->AllocPacket(ap);
data << (BYTE)enChatSystemID << (BYTE)sGetChatShowItem;
CUserItem userItem;
GetGlobalLogicEngine()->GetChatMgr().GetShowItem(userItem, itemGuid.llId);
if(userItem.series.llId > 0)
{
data << (BYTE)1;
userItem >>data;
}else
{
data <<(BYTE)0;
}
ap.flush();
return;
}
}while (false);
CActorPacket pack;
CDataPacket & data = m_pEntity->AllocPacket(pack);
data << (BYTE) enChatSystemID << (BYTE) sChatResult;
data<<(BYTE)result;
pack.flush();
}
//求救
void CChatSystem::BroadcastSendHelp(CDataPacketReader &inPack)
{
}
bool CChatSystem::SendChat(int nChannleID, char *msg, bool boSave, byte nParam, std::string sendName, LONG64 itemId)
{
if (m_pEntity ==NULL) return false;
char buff[1024];
CDataPacket outPack(buff, sizeof(buff)); //下发的数据包
unsigned int nSex =m_pEntity->GetProperty<unsigned int>(PROP_ACTOR_SEX); //获取玩家的性别
unsigned int nCircle = m_pEntity->GetProperty<unsigned int>(PROP_ACTOR_CIRCLE); //获取玩家的转数
/// 禁言
CheckAutoSilencing(msg);
GetGlobalLogicEngine()->GetChatMgr().Filter(msg) ;
outPack << (BYTE) enChatSystemID << (BYTE)sSendChat <<(BYTE)nChannleID;
outPack.writeString(m_pEntity->GetEntityName()); //把自己的名字写上去
outPack.writeString(msg);
outPack << m_pEntity->GetLevel();
Uint64 actorid = Uint64(m_pEntity->GetHandle());
outPack <<actorid;
outPack<<(unsigned int)(m_pEntity->GetProperty<unsigned int>(PROP_ACTOR_SUPPER_PLAY_LVL));
outPack << (BYTE)(itemId != 0? 1:0);
if(itemId != 0)
{
outPack << itemId;
}
bool boCanSendToLog = true;
if (IsShutup())
{
((CActor *)m_pEntity)->SendData(outPack.getMemoryPtr(), outPack.getPosition());
}
else
{
switch(nChannleID)
{
case ciChannelSecret: //私聊
{
CActor * pActor = GetGlobalLogicEngine()->GetEntityMgr()->GetActorPtrByName(sendName.c_str()); //对方玩家
if(pActor ==NULL)
{
m_pEntity->SendTipmsgFormatWithId(tmpChatTargetOffLine, tstFigthing);
return false;
}
if(pActor->GetFriendSystem().GetSocialFlag(m_pEntity->GetId(),SOCIAL_BLACK))
{
m_pEntity->SendTipmsgFormatWithId(tmpChatTargetOffLine, tstFigthing);
return false;
}
if (!pActor->OnGetIsSimulator()
&& !pActor->OnGetIsTestSimulator())
{
CActorPacket pack;
CDataPacket & data = pActor->AllocPacket(pack);
data.writeBuf(outPack.getMemoryPtr(),outPack.getPosition());
pack.flush();
}
// ((CActor*)m_pEntity)->GetFriendSystem().AddLinkManLately(pActor); //本人的“私聊”添加对方
// pActor->GetFriendSystem().AddLinkManLately((CActor*)m_pEntity); //对方的“私聊”添加本人
}
break;
case ciChannelNear: //附近
{
m_pEntity->GetObserverSystem()->BroadCast(outPack.getMemoryPtr(), outPack.getPosition(),true); //附近广播
break;
}
case ciChannelGuild: //工会
m_pEntity->GetGuildSystem()->BroadCast(outPack.getMemoryPtr(), outPack.getPosition());
break;
case ciChannelTeam: //队伍聊天
m_pEntity->GetTeamSystem().BroadCast(outPack.getMemoryPtr(), outPack.getPosition());
break;
case ciChannelWorld: //世界频道
{
// CUserItemContainer::ItemOPParam param;
// param.wItemId = (WORD) (GetLogicServer()->GetDataProvider()->GetChatSystemConfig().nWorldChatItemItem); //世界喊话的物品的ID
// param.btBindFlag = -1;
// CUserBag& bag = m_pEntity->GetBagSystem();
// param.wCount = 1;
// if (param.wCount <= bag.GetItemCount(param.wItemId))
// {
// //ms.SendLackItem(param.wItemId, param.wCount);
// if(bag.DeleteItem(param,"laba",GameLog::clWorldTalkItem/*, -1, m_pEntity*/) < 1)
// return false;
// }
// int boratNum = m_pEntity->GetProperty<int>(PROP_ACTOR_BROATNUM);
// if(boratNum ==0)
// {
// m_pEntity->SendTipmsgFormatWithId(tmBoratNotEnough, tstFigthing);
// return false;
// }
// m_pEntity->RemoveConsume(qatBroat, 0, 1, -1, -1,-1,0, GameLog::Log_WorldChat);
//全服聊天限制
int nVip = ((CActor*)m_pEntity)->GetMiscSystem().GetMaxColorCardLevel();
CHATSYSTEMCONFIG &gc = GetLogicServer()->GetDataProvider()->GetChatSystemConfig();
if(nVip >= gc.nVipChats.size()) {
return false;
}
int nMaxTimes = gc.nVipChats[nVip];
int nUseTimes = ((CActor*)m_pEntity)->GetStaticCountSystem().GetStaticCount(gc.nCounter);
if((nMaxTimes != -1) && (nUseTimes >= nMaxTimes)) {
m_pEntity->SendTipmsgFormatWithId(tmChatVipLimit, tstUI);
return false;
}
((CActor*)m_pEntity)->GetStaticCountSystem().AddStaticCount(gc.nCounter,1);
GetGlobalLogicEngine()->GetChatMgr().AddChatRecord(outPack.getMemoryPtr(), outPack.getPosition());
GetGlobalLogicEngine()->GetEntityMgr()->BroadCast(outPack.getMemoryPtr(), outPack.getPosition());
if(nMaxTimes != -1 && nMaxTimes-nUseTimes-1 <= gc.nDisplayLeftTimesLimit ) {
m_pEntity->SendTipmsgFormatWithId(tmChatVipLeftTimes, tstFigthing,nMaxTimes-nUseTimes-1);
}
// LPCTSTR sLogText = GetLogicServer()->GetDataProvider()->GetOldTipmsgConfig().GetTipmsg(tpLogWorldChat);
// if (nCount == 0 || m_pEntity->ChangeMoney(mtCoin,-1*nCount,GameLog::clChatMoney,0, sLogText,true)) //先扣除银两才能进行世界聊天
// {
// GetGlobalLogicEngine()->GetEntityMgr()->BroadCast(outPack.getMemoryPtr(), outPack.getPosition());
// }
}
break;
default:
return false;
}
}
if (boCanSendToLog && boSave && GetLogicServer()->GetDataProvider()->GetChatSystemConfig().nChatLogFlag > 0)
{
SaveChatMsg(nChannleID, (char *)m_pEntity->GetEntityName(), msg);
}
// 贪玩聊天上报
static char *pSPID = (char *)GetLogicServer()->GetVSPDefine().GetDefinition("SPID");
char cSPID[CHAT_BUFF_SIZE] = {"27"};
if ( strcmp(pSPID, cSPID) == 0 )
{
TanWanChatReport(m_pEntity->GetAccount(), m_pEntity->GetId(), m_pEntity->GetEntityName(), nChannleID, msg, sendName.c_str());
}
return true;
}
bool CChatSystem::SendChatMessageByChannel(int channel, char * outPack,SIZE_T nSize)
{
switch(channel)
{
case ciChannelNear: //附近
m_pEntity->GetObserverSystem()->BroadCast(outPack, nSize,true); //附近广播
break;
case ciChannelGuild: //工会
m_pEntity->GetGuildSystem()->BroadCast(outPack, nSize);
break;
case ciChannelTeam: //队伍聊天
m_pEntity->GetTeamSystem().BroadCast(outPack, nSize);
break;
case ciChannelWorld: //世界频道
GetGlobalLogicEngine()->GetEntityMgr()->BroadCast(outPack, nSize);
break;
default:
return false;
}
}
void CChatSystem::SetShutup(bool bForbid, INT_PTR nDuration)
{
if (bForbid)
{
m_nFreePostTime = (unsigned int)(GetGlobalLogicEngine()->getMiniDateTime() + nDuration);
}
else
{
m_nFreePostTime = GetGlobalLogicEngine()->getMiniDateTime();
m_nChatHitCount = 0;
}
if(m_pEntity)
((CActor*)m_pEntity)->SetProperty<unsigned int>(PROP_ACTOR_BANCHAT, m_nFreePostTime);
m_bShutup = bForbid;
}
bool CChatSystem::IsShutup()
{
unsigned int nCurrTm = GetGlobalLogicEngine()->getMiniDateTime();
if (m_nFreePostTime <= nCurrTm)
{
m_nFreePostTime = nCurrTm;
m_nChatHitCount = 0;
return false;
}
return true;
}
unsigned int CChatSystem::GetFreePostTime()
{
return m_nFreePostTime;
}
void CChatSystem::SetOffLineShutUp(unsigned int nActorId, bool bForbid, INT_PTR nDuration)
{
CActor* pActor = GetGlobalLogicEngine()->GetEntityMgr()->GetEntityPtrByActorID(nActorId);
if(pActor)
{
pActor->GetChatSystem()->SetShutup(bForbid, nDuration);
}
else
{
if (bForbid)
{
unsigned int nTime = (unsigned int)(GetGlobalLogicEngine()->getMiniDateTime() + nDuration);
SaveShutUpData(nActorId, nTime);
}
else
{
SaveShutUpData(nActorId, 0);
}
}
}
void CChatSystem::SaveShutUpData(unsigned int nActorId, unsigned int nFreePostTime)
{
CCLVariant &var = GetGlobalLogicEngine()->GetGlobalVarMgr().GetVar();
CCLVariant* pList = var.get("FreePostTimeList");
if (!pList)
{
pList = &var.set("FreePostTimeList");
}
if (pList)
{
char sId[64];
sprintf(sId,"%u",nActorId);
CCLVariant* pActorVar = pList->get(sId);
if (!pActorVar)
{
pActorVar = &pList->set(sId);
}
if (pActorVar)
{
pActorVar->set("FreePostTime", (double)(nFreePostTime));
}
}
}
void CChatSystem::SaveToScriptData(PACTORDBDATA pData)
{
pData->nShutUpTime = m_nFreePostTime;
//SaveShutUpData(m_pEntity->GetId(), GetFreePostTime());
}
void CChatSystem::LoadFromScriptData()
{
CCLVariant &var = GetGlobalLogicEngine()->GetGlobalVarMgr().GetVar();
CCLVariant* pList = var.get("FreePostTimeList");
if (pList)
{
char sId[64];
sprintf(sId,"%u",m_pEntity->GetId());
CCLVariant* pActorVar = pList->get(sId);
if (pActorVar)
{
CCLVariant* pVar = pActorVar->get("FreePostTime");
if(pVar)
{
unsigned int nFreePostTime = (unsigned int)((double)(*pVar));
unsigned int nCurrMiniTime = GetGlobalLogicEngine()->getMiniDateTime();
if (nFreePostTime && nFreePostTime > nCurrMiniTime)
{
SetShutup(true, nFreePostTime - nCurrMiniTime);
}
}
}
}
}
char* CChatSystem::GetChannelName(int ChannelId)
{
switch(ChannelId)
{
case ciChannelSecret:
return GetLogicServer()->GetDataProvider()->GetOldTipmsgConfig().GetTipmsg(tpChannelSecret);
case ciChannelNear:
return GetLogicServer()->GetDataProvider()->GetOldTipmsgConfig().GetTipmsg(tpChannelNear);
// case ciChannelHorn:
// return GetLogicServer()->GetDataProvider()->GetOldTipmsgConfig().GetTipmsg(tpChannelHorn);
case ciChannelGuild:
return GetLogicServer()->GetDataProvider()->GetOldTipmsgConfig().GetTipmsg(tpChannelGuild);
case ciChannelTeam:
return GetLogicServer()->GetDataProvider()->GetOldTipmsgConfig().GetTipmsg(tpChannelTeam);
// case ciChannelBigTeam:
// return GetLogicServer()->GetDataProvider()->GetOldTipmsgConfig().GetTipmsg(tpChannelBigTeam);
// case ciChannelMap:
// return GetLogicServer()->GetDataProvider()->GetOldTipmsgConfig().GetTipmsg(tpChannelMap);
// case ciChannelTipmsg:
// return GetLogicServer()->GetDataProvider()->GetOldTipmsgConfig().GetTipmsg(tpChannelTipmsg);
// case ciChannelZhenying:
// return GetLogicServer()->GetDataProvider()->GetOldTipmsgConfig().GetTipmsg(tpChannelZhenying);
// case ciChannelSystem:
// return GetLogicServer()->GetDataProvider()->GetOldTipmsgConfig().GetTipmsg(tpChannelSystem);
case ciChannelWorld:
return GetLogicServer()->GetDataProvider()->GetOldTipmsgConfig().GetTipmsg(tpChannelWorld);
// case ciChannelHelp:
// return GetLogicServer()->GetDataProvider()->GetOldTipmsgConfig().GetTipmsg(tpChannelHelp);
// case ciChannelFriend:
// return GetLogicServer()->GetDataProvider()->GetOldTipmsgConfig().GetTipmsg(tpChannelZhenying); //复用成好友
default:
break;
}
return NULL;
}
void CChatSystem::SaveChatMsg(int ChannelId,char * userName,char * strMsg)
{
LPCTSTR channelName = GetChannelName(ChannelId);
if(channelName == NULL) return;
switch(ChannelId)
{
//case ciChannelSecret:
//case ciChannelNear:
case ciChannelGuild:
//case ciChannelTeam:
case ciChannelWorld:
case ciChannelSystem:
case ciChannelIntegrated:
{
//记录日志
if(GetLogicServer()->GetLocalClient())
{
}
break;
}
default:
break;
}
}
void CChatSystem::GetSortChatMsg(const char* msg, char* all, char* word)
{
LPCSTR sptr;
INT_PTR nLen = 0;
unsigned char ch;
char letter[CHAT_BUFF_SIZE] = {'\0'};
char other[CHAT_BUFF_SIZE] = {'\0'};
for ( sptr = msg; *sptr; sptr= sptr + nLen)
{
ch = (unsigned char)*sptr;
if((ch & 0xF8) == 0xF8) //5个字节111110xx 10xxxxxx 10xxxxxx 10xxxxxx
{
nLen =5;
}
else if( (ch & 0xF0) == 0xF0 )//4个字节11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
{
nLen =4;
}
else if( (ch & 0xE0) == 0xE0)//3个字节1110xxxx 10xxxxxx 10xxxxxx
{
nLen =3;
}
else if( (ch & 0xC0) == 0xC0 )//2个字节110xxxxx 10xxxxxx
{
nLen =2;
}
else
{
nLen =1;
}
if (nLen >=2)
{
strncat(all,sptr,nLen);
strncat(word,sptr,nLen);
}
else if (nLen == 1)
{
if (ch > 'A' && ch <'Z' || ch >'a'&& ch < 'z')
{
strncat(letter,sptr,nLen);
}
else
{
strncat(other,sptr,nLen);
}
}
}
strcat(all,letter);
strcat(all,other);
}
// 检测禁言
void CChatSystem::CheckAutoSilencing(const char* msg)
{
//GLOBALCONFIG& gc(GetLogicServer()->GetDataProvider()->GetGlobalConfig());
CHATSYSTEMCONFIG& gc = GetLogicServer()->GetDataProvider()->GetChatSystemConfig();
if( ! m_pEntity->CheckLevel((int)gc.nAutoSilenceLevel+1, 0))
{ // 包含nAutoSilenceLevel所以+1
char all[CHAT_BUFF_SIZE] = {'\0'};//排序下中文字母,提高屏蔽字识别率
char word[CHAT_BUFF_SIZE] = {'\0'};//中文
GetSortChatMsg(msg,all,word);
if (! GetGlobalLogicEngine()->GetChatMgr().IsStrInvalid((char*)all, 2))
{
++m_nChatHitCount;
}
if (strcmp(m_lastChatMsg,word) == 0)//只记录中文
{
m_nSameChatMsgCount++;
}
else
{
m_nSameChatMsgCount = 0;
}
strcpy(m_lastChatMsg,word);
if ( !IsShutup())
{
CChatManager &mgr= GetGlobalLogicEngine()->GetChatMgr();
unsigned long nIp = inet_addr(m_pEntity->GetIp());
int nShutupIpCount = mgr.GetChatShutUpIpCount(nIp);
if (nShutupIpCount >= gc.nAutoSilenceSameIpShutup)//ip禁言
{
SetShutup(true, gc.nAutoSilencingSecond );
}
if (m_nChatHitCount > gc.nAutoSilencing)//forbitword禁言
{
SetShutup(true, gc.nAutoSilencingSecond );
// mgr.AddChatShutUpIpCount(nIp);
}
if (m_nSameChatMsgCount >= gc.nSameChatSliencingCount)//发相同内容禁言
{
SetShutup(true, gc.nSameChatSliencingSecond );
// mgr.AddChatShutUpIpCount(nIp);
m_nSameChatMsgCount =0;
}
}
}
}
bool CChatSystem::CheckChatLen(char* msg)
{
size_t nLen = strlen(msg);
if (strncmp(msg,"[<#",3)==0)//展示装备功能
{
if (nLen > 300)
{
return false;
}
}
//字符长度过长的话,多半是模拟发言了
else if( nLen > 120)//客户端最多40字符中文)
{
//m_pEntity->CloseActor(false);
return false;
}
return true;
}
bool CChatSystem::HaveCutChar(char* InputStr)
{
bool boResult = false;
if( strstr(InputStr,"<url>") || strstr(InputStr, "font") || strstr(InputStr, "color") || strstr(InputStr, "<<") || strstr(InputStr, ">>")
||strstr(InputStr,"\r") || strstr(InputStr, "\n")) //客户端传入的消息,存在非法内容
{
boResult = true;
}
return boResult;
}
void CChatSystem::OnCustomReqCsChat(CDataPacketReader& inPack)
{
if(!m_pEntity)
return;
BYTE nChannleID = 0;
int nSvID = 0;
unsigned int nMsgTime = 0;
inPack >> nChannleID;
inPack >> nSvID;
inPack >> nMsgTime;
if (nChannleID == ciChannelTipmsg)
{
char strBuff[10240];
memset(strBuff, 0, sizeof(strBuff));
CActorPacket ap;
CDataPacket& outPack = m_pEntity->AllocPacket(ap);
//CDataPacket outPack(strBuff, sizeof(strBuff));
outPack << (BYTE) enChatSystemID << (BYTE)sSendReqCsChat <<(BYTE)ciChannelTipmsg;
int ccount = 0;
INT_PTR nOffer = outPack.getPosition();
outPack << ccount;
std::vector<CChatManager::CHATRECORD> & pCsRecord = GetGlobalLogicEngine()->GetChatMgr().GetChatCsRecord();
for (size_t i = 0; i < pCsRecord.size(); i++)
{
if(nMsgTime != 0 && pCsRecord[i].msgTime <= nMsgTime)
{
continue;
}
outPack << (byte) pCsRecord[i].msgType;
outPack << (unsigned int) pCsRecord[i].msgTime;
std::string sstr = pCsRecord[i].msg;
outPack.writeString(sstr.c_str());
ccount++;
}
INT_PTR nOffer2 = outPack.getPosition();
outPack.setPosition(nOffer);
outPack << ccount;
outPack.setPosition(nOffer2);
ap.flush();
}
}
// void CChatSystem::OnSendCsChat(CChatManager::CHATRECORD& record)
// {
// if(!m_pEntity)
// return;
// char strBuff[10240];
// memset(strBuff, 0, sizeof(strBuff));
// CActorPacket ap;
// CDataPacket& outPack = m_pEntity->AllocPacket(ap);
// //CDataPacket outPack(strBuff, sizeof(strBuff));
// outPack << (BYTE) enChatSystemID << (BYTE)sSendReqCsChat <<(BYTE)ciChannelTipmsg;
// int ccount = 0;
// INT_PTR nOffer = outPack.getPosition();
// outPack << 1;
// {
// outPack << (byte) record.msgType;
// outPack << (unsigned int) record.msgTime;
// std::string sstr = record.msg;
// outPack.writeString(sstr.c_str());
// }
// ap.flush();
// }
void CChatSystem::TanWanChatReport(LPCTSTR szAccount, int nActorId, LPCTSTR szActorName, int nChannelId, LPCTSTR szMsg, LPCTSTR szSendToActorName)
{
if ( nChannelId < 0 || nChannelId > ciChannelMax)
{
OutputMsg(rmError,"TanWanChatReport nChannelId 错误 频道Id=%d !", nChannelId);
return;
}
int nTanWanChannleId = 0;
switch(nChannelId)
{
case ciChannelSecret: //私聊
{
nTanWanChannleId = 1;
break;
}
case ciChannelNear: //附近频道,同屏
{
nTanWanChannleId = 8;
break;
}
case ciChannelGuild: //工会,帮派
{
nTanWanChannleId = 6;
break;
}
case ciChannelTeam: //队伍频道,5人
{
nTanWanChannleId = 7;
break;
}
case ciChannelWorld: //世界频道
{
nTanWanChannleId = 4;
break;
}
default:
{
nTanWanChannleId = 0;
break;
}
}
if ( !nTanWanChannleId )
{
OutputMsg(rmError,"TanWanChatReport nTanWanChannleId 错误 频道Id=%d !", nTanWanChannleId);
return;
}
int nServerId = GetLogicServer()->GetServerIndex();
char* szServerName = (char *)GetLogicServer()->getServerName();
static CNpc* globalNpc = GetGlobalLogicEngine()->GetGlobalNpc();
if ( globalNpc )
{
CScriptValueList paramList;
paramList << nServerId;
paramList << szServerName;
paramList << szAccount;
paramList << nActorId;
paramList << szActorName;
paramList << nTanWanChannleId;
paramList << szMsg;
paramList << szSendToActorName;
if ( !globalNpc->GetScript().CallModule("TanWanChatReport", "OnReqTanWanChatReport", paramList, paramList, 0) )
{
OutputMsg(rmError,"TanWanChatReport OnReqTanWanChatReport 错误 玩家=%s !", szActorName);
}
}
}