281 lines
No EOL
16 KiB
C++
281 lines
No EOL
16 KiB
C++
#include "StdAfx.h"
|
||
#include "DNSchedule.h"
|
||
|
||
CDNSchedule::CDNSchedule( DWORD dwCycleTime )
|
||
{
|
||
m_dwCycleTime = dwCycleTime;
|
||
m_dwPrevTime = 0;
|
||
m_bInitialize = false;
|
||
}
|
||
|
||
CDNSchedule::~CDNSchedule()
|
||
{
|
||
}
|
||
|
||
void CDNSchedule::Process( DWORD dwCurTick )
|
||
{
|
||
if( !m_bInitialize ) return;
|
||
if( dwCurTick - m_dwPrevTime < m_dwCycleTime ) {
|
||
return;
|
||
}
|
||
m_dwPrevTime = dwCurTick;
|
||
|
||
time_t Time;
|
||
tm pTime;
|
||
|
||
time(&Time);
|
||
pTime = *localtime(&Time);
|
||
|
||
ScheduleStruct *pSchedule;
|
||
for( DWORD i=0; i<m_VecScheduleList.size(); i++ ) {
|
||
pSchedule = &m_VecScheduleList[i];
|
||
bool bEvent = false;
|
||
switch( pSchedule->Cycle ) {
|
||
case None:
|
||
{
|
||
DWORD dwTemp = 1000 * 60 * ( pSchedule->cMinute + ( pSchedule->cHour * 60 ) );
|
||
if( dwCurTick >= pSchedule->dwLastUpdateTick + dwTemp ) {
|
||
if( pSchedule->dwLastUpdateTick == 0 ) {
|
||
pSchedule->dwLastUpdateTick = dwCurTick;
|
||
break;
|
||
}
|
||
pSchedule->dwLastUpdateTick = dwCurTick;
|
||
|
||
bEvent = true;
|
||
}
|
||
}
|
||
break;
|
||
case Day:
|
||
if( pTime.tm_hour == pSchedule->cHour ) {
|
||
if( !pSchedule->bUpdate ) {
|
||
pSchedule->bUpdate = true;
|
||
bEvent = true;
|
||
}
|
||
}
|
||
else pSchedule->bUpdate = false;
|
||
break;
|
||
#if defined( PRE_ADD_MONTHLY_MISSION )
|
||
case Month:
|
||
{
|
||
// 1일(DEFAULT_MONTHLY_RESET_DAY)이 아니거나 스케쥴 초기화 시간이 아니면 아무런 처리를 하지 않는다
|
||
if((pTime.tm_mday != DEFAULT_MONTHLY_RESET_DAY) || (pTime.tm_hour != pSchedule->cHour))
|
||
{
|
||
pSchedule->bUpdate = false;
|
||
continue;
|
||
}
|
||
|
||
tm pDate = *localtime(&pSchedule->tDate);
|
||
// 미션을 받은지 1달이 지났거나, 오늘 오랜만에 접속해서 리셋된 경우(1일 0시~8시59분 사이)
|
||
if((pDate.tm_mon != pTime.tm_mon) || (pDate.tm_mon == pTime.tm_mon && pDate.tm_hour < pSchedule->cHour))
|
||
{
|
||
if( !pSchedule->bUpdate ) {
|
||
pSchedule->bUpdate = true;
|
||
bEvent = true;
|
||
}
|
||
}
|
||
else
|
||
pSchedule->bUpdate = false;
|
||
}
|
||
break;
|
||
#endif // #if defined( PRE_ADD_MONTHLY_MISSION )
|
||
default:
|
||
{
|
||
if( pTime.tm_wday == (int)pSchedule->Cycle - Sunday && pTime.tm_hour == pSchedule->cHour ) {
|
||
if( !pSchedule->bUpdate ) {
|
||
pSchedule->bUpdate = true;
|
||
bEvent = true;
|
||
}
|
||
}
|
||
else pSchedule->bUpdate = false;
|
||
}
|
||
break;
|
||
}
|
||
if( bEvent ) {
|
||
pSchedule->tDate = Time;
|
||
OnScheduleEvent( pSchedule->EventType, pSchedule, false );
|
||
}
|
||
}
|
||
}
|
||
|
||
void CDNSchedule::RegisterSchedule( ScheduleEventEnum ScheduleEvent, __time64_t tDate )
|
||
{
|
||
DNTableFileFormat *pSox = GetDNTable( CDnTableDB::TSCHEDULE );
|
||
if( !pSox )
|
||
{
|
||
g_Log.Log( LogType::_FILELOG, L"ScheduleTable.ext failed\r\n");
|
||
return;
|
||
}
|
||
|
||
int nItemID = ScheduleEvent + 1;
|
||
if( !pSox->IsExistItem( nItemID ) ) return;
|
||
|
||
ScheduleStruct Struct;
|
||
Struct.EventType = ScheduleEvent;
|
||
Struct.cHour = (char)pSox->GetFieldFromLablePtr( nItemID, "_Hour" )->GetInteger();
|
||
Struct.cMinute = (char)pSox->GetFieldFromLablePtr( nItemID, "_Minute" )->GetInteger();
|
||
Struct.Cycle = (CycleTypeEnum)pSox->GetFieldFromLablePtr( nItemID, "_Cycle" )->GetInteger();
|
||
Struct.tDate = tDate;
|
||
|
||
m_VecScheduleList.push_back( Struct );
|
||
}
|
||
|
||
void CDNSchedule::CheckInitializeSchedule()
|
||
{
|
||
time_t Time;
|
||
tm pTime;
|
||
|
||
time(&Time);
|
||
pTime = *localtime(&Time);
|
||
|
||
ScheduleStruct *pSchedule;
|
||
for( DWORD i=0; i<m_VecScheduleList.size(); i++ ) {
|
||
pSchedule = &m_VecScheduleList[i];
|
||
|
||
bool bEvent = false;
|
||
tm pDate = *localtime(&pSchedule->tDate);
|
||
int nDayValueDB = GetDateValue( 1900 + pDate.tm_year, pDate.tm_mon + 1, pDate.tm_mday );
|
||
int nDayValueCur = GetDateValue( 1900 + pTime.tm_year, pTime.tm_mon + 1, pTime.tm_mday );
|
||
|
||
switch( pSchedule->Cycle ) {
|
||
case None: break;
|
||
case Day:
|
||
/*
|
||
{
|
||
int nDBValue = ( ( pDate.tm_year * 1000 ) + ( pDate.tm_mon * 100 ) ) + ( ( ( pDate.tm_mday * 24 ) + ( pDate.tm_hour - pSchedule->cHour ) ) / 24 );
|
||
|
||
time_t Time;
|
||
tm *pTime;
|
||
|
||
time(&Time);
|
||
pTime = localtime(&Time);
|
||
int nCurValue = ( ( pTime.tm_year * 1000 ) + ( pTime.tm_mon * 100 ) ) + ( ( ( pTime.tm_mday * 24 ) + ( pTime.tm_hour - pSchedule->cHour ) ) / 24 );
|
||
|
||
if( nDBValue != nCurValue ) bEvent = true;
|
||
}
|
||
*/
|
||
// /*
|
||
if( nDayValueCur - nDayValueDB == 0 && pDate.tm_hour >= pSchedule->cHour ) break;
|
||
if( nDayValueCur - nDayValueDB == 0 ) {
|
||
if( pTime.tm_hour < pSchedule->cHour ) break;
|
||
}
|
||
else if( nDayValueCur - nDayValueDB == 1 ) {
|
||
if( pTime.tm_hour < pSchedule->cHour ) {
|
||
if( pDate.tm_hour >= pSchedule->cHour ) break;
|
||
}
|
||
}
|
||
bEvent = true;
|
||
// */
|
||
|
||
break;
|
||
#if defined( PRE_ADD_MONTHLY_MISSION )
|
||
case Month:
|
||
{
|
||
int nMonthResetCur = 0;
|
||
//지금을 기준으로 마지막 리셋일의 DateValue를 구한다
|
||
if( pTime.tm_hour < pSchedule->cHour && pTime.tm_mday <= DEFAULT_MONTHLY_RESET_DAY)
|
||
{
|
||
int nYear = 1900 + pTime.tm_year;
|
||
int nMonth = pTime.tm_mon;
|
||
if(nMonth == 0)
|
||
{
|
||
nMonth = 11;
|
||
nYear--;
|
||
}
|
||
else
|
||
nMonth--;
|
||
|
||
nMonthResetCur = GetDateValue( nYear, nMonth + 1, DEFAULT_MONTHLY_RESET_DAY );
|
||
}
|
||
else
|
||
nMonthResetCur = GetDateValue( 1900 + pTime.tm_year, pTime.tm_mon + 1, DEFAULT_MONTHLY_RESET_DAY );
|
||
|
||
if( (nMonthResetCur > nDayValueDB) ||
|
||
((nMonthResetCur == nDayValueDB) && ( pSchedule->cHour > pDate.tm_hour))) // 리셋일자가 같은 경우, 리셋시간을 비교해준다
|
||
bEvent = true;
|
||
}
|
||
break;
|
||
#endif // #if defined( PRE_ADD_MONTHLY_MISSION )
|
||
default:
|
||
{
|
||
int nWeek = pSchedule->Cycle - CDNSchedule::Sunday;
|
||
int nValue;
|
||
|
||
/*
|
||
int nDBValue = ( GetDateValue( 1900 + pDate.tm_year, pDate.tm_mon + 1, 0 ) - 4 - nWeek ) / 7;
|
||
nValue = GetDateValue( 1900 + pDate.tm_year, pDate.tm_mon + 1, pDate.tm_mday ) - 4 - nWeek;
|
||
nOffset = nValue % 7;
|
||
nWeekCount = ( 7 + ( pDate.tm_mday - nOffset ) + ( nOffset / 7 ) ) / 7;
|
||
if( nOffset == 0 ) {
|
||
if( pDate.tm_hour < pSchedule->cHour ) nWeekCount--;
|
||
}
|
||
nDBValue += nWeekCount;
|
||
*/
|
||
nValue = GetDateValue( 1900 + pDate.tm_year, pDate.tm_mon + 1, pDate.tm_mday ) - 4 - nWeek;
|
||
int nDBValue = nValue / 7;
|
||
if( nValue % 7 == 0 ) {
|
||
if( pDate.tm_hour < pSchedule->cHour ) nDBValue--;
|
||
}
|
||
|
||
time_t LocalTime;
|
||
tm pLocalTime;
|
||
|
||
time(&LocalTime);
|
||
pLocalTime = *localtime(&LocalTime);
|
||
|
||
/*
|
||
int nCurValue = ( GetDateValue( 1900 + pLocalTime.tm_year, pLocalTime.tm_mon + 1, 0 ) - 4 - nWeek ) / 7;
|
||
nValue = GetDateValue( 1900 + pLocalTime.tm_year, pLocalTime.tm_mon + 1, pLocalTime.tm_mday ) - 4 - nWeek;
|
||
nOffset = nValue % 7;
|
||
nWeekCount = ( 7 + ( pLocalTime.tm_mday - nOffset ) + ( nOffset / 7 ) ) / 7;
|
||
if( nOffset == 0 ) {
|
||
if( pLocalTime.tm_hour < pSchedule->cHour ) nWeekCount--;
|
||
}
|
||
nCurValue += nWeekCount;
|
||
*/
|
||
nValue = GetDateValue( 1900 + pLocalTime.tm_year, pLocalTime.tm_mon + 1, pLocalTime.tm_mday ) - 4 - nWeek;
|
||
int nCurValue = nValue / 7;
|
||
if( nValue % 7 == 0 ) {
|
||
if( pLocalTime.tm_hour < pSchedule->cHour ) nCurValue--;
|
||
}
|
||
|
||
if( nDBValue != nCurValue ) bEvent = true;
|
||
}
|
||
break;
|
||
}
|
||
if( bEvent ) {
|
||
pSchedule->tDate = Time;
|
||
OnScheduleEvent( pSchedule->EventType, pSchedule, true );
|
||
}
|
||
pSchedule->bUpdate = true;
|
||
}
|
||
m_bInitialize = true;
|
||
}
|
||
|
||
int CDNSchedule::GetDateValue( int nYear, int nMonth, int nDay )
|
||
{
|
||
int nResult = 0;
|
||
for( int i=2009; i<nYear; i++ ) {
|
||
bool bLeapMonth = false;
|
||
// int nValue = ( i - 1583 ) + 1;
|
||
if( i % 4 == 0 ) bLeapMonth = true;
|
||
if( i % 100 == 0 ) bLeapMonth = false;
|
||
if( i % 400 == 0 ) bLeapMonth = true;
|
||
|
||
if( bLeapMonth ) nResult += 366;
|
||
else nResult += 365;
|
||
}
|
||
|
||
bool bLeapMonth = false;
|
||
// int nValue = ( nYear - 1583 ) + 1;
|
||
if( nYear % 4 == 0 ) bLeapMonth = true;
|
||
if( nYear % 100 == 0 ) bLeapMonth = false;
|
||
if( nYear % 400 == 0 ) bLeapMonth = true;
|
||
int nDayCount[12] = { 31, ( bLeapMonth == true ) ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
|
||
|
||
for( int i=0; i<nMonth - 1; i++ ) {
|
||
nResult += nDayCount[i];
|
||
}
|
||
nResult += nDay;
|
||
|
||
return nResult;
|
||
} |