diff --git a/Admin/Templates/config.tpl b/Admin/Templates/config.tpl
index 4a2df605..8526f49b 100644
--- a/Admin/Templates/config.tpl
+++ b/Admin/Templates/config.tpl
@@ -113,6 +113,12 @@ $cronKey = defined('CRON_KEY') ? (string) CRON_KEY : '';
$cronBase = defined('HOMEPAGE') ? rtrim(HOMEPAGE, '/') : '';
$cronUrl = ($cronBase !== '' && $cronKey !== '') ? $cronBase . '/cron.php?key=' . $cronKey : '';
+$cleanReports = defined('CLEANUP_REPORTS_DAYS') ? (int) CLEANUP_REPORTS_DAYS : 14;
+$cleanChat = defined('CLEANUP_CHAT_DAYS') ? (int) CLEANUP_CHAT_DAYS : 7;
+$cleanMessages = defined('CLEANUP_MESSAGES_DAYS') ? (int) CLEANUP_MESSAGES_DAYS : 0;
+$cleanupMarker = __DIR__ . '/../../GameEngine/Prevention/cleanup_last.txt';
+$cleanupInfo = @is_file($cleanupMarker) ? @json_decode((string) @file_get_contents($cleanupMarker), true) : null;
+
$cronPath = realpath(__DIR__ . '/../../cron.php');
$cronCmd = $cronPath ? '*/5 * * * * /usr/local/bin/php ' . $cronPath . ' >/dev/null 2>&1' : '';
@@ -175,6 +181,32 @@ $cronKeyMasked = ($cronKey === '')
+
+ Database cleanup ?Automation trims tables that would otherwise grow forever. Archived reports are never deleted. 0 disables a rule.
+ 0 ? $cleanReports . 'd' : 'off');
+ $parts[] = 'chat: ' . ($cleanChat > 0 ? $cleanChat . 'd' : 'off');
+ $parts[] = 'deleted messages: ' . ($cleanMessages > 0 ? $cleanMessages . 'd' : 'off');
+ echo implode(' | ', $parts);
+ ?>
+
+
+
+ Last cleanup run ?Cleanup runs once per hour from Automation and deletes in batches, so a first run on an old server catches up over several passes.
+ (' . (int) ($r['reports'] ?? 0) . ' reports, '
+ . (int) ($r['chat'] ?? 0) . ' chat, '
+ . (int) ($r['messages'] ?? 0) . ' messages)';
+ } else {
+ echo "Not run yet ";
+ }
+ ?>
+
+
Cron job command ?Add this in cPanel → Cron Jobs. The path is detected from this installation.
diff --git a/Admin/Templates/editCronSet.tpl b/Admin/Templates/editCronSet.tpl
index b3bc22ee..bf20ce69 100644
--- a/Admin/Templates/editCronSet.tpl
+++ b/Admin/Templates/editCronSet.tpl
@@ -27,6 +27,13 @@ $cronLoop = defined('CRON_LOOP_SECONDS') ? (int) CRON_LOOP_SECONDS : 300;
$cronTick = defined('CRON_TICK_SECONDS') ? (int) CRON_TICK_SECONDS : 60;
$cronKey = defined('CRON_KEY') ? (string) CRON_KEY : '';
+$cleanReports = defined('CLEANUP_REPORTS_DAYS') ? (int) CLEANUP_REPORTS_DAYS : 14;
+$cleanChat = defined('CLEANUP_CHAT_DAYS') ? (int) CLEANUP_CHAT_DAYS : 7;
+$cleanMessages = defined('CLEANUP_MESSAGES_DAYS') ? (int) CLEANUP_MESSAGES_DAYS : 0;
+
+$cleanupMarker = __DIR__ . '/../../GameEngine/Prevention/cleanup_last.txt';
+$cleanupInfo = @is_file($cleanupMarker) ? @json_decode((string) @file_get_contents($cleanupMarker), true) : null;
+
$cronPath = realpath(__DIR__ . '/../../cron.php');
$cronCmd = $cronPath ? '*/5 * * * * /usr/local/bin/php ' . $cronPath . ' >> ' . dirname(dirname($cronPath)) . '/cron.log 2>&1' : '';
?>
@@ -132,6 +139,49 @@ code{background:#f1f5f9;padding:2px 5px;border-radius:4px;font-size:11px;word-br
+
+
‹
diff --git a/GameEngine/Admin/Mods/config_template.php b/GameEngine/Admin/Mods/config_template.php
index 5c9a6419..180c9115 100644
--- a/GameEngine/Admin/Mods/config_template.php
+++ b/GameEngine/Admin/Mods/config_template.php
@@ -85,6 +85,24 @@ if (!function_exists('admin_config_template_path')) {
$text = str_replace('%CRONTICK%', (string) $cronTick, $text);
}
+ // Retentiile de curatenie: la fel, editate din ACP, deci orice alt mod
+ // care regenereaza config.php trebuie sa le pastreze.
+ $cleanupDefaults = array(
+ '%CLEANUPREPORTS%' => array('CLEANUP_REPORTS_DAYS', 14),
+ '%CLEANUPCHAT%' => array('CLEANUP_CHAT_DAYS', 7),
+ '%CLEANUPMESSAGES%' => array('CLEANUP_MESSAGES_DAYS', 0),
+ );
+
+ foreach ($cleanupDefaults as $placeholder => $info) {
+ if (strpos($text, $placeholder) === false) {
+ continue;
+ }
+
+ list($constant, $default) = $info;
+ $value = defined($constant) ? (int) constant($constant) : $default;
+ $text = str_replace($placeholder, (string) $value, $text);
+ }
+
return $text;
}
}
diff --git a/GameEngine/Admin/Mods/editCronSet.php b/GameEngine/Admin/Mods/editCronSet.php
index 56be5938..338931bf 100644
--- a/GameEngine/Admin/Mods/editCronSet.php
+++ b/GameEngine/Admin/Mods/editCronSet.php
@@ -59,6 +59,17 @@ if ($loop > 0 && $loop < $tick) {
$loop = 0;
}
+// Retentiile de curatenie (0 = regula dezactivata). Limita superioara de 3650
+// zile (10 ani) e doar ca sa nu se scrie valori absurde in config.
+$cleanReports = isset($_POST['cleanup_reports']) ? (int) $_POST['cleanup_reports'] : 14;
+$cleanChat = isset($_POST['cleanup_chat']) ? (int) $_POST['cleanup_chat'] : 7;
+$cleanMessages = isset($_POST['cleanup_messages']) ? (int) $_POST['cleanup_messages'] : 0;
+
+foreach (array('cleanReports', 'cleanChat', 'cleanMessages') as $var) {
+ if ($$var < 0) { $$var = 0; }
+ if ($$var > 3650) { $$var = 3650; }
+}
+
$regenerateKey = !empty($_POST['regenerate_key']);
$cronKey = (defined('CRON_KEY') && CRON_KEY !== '' && CRON_KEY !== '%CRONKEY%')
@@ -115,6 +126,18 @@ if (!cron_set_define($config, 'CRON_KEY', "'" . addcslashes($cronKey, "'\\") . "
$missing[] = "define('CRON_KEY', '" . addcslashes($cronKey, "'\\") . "');";
}
+if (!cron_set_define($config, 'CLEANUP_REPORTS_DAYS', (string) $cleanReports)) {
+ $missing[] = "define('CLEANUP_REPORTS_DAYS', " . $cleanReports . ");";
+}
+
+if (!cron_set_define($config, 'CLEANUP_CHAT_DAYS', (string) $cleanChat)) {
+ $missing[] = "define('CLEANUP_CHAT_DAYS', " . $cleanChat . ");";
+}
+
+if (!cron_set_define($config, 'CLEANUP_MESSAGES_DAYS', (string) $cleanMessages)) {
+ $missing[] = "define('CLEANUP_MESSAGES_DAYS', " . $cleanMessages . ");";
+}
+
// Server instalat inainte ca aceste constante sa existe: le adaugam dupa
// AUTOMATION_LOCK_FILE_NAME (locul lor din template).
if (!empty($missing)) {
@@ -140,7 +163,7 @@ fwrite($fh, $config);
fclose($fh);
$database->query(
- "Insert into " . TB_PREFIX . "admin_log values (0," . $id . ",'Changed Cron & Automation Settings'," . time() . ")"
+ "Insert into " . TB_PREFIX . "admin_log values (0," . $id . ",'Changed Cron, Automation & Cleanup Settings'," . time() . ")"
);
header("Location: ../../../Admin/admin.php?p=config");
diff --git a/GameEngine/Automation.php b/GameEngine/Automation.php
index a2795ac0..63442fbe 100644
--- a/GameEngine/Automation.php
+++ b/GameEngine/Automation.php
@@ -72,6 +72,7 @@ include_once __DIR__ . '/Automation/AutomationHero.php';
include_once __DIR__ . '/Automation/AutomationStarvation.php';
include_once __DIR__ . '/Automation/AutomationNatarsWW.php';
include_once __DIR__ . '/Automation/AutomationMedals.php';
+include_once __DIR__ . '/Automation/AutomationCleanup.php';
class Automation {
// === Faza S2: metodele clasei, grupate pe domenii ===
@@ -89,6 +90,7 @@ class Automation {
+ use AutomationCleanup;
/**
* @var object The artifacts class, used to create Natars, artifacts and obtaining info about them
*/
@@ -130,7 +132,9 @@ class Automation {
"sendUnitsComplete", "loyaltyRegeneration", "sendreinfunitsComplete",
"returnunitsComplete", "sendSettlersComplete", "spawnNatars",
"spawnWWVillages", "spawnWWBuildingPlans", "activateArtifacts",
- "heroAdventureComplete"];
+ "heroAdventureComplete",
+ // P3: curatenie periodica (are interval propriu, nu ruleaza la fiecare tick)
+ "cleanupOldData"];
foreach($methodsArrays as $method){
$file = fopen($autoprefix."GameEngine/Prevention/".$method.".txt", "w");
diff --git a/GameEngine/Automation/AutomationCleanup.php b/GameEngine/Automation/AutomationCleanup.php
new file mode 100644
index 00000000..93637f39
--- /dev/null
+++ b/GameEngine/Automation/AutomationCleanup.php
@@ -0,0 +1,141 @@
+ 0 && (time() - $lastRun) < $interval) {
+ return;
+ }
+
+ $batch = defined('CLEANUP_BATCH') ? (int) CLEANUP_BATCH : 5000;
+
+ if ($batch < 100) { $batch = 100; }
+ if ($batch > 100000) { $batch = 100000; }
+
+ $removed = array(
+ 'reports' => 0,
+ 'chat' => 0,
+ 'messages' => 0,
+ );
+
+ // --- Rapoarte de lupta ------------------------------------------------
+ // Se sterg doar cele NEARHIVATE: arhivarea e alegerea explicita a
+ // jucatorului de a pastra un raport, deci nu o calcam.
+ // Coloana `time` e indexata, deci stergerea e ieftina.
+ $reportDays = defined('CLEANUP_REPORTS_DAYS') ? (int) CLEANUP_REPORTS_DAYS : 14;
+
+ if ($reportDays > 0) {
+ $cutoff = time() - ($reportDays * 86400);
+
+ $q = "DELETE FROM " . TB_PREFIX . "ndata
+ WHERE archive = 0 AND `time` < " . $cutoff . "
+ LIMIT " . $batch;
+
+ if (mysqli_query($database->dblink, $q)) {
+ $removed['reports'] = mysqli_affected_rows($database->dblink);
+ }
+ }
+
+ // --- Chat --------------------------------------------------------------
+ // ATENTIE: coloana `date` e varchar, dar contine un timestamp unix scris
+ // de Chat::add_data() (time()). Comparatia se face pe valoarea numerica.
+ // Chat-ul afiseaza oricum doar ultimele 13 mesaje per alianta, deci
+ // istoricul vechi nu e folosit nicaieri.
+ $chatDays = defined('CLEANUP_CHAT_DAYS') ? (int) CLEANUP_CHAT_DAYS : 7;
+
+ if ($chatDays > 0) {
+ $cutoff = time() - ($chatDays * 86400);
+
+ $q = "DELETE FROM " . TB_PREFIX . "chat
+ WHERE (`date` + 0) < " . $cutoff . "
+ LIMIT " . $batch;
+
+ if (mysqli_query($database->dblink, $q)) {
+ $removed['chat'] = mysqli_affected_rows($database->dblink);
+ }
+ }
+
+ // --- Mesaje sterse de ambele parti -------------------------------------
+ // Implicit DEZACTIVAT (0). Un mesaj cu deltarget = 1 SI delowner = 1 nu
+ // mai e vizibil nici expeditorului, nici destinatarului, deci purjarea
+ // lui nu se vede in joc. Activeaza din config daca vrei.
+ $messageDays = defined('CLEANUP_MESSAGES_DAYS') ? (int) CLEANUP_MESSAGES_DAYS : 0;
+
+ if ($messageDays > 0) {
+ $cutoff = time() - ($messageDays * 86400);
+
+ $q = "DELETE FROM " . TB_PREFIX . "mdata
+ WHERE deltarget = 1 AND delowner = 1 AND `time` < " . $cutoff . "
+ LIMIT " . $batch;
+
+ if (mysqli_query($database->dblink, $q)) {
+ $removed['messages'] = mysqli_affected_rows($database->dblink);
+ }
+ }
+
+ // Marker + ultimul rezultat (citit de panoul de admin pentru afisare).
+ @file_put_contents(
+ $markerFile,
+ json_encode(array(
+ 'time' => time(),
+ 'removed' => $removed,
+ )),
+ LOCK_EX
+ );
+ }
+}
diff --git a/Templates/footer.tpl b/Templates/footer.tpl
index ebdbf318..3f39c576 100644
--- a/Templates/footer.tpl
+++ b/Templates/footer.tpl
@@ -44,7 +44,7 @@ $currentYear = date('Y');
* Build version
* Ușor de modificat ulterior
*/
-$serverVersion = 'v.10.0 Full Refactor&Redesign';
+$serverVersion = 'v.11 Full Refactor';
?>
diff --git a/install/data/constant_format.tpl b/install/data/constant_format.tpl
index 9a179d1a..8603927a 100644
--- a/install/data/constant_format.tpl
+++ b/install/data/constant_format.tpl
@@ -42,6 +42,18 @@ define('CRON_TICK_SECONDS', %CRONTICK%);
// Generata automat la instalare; pastrata la salvarile de configuratie din ACP.
define('CRON_KEY', '%CRONKEY%');
+//////////////////////////////////
+// ***** DATABASE CLEANUP *****//
+//////////////////////////////////
+// Tabelele care cresc nelimitat (rapoarte, chat, mesaje sterse) sunt curatate
+// periodic de Automation. 0 = dezactivat pentru fiecare regula in parte.
+// Rapoartele ARHIVATE de jucator nu se sterg niciodata.
+define('CLEANUP_REPORTS_DAYS', %CLEANUPREPORTS%);
+define('CLEANUP_CHAT_DAYS', %CLEANUPCHAT%);
+define('CLEANUP_MESSAGES_DAYS', %CLEANUPMESSAGES%);
+define('CLEANUP_INTERVAL', 3600);
+define('CLEANUP_BATCH', 5000);
+
//////////////////////////////////
// ***** SERVER SETTINGS *****//
//////////////////////////////////
diff --git a/install/process.php b/install/process.php
index e1c8e268..bd0a2738 100644
--- a/install/process.php
+++ b/install/process.php
@@ -114,6 +114,11 @@ class Process {
// din ACP (Config -> Cron & Automation -> edit).
$findReplace["%CRONLOOP%"] = 300;
$findReplace["%CRONTICK%"] = 60;
+ // Retentii implicite pentru curatenia periodica din Automation
+ // (0 = regula dezactivata).
+ $findReplace["%CLEANUPREPORTS%"] = 14;
+ $findReplace["%CLEANUPCHAT%"] = 7;
+ $findReplace["%CLEANUPMESSAGES%"] = 0;
$findReplace["%DOMAIN%"] = $_POST['domain'];
$findReplace["%HOMEPAGE%"] = $_POST['homepage'];
$findReplace["%SERVER%"] = $_POST['server'];