diff --git a/src/ProtocolCode.lua b/src/ProtocolCode.lua index ff047ff..0db8c5a 100644 --- a/src/ProtocolCode.lua +++ b/src/ProtocolCode.lua @@ -56,6 +56,8 @@ actionCodes = { Role_diamondConvertRpc = 140, -- 钻石兑换成别的物品 Role_getTimeGiftRpc = 141, Role_runeBuyRpc = 142, -- 铭文购买 + Role_setFriendTeamRpc = 143, -- 设置好友切磋队伍 + Role_setBgRpc = 144, -- 设置看板娘 Adv_startAdvRpc = 151, Adv_startHangRpc = 152, diff --git a/src/actions/EmailAction.lua b/src/actions/EmailAction.lua index bfc4130..36dc00f 100644 --- a/src/actions/EmailAction.lua +++ b/src/actions/EmailAction.lua @@ -14,19 +14,25 @@ local function loadEmails(roleId) end local function delExpireEmails(roleId) - local sql = [[ - DELETE FROM Email - WHERE id IN ( - SELECT id FROM ( - SELECT id - FROM Email WHERE roleId=%s - ORDER BY createtime DESC, id desc - LIMIT %s, 100000 - ) a - ); - ]] + --local sql = [[ + -- DELETE FROM Email + -- WHERE id IN ( + -- SELECT id FROM ( + -- SELECT id + -- FROM Email WHERE roleId=%s + -- ORDER BY createtime DESC, id desc + -- LIMIT %s, 100000 + -- ) a + -- ); + --]] + local sql = "SELECT id FROM Email WHERE roleId=%s ORDER BY createtime DESC, id desc LIMIT %s, 100000" sql = string.format(sql, roleId, EMAIL_LIMIT) - mysqlproxy:query(sql) + local res = mysqlproxy:query(sql) + local tmp = {} + for _, v in ipairs(res) do + table.insert(tmp, v.id) + end + mysqlproxy:query(string.format("DELETE FROM Email WHERE id IN (%s)", table.concat(tmp, ","))) end function _M.listRpc(agent, data) diff --git a/src/actions/RoleAction.lua b/src/actions/RoleAction.lua index b340309..4a21957 100644 --- a/src/actions/RoleAction.lua +++ b/src/actions/RoleAction.lua @@ -1583,4 +1583,27 @@ function _M.runeBuyRpc(agent, data) return true end +function _M.setFriendTeamRpc(agent, data) + local role = agent.role + local msg = MsgPack.unpack(data) + local team = msg.team + local info = {} + info.team = role:getTeamHerosInfo(team) + info.bInfo = role:getTeamBattleInfo(team) + info.v = role:getTeamBattleValue(team.heros) + role:updateProperty({field="friendTeam", value=info}) + + SendPacket(actionCodes.Role_setFriendTeamRpc, "") + return true +end + +function _M.setBgRpc(agent, data) + local role = agent.role + local msg = MsgPack.unpack(data) + role:updateProperty({field="bgId", value=msg.id}) + + SendPacket(actionCodes.Role_setBgRpc, "") + return true +end + return _M \ No newline at end of file diff --git a/src/models/Role.lua b/src/models/Role.lua index 10045c0..7561a96 100644 --- a/src/models/Role.lua +++ b/src/models/Role.lua @@ -30,6 +30,7 @@ function Role:ctor( properties ) self.advData = nil self.activity = nil self._pushToken = nil + self._lastSaveTs = skynet.timex() self.advElChapter = tonum(redisproxy:hget("adv_season", "chapter"), globalCsv.adv_endless_default_chapter) -- 无尽模式记录的赛季对应章节 self.advOverTime = tonum(redisproxy:hget("adv_season", "overTime")) -- 无尽模式关闭时间戳 if self.advOverTime == 0 then @@ -205,6 +206,10 @@ Role.schema = { roleIncre = {"table", {}}, -- 角色英雄,铭文,火花自增序列 {heroId = 1, runeId = 1, sparkId = 1} unlockChap = {"table", {}}, -- 解锁的章节 + + heroCnt = {"number", 0}, -- 英雄数量 + friendTeam = {"table", {}}, -- 好友切磋队伍信息 {bInfo = {}, team = {}, v = 0} + bgId = {"number", 0}, -- 看板娘id } @@ -444,6 +449,8 @@ function Role:data() returner = self:getProperty("returner"), unlockChap = self:getProperty("unlockChap"), -- 解锁的章节 + friendTeam = self:getProperty("friendTeam"), + bgId = self:getProperty("bgId"), } end diff --git a/src/models/RoleCross.lua b/src/models/RoleCross.lua index 4f3c2c4..e3b5a61 100644 --- a/src/models/RoleCross.lua +++ b/src/models/RoleCross.lua @@ -11,7 +11,9 @@ RoleCross.bind = function (Role) level = self:getProperty("level"), headId = self:getProperty("headId"), ltime = self:getProperty("ltime"), - battleV = self:getProperty("pvpTBVC") ~= 0 and self:getProperty("pvpTBVC") or self:getProperty("hangTBV") + + battleV = self.getProperty("friendTeam").v or 0, + --battleV = self:getProperty("pvpTBVC") ~= 0 and self:getProperty("pvpTBVC") or self:getProperty("hangTBV") } return info end @@ -19,8 +21,13 @@ RoleCross.bind = function (Role) -- 好友详细队伍信息 function Role:friendInfo() local info = self:friendSInfo() - local team = self:getProperty("pvpTBVC") ~= 0 and self:getProperty("pvpTSC") or self:getProperty("hangTS") - info.team = team + --local team = self:getProperty("pvpTBVC") ~= 0 and self:getProperty("pvpTSC") or self:getProperty("hangTS") + --info.team = team + info.team = self:getProperty("friendTeam").team or {} + info.heroCnt = self:getProperty("heroCnt") + info.achieveCnt = table.numbers(self:getProperty("achiveV")) + info.bgId = self:getProperty("bgId") + info.hangPass = self:getProperty("hangPass") return info end @@ -274,31 +281,42 @@ function CMD.getProperties(roleId, fields) end function CMD.friendSInfo(roleId) - local info = CMD.getProperties(roleId, {"name", "level", "headId", "ltime", "pvpTBVC", "hangTBV"}) + --local info = CMD.getProperties(roleId, {"name", "level", "headId", "ltime", "pvpTBVC", "hangTBV"}) + local info = CMD.getProperties(roleId, {"name", "level", "headId", "ltime", "friendTeam"}) return { name = info.name, level = info.level, headId = info.headId, ltime = info.ltime, - battleV = info.pvpTBVC ~= 0 and info.pvpTBVC or info.hangTBV, + --battleV = info.pvpTBVC ~= 0 and info.pvpTBVC or info.hangTBV, + battleV = info.friendTeam.v or 0, } end function CMD.friendInfo(roleId) - local info = CMD.getProperties(roleId, {"name", "level", "headId", "ltime", "pvpTBVC", "hangTBV", "pvpTSC", "hangTS"}) + --local info = CMD.getProperties(roleId, {"name", "level", "headId", "ltime", "pvpTBVC", "hangTBV", "pvpTSC", "hangTS"}) + local info = CMD.getProperties(roleId, {"name", "level", "headId", "ltime", "friendTeam", "heroCnt", "achiveV", "bgId", "hangPass"}) return { name = info.name, level = info.level, headId = info.headId, ltime = info.ltime, - battleV = info.pvpTBVC ~= 0 and info.pvpTBVC or info.hangTBV, - team = info.pvpTBVC ~= 0 and info.pvpTSC or info.hangTS + --battleV = info.pvpTBVC ~= 0 and info.pvpTBVC or info.hangTBV, + --team = info.pvpTBVC ~= 0 and info.pvpTSC or info.hangTS + battleV = info.friendTeam.v or 0, + team = info.friendTeam.team or {}, + heroCnt = info.heroCnt, + achieveCnt = table.numbers(info.achiveV), + bgId = info.bgId, + hangPass = info.hangPass, } end function CMD.friendBattleInfo(roleId) - local info = CMD.getProperties(roleId, {"pvpTBC", "hangTB"}) - return (next(info.pvpTBC) and next(info.pvpTBC.heros)) and info.pvpTBC or info.hangTB + --local info = CMD.getProperties(roleId, {"pvpTBC", "hangTB"}) + local info = CMD.getProperties(roleId, {"friendTeam"}) + --return (next(info.pvpTBC) and next(info.pvpTBC.heros)) and info.pvpTBC or info.hangTB + return info.friendTeam.bInfo or {} end function CMD.pvpCInfo(roleId) diff --git a/src/models/RolePlugin.lua b/src/models/RolePlugin.lua index 2857ede..1f7d466 100644 --- a/src/models/RolePlugin.lua +++ b/src/models/RolePlugin.lua @@ -603,6 +603,7 @@ function RolePlugin.bind(Role) SendPacket(actionCodes.Hero_loadInfos, bin) end + self:updateProperty({field = "heroCnt", value = #self.heros}) self:logItems(heroType + ItemStartId.Hero, 0, 1, params.log) if params.log then @@ -1929,10 +1930,15 @@ function RolePlugin.bind(Role) function Role:onRecoverTimer(now) self:updateTimeReset(now, true) self:checkNewEvent(now) - self:saveRoleData() + self:saveRoleData(now) end - function Role:saveRoleData() + local SAVE_DATA_INTERVAL = 3 + function Role:saveRoleData(now) + if now - self._lastSaveTs < SAVE_DATA_INTERVAL then + return + end + self._lastSaveTs = now self:update() local objs = {self.activity, self.dailyData, self.dinerData, self.storeData, self.roleIncre} for _, info in ipairs(objs) do diff --git a/src/services/dbseed.lua b/src/services/dbseed.lua index 479f58b..9ab62dd 100644 --- a/src/services/dbseed.lua +++ b/src/services/dbseed.lua @@ -100,6 +100,9 @@ local function initAutoIncreUidTable() mysqlproxy:query(string.format(tpl, "seaportTime0", 0)) mysqlproxy:query(string.format(tpl, "seaportTime1", 0)) mysqlproxy:query(string.format(tpl, "seaportTime2", 0)) + + -- 记录当前更新版本 + mysqlproxy:query(string.format(tpl, "db_ver", 0)) end end @@ -255,6 +258,31 @@ local function selectDb() end end +local function doUpdateSql() + local updates = { + [1] = { + "ALTER TABLE `Email` ADD INDEX roleid_createtime_id(`roleId`,`createtime`,`id`),DROP INDEX roleId_Index", + "ALTER TABLE `Role` ADD INDEX uid_Index(`uid`)", + }, + } + -- 更新记录表 + local res = mysqlproxy:query("SELECT `value` FROM `autoincrement_set` WHERE `key` = 'db_ver';") + local ver = res[1].value + for k, sqls in ipairs(updates) do + if ver < k then + skynet.error("do update sql, version:"..k) + for _, sql in ipairs(sqls) do + local r = mysqlproxy:query(sql) + if r["errno"] then + skynet.error(string.format("%s, err:%s",sql, r["err"])) + return + end + end + mysqlproxy:query(string.format("UPDATE `autoincrement_set` SET `value` = %d WHERE `key` = 'db_ver';", k)) + end + end +end + skynet.start(function () --local new = redisproxy:hsetnx("autoincrement_set", "server_start", os.date("%Y%m%d", skynet.timex())) == 1 --if not new then @@ -273,6 +301,7 @@ skynet.start(function () initRedisDb() initSeaportTask() -- 海港任务数据初始化 loadAllUserInfo() + doUpdateSql() -- 执行更新sql selectDb() skynet.exit() end) \ No newline at end of file diff --git a/src/utils/MysqlUtil.lua b/src/utils/MysqlUtil.lua index 0c5ed49..c20a1bd 100644 --- a/src/utils/MysqlUtil.lua +++ b/src/utils/MysqlUtil.lua @@ -34,7 +34,6 @@ function addFriend(roleId, friendId) rpcRole(roleId, "addFriend", friendId) rpcRole(friendId, "addFriend", roleId) end - dump(r) end function delFriend(roleId, friendId) @@ -44,7 +43,6 @@ function delFriend(roleId, friendId) rpcRole(roleId, "delFriend", friendId) rpcRole(friendId, "delFriend", roleId) end - dump(r) end function roleExists(roleId) -- libgit2 0.21.2