server/game/src/banword.cpp
2022-03-05 12:44:06 +02:00

127 lines
2.0 KiB
C++

#include "stdafx.h"
#include "constants.h"
#include "banword.h"
#include "config.h"
extern void SendLog(const char * c_pszBuf); // ¿î¿µÀÚ¿¡°Ô¸¸ °øÁö
CBanwordManager::CBanwordManager()
{
}
CBanwordManager::~CBanwordManager()
{
}
bool CBanwordManager::Initialize(TBanwordTable * p, WORD wSize)
{
m_hashmap_words.clear();
for (WORD i = 0; i < wSize; ++i, ++p)
m_hashmap_words[p->szWord] = true;
char szBuf[256];
snprintf(szBuf, sizeof(szBuf), "Banword reloaded! (total %zu banwords)", m_hashmap_words.size());
SendLog(szBuf);
return true;
}
bool CBanwordManager::Find(const char * c_pszString)
{
return m_hashmap_words.end() != m_hashmap_words.find(c_pszString);
}
bool CBanwordManager::CheckString(const char * c_pszString, size_t _len)
{
if (m_hashmap_words.empty())
return false;
typeof(m_hashmap_words.begin()) it = m_hashmap_words.begin();
while (it != m_hashmap_words.end())
{
const std::string & r = it->first;
const char * tmp = c_pszString;
ssize_t len = _len;
while (len > 0)
{
if (is_twobyte(tmp))
{
if (!strncmp(tmp, r.c_str(), r.size()))
return true;
tmp += 2;
len -= 2;
}
else
{
if (!strncmp(tmp, r.c_str(), r.size()))
return true;
++tmp;
--len;
}
}
it++;
}
return false;
}
void CBanwordManager::ConvertString(char * c_pszString, size_t _len)
{
typeof(m_hashmap_words.begin()) it = m_hashmap_words.begin();
while (it != m_hashmap_words.end())
{
const std::string & r = it->first;
char * tmp = c_pszString;
ssize_t len = _len;
while (len > 0)
{
if (is_twobyte(tmp))
{
if (!strncmp(tmp, r.c_str(), r.size()))
{
memset(tmp, '*', r.size());
tmp += r.size();
len -= r.size();
}
else
{
tmp += 2;
len -= 2;
}
}
else
{
if (*tmp == '*')
{
++tmp;
--len;
continue;
}
if (!strncmp(tmp, r.c_str(), r.size()))
{
memset(tmp, '*', r.size());
tmp += r.size();
len -= r.size();
}
else
{
++tmp;
--len;
}
}
}
it++;
}
}