#!/usr/bin/python # -*- coding: GBK -*- #------------------------------------------------------------------------------- # ##@package Player.PlayerBackup # # @todo:Íæ¼Ò±¸µµ # @author hxp # @date 2022-12-06 # @version 1.0 # # ÏêϸÃèÊö: Íæ¼Ò±¸µµ # #------------------------------------------------------------------------------- #"""Version = 2022-12-06 18:30""" #------------------------------------------------------------------------------- import ChConfig import PlayerControl import ReadChConfig import GameWorld import shutil import time import os def CheckPlayerBackup(curPlayer): PlayerBakRoot = ReadChConfig.GetPyMongoConfig("Backup", "PlayerBakRoot", isLog=False) if not PlayerBakRoot: #GameWorld.DebugLog("δÆôÓñ¸µµ") return curTime = int(time.time()) backupTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_BackupTime) if not backupTime: PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_BackupTime, curTime) return playerID = curPlayer.GetPlayerID() BackupCDTimes = GameWorld.ToIntDef(ReadChConfig.GetPyMongoConfig("Backup", "BackupMinutes")) if not BackupCDTimes or curTime - backupTime < BackupCDTimes * 60: #GameWorld.DebugLog("±¸µµcdÖÐ, BackupCDTimes=%s,pass=%s" % (BackupCDTimes, curTime - backupTime), playerID) return PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_BackupTime, curTime) PlayerBakDir = os.path.join(PlayerBakRoot, str(playerID)) BakCopyDir = os.path.join(PlayerBakDir, "Backup") if not os.path.exists(PlayerBakDir): os.makedirs(PlayerBakDir) os.makedirs(BakCopyDir) fileType = ReadChConfig.GetPyMongoConfig("Backup", "PlayerBakFileType", defaultValue=".pdbak") moveList, copyList = [], [] for parent, _, filenames in os.walk(PlayerBakDir): for filename in filenames: if not filename.endswith(fileType): continue fullPath = os.path.join(parent, filename) if parent == BakCopyDir: bakTime = GameWorld.ToIntDef(filename[:filename.index(".")].split("_")[1]) copyList.append([bakTime, fullPath]) else: if not os.path.exists(os.path.join(BakCopyDir, filename)): moveList.append(fullPath) else: os.remove(fullPath) for filePath in moveList: shutil.move(filePath, BakCopyDir) copyList.sort() BackupCopyMax = GameWorld.ToIntDef(ReadChConfig.GetPyMongoConfig("Backup", "BackupCopy")) # ±£Áô¾É±¸µµ·ÝÊý delCopyCount = len(copyList) + len(moveList) - BackupCopyMax for _, copyFilePath in copyList: if delCopyCount > 0: delCopyCount -= 1 os.remove(copyFilePath) else: break # Íæ¼Ò±¸µµÎļþ¸ñʽ: Íæ¼ÒID_±¸µµÊ±¼ä´Á.pb pdBakPath = os.path.join(PlayerBakDir, "%s_%s%s" % (playerID, curTime, fileType)) curPlayer.RealTimeBackupSinglePlayerLogic(pdBakPath) GameWorld.DebugLog("DoPlayerBackup: %s" % pdBakPath, playerID) return