You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

441 lines
13 KiB
Lua

-- 用户数据模型
local skynet = require "skynet"
local cjson = require "cjson"
local bagmodel = require "bagmodel"
local heromodel = require "heromodel"
local mqhelper = require "mqhelper"
local settings = require "settings"
local lordlogic = require "lordlogic"
local viplogic = require "viplogic"
local boxlogic = require "boxlogic"
local booklogic = require "booklogic"
local dateutils = require "dateutils"
local utils = require "utils"
local pattern = "(%d+)-(%d+)-(%d+) (%d+):(%d+):(%d+)"
local usermodel = {}
require "functions"
function usermodel:init(user)
self.uid = user.uid
self.serverid = user.serverid
self.openid = user.openid
self.unionid = user.unionid
self.nickname = user.nickname
self.avatar = user.avatar
self.is_update = user.is_update or 0
self.lv = user.lv or 1--主公等级
self.stage = user.stage or 0 --当前阶
self.max_level = user.max_level or 1--关卡
self.owner = user.owner or 0
self.recharge_total = user.recharge_total or 0 --充值总数
self.recruit_num = user.recruit_num or 0 --招募次数
self.openbox_num = user.openbox_num or 0 --宝箱开启次数
self.blackmarket_num = user.blackmarket_num or 0 --黑市购买次数
self.coinget_num = user.coinget_num or 0 --点金次数
self.click_num = user.click_num or 0 --点击次数
self.tower_level = user.tower_level or 1 --咸将塔 关
self.online_status = user.online_status
self.login_day = user.login_day or 0 --登录天数
self.box_score = user.box_score or 0
self.box_stage = user.box_stage or 1
self.emblemstar = user.emblemstar or 0 --徽星数量
self.emblemstarid = user.emblemstarid or 0
self.fishing_score = user.fishing_score or 0
self.fishing_num_lv1 = user.fishing_num_lv1 or 0
self.fishing_num_lv2 = user.fishing_num_lv2 or 0
self.last_use_xyg_time = user.last_use_xyg_time or 0
self.last_use_nengliang_time = user.last_use_nengliang_time or 0
self.arena_level = user.arena_level or 1 -- 竞技场等级
self.last_recruit_time = user.last_recruit_time or 0
self.last_fishing_time = user.last_fishing_time or 0
self.last_login_time = user.last_login_time
self.last_logout_time = user.last_logout_time
end
function usermodel:login()
self.last_login_time = os.date("%Y-%m-%d %H:%M:%S")
self.online_status = 1
end
function usermodel:getserverid()
return self.serverid
end
function usermodel:getServer()
return utils.getserver(self.serverid)
end
--获取竞技场组
function usermodel:getArenaServer()
return utils.getarenserver(self.serverid, self.arena_level)
end
function usermodel:getBaiFuServer()
return utils.getbaifuserver(self.serverid)
end
--更新招募时间
function usermodel:updaterecruittime()
self.last_recruit_time = os.time()
self:save({last_recruit_time=self.last_recruit_time})
end
--检查是否免费 true 免费
function usermodel:checkrecruit()
if self.last_recruit_time == 0 then
return true
end
local d = dateutils.calday(os.time() ,self.last_recruit_time)
if d ~= 0 then
return true
end
return false
end
--更新钓鱼时间
function usermodel:updatefishingtime()
self.last_fishing_time = os.time()
self:save({last_fishing_time=self.last_fishing_time})
end
--检查是否免费钓鱼 true 免费
function usermodel:checkfishing()
if self.last_fishing_time == 0 then
return true
end
if os.time() - self.last_fishing_time >= 8*3600 then
return true
end
return false
end
function usermodel:caloverfishingtimelong()
if os.time() - self.last_fishing_time >= 8*3600 then
return 0
end
local t = os.time() - self.last_fishing_time
return math.max(0, 8*3600 - t)
end
function usermodel:caloverrecruittimelong()
local d = dateutils.calday(os.time() ,self.last_recruit_time)
if d ~= 0 then
return 0
end
return math.max(0, dateutils.onedayover() - os.time())
end
--添加招募次数
function usermodel:addrecruitnum(num)
self.recruit_num = self.recruit_num + num
end
function usermodel:addopenboxnum(num)
self.openbox_num = self.openbox_num + num
end
function usermodel:addblackmarketnum(num)
self.blackmarket_num = self.blackmarket_num + num
end
function usermodel:addcoingetnum(num)
self.coinget_num = self.coinget_num + num
end
function usermodel:addclicknum(num)
self.click_num = self.click_num + num
end
--增加徽星
function usermodel:incremblemstar(star)
self.emblemstar = self.emblemstar + star
-- self:save({emblemstar=self.emblemstar})
end
--是否可以领取
function usermodel:canreceiveremblemstar()
local emblemstarid = self.emblemstarid
local cfg = booklogic.getcurbookstage(emblemstarid + 1)
local start = cfg.start
local emblemstar = self.emblemstar
if emblemstar >= start then
return true
end
return false
end
--领取
function usermodel:receiveremblemstar()
self.emblemstarid = self.emblemstarid + 1
end
function usermodel:incrboxscore(num)
self.box_score = self.box_score + num
end
function usermodel:decrboxscore(num)
self.box_score = self.box_score - num
end
function usermodel:updateboxscore(score)
self.box_score = score
end
function usermodel:updateboxstage(stage)
self.box_stage = stage
end
function usermodel:boxstageup()
local cfg = boxlogic.getstageconf()
if self.box_stage == 9 then
self.box_stage = 1
else
self.box_stage = self.box_stage + 1
end
end
function usermodel:checkcanreceivebox()
local cfg = boxlogic.getstageconfbystage(self.box_stage)
assert(cfg ~= nil, "配置获取失败")
local limit = cfg.limit
if self.box_score >= limit then
return true
end
return false
end
function usermodel:getcurattr()
local userinfo = {}
userinfo.uid = self.uid
userinfo.lv = self.lv --主公等级
userinfo.stage = self.stage
return userinfo
end
function usermodel:serialize()
local userinfo = {}
userinfo.uid = self.uid
userinfo.serverid = self.serverid
userinfo.nickname = self.nickname
userinfo.avatar = self.avatar
userinfo.lv = self.lv --主公等级
userinfo.stage = self.stage
userinfo.max_level = self.max_level --关卡
userinfo.tower_level = self.tower_level
userinfo.cur_tower_level = self:calcurtowerlevel()
userinfo.vip_lv = self:getviplv() --vip等级
userinfo.recharge_total = self.recharge_total --充值总数
userinfo.recharge_day = self.recharge_day
userinfo.emblemstar = self.emblemstar
userinfo.emblemstarid = self.emblemstarid
userinfo.fishing_score = self.fishing_score
userinfo.fishing_num_lv1= self.fishing_num_lv1
userinfo.fishing_num_lv2= self.fishing_num_lv2
userinfo.owner = self.owner
userinfo.last_use_xyg_time = self.last_use_xyg_time
userinfo.last_use_nengliang_time = self.last_use_nengliang_time
userinfo.recruit_over_timelong = self:caloverrecruittimelong()
userinfo.fishing_over_timelong = self:caloverfishingtimelong()
userinfo.box_score = self.box_score
userinfo.box_stage = self.box_stage
userinfo.clk = self:getclk()
userinfo.atk = self:getatk()
userinfo.hp = self:gethp()
userinfo.def = self:getdef()
userinfo.zhanli = self:getzhanli()
return userinfo
end
function usermodel:getclk()
return lordlogic.getclk(self.lv - 1)
end
function usermodel:getatk()
return lordlogic.getatk(self.lv - 1)
end
function usermodel:gethp()
return lordlogic.gethp(self.lv - 1)
end
function usermodel:getdef()
return lordlogic.getdef(self.lv - 1)
end
function usermodel:getlordorderext(k)
return lordlogic.getlordorderext(k, self.stage)
end
--[[
战斗力=攻击力*1+血量*0.21+防御*0.74+速度*1
]]
function usermodel:getzhanli()
return heromodel:gettotalzhanli()
end
--当前塔的阶段
function usermodel:calcurtowerstage()
return math.ceil(self.tower_level/10)
end
--上一个塔的阶段
function usermodel:callasttowerstage()
return math.floor((self.tower_level - 1)/10)
end
--当前塔的层数
function usermodel:calcurtowerlevel()
return math.floor((self.tower_level - 1)%10 + 1)
end
function usermodel:towerlevelup()
self.tower_level = self.tower_level + 1
self:save({tower_level=self.tower_level})
end
function usermodel:settowerstatus(status)
self.tower_status = status
end
--获取到他人可以看到的信息
function usermodel:get_look_info()
local userinfo = {}
userinfo.uid = self.uid
userinfo.serverid = self.serverid
userinfo.nickname = self.nickname
userinfo.avatar = self.avatar
userinfo.max_level = self.max_level
return userinfo
end
--使用小鱼干
function usermodel:usexiaoyugan()
self.last_use_xyg_time = os.time()
self:save({last_use_xyg_time=self.last_use_xyg_time})
end
--使用能量
function usermodel:usenengliang()
self.last_use_nengliang_time = os.time()
self:save({last_use_nengliang_time=self.last_use_nengliang_time})
end
--升级
function usermodel:lvup(num)
self.lv = self.lv + num
self:save({lv=self.lv})
end
function usermodel:stageup()
self.stage = self.stage + 1
self:save({stage=self.stage})
end
--下一关
function usermodel:incrlevel()
self.max_level = self.max_level + 1
self:save({max_level=self.max_level})
end
function usermodel:incrrechargetotal(t)
self.recharge_total = self.recharge_total + t
self:save({recharge_total=self.recharge_total})
end
function usermodel:getviplv()
local lv = viplogic.getviplv(self.recharge_total)
return lv
end
function usermodel:getfishingnum(lv)
return self["fishing_num_lv"..lv] or 0
end
function usermodel:incrfishingnum(lv, num)
self["fishing_num_lv"..lv] = self["fishing_num_lv"..lv] + num
end
--添加捕获积分
function usermodel:incrfishingscore(num)
self.fishing_score = self.fishing_score + num
self:save({fishing_score=self.fishing_score})
end
--添加捕获积分
function usermodel:decrfishingscore(num)
self.fishing_score = self.fishing_score - num*20
self:save({fishing_score=self.fishing_score})
end
--用户离线
function usermodel:logout()
skynet.error(string.format("user %d logout", UID))
self.last_logout_time = os.date("%Y-%m-%d %H:%M:%S")
self.online_status = 0
self:save({last_logout_time=self.last_logout_time, online_status=self.online_status})
end
function usermodel:savenickname(nickname)
self.nickname = nickname
self.is_update = 1
self:save({nickname=self.nickname, is_update=self.is_update})
end
function usermodel:saveavatar(avatar)
self.avatar = avatar
self:save({avatar=self.avatar})
end
--全量保存
function usermodel:saveall()
local userinfo = {}
userinfo.is_update = self.is_update
userinfo.lv = self.lv
userinfo.stage = self.stage
userinfo.max_level = self.max_level
userinfo.recharge_total = self.recharge_total
userinfo.recruit_num = self.recruit_num
userinfo.openbox_num = self.openbox_num
userinfo.blackmarket_num = self.blackmarket_num
userinfo.coinget_num = self.coinget_num
userinfo.click_num = self.click_num
userinfo.tower_level = self.tower_level
userinfo.online_status = self.online_status
userinfo.login_day = self.login_day
userinfo.box_score = self.box_score
userinfo.box_stage = self.box_stage
userinfo.emblemstar = self.emblemstar
userinfo.emblemstarid = self.emblemstarid
userinfo.fishing_score = self.fishing_score
userinfo.fishing_num_lv1= self.fishing_num_lv1
userinfo.fishing_num_lv2= self.fishing_num_lv2
userinfo.owner = self.owner
userinfo.last_use_xyg_time = self.last_use_xyg_time
userinfo.last_use_nengliang_time = self.last_use_nengliang_time
userinfo.last_recruit_time = self.last_recruit_time
userinfo.last_fishing_time = self.last_fishing_time
self:save(userinfo)
end
--保存用户信息
function usermodel:save(data)
skynet.error(string.format("user %d save to db", UID))
DEBUG("save data = ", DUMP(data))
assert(not table.empty(data), " user save data 数据错误 ")
local ok = skynet.call(".usercenterd", "lua", "saveuser", UID, data)
local ok = mqhelper.exec("upsert", UID, settings.user_mongodb_key.tname, settings.user_mongodb_key.cname, {["$set"]=data}, {uid=UID})
end
return usermodel