HomeServer/lualib-src/Server-main/AllServer/MultiServer/ActivityList.lua

175 lines
5.0 KiB
Lua
Raw Permalink Normal View History

2024-11-20 15:41:09 +08:00
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