175 lines
5.0 KiB
Lua
175 lines
5.0 KiB
Lua
local skynet = require "skynet"
|
|
local oo = require "Class"
|
|
local log = require "Log"
|
|
local redisKeyUrl = require "RedisKeyUrl"
|
|
local sqlUrl = require "SqlUrl"
|
|
local ActivityList = oo.class()
|
|
|
|
|
|
--[[
|
|
|
|
CMD_C2S_ActivityList = 1025; //活动列表
|
|
CMD_S2C_ActivityList = 1026;
|
|
CMD_C2S_ActivityOP = 1027; //活动操作
|
|
CMD_S2C_ActivityOP = 1028;
|
|
//活动信息
|
|
message PBActivityInfo
|
|
{
|
|
int32 id = 1; //活动ID
|
|
int32 type = 2; //活动ID
|
|
int32 startTime = 3; //开始时间
|
|
int32 endTime = 4; //结束时间
|
|
int32 status = 5; //状态
|
|
}
|
|
|
|
//活动列表
|
|
message C2SActivityList
|
|
{
|
|
}
|
|
|
|
//活动列表
|
|
message S2CActivityList
|
|
{
|
|
repeated PBActivityInfo activityList = 1; //活动列表
|
|
}
|
|
]]
|
|
ActivityList.Type_Test = 1 --春节活动
|
|
|
|
ActivityList.Status_Init = 1 --未开始
|
|
ActivityList.Status_Start = 2 --已经开始
|
|
ActivityList.Status_Stop = 3 --停止
|
|
|
|
ActivityList.ActivityEvent_Ten = 1
|
|
|
|
ActivityList.ActivityType_Schedule = 1 --间隔多久执行一次
|
|
|
|
function ActivityList:Init()
|
|
self.activityList = {}
|
|
end
|
|
|
|
function ActivityList:OnNewDay() --跨天
|
|
|
|
end
|
|
|
|
--每5秒调一次
|
|
function ActivityList:On5SecTimer()
|
|
self:Refresh()
|
|
end
|
|
|
|
--获取所有活动信息
|
|
function ActivityList:GetActivityList( c2sData , s2cData )
|
|
local data = {}
|
|
data.activityList = self.activityList
|
|
s2cData.cmd = pb.enum("MsgType","CMD_S2C_ActivityList")
|
|
s2cData.data = assert(pb.encode("S2CActivityList", data))
|
|
end
|
|
|
|
--新增活动
|
|
function ActivityList:Add( activityEvent , activityType , timerInfo )
|
|
--获取活动ID
|
|
local redisKey = string.format(redisKeyUrl.MultiServerActivityID )
|
|
local id = skynet.server.redis:incr(redisKey)
|
|
if not self.activityList[ id ] then
|
|
self.activityList[ id ] = {}
|
|
end
|
|
|
|
local startTime,endTime = self:CalcTime( activityType , timerInfo )
|
|
self.activityList[ id ].id = id
|
|
self.activityList[ id ].activityEvent = activityEvent
|
|
self.activityList[ id ].activityType = activityType
|
|
self.activityList[ id ].timerInfo = timerInfo
|
|
self.activityList[ id ].startTime = startTime
|
|
self.activityList[ id ].endTime = endTime
|
|
self.activityList[ id ].status = self.Status_Init
|
|
log.info(string.format("新增活动信息 ID %d 类型 %d 开始时间 %d 结束时间 %d 状态 %d" , id , activityType , startTime , endTime , self.Status_Init))
|
|
return true
|
|
end
|
|
|
|
--计算开启时间
|
|
function ActivityList:CalcTime( activityType , timerInfo )
|
|
local startTime,endTime = 0,0
|
|
if self.ActivityType_Schedule == activityType then --定时任务
|
|
startTime,endTime = timerInfo.startTime,timerInfo.endTime
|
|
end
|
|
return startTime,endTime
|
|
end
|
|
|
|
--删除活动
|
|
function ActivityList:Delete( id )
|
|
if self.activityList[ id ] then
|
|
self.activityList[ id ] = nil
|
|
end
|
|
log.info(string.format("删除活动信息 ID %d" , id ))
|
|
end
|
|
|
|
--开始活动
|
|
function ActivityList:Start( id )
|
|
if not self.activityList[ id ] then
|
|
return
|
|
end
|
|
self.activityList[ id ].status = self.Status_Start
|
|
log.info(string.format("活动信息 ID %d 开始" , id ))
|
|
end
|
|
|
|
--开始活动
|
|
function ActivityList:Stop( id )
|
|
if not self.activityList[ id ] then
|
|
return
|
|
end
|
|
self.activityList[ id ].status = self.Status_Stop
|
|
log.info(string.format("活动信息 ID %d 停止" , id ))
|
|
end
|
|
|
|
--刷新
|
|
function ActivityList:Refresh()
|
|
local sql = nil
|
|
for k, v in pairs(self.activityList) do
|
|
if self.Status_Stop == v.status and skynet.GetTime() >= v.startTime and skynet.GetTime() <= v.endTime then
|
|
v.status = self.Status_Start
|
|
|
|
log.info(string.format("活动 ID %d 已经开始 活动类型为 %d " , v.id , v.type ))
|
|
elseif self.Status_Start == v.status and skynet.GetTime() > v.endTime then
|
|
v.status = self.Status_Stop
|
|
--计算下一次活动时间
|
|
local startTime,endTime = self:CalcTime( v.activityType , v.timerInfo )
|
|
v.startTime = startTime
|
|
v.endTime = endTime
|
|
log.info(string.format("活动 ID %d 已经结束 活动类型为 %d " , v.id , v.type ))
|
|
end
|
|
end
|
|
end
|
|
|
|
|
|
--活动是否开始
|
|
function ActivityList:IsStart( type )
|
|
for k, v in pairs(self.activityList) do
|
|
if type == v.type and self.Status_Start == v.status then
|
|
return true
|
|
end
|
|
end
|
|
return false
|
|
end
|
|
|
|
--获取活动类型
|
|
function ActivityList:GetType( id )
|
|
for k, v in pairs(self.activityList) do
|
|
if id == v.id then
|
|
return v.type
|
|
end
|
|
end
|
|
return nil
|
|
end
|
|
|
|
--通知所有玩家活动消息
|
|
function ActivityList:NoticeAllUser( type , status )
|
|
local playerList = skynet.server.playerCenter:GetPlayerList()
|
|
for k, v in pairs(playerList) do
|
|
local data = {}
|
|
data.type = type
|
|
data.status = status
|
|
--skynet.server.gameServer:SendMsgToUser( userId , "CMD_S2C_Activity", userData)
|
|
end
|
|
end
|
|
|
|
skynet.server.activityList = ActivityList
|
|
return ActivityList |