require "ProtocolCode" require "shared.init" require "GlobalVar" require "RedisKeys" require "skynet.manager" skynet = require "skynet" csvdb = require "shared.csvdata" redisproxy = require "shared.redisproxy" datacenter = require "skynet.datacenter" local capsules = {} local CMD = {} NotifyChangeType = { JOIN = 1, EXIT = 2, DRAW = 3, SPECIAL = 4, INCENTIVE = 5, } local function rpcRole(roleId, funcName, ...) local fields = ... local agent = datacenter.get("agent", roleId) local roleCross = require("models.RoleCross") if funcName == "getProperties" then return roleCross.handle(funcName, roleId, fields) else return roleCross.handle(funcName, roleId, ...) end end function getNameByRoleId(roleId) return rpcRole(roleId, "getProperty", "name") end function broadCastCapsule(roleId, capsuleId, broadInfo) local capsule = capsules[capsuleId] or {} local register = capsule:getProperty("register") or {} if next(capsule) then for id, _ in pairs(register) do if id ~= roleId then rpcRole(id, "SendPacket", actionCodes.Capsule_notifyChange, MsgPack.pack(broadInfo)) -- 通知对方 end end end end local function getCapsuleId(id, room) return string.format("%d%d", id, room) end local function add(roleId, capsuleId) local capsule = capsules[capsuleId] or {} if next(capsule) then capsule:join(roleId) broadCastCapsule(roleId, capsuleId, {changeType = NotifyChangeType.JOIN, roleId = roleId}) return capsule:data(roleId) end print("id 不存在: ".. capsuleId) return nil end local function capsuleRefreshing() for _, v in pairs(capsules) do if v:refreshing() then v:init() v:create() end end end --扭蛋机刷新 local function check_capsules() pcall(capsuleRefreshing) skynet.timeout(60, check_capsules) end function CMD.start() local now = skynet.timex() local res = redisproxy:smembers(CAPSULE_INFO) or {} for _, key in pairs(res) do local capsule = require("models.Capsule").new({ key = CAPSULE_PUBLIC:format(key)}) capsule:load() if capsule:isShow() then if capsule:refreshing(now) then capsule:init() capsule:create() end capsules[key] = capsule else redisproxy:del(CAPSULE_PUBLIC:format(key)) redisproxy:srem(CAPSULE_INFO, key) end end for _, data in pairs(csvdb["ichibankuji_mainCsv"]) do for _, val in ipairs(data) do if val.type == 1 then local key = val.id..val.room if not capsules[key] then local capsule = require("models.Capsule").new({ key = CAPSULE_PUBLIC:format(key), id= val.id, room = val.room, typ = 1, name=val.name}) capsule:init() capsule:create() capsules[key] = capsule redisproxy:sadd(CAPSULE_INFO, key) end end end end check_capsules() end function CMD.list(coin) local tmpCapsules = {} for k, v in pairs(capsules) do if v:getProperty("coin") == coin then local onlineCount= v:getOnlineCount() tmpCapsules[k] = {id=v:getProperty("id"), room=v:getProperty("room"), typ=v:getProperty("typ"), people=onlineCount[2], coin= v:getProperty("coin")} end end return tmpCapsules end function CMD.join(roleId, capsuleId) if capsuleId then return add(roleId, capsuleId) end return nil end function CMD.exit(roleId, capsuleId) if capsuleId then local capsule = capsules[capsuleId] or {} if next(capsule) then capsule:exit(roleId) broadCastCapsule(roleId, capsuleId, {changeType = NotifyChangeType.EXIT, roleId = roleId}) end else for _, capsule in pairs(capsules) do if next(capsule) then capsule:exit(roleId) broadCastCapsule(roleId, capsuleId, {changeType = NotifyChangeType.EXIT, roleId = roleId}) end end end end function CMD.draw_capsule(roleId, capsuleId, full, cares) local capsule = capsules[capsuleId] or {} if next(capsule) then local ret, reward, rewardByGoods, notify = capsule:draw(roleId, full, cares) --if ret > 4 then -- broadCastCapsule(roleId, capsuleId, {changeType = NotifyChangeType.DRAW, roleId = roleId, notify = notify}) --end return ret, reward, rewardByGoods, capsule:data(roleId) end return 1 end function CMD.register(roleId, capsuleId) local capsule = capsules[capsuleId] or {} if next(capsule) then return capsule:register(roleId) end return nil end skynet.start(function() skynet.dispatch("lua", function(session, address, cmd, ...) local f = CMD[string.lower(cmd)] skynet.ret(skynet.pack(f(...))) end) skynet.register("capsuled") globalCsv = csvdb["GlobalDefineCsv"] end)