diff --git a/admin/template/menus.php b/admin/template/menus.php index 80ed3b48..e2075d58 100644 --- a/admin/template/menus.php +++ b/admin/template/menus.php @@ -34,8 +34,10 @@ $menus = [ ], ['name' => 'Tools', 'icon' => 'tools', 'order' => 100, 'link' => [ - ['name' => 'Notepad', 'link' => 'notepad', 'order' => 10], - ['name' => 'phpinfo', 'link' => 'phpinfo', 'order' => 20], + ['name' => 'Mass Account Actions', 'link' => 'tools&tool=account', 'order' => 10], + ['name' => 'Mass Teleport Actions', 'link' => 'tools&tool=teleport', 'order' => 20], + ['name' => 'Notepad', 'link' => 'notepad', 'order' => 30], + ['name' => 'phpinfo', 'link' => 'phpinfo', 'order' => 40], ], ], ['name' => 'Logs', 'icon' => 'bug', 'order' => 110, 'link' => diff --git a/system/pages/admin/tools.php b/system/pages/admin/tools.php index 2b880b46..4992b7f9 100644 --- a/system/pages/admin/tools.php +++ b/system/pages/admin/tools.php @@ -10,18 +10,24 @@ defined('MYAAC') or die('Direct access not allowed!'); $title = 'Tools'; -$tool = $_GET['tool']; -if (!isset($tool)) { +if (!isset($_GET['tool'])) { echo 'Tool not set.'; return; } +$tool = $_GET['tool']; if (preg_match("/[^A-z0-9_\-]/", $tool)) { echo 'Invalid tool.'; return; } -$file = BASE . 'admin/pages/tools/' . $tool . '.php'; -if (!@file_exists($file)) +$file = SYSTEM . 'pages/admin/tools/' . $tool . '.php'; + +if (@file_exists($file)) { require $file; + return; +} + +echo 'Tool ' . $tool . ' not found.'; + ?> diff --git a/system/pages/admin/tools/account.php b/system/pages/admin/tools/account.php new file mode 100644 index 00000000..322d3806 --- /dev/null +++ b/system/pages/admin/tools/account.php @@ -0,0 +1,202 @@ + + * @author Lee + * @copyright 2020 MyAAC + * @link https://my-aac.org + */ +defined('MYAAC') or die('Direct access not allowed!'); + +$title = 'Mass Account Actions'; + +$hasCoinsColumn = $db->hasColumn('accounts', 'coins'); +$hasPointsColumn = $db->hasColumn('accounts', 'premium_points'); +$freePremium = $config['lua']['freePremium']; + +function admin_give_points($points) +{ + global $db, $hasPointsColumn; + + if (!$hasPointsColumn) { + error('Points not supported.'); + return; + } + + $statement = $db->prepare('UPDATE `accounts` SET `premium_points` = `premium_points` + :points'); + if (!$statement) { + error('Failed to prepare query statement.'); + return; + } + + if (!$statement->execute([ + 'points' => $points + ])) { + error('Failed to add points.'); + return; + } + success($points . ' points added to all accounts.'); +} + +function admin_give_coins($coins) +{ + global $db, $hasCoinsColumn; + + if (!$hasCoinsColumn) { + error('Coins not supported.'); + return; + } + + $statement = $db->prepare('UPDATE `accounts` SET `coins` = `coins` + :coins'); + if (!$statement) { + error('Failed to prepare query statement.'); + return; + } + + if (!$statement->execute([ + 'coins' => $coins + ])) { + error('Failed to add coins.'); + return; + } + + success($coins . ' coins added to all accounts.'); +} + +function query_add_premium($column, $value_query, $condition_query = '1=1', $params = []) +{ + global $db; + + $statement = $db->prepare("UPDATE `accounts` SET `{$column}` = $value_query WHERE $condition_query"); + if (!$statement) { + error('Failed to prepare query statement.'); + return false; + } + + if (!$statement->execute($params)) { + error('Failed to add premium days.'); + return false; + } + + return true; +} + +function admin_give_premdays($days) +{ + global $db, $freePremium; + + if ($freePremium) { + error('Premium days not supported. Free Premium enabled.'); + return; + } + + $value = $days * 86400; + $now = time(); + // othire + if ($db->hasColumn('accounts', 'premend')) { + // append premend + if (query_add_premium('premend', '`premend` + :value', '`premend` > :now', ['value' => $value, 'now' => $now])) { + // set premend + if (query_add_premium('premend', ':value', '`premend` <= :now', ['value' => $now + $value, 'now' => $now])) { + success($days . ' premium days added to all accounts.'); + return; + } else { + error('Failed to execute set query.'); + return; + } + } else { + error('Failed to execute append query.'); + return; + } + + return; + } + + // tfs 0.x + if ($db->hasColumn('accounts', 'premdays')) { + // append premdays + if (query_add_premium('premdays', '`premdays` + :value', '1=1', ['value' => $days])) { + // append lastday + if (query_add_premium('lastday', '`lastday` + :value', '`lastday` > :now', ['value' => $value, 'now' => $now])) { + // set lastday + if (query_add_premium('lastday', ':value', '`lastday` <= :now', ['value' => $now + $value, 'now' => $now])) { + success($days . ' premium days added to all accounts.'); + return; + } else { + error('Failed to execute set query.'); + return; + } + success($days . ' premium days added to all accounts.'); + return; + } else { + error('Failed to execute append query.'); + return; + } + } else { + error('Failed to execute set days query.'); + return; + } + + return; + } + + // tfs 1.x + if ($db->hasColumn('accounts', 'premium_ends_at')) { + // append premium_ends_at + if (query_add_premium('premium_ends_at', '`premium_ends_at` + :value', '`premium_ends_at` > :now', ['value' => $value, 'now' => $now])) { + // set premium_ends_at + if (query_add_premium('premium_ends_at', ':value', '`premium_ends_at` <= :now', ['value' => $now + $value, 'now' => $now])) { + success($days . ' premium days added to all accounts.'); + return; + } else { + error('Failed to execute set query.'); + return; + } + } else { + error('Failed to execute append query.'); + return; + } + + return; + } + + error('Premium Days not supported.'); +} + +if (isset($_POST['action']) && $_POST['action']) { + + $action = $_POST['action']; + + if (preg_match("/[^A-z0-9_\-]/", $action)) { + error('Invalid action.'); + } else { + $value = isset($_POST['value']) ? intval($_POST['value']) : 0; + + if (!$value) { + error('Please fill all inputs'); + } else { + switch ($action) { + case 'give-points': + admin_give_points($value); + break; + case 'give-coins': + admin_give_coins($value); + break; + case 'give-premdays': + admin_give_premdays($value); + break; + default: + error('Action ' . $action . 'not found.'); + } + } + } +} + +$twig->display('admin.tools.account.html.twig', array( + 'hasCoinsColumn' => $hasCoinsColumn, + 'hasPointsColumn' => $hasPointsColumn, + 'freePremium' => $freePremium, +)); diff --git a/system/pages/admin/tools/teleport.php b/system/pages/admin/tools/teleport.php new file mode 100644 index 00000000..842d4abe --- /dev/null +++ b/system/pages/admin/tools/teleport.php @@ -0,0 +1,100 @@ + + * @author Lee + * @copyright 2020 MyAAC + * @link https://my-aac.org + */ +defined('MYAAC') or die('Direct access not allowed!'); + +$title = 'Mass Teleport Actions'; + +function admin_teleport_position($x, $y, $z) { + global $db; + $statement = $db->prepare('UPDATE `players` SET `posx` = :x, `posy` = :y, `posz` = :z'); + if (!$statement) { + error('Failed to prepare query statement.'); + return; + } + + if (!$statement->execute([ + 'x' => $x, 'y' => $y, 'z' => $z + ])) { + error('Failed to execute query.'); + return; + } + + success('Player\'s position updated.'); +} + +function admin_teleport_town($town_id) { + global $db; + $statement = $db->prepare('UPDATE `players` SET `town_id` = :town_id'); + if (!$statement) { + error('Failed to prepare query statement.'); + return; + } + + if (!$statement->execute([ + 'town_id' => $town_id + ])) { + error('Failed to execute query.'); + return; + } + + success('Player\'s town updated.'); +} + +if (isset($_POST['action']) && $_POST['action']) { + + $action = $_POST['action']; + + if (preg_match("/[^A-z0-9_\-]/", $action)) { + error('Invalid action.'); + } else { + + $playersOnline = 0; + if($db->hasTable('players_online')) {// tfs 1.0 + $playersOnline = $db->query('SELECT count(*) FROM `players_online`'); + } else { + $playersOnline = $db->query('SELECT count(*) FROM `players` WHERE `players`.`online` > 0'); + } + + if ($playersOnline > 0) { + error('Please, close the server before execute this action otherwise players will not be affected.'); + return; + } + + $town_id = isset($_POST['town_id']) ? intval($_POST['town_id']) : 0; + $posx = isset($_POST['posx']) ? intval($_POST['posx']) : 0; + $posy = isset($_POST['posy']) ? intval($_POST['posy']) : 0; + $posz = isset($_POST['posz']) ? intval($_POST['posz']) : 0; + + switch ($action) { + case 'set-town': + if (!isset($config['towns'][$town_id])) { + error('Please fill all inputs'); + return; + } + + admin_teleport_town($value); + break; + case 'set-position': + if (!$posx || !$posy || !$posz) { + error('Please fill all inputs'); + return; + } + + admin_teleport_position($posx, $posy, $posz); + break; + default: + error('Action ' . $action . 'not found.'); + } + } + +} + +$twig->display('admin.tools.teleport.html.twig', array()); diff --git a/system/templates/admin.tools.account.html.twig b/system/templates/admin.tools.account.html.twig new file mode 100644 index 00000000..97eaa944 --- /dev/null +++ b/system/templates/admin.tools.account.html.twig @@ -0,0 +1,67 @@ +