Files
mir_server/server/LogicServer/config/RebateProvider.cpp
aixianling 5c9f1dae4a init
2025-01-09 17:45:40 +08:00

723 lines
31 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "StdAfx.h"
#include "RebateProvider.h"
CBufferAllocator* CRebateProvider::m_pAllocator;
CRebateProvider::CRebateProvider() :Inherited()
{
m_pAllocator = new CBufferAllocator();
m_RebatesGroup.clear();
}
CRebateProvider::~CRebateProvider()
{
delete m_pAllocator;
m_pAllocator = NULL;
}
bool CRebateProvider::Load(LPCTSTR sFilePath)
{
bool Result = false;
CMemoryStream ms;
CCustomLuaPreProcessor pp;
LPCTSTR sText;
try
{
//从文件加载配置脚本
if ( ms.loadFromFile(sFilePath) <= 0 )
showErrorFormat(_T("unable to load from %s"), sFilePath);
//对配置脚本进行预处理
GetLogicServer()->GetVSPDefine().RegisteToPreprocessor(pp);
sText = pp.parse((LPCTSTR)ms.getMemory(), sFilePath);
//设置脚本内容
if ( !setScript(sText) )
showError(_T("syntax error on Rebate"));
Result = ReadConfig("RebateDisposeConfig"); // 线下返利
if ( Result )
{
Result = ReadConfig("YBRebateConfig"); // 元宝返利
}
if ( Result )
{
Result = ReadConfig("SingleRebateConfig"); // 单笔返利
}
}
catch (RefString &s)
{
OutputMsg(rmError, _T("load Rebate error: %s"), s.rawStr());
FILE* fp = fopen("scripterror.txt", "wb");
if (fp)
{
fputs(sText, fp);
fclose(fp);
}
}
catch (...)
{
OutputMsg(rmError, _T("unexpected error on load Rebate"));
}
//销毁脚本虚拟机
setScript(NULL);
return Result;
}
bool CRebateProvider::ReadConfig(LPCTSTR sFileName)
{
int nDef = 0;
char pBuff[1024];
int nServerIdx = GetLogicServer()->GetServerIndex();
if ( sFileName && openGlobalTable(sFileName) )
{
// 预先分配 30 个 pTimeDetail 所占的空间
OneTimePair* pTimeDetail = nullptr;
int nTimeDetailCount = 0;
if (enumTableFirst())
{
pTimeDetail = (OneTimePair*)m_pAllocator->AllocBuffer(sizeof(OneTimePair) * OneTimePairAllocNum);
do
{
if (enumTableFirst())
{
do
{
int nId = getFieldInt("Id", &nDef);
int nOfflineType = getFieldInt("offlineType", &nDef);
// 判断Id所对应的组是否已经度去过
bool isExist = false;
if (nOfflineType <= eRebateOfflineType_MIN || nOfflineType >= eRebateOfflineType_MAX)
{
OutputMsg(rmError, _T("Load RebateDisposeConfig Error OfflineType error ! OfflineType : %d"), nOfflineType);
continue;
}
if (m_RebatesGroup.find(nId) != m_RebatesGroup.end())
{
isExist = true;
}
if ( !isExist )
{
// 判断区服是否生效
int nOpenServer = getFieldInt("openServer", &nDef);
if ( nOpenServer && nOpenServer != nServerIdx )
{
continue;
}
RebateGroupInfo& rebateGroupInfo = m_RebatesGroup[nId];
rebateGroupInfo.nId = nId;
rebateGroupInfo.nOfflineType = nOfflineType;
rebateGroupInfo.nOpenServer = nOpenServer;
rebateGroupInfo.nTimeType = getFieldInt("timeType", &nDef);
rebateGroupInfo.nAtonce = getFieldInt("atonce", &nDef);
rebateGroupInfo.nOverlay = getFieldInt("overlay", &nDef);
// 详细活动时间
if (feildTableExists("TimeDetail") && openFieldTable("TimeDetail"))
{
int nCount = (int)lua_objlen(m_pLua,-1);
rebateGroupInfo.pTimeDetail = (OneTimePair*)m_pAllocator->AllocBuffer(sizeof(OneTimePair) * nCount);
for (size_t i = 1; i <= nCount; i++)
{
getFieldIndexTable(i);
getFieldStringBuffer("StartTime",rebateGroupInfo.pTimeDetail[i-1].strStartTime,ATIVITY_TIME_LEN);
getFieldStringBuffer("EndTime",rebateGroupInfo.pTimeDetail[i-1].strEndTime,ATIVITY_TIME_LEN);
closeTable();
}
rebateGroupInfo.nTimeCount = nCount;
rebateGroupInfo.nTimeIdx = 0;
closeTable();
}
// 计算时间(若算不到时间,说明不开启了)
if ( !UpdateOpenTime(m_pLua, rebateGroupInfo) )
{
// 不能释放对应的活动,次日发放的奖励,如果玩家长时间未登录 且过了活动时间,将无法发放奖励,
}
rebateGroupInfo.RebatesInfo.clear();
}
RebateGroupInfo& rebateGroupInfo = m_RebatesGroup[nId];
// 验证同一Id奖励序号、时间类型、活动时间、活动类型、指定区开放、立刻发放奖励、是否可叠加等信息是否一致
int nIndex = getFieldInt("index", &nDef);
if ( isExist )
{
//验证 奖励序号
if ( rebateGroupInfo.RebatesInfo.find(nIndex) != rebateGroupInfo.RebatesInfo.find(nIndex) )
{
OutputMsg(rmError, _T("Load RebateDisposeConfig Error Index repeat! Id : %d, Index : %d"), nId, nIndex);
continue;
}
//验证 时间类型
int nTimeType = getFieldInt("timeType", &nDef);
if ( nTimeType != rebateGroupInfo.nTimeType )
{
OutputMsg(rmError, _T("Load RebateDisposeConfig Error TimeType Different! Id : %d, Index : %d"), nId, nIndex);
continue;
}
//验证 活动时间
bool isDifferent = false;
if (feildTableExists("TimeDetail") && openFieldTable("TimeDetail"))
{
int nCount = (int)lua_objlen(m_pLua,-1);
memset( pTimeDetail, 0, sizeof( pTimeDetail));
for (size_t i = 1; i <= nCount; i++)
{
getFieldIndexTable(i);
getFieldStringBuffer("StartTime", pTimeDetail[i-1].strStartTime,ATIVITY_TIME_LEN);
getFieldStringBuffer("EndTime", pTimeDetail[i-1].strEndTime,ATIVITY_TIME_LEN);
closeTable();
}
nTimeDetailCount = nCount;
closeTable();
}
if ( nTimeDetailCount != rebateGroupInfo.nTimeCount )
{
OutputMsg(rmError, _T("Load RebateDisposeConfig Error TimeDetail Count Different! Id : %d, Index : %d"), nId, nIndex);
continue;
}
for (size_t i = 0; i < nTimeDetailCount; i++)
{
if ( strcmp( pTimeDetail[i].strStartTime, rebateGroupInfo.pTimeDetail[i].strStartTime ) )
{
OutputMsg(rmError, _T("Load RebateDisposeConfig Error TimeDetail Different! Id : %d, Index : %d"), nId, nIndex);
isDifferent = true;
continue;
}
if ( strcmp( pTimeDetail[i].strEndTime, rebateGroupInfo.pTimeDetail[i].strEndTime ) )
{
OutputMsg(rmError, _T("Load RebateDisposeConfig Error TimeDetail Different! Id : %d, Index : %d"), nId, nIndex);
isDifferent = true;
continue;
}
}
if ( isDifferent )
{
continue;
}
//验证 活动类型
if ( nOfflineType != rebateGroupInfo.nOfflineType )
{
OutputMsg(rmError, _T("Load RebateDisposeConfig Error OfflineType Different! Id : %d, Index : %d"), nId, nIndex);
continue;
}
//验证 指定区开放
int nOpenServer = getFieldInt("openServer", &nDef);
if ( nOpenServer != rebateGroupInfo.nOpenServer )
{
OutputMsg(rmError, _T("Load RebateDisposeConfig Error OpenServer Different! Id : %d, Index : %d"), nId, nIndex);
continue;
}
//验证 立刻发放奖励
int nAtonce = getFieldInt("atonce", &nDef);
if ( nAtonce != rebateGroupInfo.nAtonce )
{
OutputMsg(rmError, _T("Load RebateDisposeConfig Error Atonce Different! Id : %d, Index : %d"), nId, nIndex);
continue;
}
//验证 是否可叠加
int nOverlay = getFieldInt("overlay", &nDef);
if ( nOverlay != rebateGroupInfo.nOverlay )
{
OutputMsg(rmError, _T("Load RebateDisposeConfig Error Overlay Different! Id : %d, Index : %d"), nId, nIndex);
continue;
}
}
RebateInfo& rebateInfo = rebateGroupInfo.RebatesInfo[nIndex];
rebateInfo.nIndex = nIndex;
// 线下返利、单笔返利
if ( rebateGroupInfo.nId < YBRebateStartId )
{
rebateInfo.nPay = getFieldInt("pay", &nDef);
rebateInfo.nMinPay = 0;
rebateInfo.nMaxPay = 0;
}
else
{
// 元宝返利
rebateInfo.nPay = 0;
memset(pBuff, 0, sizeof(pBuff));
getFieldStringBuffer("pay",pBuff,sizeof(pBuff));
int nTop = lua_gettop(m_pLua);
lua_getglobal(m_pLua, "string");
lua_getfield(m_pLua, -1, "match");
lua_pushlstring(m_pLua, pBuff, strnlen(pBuff, sizeof(pBuff)));
lua_pushlstring(m_pLua, "(%d+)-(%d+)", strnlen("(%d+)-(%d+)",sizeof("(%d+)-(%d+)")));
int nErr = lua_pcall(m_pLua, 2, 2, 0);
if (!nErr)
{
rebateInfo.nMinPay = lua_tonumber(m_pLua, -2);
rebateInfo.nMaxPay = lua_tonumber(m_pLua, -1);
}else return false;
lua_pop(m_pLua, 2);
lua_settop(m_pLua, nTop);
}
// 线下返利、单笔返利
if ( rebateGroupInfo.nId < YBRebateStartId )
{
if (feildTableExists("awardList") && openFieldTable("awardList"))
{
rebateInfo.vecAwardList.clear();
if(enumTableFirst())
{
do
{
ACTORAWARD stTemp ;
stTemp.btType = getFieldInt("type", &nDef) ;
stTemp.wId = getFieldInt("id", &nDef) ;
stTemp.wCount = getFieldInt("count", &nDef) ;
rebateInfo.vecAwardList.emplace_back( stTemp ) ;
} while (enumTableNext());
closeTable();
}
}
rebateInfo.nRebatePercentage = 0;
}
else
{
// 元宝返利
rebateInfo.vecAwardList.clear();
rebateInfo.nRebatePercentage = getFieldInt("awardList", &nDef);
}
if (feildTableExists("mailInfo") && openFieldTable("mailInfo"))
{
rebateInfo.sTitle = (char*)m_pAllocator->AllocBuffer(sizeof(pBuff));
memset(pBuff, 0, sizeof(pBuff));
getFieldStringBuffer("head", rebateInfo.sTitle, sizeof(pBuff));
rebateInfo.sContent = (char*)m_pAllocator->AllocBuffer(sizeof(pBuff));
memset(pBuff, 0, sizeof(pBuff));
getFieldStringBuffer("context", rebateInfo.sContent,sizeof(pBuff));
closeTable();
}
} while (enumTableNext());
}
} while (enumTableNext());
//释放 pTimeDetail 预分配的内存
m_pAllocator->FreeBuffer( pTimeDetail);
pTimeDetail = NULL;
}
closeTable();
return true;
} else {
return false;
}
}
bool CRebateProvider::ReadTime(lua_State * pLuaState, int nTimeType, LPCTSTR sKey, int nKeyLen, CMiniDateTime& out)
{
switch (nTimeType)
{
case 0: //day-hour:minute
case 2:
case 3:
{
static int nD,nH,nM = 3;
int nTop = lua_gettop(pLuaState);
lua_getglobal(pLuaState, "string");
lua_getfield(pLuaState, -1, "match");
lua_pushlstring(pLuaState, sKey, strnlen(sKey, nKeyLen));
lua_pushlstring(pLuaState, "(%d+)-(%d+):(%d+)", strnlen("(%d+)-(%d+):(%d+)",sizeof("(%d+)-(%d+):(%d+)")));
int nErr = lua_pcall(pLuaState, 2, 3, 0);
if (!nErr)
{
nD = lua_tonumber(pLuaState, -3);
nH = lua_tonumber(pLuaState, -2);
nM = lua_tonumber(pLuaState, -1);
}else return false;
lua_pop(pLuaState, 3);
lua_settop(pLuaState, nTop);
out = nD*24*3600 + nH*3600 + nM*60;
}
break;
case 1: // year.month.day-hour:minute
{
SYSTEMTIME TimeResult;
memset(&TimeResult,0,sizeof(TimeResult));
int nTop = lua_gettop(pLuaState);
lua_getglobal(pLuaState, "string");
lua_getfield(pLuaState, -1, "match");
lua_pushlstring(pLuaState, sKey, strnlen(sKey, nKeyLen));
lua_pushlstring(pLuaState, "(%d+)%.(%d+)%.(%d+)-(%d+):(%d+)", strnlen("(%d+)%.(%d+)%.(%d+)-(%d+):(%d+)",sizeof("(%d+)%.(%d+)%.(%d+)-(%d+):(%d+)")));
int nErr = lua_pcall(pLuaState, 2, 5, 0);
if (!nErr)
{
TimeResult.wYear = lua_tonumber(pLuaState, -5);
TimeResult.wMonth = lua_tonumber(pLuaState, -4);
TimeResult.wDay = lua_tonumber(pLuaState, -3);
TimeResult.wHour = lua_tonumber(pLuaState, -2);
TimeResult.wMinute = lua_tonumber(pLuaState, -1);
}else return false;
lua_pop(pLuaState, 5);
lua_settop(pLuaState, nTop);
out.encode(TimeResult);
}
break;
}
}
bool CRebateProvider::ReadFixedTimeValue(lua_State * pLuaState, LPCTSTR sKey, int nKeyLen, SYSTEMTIME& out)
{
memset(&out,0,sizeof(out));
int nTop = lua_gettop(pLuaState);
lua_getglobal(pLuaState, "string");
lua_getfield(pLuaState, -1, "match");
lua_pushlstring(pLuaState, sKey, strnlen(sKey, nKeyLen));
lua_pushlstring(pLuaState, "(%d+)%.(%d+)%.(%d+)-(%d+):(%d+)", strnlen("(%d+)%.(%d+)%.(%d+)-(%d+):(%d+)",sizeof("(%d+)%.(%d+)%.(%d+)-(%d+):(%d+)")));
int nErr = lua_pcall(pLuaState, 2, 5, 0);
if (!nErr)
{
out.wYear = lua_tonumber(pLuaState, -5);
out.wMonth = lua_tonumber(pLuaState, -4);
out.wDay = lua_tonumber(pLuaState, -3);
out.wHour = lua_tonumber(pLuaState, -2);
out.wMinute = lua_tonumber(pLuaState, -1);
}else return false;
lua_pop(pLuaState, 5);
lua_settop(pLuaState, nTop);
}
bool CRebateProvider::UpdateOpenTime(lua_State * pLuaState, RebateGroupInfo& rebateGroupInfo, bool nNextTime)
{
//nNextTime 直接开启下一轮
bool result = false;
CMiniDateTime now_time = CMiniDateTime::now();
#ifdef _DEBUG
{
SYSTEMTIME nowTime;
memset(&nowTime,0,sizeof(nowTime));
now_time.decode(nowTime);
OutputMsg(rmTip, _T("活动序号[%d] 当前时间:(%d-%d-%d %d:%d:%d) "),rebateGroupInfo.nId,
nowTime.wYear, nowTime.wMonth, nowTime.wDay, nowTime.wHour, nowTime.wMinute, nowTime.wSecond);
}
#endif
// bool isAfterSrvDay = true;
// // 开服N天后才开第N天仍不开则计算时间时需要偏移
// if (rebateGroupInfo.nAfterSrvDay > 0)
// {
// int nOpenServerDay = GetLogicServer()->GetDaysSinceOpenServer();
// int nDiff = rebateGroupInfo.nAfterSrvDay - nOpenServerDay + 1;
// if (nDiff > 0)
// {
// now_time += nDiff*3600*24;
// isAfterSrvDay = false;
// }
// #ifdef _DEBUG
// OutputMsg(rmTip, _T("活动[%d] Diff=%d"), rebateGroupInfo.nId,rebateGroupInfo.nIndex nDiff);
// #endif
// }
#ifdef _DEBUG
{
SYSTEMTIME nowTime;
memset(&nowTime,0,sizeof(nowTime));
now_time.decode(nowTime);
OutputMsg(rmTip, _T("活动[%d] 当前调整时间:(%d-%d-%d %d:%d:%d) "),rebateGroupInfo.nId,
nowTime.wYear, nowTime.wMonth, nowTime.wDay, nowTime.wHour, nowTime.wMinute, nowTime.wSecond);
}
#endif
// // 开服前N天开包括第N天超过这个时间将不再开启
// if (rebateGroupInfo.nBeforeSrvDay > 0 &&
// GetLogicServer()->GetDaysSinceOpenServer() > rebateGroupInfo.nBeforeSrvDay)
// {
// return false;
// }
switch (rebateGroupInfo.nTimeType)
{
case eActivityTimeType_KFSJ: // 开服时间
{
for (; rebateGroupInfo.nTimeIdx < rebateGroupInfo.nTimeCount; rebateGroupInfo.nTimeIdx++)
{
short curidx = rebateGroupInfo.nTimeIdx;
// 获取结束时间
rebateGroupInfo.nEndTime.tv = 0;
if(strcmp(rebateGroupInfo.pTimeDetail[curidx].strEndTime, "-1"))
{
ReadTime(pLuaState, rebateGroupInfo.nTimeType, rebateGroupInfo.pTimeDetail[curidx].strEndTime, ATIVITY_TIME_LEN, rebateGroupInfo.nEndTime);
rebateGroupInfo.nEndTime = GetLogicServer()->GetServerOpenTime().rel_today() + rebateGroupInfo.nEndTime;
}
// 已经结束的,换下一个点 --默认-1 为永久
if (rebateGroupInfo.nEndTime != 0 && rebateGroupInfo.nEndTime <= now_time) continue;
// 获取开始时间
ReadTime(pLuaState, rebateGroupInfo.nTimeType, rebateGroupInfo.pTimeDetail[curidx].strStartTime, ATIVITY_TIME_LEN, rebateGroupInfo.nStartTime);
rebateGroupInfo.nStartTime = GetLogicServer()->GetServerOpenTime().rel_today() + rebateGroupInfo.nStartTime;
if(nNextTime && rebateGroupInfo.nStartTime < now_time) continue;
result = true;
break;
}
}
break;
case eActivityTimeType_GDSJ: // 固定时间
{
for (; rebateGroupInfo.nTimeIdx < rebateGroupInfo.nTimeCount; rebateGroupInfo.nTimeIdx++)
{
short curidx = rebateGroupInfo.nTimeIdx;
// 获取结束时间
ReadTime(pLuaState, rebateGroupInfo.nTimeType, rebateGroupInfo.pTimeDetail[curidx].strEndTime, ATIVITY_TIME_LEN, rebateGroupInfo.nEndTime);
// 已经结束的,换下一个点
if (rebateGroupInfo.nEndTime <= now_time) continue;
// 获取开始时间
ReadTime(pLuaState, rebateGroupInfo.nTimeType, rebateGroupInfo.pTimeDetail[curidx].strStartTime, ATIVITY_TIME_LEN, rebateGroupInfo.nStartTime);
// // 开服时间检测
// if (rebateGroupInfo.nAfterSrvDay > 0 && (!isAfterSrvDay) && rebateGroupInfo.nStartTime < now_time)
// {
// SYSTEMTIME timeinfo;
// ReadFixedTimeValue(pLuaState, rebateGroupInfo.pTimeDetail[curidx].strStartTime, ATIVITY_TIME_LEN, timeinfo);
// rebateGroupInfo.nStartTime = now_time.rel_today(timeinfo.wHour, timeinfo.wMinute, 0);
// }
// 切换下一个时间点
if(nNextTime && rebateGroupInfo.nStartTime < now_time) continue;
result = true;
break;
}
}
break;
case eActivityTimeType_HFSJ: // 合服时间
{
for (; rebateGroupInfo.nTimeIdx < rebateGroupInfo.nTimeCount; rebateGroupInfo.nTimeIdx++)
{
short curidx = rebateGroupInfo.nTimeIdx;
// 获取结束时间
ReadTime(pLuaState, rebateGroupInfo.nTimeType, rebateGroupInfo.pTimeDetail[curidx].strEndTime, ATIVITY_TIME_LEN, rebateGroupInfo.nEndTime);
rebateGroupInfo.nEndTime = GetLogicServer()->GetServerCombineTime() + rebateGroupInfo.nEndTime;
// 已经结束的,换下一个点
if (rebateGroupInfo.nEndTime <= now_time || nNextTime) continue;
// 获取开始时间
ReadTime(pLuaState, rebateGroupInfo.nTimeType, rebateGroupInfo.pTimeDetail[curidx].strStartTime, ATIVITY_TIME_LEN, rebateGroupInfo.nStartTime);
rebateGroupInfo.nStartTime = GetLogicServer()->GetServerCombineTime() + rebateGroupInfo.nStartTime;
if(nNextTime && rebateGroupInfo.nStartTime < now_time) continue;
result = true;
break;
}
}
break;
case eActivityTimeType_XHSJ: // 循环时间
{
int nCurYear,nCurMon,nCurDay,nCurHour,nCurMin,nCurSec,nCurWeek;
{
SYSTEMTIME SysTime;// = GetGlobalLogicEngine()->getSysTime();
now_time.decode(SysTime);
nCurYear = SysTime.wYear;
nCurMon = SysTime.wMonth;
nCurDay = SysTime.wDay;
nCurHour = SysTime.wHour;
nCurMin = SysTime.wMinute;
nCurSec = SysTime.wSecond;
struct tm tmResult;
memset(&tmResult, 0, sizeof(tmResult));
tmResult.tm_isdst = 0;
tmResult.tm_year = nCurYear - 1900;
tmResult.tm_mon = nCurMon - 1;
tmResult.tm_mday = nCurDay;
mktime(&tmResult);
nCurWeek = tmResult.tm_wday;
}
if (nCurWeek == 0)
{
nCurWeek = 7;
}
static int nStartWeek,nStartHour,nStartMinute;
static int nEndWeek,nEndHour,nEndMinute;
static CMiniDateTime openTime,closeTime;
for (; rebateGroupInfo.nTimeIdx < rebateGroupInfo.nTimeCount; rebateGroupInfo.nTimeIdx++)
{
short curidx = rebateGroupInfo.nTimeIdx;
// 获取结束时间
int nTop = lua_gettop(pLuaState);
lua_getglobal(pLuaState, "string");
lua_getfield(pLuaState, -1, "match");
lua_pushlstring(pLuaState, rebateGroupInfo.pTimeDetail[curidx].strEndTime, strnlen(rebateGroupInfo.pTimeDetail[curidx].strEndTime, ATIVITY_TIME_LEN));
lua_pushlstring(pLuaState, "(%d+)-(%d+):(%d+)", strnlen("(%d+)-(%d+):(%d+)",sizeof("(%d+)-(%d+):(%d+)")));
int nErr = lua_pcall(pLuaState, 2, 3, 0);
if (!nErr)
{
nEndWeek = lua_tonumber(pLuaState, -3);
nEndHour = lua_tonumber(pLuaState, -2);
nEndMinute = lua_tonumber(pLuaState, -1);
}else return false;
lua_pop(pLuaState, 3);
lua_settop(pLuaState, nTop);
closeTime.encode(nCurYear, nCurMon, nCurDay + (nEndWeek > 0?nEndWeek - nCurWeek:0), nEndHour, nEndMinute, 0);
//#ifdef _DEBUG
{
SYSTEMTIME nowTime;
memset(&nowTime,0,sizeof(nowTime));
closeTime.decode(nowTime);
OutputMsg(rmTip, _T("活动[%d] (%d)结束时间:(%d-%d-%d %d:%d:%d) "),rebateGroupInfo.nId,curidx,
nowTime.wYear, nowTime.wMonth, nowTime.wDay, nowTime.wHour, nowTime.wMinute, nowTime.wSecond);
}
//#endif
// 已经结束的,换下一个点
if (closeTime <= now_time) continue;
// 获取开始时间
nTop = lua_gettop(pLuaState);
lua_getglobal(pLuaState, "string");
lua_getfield(pLuaState, -1, "match");
lua_pushlstring(pLuaState, rebateGroupInfo.pTimeDetail[curidx].strStartTime, strnlen(rebateGroupInfo.pTimeDetail[curidx].strStartTime, ATIVITY_TIME_LEN));
lua_pushlstring(pLuaState, "(%d+)-(%d+):(%d+)", strnlen("(%d+)-(%d+):(%d+)",sizeof("(%d+)-(%d+):(%d+)")));
nErr = lua_pcall(pLuaState, 2, 3, 0);
if (!nErr)
{
nStartWeek = lua_tonumber(pLuaState, -3);
nStartHour = lua_tonumber(pLuaState, -2);
nStartMinute = lua_tonumber(pLuaState, -1);
}else return false;
lua_pop(pLuaState, 3);
lua_settop(pLuaState, nTop);
openTime.encode(nCurYear, nCurMon, nCurDay + (nStartWeek > 0?nStartWeek - nCurWeek:0), nStartHour, nStartMinute, 0);
if(nNextTime && openTime < now_time) continue;
// 记录时间戳
rebateGroupInfo.nStartTime = openTime;
rebateGroupInfo.nEndTime = closeTime;
result = true;
break;
}
if (!result)
{
// 如果都不在时间内,那就是下一周了的第一个时间了
rebateGroupInfo.nTimeIdx = 0;
// 获取开始时间
int nTop = lua_gettop(pLuaState);
lua_getglobal(pLuaState, "string");
lua_getfield(pLuaState, -1, "match");
lua_pushlstring(pLuaState, rebateGroupInfo.pTimeDetail[0].strStartTime, strnlen(rebateGroupInfo.pTimeDetail[0].strStartTime, ATIVITY_TIME_LEN));
lua_pushlstring(pLuaState, "(%d+)-(%d+):(%d+)", strnlen("(%d+)-(%d+):(%d+)",sizeof("(%d+)-(%d+):(%d+)")));
int nErr = lua_pcall(pLuaState, 2, 3, 0);
if (!nErr)
{
nStartWeek = lua_tonumber(pLuaState, -3);
nStartHour = lua_tonumber(pLuaState, -2);
nStartMinute = lua_tonumber(pLuaState, -1);
}else return false;
lua_pop(pLuaState, 3);
lua_settop(pLuaState, nTop);
openTime.encode(nCurYear, nCurMon, nCurDay + (nStartWeek > 0?nStartWeek - nCurWeek:0), nStartHour, nStartMinute, 0);
// 获取结束时间
nTop = lua_gettop(pLuaState);
lua_getglobal(pLuaState, "string");
lua_getfield(pLuaState, -1, "match");
lua_pushlstring(pLuaState, rebateGroupInfo.pTimeDetail[0].strEndTime, strnlen(rebateGroupInfo.pTimeDetail[0].strEndTime, ATIVITY_TIME_LEN));
lua_pushlstring(pLuaState, "(%d+)-(%d+):(%d+)", strnlen("(%d+)-(%d+):(%d+)",sizeof("(%d+)-(%d+):(%d+)")));
nErr = lua_pcall(pLuaState, 2, 3, 0);
if (!nErr)
{
nEndWeek = lua_tonumber(pLuaState, -3);
nEndHour = lua_tonumber(pLuaState, -2);
nEndMinute = lua_tonumber(pLuaState, -1);
}else return false;
lua_pop(pLuaState, 3);
lua_settop(pLuaState, nTop);
closeTime.encode(nCurYear, nCurMon, nCurDay + (nEndWeek > 0?nEndWeek - nCurWeek:0), nEndHour, nEndMinute, 0);
int loop = (0 == nStartWeek) || (0 == nEndWeek) ? 1 : 7;
// 计算矫正
if (closeTime < openTime)
openTime = openTime - loop * (24*3600);
// 计算矫正后起始/结束时间
rebateGroupInfo.nStartTime = openTime;
rebateGroupInfo.nEndTime = closeTime;
while (now_time > (unsigned int)rebateGroupInfo.nEndTime || (nNextTime && now_time > (unsigned int)rebateGroupInfo.nStartTime))
{
rebateGroupInfo.nStartTime = rebateGroupInfo.nStartTime + loop * (24*3600);
rebateGroupInfo.nEndTime = rebateGroupInfo.nEndTime + loop * (24*3600);
}
result = true;
}
// {
// //开服前n天开启的活动需要判定下次开启时间是否超过n
// if (rebateGroupInfo.nBeforeSrvDay > 0)
// {
// // int i = GetLogicServer()->GetServerOpenTime().rel_today();
// int nDay = (rebateGroupInfo.nStartTime.tv - GetLogicServer()->GetServerOpenTime().rel_today())/(3600*24)+1;
// if (nDay > rebateGroupInfo.nBeforeSrvDay)
// return false;
// }
// }
}
break;
}
//#ifdef _DEBUG
SYSTEMTIME starTime,endTime;
memset(&starTime,0,sizeof(starTime));
memset(&endTime,0,sizeof(endTime));
rebateGroupInfo.nStartTime.decode(starTime);
rebateGroupInfo.nEndTime.decode(endTime);
OutputMsg(rmTip, _T("活动[%d] 开始时间:(%d-%d-%d %d:%d:%d) 结束时间:(%d-%d-%d %d:%d:%d) "),rebateGroupInfo.nId,
starTime.wYear, starTime.wMonth, starTime.wDay, starTime.wHour, starTime.wMinute, starTime.wSecond,
endTime.wYear, endTime.wMonth, endTime.wDay, endTime.wHour, endTime.wMinute, endTime.wSecond);
//#endif
return result;
}