diff --git a/hwe/b_myPage.php b/hwe/b_myPage.php index ad96b814..d62183fc 100644 --- a/hwe/b_myPage.php +++ b/hwe/b_myPage.php @@ -2,6 +2,9 @@ namespace sammo; +use sammo\Enums\GeneralAccessLogColumn; +use sammo\Enums\TableName; + include "lib.php"; include "func.php"; @@ -29,7 +32,14 @@ if ($myset > 0) { $submit = 'hidden'; } -$targetTime = addTurn($me->getVar('lastrefresh'), $gameStor->turnterm, GameConst::$minTurnDieOnPrestart); +$lastRefresh = $db->queryFirstField( + 'SELECT %b FROM %b WHERE %b = %i', + GeneralAccessLogColumn::lastRefresh->value, + TableName::generalAccessLog->value, + GeneralAccessLogColumn::generalID->value, $generalID +); + +$targetTime = addTurn($lastRefresh, $gameStor->turnterm, GameConst::$minTurnDieOnPrestart); if ($gameStor->turntime <= $gameStor->opentime) { //서버 가오픈시 할 수 있는 행동 if ($me->getNPCType() == 0 && $me->getNationID() == 0) { diff --git a/hwe/func.php b/hwe/func.php index 8b2e7766..9f253179 100644 --- a/hwe/func.php +++ b/hwe/func.php @@ -6,6 +6,7 @@ use DateTime; use Ds\Set; use sammo\Enums\AuctionType; use sammo\Enums\GeneralAccessLogColumn; +use sammo\Enums\GeneralColumn; use sammo\Enums\InheritanceKey; use sammo\Enums\RankColumn; @@ -1007,16 +1008,16 @@ function increaseRefresh($type = "", $cnt = 1) $isunited = $gameStor->isunited; $opentime = $gameStor->opentime; - if($userGrade == 6){ + if ($userGrade == 6) { return; } - if($isunited == 2){ + if ($isunited == 2) { return; } - if(!$generalID){ + if (!$generalID) { return; } - if($opentime > $date){ + if ($opentime > $date) { return; } @@ -1039,7 +1040,7 @@ function increaseRefresh($type = "", $cnt = 1) $serverID = UniqueConst::$serverID; $logPath = "{$serverPath}/logs/{$serverID}/api_log.db"; - $logDB = FileDB::db($logPath, $serverPath. '/../f_install/sql/api_log.sql'); + $logDB = FileDB::db($logPath, $serverPath . '/../f_install/sql/api_log.sql'); $ip = $_SERVER['REMOTE_ADDR'] ?? 'local'; $date = date('Y-m-d H:i:s'); @@ -1214,7 +1215,16 @@ function updateOnline() //동접수 $startTurn = cutTurn($gameStor->turntime, $gameStor->turnterm, false); - $onlineUser = $db->query('SELECT no,name,nation FROM general WHERE lastrefresh >= %s AND npc < 2', $startTurn); + $onlineUser = $db->query( + 'SELECT %b, %b, %b FROM `general_access_log` as `log` INNER JOIN `general` ON `log`.%b = `general`.%b WHERE %b >= %s', + GeneralColumn::no->value, + GeneralColumn::name->value, + GeneralColumn::nation->value, + GeneralAccessLogColumn::generalID->value, + GeneralColumn::no->value, + GeneralAccessLogColumn::lastRefresh->value, + $startTurn + ); $onlineNum = count($onlineUser); $onlineNationUsers = Util::arrayGroupBy($onlineUser, 'nation'); @@ -1742,7 +1752,7 @@ function deleteNation(General $lord, bool $applyDB): array // 전 장수 재야로 foreach ($nationGeneralList as $general) { - if($general->getNPCType() < 2){ + if ($general->getNPCType() < 2) { $general->setAuxVar( InheritanceKey::max_belong->value, max( diff --git a/hwe/sammo/API/General/BuildNationCandidate.php b/hwe/sammo/API/General/BuildNationCandidate.php index 75816a7a..8ce2e797 100644 --- a/hwe/sammo/API/General/BuildNationCandidate.php +++ b/hwe/sammo/API/General/BuildNationCandidate.php @@ -39,7 +39,7 @@ class BuildNationCandidate extends \sammo\BaseAPI $gameStor = KVStorage::getStorage($db, 'game_env'); $gameStor->cacheValues(['opentime', 'turntime']); - $general = $db->queryFirstRow('SELECT no,name,nation,owner_name,npc,lastrefresh FROM general WHERE owner=%i', $userID); + $general = $db->queryFirstRow('SELECT no,name,nation,owner_name,npc FROM general WHERE owner=%i', $userID); if (!$general) { return '장수가 없습니다'; diff --git a/hwe/sammo/API/General/DieOnPrestart.php b/hwe/sammo/API/General/DieOnPrestart.php index c9650bb2..eee54801 100644 --- a/hwe/sammo/API/General/DieOnPrestart.php +++ b/hwe/sammo/API/General/DieOnPrestart.php @@ -5,6 +5,7 @@ namespace sammo\API\General; use sammo\DB; use sammo\DummyGeneral; use sammo\Enums\APIRecoveryType; +use sammo\Enums\GeneralAccessLogColumn; use sammo\GameConst; use sammo\Session; use sammo\General; @@ -37,7 +38,13 @@ class DieOnPrestart extends \sammo\BaseAPI $gameStor = KVStorage::getStorage($db, 'game_env'); $gameStor->cacheValues(['turnterm', 'opentime', 'turntime', 'year', 'month']); - $general = $db->queryFirstRow('SELECT no,name,nation,owner_name,npc,lastrefresh FROM general WHERE owner=%i AND npc = 0', $userID); + $general = $db->queryFirstRow('SELECT no,name,nation,owner_name,npc FROM general WHERE owner=%i AND npc = 0', $userID); + $lastRefresh = $db->queryFirstField( + 'SELECT %b FROM general_access_log WHERE %b = %i', + GeneralAccessLogColumn::lastRefresh->value, + GeneralAccessLogColumn::generalID, + $general['no'] + ); if (!$general) { return '장수가 없습니다'; @@ -55,7 +62,7 @@ class DieOnPrestart extends \sammo\BaseAPI } //서버 가오픈시 할 수 있는 행동 - $targetTime = addTurn($general['lastrefresh'], $gameStor->turnterm, GameConst::$minTurnDieOnPrestart); + $targetTime = addTurn($lastRefresh, $gameStor->turnterm, GameConst::$minTurnDieOnPrestart); if ($targetTime > TimeUtil::now()) { $targetTimeShort = substr($targetTime, 0, 19); return "아직 삭제할 수 없습니다. {$targetTimeShort} 부터 가능합니다."; diff --git a/hwe/sammo/API/General/Join.php b/hwe/sammo/API/General/Join.php index 796dcc0b..91087876 100644 --- a/hwe/sammo/API/General/Join.php +++ b/hwe/sammo/API/General/Join.php @@ -8,6 +8,7 @@ use sammo\Auction; use sammo\CityConst; use sammo\DB; use sammo\Enums\APIRecoveryType; +use sammo\Enums\GeneralAccessLogColumn; use sammo\Enums\RankColumn; use sammo\GameConst; use sammo\GameUnitConst; @@ -414,7 +415,6 @@ class Join extends \sammo\BaseAPI 'officer_level' => 0, 'turntime' => $turntime, 'killturn' => 6, - 'lastrefresh' => $now, 'crewtype' => GameUnitConst::DEFAULT_CREWTYPE, 'makelimit' => 0, 'betray' => $betray, @@ -427,6 +427,12 @@ class Join extends \sammo\BaseAPI 'special2' => $special2 ]); $generalID = $db->insertId(); + $db->insert('general_access_log', [ + GeneralAccessLogColumn::generalID->value => $generalID, + GeneralAccessLogColumn::userID->value => $userID, + GeneralAccessLogColumn::nationID->value => 1, + GeneralAccessLogColumn::lastRefresh->value => $now, + ]); if($blockCustomGeneralName){ //XXX: 클래스가 이게 맞나? diff --git a/hwe/sammo/Enums/GeneralColumn.php b/hwe/sammo/Enums/GeneralColumn.php index dc40b6dd..c312e0f2 100644 --- a/hwe/sammo/Enums/GeneralColumn.php +++ b/hwe/sammo/Enums/GeneralColumn.php @@ -58,7 +58,6 @@ enum GeneralColumn: string{ case recent_war = 'recent_war'; case makelimit = 'makelimit'; case killturn = 'killturn'; - case lastrefresh = 'lastrefresh'; case ip = 'ip'; case block = 'block'; case dedlevel = 'dedlevel'; diff --git a/hwe/sammo/General.php b/hwe/sammo/General.php index b7a4b7fc..55d699d7 100644 --- a/hwe/sammo/General.php +++ b/hwe/sammo/General.php @@ -1030,7 +1030,7 @@ class General implements iAction 'personal', 'special', 'special2', 'defence_train', 'tnmt', 'npc', 'npc_org', 'deadyear', 'npcmsg', 'dex1', 'dex2', 'dex3', 'dex4', 'dex5', 'betray', 'recent_war', 'last_turn', 'myset', - 'specage', 'specage2', 'con', 'connect', 'aux', 'lastrefresh', 'permission', 'penalty', + 'specage', 'specage2', 'con', 'connect', 'aux', 'permission', 'penalty', ]; if ($reqColumns === null) { diff --git a/hwe/sammo/Scenario/GeneralBuilder.php b/hwe/sammo/Scenario/GeneralBuilder.php index b0d352da..31ddb4a1 100644 --- a/hwe/sammo/Scenario/GeneralBuilder.php +++ b/hwe/sammo/Scenario/GeneralBuilder.php @@ -708,7 +708,6 @@ class GeneralBuilder{ 'dex4'=>$this->dex4, 'dex5'=>$this->dex5, 'aux'=>\sammo\Json::encode($this->aux), - 'lastrefresh'=>TimeUtil::now(), ]); $this->generalID = $db->insertId(); $turnRows = []; diff --git a/hwe/sql/schema.sql b/hwe/sql/schema.sql index bff6f4cd..ba84682c 100644 --- a/hwe/sql/schema.sql +++ b/hwe/sql/schema.sql @@ -54,7 +54,6 @@ CREATE TABLE `general` ( `recent_war` DATETIME(6) NULL DEFAULT NULL, `makelimit` INT(2) NULL DEFAULT '0', `killturn` INT(3) NULL DEFAULT NULL, - `lastrefresh` DATETIME NULL DEFAULT NULL, `ip` VARCHAR(40) NULL DEFAULT '', `block` INT(1) NULL DEFAULT '0', `dedlevel` INT(2) NULL DEFAULT '0', @@ -86,7 +85,6 @@ CREATE TABLE `general` ( INDEX `officer_level` (`nation`, `officer_level`), INDEX `officer_city` (`officer_city`, `officer_level`), INDEX `name` (`name`), - INDEX `last_refresh` (`lastrefresh`), CONSTRAINT `json1` CHECK (json_valid(`last_turn`)), CONSTRAINT `json2` CHECK (json_valid(`aux`)), CONSTRAINT `json3` CHECK (json_valid(`penalty`))