HomeServer/lualib-src/Server-main/Common/Player/PlayerRecord.lua
2024-11-20 15:41:37 +08:00

94 lines
2.8 KiB
Lua

local skynet = require "skynet"
local oo = require "Class"
local log = require "Log"
local sqlUrl = require "SqlUrl"
local serverId = tonumber(skynet.getenv "serverId")
local db = require "DB"
local json =require "json"
local PlayerRecord = oo.class()
PlayerRecord.recordList = {}
function PlayerRecord:Init()
self:CreateTable()
end
--跨天
function PlayerRecord:OnNewDay()
self:CreateTable()
end
--5秒Timer
function PlayerRecord:On5SecTimer()
if not skynet.server.gameServer.curServerConfig then
return
end
self:Save()
end
--创建表
function PlayerRecord:CreateTable()
local time = skynet.GetTime()
local year = os.date("*t", time).year
local month = os.date("*t", time).month
local day = os.date("*t", time).day
local sql = nil
for dbIndex = 1, skynet.server.gameConfig.DBInfoConfig.playerTableCount , 1 do
sql = string.format(sqlUrl.createPlayerRecord , year , month , day )
skynet.server.db:QueryPlayer( dbIndex , sql )
end
end
--新增记录
function PlayerRecord:Add( userId , type , ... )
local p1,p2,p3,p4,p5,p6,p7,p8 = ...
local dbIndex = math.floor(userId / 10000000)
if not self.recordList[ dbIndex ] then
self.recordList[ dbIndex ] = {}
end
local data = {}
data.p1 = p1
data.p2 = p2
data.p3 = p3
data.p4 = p4
data.p5 = p5
data.p7 = p7
data.p8 = p8
table.insert( self.recordList[ dbIndex ] , { userId = userId , type = type , data = json:encode(data) } )
end
--保存记录
function PlayerRecord:Save()
local pararm = nil
local time = skynet.GetTime()
local year = os.date("*t", time).year
local month = os.date("*t", time).month
local day = os.date("*t", time).day
for dbIndex, value in pairs(self.recordList) do
local sql = string.format(sqlUrl.insertRecordToPlayerRecord1 , year , month ,day)
local saveCount = 0
for k, v in pairs(value) do
pararm = string.format(sqlUrl.insertRecordToPlayerRecord2 , v.userId , v.type , v.data)
sql = sql .. pararm
self.recordList[ dbIndex ][ k ] = nil
saveCount = saveCount + 1
if saveCount >= skynet.server.gameServer.curServerConfig.PerSavePlayerRecordCount then
break
end
end
if saveCount > 0 then
sql = string.sub(sql , 1, -2 ) --去掉最后一个逗号
local dbData = skynet.server.db:QueryPlayer( dbIndex , sql )
if dbData and dbData.affected_rows then
log.info(string.format("保存玩家数据记录 数据库索引 %d 应保存人数 %d 实际保存人数 %d 保存用时 %d 秒", dbIndex , saveCount , dbData.affected_rows , skynet.GetTime() - time ))
end
end
end
end
skynet.server.playerRecord = PlayerRecord
return PlayerRecord