156 lines
No EOL
4.4 KiB
C++
156 lines
No EOL
4.4 KiB
C++
|
|
#include "Stdafx.h"
|
|
#include "ReservedNotice.h"
|
|
#include "ServiceManager.h"
|
|
#include "Log.h"
|
|
#include "StringUtil.h"
|
|
|
|
CReservedNotice::CReservedNotice()
|
|
{
|
|
}
|
|
|
|
CReservedNotice::~CReservedNotice()
|
|
{
|
|
ScopeLock<CSyncLock> Lock(m_Sync);
|
|
ClearNotice();
|
|
}
|
|
|
|
void CReservedNotice::IdleProcess()
|
|
{
|
|
ScopeLock<CSyncLock> Lock(m_Sync);
|
|
|
|
time_t tt;
|
|
time(&tt);
|
|
localtime(&tt);
|
|
ULONG nCurTime = timeGetTime();
|
|
|
|
TReservedNoticeInfo * pInfo = NULL;
|
|
std::vector <TReservedNoticeInfo*>::iterator ii;
|
|
int nNoticeCount = 0;
|
|
for (ii = m_NoticeList.begin(); ii != m_NoticeList.end(); )
|
|
{
|
|
pInfo = (*ii);
|
|
if (pInfo->_tBeginTime < tt)
|
|
{
|
|
bool bIsPeriod = false;
|
|
if (pInfo->nPeriodSec > 0 && pInfo->_tEndTime > tt)
|
|
bIsPeriod = true;
|
|
|
|
if (bIsPeriod && pInfo->nLastNoticeTime > 0 && pInfo->nLastNoticeTime + (pInfo->nPeriodSec * 1000) > nCurTime)
|
|
{
|
|
ii++;
|
|
continue;
|
|
}
|
|
|
|
switch (pInfo->nNoticeType)
|
|
{
|
|
case _NOTICETYPE_ALL: g_pServiceManager->NoticeWholeWorld(pInfo->nDurationSec, pInfo->szNoticeMsg.c_str()); break;
|
|
case _NOTICETYPE_WORLD: g_pServiceManager->NoticeWorld(pInfo->nMasterMID, pInfo->nDurationSec, pInfo->szNoticeMsg.c_str()); break;
|
|
case _NOTICETYPE_ZONE: g_pServiceManager->NoticeZone(pInfo->nMasterMID, pInfo->nMapIdx, pInfo->nDurationSec, pInfo->szNoticeMsg.c_str()); break;
|
|
case _NOTICETYPE_CHANNEL: g_pServiceManager->NoticeChannel(pInfo->nMasterMID, pInfo->nChannelID, pInfo->nDurationSec, pInfo->szNoticeMsg.c_str()); break;
|
|
}
|
|
|
|
g_Log.Log(LogType::_FILELOG, L"ReserveNotice [ID:%d][Msg:%S][Type:%d][Period:%d][Duration:%d]\n", pInfo->nNoticeID, pInfo->szNoticeMsg.c_str(), pInfo->nNoticeType, pInfo->nPeriodSec, pInfo->nDurationSec);
|
|
|
|
if (bIsPeriod == false)
|
|
ii = m_NoticeList.erase(ii);
|
|
else
|
|
{
|
|
pInfo->nLastNoticeTime = nCurTime;
|
|
ii++;
|
|
}
|
|
|
|
if (nNoticeCount >= 20)
|
|
{
|
|
g_Log.Log(LogType::_FILELOG, L"ReserveNotice break");
|
|
return;
|
|
}
|
|
nNoticeCount++;
|
|
}
|
|
else
|
|
ii++;
|
|
}
|
|
}
|
|
|
|
bool CReservedNotice::LoadNotice(const char * pPath)
|
|
{
|
|
ScopeLock<CSyncLock> Lock(m_Sync);
|
|
if (m_XmlParser.Open(pPath) == false) return false;
|
|
|
|
time_t tt;
|
|
time(&tt);
|
|
localtime(&tt);
|
|
|
|
ClearNotice();
|
|
if (m_XmlParser.FirstChildElement("ReservedNotice", true))
|
|
{
|
|
if (m_XmlParser.FirstChildElement("Notice"))
|
|
{
|
|
do
|
|
{
|
|
TReservedNoticeInfo * pInfo = new TReservedNoticeInfo;
|
|
memset(pInfo, 0, sizeof(TReservedNoticeInfo));
|
|
|
|
pInfo->nNoticeID = _wtoi(m_XmlParser.GetAttribute("ID"));
|
|
pInfo->nNoticeType = GetNoticeType(m_XmlParser.GetAttribute("Type"));
|
|
pInfo->_tBeginTime = _wtoTime_t(m_XmlParser.GetAttribute("BeginTime"));
|
|
|
|
pInfo->nPeriodSec = _wtoi(m_XmlParser.GetAttribute("PeriodSec"));
|
|
if (pInfo->nPeriodSec > 0)
|
|
pInfo->_tEndTime = _wtoTime_t(m_XmlParser.GetAttribute("EndTime"));
|
|
|
|
pInfo->nMasterMID = _wtoi(m_XmlParser.GetAttribute("MasterMID"));
|
|
pInfo->nServerMID = _wtoi(m_XmlParser.GetAttribute("ServerMID"));
|
|
pInfo->nMapIdx = _wtoi(m_XmlParser.GetAttribute("MapIdx"));
|
|
pInfo->nChannelID = _wtoi(m_XmlParser.GetAttribute("ChannelID"));
|
|
pInfo->nDurationSec = _wtoi(m_XmlParser.GetAttribute("SlideSec"));
|
|
std::wstring wszTemp = m_XmlParser.GetAttribute("Content");
|
|
ToMultiString(wszTemp, pInfo->szNoticeMsg);
|
|
|
|
if (pInfo->_tEndTime > 0)
|
|
{
|
|
if (pInfo->_tEndTime < tt)
|
|
{
|
|
g_Log.Log(LogType::_FILELOG, L"Notice Has Expired [ID:%d] [EndTime:%s]\n", pInfo->nNoticeID, m_XmlParser.GetAttribute("BeginTime"));
|
|
SAFE_DELETE(pInfo);
|
|
continue;
|
|
}
|
|
}
|
|
else if (pInfo->_tBeginTime < tt)
|
|
{
|
|
g_Log.Log(LogType::_FILELOG, L"Notice Has Expired [ID:%d] [BeingTime:%s]\n", pInfo->nNoticeID, m_XmlParser.GetAttribute("BeginTime"));
|
|
SAFE_DELETE(pInfo);
|
|
continue;
|
|
}
|
|
|
|
m_NoticeList.push_back(pInfo);
|
|
} while (m_XmlParser.NextSiblingElement("Notice"));
|
|
}
|
|
m_XmlParser.GoParent();
|
|
}
|
|
else return false;
|
|
return true;
|
|
}
|
|
|
|
void CReservedNotice::ClearNotice()
|
|
{
|
|
std::vector <TReservedNoticeInfo*>::iterator ii;
|
|
for (ii = m_NoticeList.begin(); ii != m_NoticeList.end(); ii++)
|
|
SAFE_DELETE((*ii));
|
|
m_NoticeList.clear();
|
|
}
|
|
|
|
int CReservedNotice::GetNoticeType(const WCHAR * pType)
|
|
{
|
|
if (!_wcsicmp(pType, L"Whole"))
|
|
return _NOTICETYPE_ALL;
|
|
else if (!_wcsicmp(pType, L"World"))
|
|
return _NOTICETYPE_WORLD;
|
|
else if (!_wcsicmp(pType, L"Server"))
|
|
return _NOTICETYPE_EACHSERVER;
|
|
else if (!_wcsicmp(pType, L"Zone"))
|
|
return _NOTICETYPE_ZONE;
|
|
else if (!_wcsicmp(pType, L"Channel"))
|
|
return _NOTICETYPE_CHANNEL;
|
|
return -1;
|
|
} |