mirror of
https://github.com/slawkens/myaac.git
synced 2025-10-13 17:24:54 +02:00
Feature/new router (#165)
* Remove unneeded escape * Fix guild back buttons (change logo & motd) * small adjustment in news.php * Fix create character when admin (any case is allowed now) * Fix forum table style (boards & thread view) * Small improvement to plugins.enabled check * [WIP] nikic/fast-route implementation I will describe it more in Pull Request * Optimisations & fixes. * Fix path - should not be absolute * Add PLUGINS to Twig path * Don't hide "Install Plugin" Box by default * Update package-lock.json * nothing important, just early exit & fixes Fix creature display * fix premium_ends_at for tfs 1.3+ * Move pages * Move pages tbc * $db->select: make $where parameter optional, allows to get all records * Add some error box to error * fix parse error * Rewriting the router v2 To be more flexible * small fixes * fix & add admin icons * Move mass_* pages to correct folder * fix logout hook 2 * Delete accountmanagement.php * This code wasn't used * Add missing var * Add redirect_from && redirect_to to router options + Also add * for all methods shortcut * Remove comments Not allowed in normal json * Allow admin pages included into plugins dir * block access to some files * Fix admin logout * Fix #178 * feature: mail confirmed reward Suggested by @EPuncker # Conflicts: # system/hooks.php * remove misleading comment * adjust required version according to composer.json * fix duplicated word * Adjustments & fixed to mass actions * Add password confirm, and change text type to password * Add list of Open Source Software MyAAC is using * Fix signature * Show First, Second instead of numbers * fix base dir detection * fix double ACTION define + undefined URI in template * new function> escapeHtml + fix css in admin menus * fix changelog add * fix news adding, rename const to NEWS_* * Add verify to pages, add messages, limits, fix add * fix "Please fill all input" * add required input to admin pages * shorten some expressions with ?? * shorten code + fix conversion (int) * Move account_types to config, account.web_flags to common.php * Update example.json * feature: router aliases * shorten some code + const convert * remove wrong char * fix signature on custom basedir * fix: mass teleport position validation (#214) * fix: mass teleport position validation * fix: max position * Fix execute in CLI * fix warning in reload cache in dev mode * Configurable admin panel folder * feature: plugin require more options with comma * $config_account_salt -> USE_ACCOUNT_SALT * fix forum show_thread * Update show_thread.php --------- Co-authored-by: Gabriel Pedro <gpedro@users.noreply.github.com>
This commit is contained in:
@@ -1,9 +1,10 @@
|
||||
<?php
|
||||
|
||||
// few things we'll need
|
||||
require '../common.php';
|
||||
|
||||
define('ADMIN_PANEL', true);
|
||||
define('MYAAC_ADMIN', true);
|
||||
const ADMIN_PANEL = true;
|
||||
const MYAAC_ADMIN = true;
|
||||
|
||||
if(file_exists(BASE . 'config.local.php')) {
|
||||
require_once BASE . 'config.local.php';
|
||||
@@ -18,8 +19,8 @@ if(file_exists(BASE . 'install') && (!isset($config['installed']) || !$config['i
|
||||
$content = '';
|
||||
|
||||
// validate page
|
||||
$page = isset($_GET['p']) ? $_GET['p'] : '';
|
||||
if(empty($page) || preg_match("/[^a-zA-Z0-9_\-]/", $page))
|
||||
$page = $_GET['p'] ?? '';
|
||||
if(empty($page) || preg_match("/[^a-zA-Z0-9_\-\/.]/", $page))
|
||||
$page = 'dashboard';
|
||||
|
||||
$page = strtolower($page);
|
||||
@@ -42,21 +43,30 @@ $hooks->load();
|
||||
require SYSTEM . 'status.php';
|
||||
require SYSTEM . 'login.php';
|
||||
require SYSTEM . 'migrate.php';
|
||||
require ADMIN . 'includes/functions.php';
|
||||
require __DIR__ . '/includes/functions.php';
|
||||
|
||||
$twig->addGlobal('config', $config);
|
||||
$twig->addGlobal('status', $status);
|
||||
|
||||
if (ACTION == 'logout') {
|
||||
require SYSTEM . 'logout.php';
|
||||
}
|
||||
|
||||
// if we're not logged in - show login box
|
||||
if(!$logged || !admin()) {
|
||||
$page = 'login';
|
||||
}
|
||||
|
||||
// include our page
|
||||
$file = SYSTEM . 'pages/admin/' . $page . '.php';
|
||||
$file = __DIR__ . '/pages/' . $page . '.php';
|
||||
if(!@file_exists($file)) {
|
||||
$page = '404';
|
||||
$file = SYSTEM . 'pages/404.php';
|
||||
if (strpos($page, 'plugins/') !== false) {
|
||||
$file = BASE . $page;
|
||||
}
|
||||
else {
|
||||
$page = '404';
|
||||
$file = SYSTEM . 'pages/404.php';
|
||||
}
|
||||
}
|
||||
|
||||
ob_start();
|
||||
@@ -67,5 +77,4 @@ ob_end_clean();
|
||||
|
||||
// template
|
||||
$template_path = 'template/';
|
||||
require ADMIN . $template_path . 'template.php';
|
||||
?>
|
||||
require __DIR__ . '/' . $template_path . 'template.php';
|
||||
|
589
admin/pages/accounts.php
Normal file
589
admin/pages/accounts.php
Normal file
@@ -0,0 +1,589 @@
|
||||
<?php
|
||||
/**
|
||||
* Account editor
|
||||
*
|
||||
* @package MyAAC
|
||||
* @author Lee
|
||||
* @copyright 2020 MyAAC
|
||||
* @link https://my-aac.org
|
||||
*/
|
||||
defined('MYAAC') or die('Direct access not allowed!');
|
||||
|
||||
$title = 'Account editor';
|
||||
$admin_base = BASE_URL . 'admin/?p=accounts';
|
||||
$use_datatable = true;
|
||||
|
||||
if ($config['account_country'])
|
||||
require SYSTEM . 'countries.conf.php';
|
||||
|
||||
$hasSecretColumn = $db->hasColumn('accounts', 'secret');
|
||||
$hasCoinsColumn = $db->hasColumn('accounts', 'coins');
|
||||
$hasPointsColumn = $db->hasColumn('accounts', 'premium_points');
|
||||
$hasTypeColumn = $db->hasColumn('accounts', 'type');
|
||||
$hasGroupColumn = $db->hasColumn('accounts', 'group_id');
|
||||
|
||||
if ($config['account_country']) {
|
||||
$countries = array();
|
||||
foreach (array('pl', 'se', 'br', 'us', 'gb') as $c)
|
||||
$countries[$c] = $config['countries'][$c];
|
||||
|
||||
$countries['--'] = '----------';
|
||||
foreach ($config['countries'] as $code => $c)
|
||||
$countries[$code] = $c;
|
||||
}
|
||||
$web_acc = ACCOUNT_WEB_FLAGS;
|
||||
$acc_type = config('account_types');
|
||||
?>
|
||||
|
||||
<link rel="stylesheet" type="text/css" href="<?php echo BASE_URL; ?>tools/css/jquery.datetimepicker.css"/ >
|
||||
<script src="<?php echo BASE_URL; ?>tools/js/jquery.datetimepicker.js"></script>
|
||||
|
||||
<?php
|
||||
$id = 0;
|
||||
$search_account = '';
|
||||
if (isset($_REQUEST['id']))
|
||||
$id = (int)$_REQUEST['id'];
|
||||
else if (isset($_REQUEST['search'])) {
|
||||
$search_account = $_REQUEST['search'];
|
||||
if (strlen($search_account) < 3 && !Validator::number($search_account)) {
|
||||
echo_error('Player name is too short.');
|
||||
} else {
|
||||
$query = $db->query('SELECT `id` FROM `accounts` WHERE `name` = ' . $db->quote($search_account));
|
||||
if ($query->rowCount() == 1) {
|
||||
$query = $query->fetch();
|
||||
$id = (int)$query['id'];
|
||||
} else {
|
||||
$query = $db->query('SELECT `id`, `name` FROM `accounts` WHERE `name` LIKE ' . $db->quote('%' . $search_account . '%'));
|
||||
if ($query->rowCount() > 0 && $query->rowCount() <= 10) {
|
||||
$str_construct = 'Do you mean?<ul class="mb-0">';
|
||||
foreach ($query as $row)
|
||||
$str_construct .= '<li><a href="' . $admin_base . '&id=' . $row['id'] . '">' . $row['name'] . '</a></li>';
|
||||
$str_construct .= '</ul>';
|
||||
echo_error($str_construct);
|
||||
} else if ($query->rowCount() > 10)
|
||||
echo_error('Specified name resulted with too many accounts.');
|
||||
else
|
||||
echo_error('No entries found.');
|
||||
}
|
||||
}
|
||||
}
|
||||
?>
|
||||
<div class="row">
|
||||
<?php
|
||||
if ($id > 0) {
|
||||
$account = new OTS_Account();
|
||||
$account->load($id);
|
||||
|
||||
if (isset($account, $_POST['save']) && $account->isLoaded()) {
|
||||
$error = false;
|
||||
|
||||
$_error = '';
|
||||
$account_db = new OTS_Account();
|
||||
if (USE_ACCOUNT_NAME) {
|
||||
$name = $_POST['name'];
|
||||
|
||||
$account_db->find($name);
|
||||
if ($account_db->isLoaded() && $account->getName() != $name)
|
||||
echo_error('This name is already used. Please choose another name!');
|
||||
}
|
||||
|
||||
$account_db->load($id);
|
||||
if (!$account_db->isLoaded())
|
||||
echo_error('Account with this id doesn\'t exist.');
|
||||
|
||||
//type/group
|
||||
if ($hasTypeColumn || $hasGroupColumn) {
|
||||
$group = $_POST['group'];
|
||||
}
|
||||
|
||||
$password = ((!empty($_POST["pass"]) ? $_POST['pass'] : null));
|
||||
if (!Validator::password($password)) {
|
||||
$errors['password'] = Validator::getLastError();
|
||||
}
|
||||
|
||||
//secret
|
||||
if ($hasSecretColumn) {
|
||||
$secret = $_POST['secret'];
|
||||
}
|
||||
|
||||
//key
|
||||
$key = $_POST['key'];
|
||||
$email = $_POST['email'];
|
||||
if (!Validator::email($email))
|
||||
$errors['email'] = Validator::getLastError();
|
||||
|
||||
//tibia coins
|
||||
if ($hasCoinsColumn) {
|
||||
$t_coins = $_POST['t_coins'];
|
||||
verify_number($t_coins, 'Tibia coins', 12);
|
||||
}
|
||||
// prem days
|
||||
$p_days = (int)$_POST['p_days'];
|
||||
verify_number($p_days, 'Prem days', 11);
|
||||
|
||||
//prem points
|
||||
$p_points = $_POST['p_points'];
|
||||
verify_number($p_points, 'Prem Points', 11);
|
||||
|
||||
//rl name
|
||||
$rl_name = $_POST['rl_name'];
|
||||
|
||||
//location
|
||||
$rl_loca = $_POST['rl_loca'];
|
||||
|
||||
//country
|
||||
$rl_country = $_POST['rl_country'];
|
||||
|
||||
$web_flags = $_POST['web_flags'];
|
||||
verify_number($web_flags, 'Web Flags', 1);
|
||||
|
||||
//created
|
||||
$created = strtotime($_POST['created']);
|
||||
verify_number($created, 'Created', 11);
|
||||
|
||||
//web last login
|
||||
$web_lastlogin = strtotime($_POST['web_lastlogin']);
|
||||
verify_number($web_lastlogin, 'Web Last login', 11);
|
||||
|
||||
if (!$error) {
|
||||
if (USE_ACCOUNT_NAME) {
|
||||
$account->setName($name);
|
||||
}
|
||||
|
||||
if ($hasTypeColumn) {
|
||||
$account->setCustomField('type', $group);
|
||||
} elseif ($hasGroupColumn) {
|
||||
$account->setCustomField('group_id', $group);
|
||||
}
|
||||
|
||||
if ($hasSecretColumn) {
|
||||
$account->setCustomField('secret', $secret);
|
||||
}
|
||||
$account->setCustomField('key', $key);
|
||||
$account->setEMail($email);
|
||||
if ($hasCoinsColumn) {
|
||||
$account->setCustomField('coins', $t_coins);
|
||||
}
|
||||
|
||||
$lastDay = 0;
|
||||
if($p_days != 0 && $p_days != OTS_Account::GRATIS_PREMIUM_DAYS) {
|
||||
$lastDay = time();
|
||||
} else if ($lastDay != 0) {
|
||||
$lastDay = 0;
|
||||
}
|
||||
|
||||
$account->setPremDays($p_days);
|
||||
$account->setLastLogin($lastDay);
|
||||
if ($hasPointsColumn) {
|
||||
$account->setCustomField('premium_points', $p_points);
|
||||
}
|
||||
$account->setRLName($rl_name);
|
||||
$account->setLocation($rl_loca);
|
||||
$account->setCountry($rl_country);
|
||||
$account->setCustomField('created', $created);
|
||||
$account->setWebFlags($web_flags);
|
||||
$account->setCustomField('web_lastlogin', $web_lastlogin);
|
||||
|
||||
if (isset($password)) {
|
||||
if (USE_ACCOUNT_SALT) {
|
||||
$salt = generateRandomString(10, false, true, true);
|
||||
$password = $salt . $password;
|
||||
$account->setCustomField('salt', $salt);
|
||||
}
|
||||
|
||||
$password = encrypt($password);
|
||||
$account->setPassword($password);
|
||||
|
||||
if (USE_ACCOUNT_SALT)
|
||||
$account->setCustomField('salt', $salt);
|
||||
}
|
||||
|
||||
$account->save();
|
||||
echo_success('Account saved at: ' . date('G:i'));
|
||||
}
|
||||
}
|
||||
} else if ($id == 0) {
|
||||
$accounts_db = $db->query('SELECT `id`, `name`' . ($hasTypeColumn ? ',type' : ($hasGroupColumn ? ',group_id' : '')) . ' FROM `accounts` ORDER BY `id` ASC');
|
||||
?>
|
||||
<div class="col-12 col-sm-12 col-lg-10">
|
||||
<div class="card card-info card-outline">
|
||||
<div class="card-header">
|
||||
<h5 class="m-0">Accounts</h5>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<table class="acc_datatable table table-striped table-bordered table-responsive d-md-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>ID</th>
|
||||
<th>Name</th>
|
||||
<?php if($hasTypeColumn || $hasGroupColumn): ?>
|
||||
<th>Position</th>
|
||||
<?php endif; ?>
|
||||
<th style="width: 40px">Edit</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<?php foreach ($accounts_db as $account_lst): ?>
|
||||
<tr>
|
||||
<th><?php echo $account_lst['id']; ?></th>
|
||||
<td><?php echo $account_lst['name']; ?></a></td>
|
||||
<?php if($hasTypeColumn || $hasGroupColumn): ?>
|
||||
<td>
|
||||
<?php if ($hasTypeColumn) {
|
||||
echo $acc_type[$account_lst['type']];
|
||||
} elseif ($hasGroupColumn) {
|
||||
$group = $groups->getGroups();
|
||||
echo $group[$account_lst['group_id']];
|
||||
} ?>
|
||||
</td>
|
||||
<?php endif; ?>
|
||||
<td><a href="?p=accounts&id=<?php echo $account_lst['id']; ?>" class="btn btn-success btn-sm" title="Edit">
|
||||
<i class="fas fa-pencil-alt"></i>
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
<?php endforeach; ?>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<?php } ?>
|
||||
|
||||
<?php if (isset($account) && $account->isLoaded()) { ?>
|
||||
<div class="col-12 col-sm-12 col-lg-10">
|
||||
<div class="card card-primary card-outline card-outline-tabs">
|
||||
<div class="card-header p-0 border-bottom-0">
|
||||
<ul class="nav nav-tabs" id="accounts-tab" role="tablist">
|
||||
<li class="nav-item">
|
||||
<a class="nav-link active" id="accounts-acc-tab" data-toggle="pill" href="#accounts-acc">Account</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" id="accounts-chars-tab" data-toggle="pill" href="#accounts-chars">Characters</a>
|
||||
</li>
|
||||
<?php if ($db->hasTable('bans')) : ?>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" id="accounts-bans-tab" data-toggle="pill" href="#accounts-bans">Bans</a>
|
||||
</li>
|
||||
<?php endif;
|
||||
|
||||
if ($db->hasTable('store_history')) : ?>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" id="accounts-store-tab" data-toggle="pill" href="#accounts-store">Store History</a>
|
||||
</li>
|
||||
<?php endif; ?>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div class="tab-content" id="accounts-tabContent">
|
||||
<div class="tab-pane fade active show" id="accounts-acc">
|
||||
<form action="<?php echo $admin_base . ((isset($id) && $id > 0) ? '&id=' . $id : ''); ?>" method="post">
|
||||
<div class="form-group row">
|
||||
<?php if (USE_ACCOUNT_NAME): ?>
|
||||
<div class="col-12 col-sm-12 col-lg-4">
|
||||
<label for="name">Account Name:</label>
|
||||
<input type="text" class="form-control" id="name" name="name" autocomplete="off" value="<?php echo $account->getName(); ?>"/>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
<div class="col-12 col-sm-12 col-lg-5">
|
||||
<div class="form-check">
|
||||
<input type="checkbox"
|
||||
name="c_pass"
|
||||
id="c_pass"
|
||||
value="false"
|
||||
class="form-check-input"/>
|
||||
<label for="c_pass">Password: (check to change)</label>
|
||||
</div>
|
||||
<div class="input-group">
|
||||
<input type="text" class="form-control" id="pass" name="pass" autocomplete="off" maxlength="20" value=""/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-12 col-sm-12 col-lg-3">
|
||||
<label for="account_id" class="control-label">Account ID:</label>
|
||||
<input type="text" class="form-control" id="account_id" name="account_id" autocomplete="off" size="8" maxlength="11" disabled value="<?php echo $account->getId(); ?>"/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group row">
|
||||
<?php
|
||||
$acc_group = $account->getAccGroupId();
|
||||
if ($hasTypeColumn) {
|
||||
?>
|
||||
<div class="col-12 col-sm-12 col-lg-6">
|
||||
<label for="group">Account Type:</label>
|
||||
<select name="group" id="group" class="form-control">
|
||||
<?php foreach ($acc_type as $id => $a_type): ?>
|
||||
<option value="<?php echo($id); ?>" <?php echo($acc_group == ($id) ? 'selected' : ''); ?>><?php echo $a_type; ?></option>
|
||||
<?php endforeach; ?>
|
||||
</select>
|
||||
</div>
|
||||
<?php
|
||||
} elseif ($hasGroupColumn) {
|
||||
?>
|
||||
<div class="col-12 col-sm-12 col-lg-6">
|
||||
<label for="group">Account Type:</label>
|
||||
<select name="group" id="group" class="form-control">
|
||||
<?php foreach ($groups->getGroups() as $id => $group): ?>
|
||||
<option value="<?php echo $id; ?>" <?php echo($acc_group == $id ? 'selected' : ''); ?>><?php echo $group->getName(); ?></option>
|
||||
<?php endforeach; ?>
|
||||
</select>
|
||||
</div>
|
||||
<?php } ?>
|
||||
<div class="col-12 col-sm-12 col-lg-6">
|
||||
<label for="web_flags">Website Access:</label>
|
||||
<select name="web_flags" id="web_flags" class="form-control">
|
||||
<?php foreach ($web_acc as $id => $a_type): ?>
|
||||
<option value="<?php echo($id); ?>" <?php echo($account->getWebFlags() == ($id) ? 'selected' : ''); ?>><?php echo $a_type; ?></option>
|
||||
<?php endforeach; ?>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group row">
|
||||
<?php if ($hasSecretColumn): ?>
|
||||
<div class="col-12 col-sm-12 col-lg-6">
|
||||
<label for="secret">Secret:</label>
|
||||
<input type="text" class="form-control" id="secret" name="secret" autocomplete="off" value="<?php echo $account->getCustomField('secret'); ?>"/>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
<div class="col-12 col-sm-12 col-lg-6">
|
||||
<label for="key">Recovery Key:</label>
|
||||
<input type="text" class="form-control" id="key" name="key" autocomplete="off" value="<?php echo $account->getCustomField('key'); ?>"/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group row">
|
||||
<div class="col-12 col-sm-12 col-lg-6">
|
||||
<label for="email">Email:</label><?php echo (config('mail_enabled') ? ' (<a href="' . ADMIN_URL . '?p=mailer&mail_to=' . $account->getEMail() . '">Send Mail</a>)' : ''); ?>
|
||||
<input type="text" class="form-control" id="email" name="email" autocomplete="off" value="<?php echo $account->getEMail(); ?>"/>
|
||||
</div>
|
||||
<?php if ($hasCoinsColumn): ?>
|
||||
<div class="col-12 col-sm-12 col-lg-6">
|
||||
<label for="t_coins">Tibia Coins:</label>
|
||||
<input type="text" class="form-control" id="t_coins" name="t_coins" autocomplete="off" maxlength="11" value="<?php echo $account->getCustomField('coins') ?>"/>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
<div class="col-12 col-sm-12 col-lg-6">
|
||||
<label for="p_days">Premium Days:</label>
|
||||
<input type="text" class="form-control" id="p_days" name="p_days" autocomplete="off" maxlength="11" value="<?php echo $account->getPremDays(); ?>"/>
|
||||
</div>
|
||||
<?php if ($hasPointsColumn): ?>
|
||||
<div class="col-12 col-sm-12 col-lg-6">
|
||||
<label for="p_points" class="control-label">Premium Points:</label>
|
||||
<input type="text" class="form-control" id="p_points" name="p_points" autocomplete="off" maxlength="8" value="<?php echo $account->getCustomField('premium_points') ?>"/>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
<div class="form-group row">
|
||||
<div class="col-12 col-sm-12 col-lg-4">
|
||||
<label for="rl_name">RL Name:</label>
|
||||
<input type="text" class="form-control" id="rl_name" name="rl_name"
|
||||
autocomplete="off" maxlength="20"
|
||||
value="<?php echo $account->getRLName(); ?>"/>
|
||||
</div>
|
||||
<div class="col-12 col-sm-12 col-lg-4">
|
||||
<label for="rl_loca">Location:</label>
|
||||
<input type="text" class="form-control" id="rl_loca" name="rl_loca"
|
||||
autocomplete="off" maxlength="20"
|
||||
value="<?php echo $account->getLocation(); ?>"/>
|
||||
</div>
|
||||
<div class="col-12 col-sm-12 col-lg-4">
|
||||
<label for="rl_country">Country:</label>
|
||||
<select name="rl_country" id="rl_country" class="form-control">
|
||||
<?php foreach ($countries as $id => $a_type): ?>
|
||||
<option value="<?php echo($id); ?>" <?php echo($account->getCountry() == ($id) ? 'selected' : ''); ?>><?php echo $a_type; ?></option>
|
||||
<?php endforeach; ?>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group row">
|
||||
<div class="col-12 col-sm-12 col-lg-6">
|
||||
<label for="created" class="control-label">Created:</label>
|
||||
<input type="text" class="form-control" id="created" name="created" autocomplete="off" maxlength="20" value="<?php echo date("M d Y, H:i:s", $account->getCustomField('created')); ?>"/>
|
||||
</div>
|
||||
<div class="col-12 col-sm-12 col-lg-6">
|
||||
<label for="web_lastlogin" class="control-label">Web Last Login:</label>
|
||||
<input type="text" class="form-control" id="web_lastlogin" name="web_lastlogin" autocomplete="off" maxlength="20" value="<?php echo date("M d Y, H:i:s", $account->getCustomField('web_lastlogin')); ?>"/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<input type="hidden" name="save" value="yes"/>
|
||||
|
||||
<button type="submit" class="btn btn-info"><i class="fas fa-update"></i> Update</button>
|
||||
<a href="<?php echo ADMIN_URL; ?>?p=accounts" class="btn btn-danger float-right"><i class="fas fa-cancel"></i> Cancel</a>
|
||||
</form>
|
||||
</div>
|
||||
<div class="tab-pane fade" id="accounts-chars">
|
||||
<div class="row">
|
||||
<?php
|
||||
if (isset($account) && $account->isLoaded()) {
|
||||
$account_players = $account->getPlayersList();
|
||||
$account_players->orderBy('id');
|
||||
if (isset($account_players)) { ?>
|
||||
<table class="table table-striped table-condensed table-responsive d-md-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>#</th>
|
||||
<th>Name</th>
|
||||
<th>Level</th>
|
||||
<th>Vocation</th>
|
||||
<th style="width: 40px">Edit</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<?php $i= 0;
|
||||
foreach ($account_players as $i => $player):
|
||||
$i++;
|
||||
$player_vocation = $player->getVocation();
|
||||
$player_promotion = $player->getPromotion();
|
||||
if (isset($player_promotion)) {
|
||||
if ((int)$player_promotion > 0)
|
||||
$player_vocation += ($player_promotion * $config['vocations_amount']);
|
||||
}
|
||||
|
||||
if (isset($config['vocations'][$player_vocation])) {
|
||||
$vocation_name = $config['vocations'][$player_vocation];
|
||||
} ?>
|
||||
<tr>
|
||||
<th><?php echo $i; ?></th>
|
||||
<td><?php echo $player->getName(); ?></td>
|
||||
<td><?php echo $player->getLevel(); ?></td>
|
||||
<td><?php echo $vocation_name; ?></td>
|
||||
<td><a href="?p=players&id=<?php echo $player->getId() ?>" class=" btn btn-success btn-sm" title="Edit"><i class="fas fa-pencil-alt"></i></a></td>
|
||||
</tr>
|
||||
<?php endforeach ?>
|
||||
</tbody>
|
||||
</table>
|
||||
<?php
|
||||
}
|
||||
} ?>
|
||||
</div>
|
||||
</div>
|
||||
<?php if ($db->hasTable('bans')) : ?>
|
||||
<div class="tab-pane fade" id="accounts-bans">
|
||||
<?php
|
||||
$bans = $db->query('SELECT * FROM ' . $db->tableName('bans') . ' WHERE ' . $db->fieldName('active') . ' = 1 AND ' . $db->fieldName('id') . ' = ' . $account->getId() . ' ORDER BY ' . $db->fieldName('added') . ' DESC LIMIT 10');
|
||||
if ($bans->rowCount()) {
|
||||
?>
|
||||
<table class="table table-striped table-condensed table-responsive d-md-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Nick</th>
|
||||
<th>Type</th>
|
||||
<th>Expires</th>
|
||||
<th>Reason</th>
|
||||
<th>Comment</th>
|
||||
<th>Added by:</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<?php
|
||||
foreach ($bans as $ban) {
|
||||
?>
|
||||
<tr>
|
||||
<td><?php
|
||||
$pName = getPlayerNameByAccount($ban['value']);
|
||||
echo '<a href="?p=players&search=' . $pName . '">' . $pName . '</a>'; ?>
|
||||
</td>
|
||||
<td><?php echo getBanType($ban['type']); ?></td>
|
||||
<td>
|
||||
<?php
|
||||
if ($ban['expires'] == "-1")
|
||||
echo 'Never';
|
||||
else
|
||||
echo date("H:i:s", $ban['expires']) . '<br/>' . date("d M Y", $ban['expires']);
|
||||
?>
|
||||
</td>
|
||||
<td><?php echo getBanReason($ban['reason']); ?></td>
|
||||
<td><?php echo $ban['comment']; ?></td>
|
||||
<td>
|
||||
<?php
|
||||
if ($ban['admin_id'] == "0")
|
||||
echo 'Autoban';
|
||||
else
|
||||
$aName = getPlayerNameByAccount($ban['admin_id']);
|
||||
echo '<a href="?p=players&search=' . $aName . '">' . $aName . '</a>';
|
||||
echo '<br/>' . date("d.m.Y", $ban['added']);
|
||||
?>
|
||||
</td>
|
||||
</tr>
|
||||
<?php } ?>
|
||||
</tbody>
|
||||
</table>
|
||||
<?php
|
||||
} else {
|
||||
echo 'No Account bans.';
|
||||
} ?>
|
||||
</div>
|
||||
<?php endif;
|
||||
if ($db->hasTable('store_history')) { ?>
|
||||
<div class="tab-pane fade" id="accounts-store">
|
||||
<?php $store_history = $db->query('SELECT * FROM `store_history` WHERE `account_id` = "' . $account->getId() . '" ORDER BY `time` DESC')->fetchAll(); ?>
|
||||
<table class="table table-striped table-condensed table-responsive d-md-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Description</th>
|
||||
<th>Coins</th>
|
||||
<th>Date</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<?php foreach ($store_history as $p): ?>
|
||||
<tr>
|
||||
<td><?php echo $p['description']; ?></td>
|
||||
<td><?php echo $p['coin_amount']; ?></td>
|
||||
<td><?php echo date('d M y H:i:s', $p['time']); ?></td>
|
||||
</tr>
|
||||
<?php endforeach; ?>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<?php } ?>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<?php } ?>
|
||||
<div class="col-12 col-sm-12 col-lg-2">
|
||||
<div class="card card-info card-outline">
|
||||
<div class="card-header">
|
||||
<h5 class="m-0">Search Accounts</h5>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div class="row">
|
||||
<div class="col-6 col-lg-12">
|
||||
<form action="<?php echo $admin_base; ?>" method="post">
|
||||
<label for="name">Account Name:</label>
|
||||
<div class="input-group input-group-sm">
|
||||
<input type="text" class="form-control" name="search" value="<?php echo $search_account; ?>" maxlength="32" size="32">
|
||||
<span class="input-group-append"><button type="submit" class="btn btn-info btn-flat">Search</button></span>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
<div class="col-6 col-lg-12">
|
||||
<form action="<?php echo $admin_base; ?>" method="post">
|
||||
<label for="name">Account ID:</label>
|
||||
<div class="input-group input-group-sm">
|
||||
<input type="text" class="form-control" name="id" value="" maxlength="32" size="32">
|
||||
<span class="input-group-append"><button type="submit" class="btn btn-info btn-flat">Search</button></span>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<script>
|
||||
$(document).ready(function () {
|
||||
$('#created').datetimepicker({format: "M d Y, H:i:s",});
|
||||
$('#web_lastlogin').datetimepicker({format: 'M d Y, H:i:s'});
|
||||
|
||||
$('#c_pass').change(function () {
|
||||
const ipass = $('input[name=pass]');
|
||||
ipass[0].disabled = !this.checked;
|
||||
ipass[0].value = '';
|
||||
}).change();
|
||||
|
||||
$('.acc_datatable').DataTable({
|
||||
"order": [[0, "asc"]]
|
||||
});
|
||||
});
|
||||
</script>
|
139
admin/pages/changelog.php
Normal file
139
admin/pages/changelog.php
Normal file
@@ -0,0 +1,139 @@
|
||||
<?php
|
||||
/**
|
||||
* CHANGELOG modifier
|
||||
*
|
||||
* @package MyAAC
|
||||
* @author Slawkens <slawkens@gmail.com>
|
||||
* @author Lee
|
||||
* @copyright 2020 MyAAC
|
||||
* @link https://my-aac.org
|
||||
*/
|
||||
defined('MYAAC') or die('Direct access not allowed!');
|
||||
|
||||
if (!hasFlag(FLAG_CONTENT_PAGES) && !superAdmin()) {
|
||||
echo 'Access denied.';
|
||||
return;
|
||||
}
|
||||
|
||||
$title = 'Changelog';
|
||||
$use_datatable = true;
|
||||
const CL_LIMIT = 600; // maximum changelog body length
|
||||
?>
|
||||
|
||||
<link rel="stylesheet" type="text/css" href="<?php echo BASE_URL; ?>tools/css/jquery.datetimepicker.css"/ >
|
||||
<script src="<?php echo BASE_URL; ?>tools/js/jquery.datetimepicker.js"></script>
|
||||
<?php
|
||||
$id = $_GET['id'] ?? 0;
|
||||
require_once LIBS . 'changelog.php';
|
||||
|
||||
if(!empty($action))
|
||||
{
|
||||
$id = $_REQUEST['id'] ?? null;
|
||||
$body = isset($_REQUEST['body']) ? stripslashes($_REQUEST['body']) : null;
|
||||
$create_date = isset($_REQUEST['createdate']) ? (int)strtotime($_REQUEST['createdate'] ): null;
|
||||
$player_id = isset($_REQUEST['player_id']) ? (int)$_REQUEST['player_id'] : null;
|
||||
$type = isset($_REQUEST['type']) ? (int)$_REQUEST['type'] : null;
|
||||
$where = isset($_REQUEST['where']) ? (int)$_REQUEST['where'] : null;
|
||||
|
||||
$errors = array();
|
||||
|
||||
if($action == 'new') {
|
||||
|
||||
if(isset($body) && Changelog::add($body, $type, $where, $player_id, $create_date, $errors)) {
|
||||
$body = '';
|
||||
$type = $where = $player_id = $create_date = 0;
|
||||
|
||||
success("Added successful.");
|
||||
}
|
||||
}
|
||||
else if($action == 'delete') {
|
||||
Changelog::delete($id, $errors);
|
||||
success("Deleted successful.");
|
||||
}
|
||||
else if($action == 'edit')
|
||||
{
|
||||
if(isset($id) && !isset($body)) {
|
||||
$cl = Changelog::get($id);
|
||||
$body = $cl['body'];
|
||||
$type = $cl['type'];
|
||||
$where = $cl['where'];
|
||||
$create_date = $cl['date'];
|
||||
$player_id = $cl['player_id'];
|
||||
}
|
||||
else {
|
||||
if(Changelog::update($id, $body, $type, $where, $player_id, $create_date,$errors)) {
|
||||
$action = $body = '';
|
||||
$type = $where = $player_id = $create_date = 0;
|
||||
|
||||
success("Updated successful.");
|
||||
}
|
||||
}
|
||||
}
|
||||
else if($action == 'hide') {
|
||||
Changelog::toggleHidden($id, $errors, $status);
|
||||
success(($status == 1 ? 'Show' : 'Hide') . " successful.");
|
||||
}
|
||||
|
||||
if(!empty($errors))
|
||||
error(implode(", ", $errors));
|
||||
}
|
||||
|
||||
$changelogs = $db->query('SELECT * FROM `' . TABLE_PREFIX . 'changelog' . '` ORDER BY `id` DESC')->fetchAll();
|
||||
|
||||
$i = 0;
|
||||
|
||||
$log_type = [
|
||||
['id' => 1, 'icon' => 'added'],
|
||||
['id' => 2, 'icon' => 'removed'],
|
||||
['id' => 3, 'icon' => 'changed'],
|
||||
['id' => 4, 'icon' => 'fixed'],
|
||||
];
|
||||
|
||||
$log_where = [
|
||||
['id' => 1, 'icon' => 'server'],
|
||||
['id' => 2, 'icon' => 'website'],
|
||||
];
|
||||
|
||||
foreach($changelogs as $key => &$log)
|
||||
{
|
||||
$log['type'] = getChangelogType($log['type']);
|
||||
$log['where'] = getChangelogWhere($log['where']);
|
||||
}
|
||||
|
||||
if($action == 'edit' || $action == 'new') {
|
||||
if($action == 'edit') {
|
||||
$player = new OTS_Player();
|
||||
$player->load($player_id);
|
||||
}
|
||||
|
||||
$account_players = $account_logged->getPlayersList();
|
||||
$account_players->orderBy('group_id', POT::ORDER_DESC);
|
||||
$twig->display('admin.changelog.form.html.twig', array(
|
||||
'action' => $action,
|
||||
'cl_link_form' => constant('ADMIN_URL').'?p=changelog&action=' . ($action == 'edit' ? 'edit' : 'new'),
|
||||
'cl_id' => $id ?? null,
|
||||
'body' => isset($body) ? escapeHtml($body) : '',
|
||||
'create_date' => $create_date ?? '',
|
||||
'player_id' => $player_id ?? null,
|
||||
'account_players' => $account_players,
|
||||
'type' => $type ?? 0,
|
||||
'where' => $where ?? 0,
|
||||
'log_type' => $log_type,
|
||||
'log_where' => $log_where,
|
||||
));
|
||||
}
|
||||
$twig->display('admin.changelog.html.twig', array(
|
||||
'changelogs' => $changelogs,
|
||||
));
|
||||
|
||||
?>
|
||||
<script>
|
||||
$(document).ready(function () {
|
||||
$('#createdate').datetimepicker({format: "M d Y, H:i:s",});
|
||||
|
||||
$('.tb_datatable').DataTable({
|
||||
"order": [[0, "desc"]],
|
||||
"columnDefs": [{targets: [1, 2,4,5],orderable: false}]
|
||||
});
|
||||
});
|
||||
</script>
|
25
admin/pages/clmd.php
Normal file
25
admin/pages/clmd.php
Normal file
@@ -0,0 +1,25 @@
|
||||
<?php
|
||||
/**
|
||||
* CHANGELOG viewer
|
||||
*
|
||||
* @package MyAAC
|
||||
* @author Slawkens <slawkens@gmail.com>
|
||||
* @author Lee
|
||||
* @copyright 2020 MyAAC
|
||||
* @link https://my-aac.org
|
||||
*/
|
||||
defined('MYAAC') or die('Direct access not allowed!');
|
||||
$title = 'MyAAC Changelog';
|
||||
|
||||
if (!file_exists(BASE . 'CHANGELOG.md')) {
|
||||
echo 'File CHANGELOG.md doesn\'t exist.';
|
||||
return;
|
||||
}
|
||||
|
||||
$changelog = file_get_contents(BASE . 'CHANGELOG.md');
|
||||
|
||||
$Parsedown = new Parsedown();
|
||||
|
||||
$changelog = $Parsedown->text($changelog); # prints: <p>Hello <em>Parsedown</em>!</p>
|
||||
|
||||
echo '<div>' . $changelog . '</div>';
|
62
admin/pages/dashboard.php
Normal file
62
admin/pages/dashboard.php
Normal file
@@ -0,0 +1,62 @@
|
||||
<?php
|
||||
/**
|
||||
* Dashboard
|
||||
*
|
||||
* @package MyAAC
|
||||
* @author Slawkens <slawkens@gmail.com>
|
||||
* @copyright 2019 MyAAC
|
||||
* @link https://my-aac.org
|
||||
*/
|
||||
defined('MYAAC') or die('Direct access not allowed!');
|
||||
$title = 'Dashboard';
|
||||
|
||||
if (isset($_GET['clear_cache'])) {
|
||||
if (clearCache()) {
|
||||
success('Cache cleared.');
|
||||
} else {
|
||||
error('Error while clearing cache.');
|
||||
}
|
||||
}
|
||||
|
||||
if (isset($_GET['maintenance'])) {
|
||||
$message = (!empty($_POST['message']) ? $_POST['message'] : null);
|
||||
$_status = (isset($_POST['status']) && $_POST['status'] == 'true');
|
||||
$_status = ($_status ? '0' : '1');
|
||||
|
||||
if (empty($message)) {
|
||||
error('Message cannot be empty.');
|
||||
} else if (strlen($message) > 255) {
|
||||
error('Message is too long. Maximum length allowed is 255 chars.');
|
||||
} else {
|
||||
$tmp = '';
|
||||
if (fetchDatabaseConfig('site_closed', $tmp))
|
||||
updateDatabaseConfig('site_closed', $_status);
|
||||
else
|
||||
registerDatabaseConfig('site_closed', $_status);
|
||||
|
||||
if (fetchDatabaseConfig('site_closed_message', $tmp))
|
||||
updateDatabaseConfig('site_closed_message', $message);
|
||||
else
|
||||
registerDatabaseConfig('site_closed_message', $message);
|
||||
}
|
||||
}
|
||||
$is_closed = getDatabaseConfig('site_closed') == '1';
|
||||
|
||||
$closed_message = 'Server is under maintenance, please visit later.';
|
||||
$tmp = '';
|
||||
if (fetchDatabaseConfig('site_closed_message', $tmp))
|
||||
$closed_message = $tmp;
|
||||
|
||||
$configAdminPanelModules = config('admin_panel_modules');
|
||||
if (isset($configAdminPanelModules)) {
|
||||
echo '<div class="row">';
|
||||
$configAdminPanelModules = explode(',', $configAdminPanelModules);
|
||||
$twig_loader->prependPath(__DIR__ . '/modules/templates');
|
||||
foreach ($configAdminPanelModules as $box) {
|
||||
$file = __DIR__ . '/modules/' . $box . '.php';
|
||||
if (file_exists($file)) {
|
||||
include($file);
|
||||
}
|
||||
}
|
||||
echo '</div>';
|
||||
}
|
13
admin/pages/data.php
Normal file
13
admin/pages/data.php
Normal file
@@ -0,0 +1,13 @@
|
||||
<?php
|
||||
/**
|
||||
* Load items.xml
|
||||
*
|
||||
* @package MyAAC
|
||||
* @author Slawkens <slawkens@gmail.com>
|
||||
* @copyright 2019 MyAAC
|
||||
* @link https://my-aac.org
|
||||
*/
|
||||
defined('MYAAC') or die('Direct access not allowed!');
|
||||
$title = 'Server Data';
|
||||
|
||||
$twig->display('admin.data.html.twig');
|
0
admin/pages/index.html
Normal file
0
admin/pages/index.html
Normal file
18
admin/pages/login.php
Normal file
18
admin/pages/login.php
Normal file
@@ -0,0 +1,18 @@
|
||||
<?php
|
||||
/**
|
||||
* Login
|
||||
*
|
||||
* @package MyAAC
|
||||
* @author Slawkens <slawkens@gmail.com>
|
||||
* @copyright 2019 MyAAC
|
||||
* @link https://my-aac.org
|
||||
*/
|
||||
defined('MYAAC') or die('Direct access not allowed!');
|
||||
$title = 'Login';
|
||||
|
||||
$twig->display('admin.login.html.twig', [
|
||||
'logout' => (ACTION == 'logout' ? 'You have been logged out!' : ''),
|
||||
'account' => USE_ACCOUNT_NAME ? 'Name' : 'Number',
|
||||
'account_login_by' => getAccountLoginByLabel(),
|
||||
'errors' => $errors ?? ''
|
||||
]);
|
83
admin/pages/logs.php
Normal file
83
admin/pages/logs.php
Normal file
@@ -0,0 +1,83 @@
|
||||
<?php
|
||||
/**
|
||||
* Logs
|
||||
*
|
||||
* @package MyAAC
|
||||
* @author Slawkens <slawkens@gmail.com>
|
||||
* @copyright 2020 MyAAC
|
||||
* @link https://my-aac.org
|
||||
*/
|
||||
defined('MYAAC') or die('Direct access not allowed!');
|
||||
$title = 'Logs Viewer';
|
||||
$use_datatable = true;
|
||||
|
||||
$files = array();
|
||||
$aac_path_logs = BASE . 'system/logs/';
|
||||
foreach (scandir($aac_path_logs, SCANDIR_SORT_ASCENDING) as $f) {
|
||||
if ($f[0] === '.' || is_dir($aac_path_logs . $f) || $f === 'index.html') {
|
||||
continue;
|
||||
}
|
||||
|
||||
$files[] = array($f, $aac_path_logs);
|
||||
}
|
||||
|
||||
$server_path_logs = $config['server_path'] . 'logs/';
|
||||
if (!file_exists($server_path_logs)) {
|
||||
$server_path_logs = $config['data_path'] . 'logs/';
|
||||
}
|
||||
|
||||
if (file_exists($server_path_logs)) {
|
||||
foreach (scandir($server_path_logs, SCANDIR_SORT_ASCENDING) as $f) {
|
||||
if ($f[0] === '.') {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (is_dir($server_path_logs . $f)) {
|
||||
foreach (scandir($server_path_logs . $f, SCANDIR_SORT_ASCENDING) as $f2) {
|
||||
if ($f2[0] === '.') {
|
||||
continue;
|
||||
}
|
||||
|
||||
$files[] = array($f . '/' . $f2, $server_path_logs);
|
||||
}
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
$files[] = array($f, $server_path_logs);
|
||||
}
|
||||
}
|
||||
|
||||
foreach ($files as &$f) {
|
||||
$f['mtime'] = filemtime($f[1] . $f[0]);
|
||||
$f['name'] = $f[0];
|
||||
}
|
||||
unset($f);
|
||||
|
||||
|
||||
define('EXIST_NONE', 0);
|
||||
define('EXIST_SERVER_LOG', 1);
|
||||
define('EXIST_AAC_LOG', 2);
|
||||
|
||||
$exist = EXIST_NONE;
|
||||
$file = isset($_GET['file']) ? $_GET['file'] : null;
|
||||
if (!empty($file)) {
|
||||
if (!preg_match('/[^A-z0-9\' _\/\-\.]/', $file)) {
|
||||
if (file_exists($aac_path_logs . $file)) {
|
||||
$exist = EXIST_AAC_LOG;
|
||||
} else if (file_exists($server_path_logs . $file)) {
|
||||
$exist = EXIST_SERVER_LOG;
|
||||
} else {
|
||||
echo 'Specified file does not exist.';
|
||||
}
|
||||
|
||||
if ($exist !== EXIST_NONE) {
|
||||
$file_content = nl2br(file_get_contents(($exist === EXIST_SERVER_LOG ? $server_path_logs : $aac_path_logs) . $file));
|
||||
$twig->display('admin.logs.view.html.twig', array('file' => $file, 'content' => $file_content));
|
||||
}
|
||||
} else {
|
||||
echo 'Invalid file name specified.';
|
||||
}
|
||||
}
|
||||
|
||||
$twig->display('admin.logs.html.twig', array('files' => $files));
|
83
admin/pages/mailer.php
Normal file
83
admin/pages/mailer.php
Normal file
@@ -0,0 +1,83 @@
|
||||
<?php
|
||||
/**
|
||||
* Mailer
|
||||
*
|
||||
* @package MyAAC
|
||||
* @author Slawkens <slawkens@gmail.com>
|
||||
* @copyright 2019 MyAAC
|
||||
* @link https://my-aac.org
|
||||
*/
|
||||
defined('MYAAC') or die('Direct access not allowed!');
|
||||
$title = 'Mailer';
|
||||
|
||||
if (!hasFlag(FLAG_CONTENT_MAILER) && !superAdmin()) {
|
||||
echo 'Access denied.';
|
||||
return;
|
||||
}
|
||||
|
||||
if (!config('mail_enabled')) {
|
||||
echo 'Mail support disabled.';
|
||||
return;
|
||||
}
|
||||
|
||||
$mail_to = isset($_REQUEST['mail_to']) ? stripslashes(trim($_REQUEST['mail_to'])) : null;
|
||||
$mail_subject = isset($_POST['mail_subject']) ? stripslashes($_POST['mail_subject']) : null;
|
||||
$mail_content = isset($_POST['mail_content']) ? stripslashes($_POST['mail_content']) : null;
|
||||
|
||||
if (isset($_POST['submit'])) {
|
||||
if (empty($mail_subject)) {
|
||||
warning('Please enter subject of the message.');
|
||||
}
|
||||
|
||||
if (empty($mail_content)) {
|
||||
warning('Please enter content of the message.');
|
||||
}
|
||||
}
|
||||
if (!empty($mail_to)) {
|
||||
if(!Validator::email($mail_to)) {
|
||||
warning('E-Mail is invalid.');
|
||||
}
|
||||
else {
|
||||
if (!empty($mail_content) && !empty($mail_subject)) {
|
||||
if (_mail($mail_to, $mail_subject, $mail_content)) {
|
||||
success("Successfully mailed <strong>$mail_to</strong>");
|
||||
}
|
||||
else {
|
||||
error("Error while sending mail to <strong>$mail_to</strong>. More info can be found in system/logs/mailer-error.log");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!empty($mail_content) && !empty($mail_subject) && empty($mail_to)) {
|
||||
$success = 0;
|
||||
$failed = 0;
|
||||
|
||||
$add = '';
|
||||
if (config('account_mail_verify')) {
|
||||
note('Note: Sending only to users with verified E-Mail.');
|
||||
$add = ' AND `email_verified` = 1';
|
||||
}
|
||||
|
||||
$query = $db->query('SELECT `email` FROM `accounts` WHERE `email` != ""' . $add);
|
||||
foreach ($query as $email) {
|
||||
if (_mail($email['email'], $mail_subject, $mail_content)) {
|
||||
$success++;
|
||||
}
|
||||
else {
|
||||
$failed++;
|
||||
echo '<br />';
|
||||
error('An error occorred while sending email to <b>' . $email['email'] . '</b>. For Admin: More info can be found in system/logs/mailer-error.log');
|
||||
}
|
||||
}
|
||||
|
||||
success('Mailing finished.');
|
||||
success("$success emails delivered.");
|
||||
warning("$failed emails failed.");
|
||||
}
|
||||
|
||||
$twig->display('admin.mailer.html.twig', [
|
||||
'mail_to' => $mail_to,
|
||||
'mail_subject' => $mail_subject,
|
||||
'mail_content' => $mail_content
|
||||
]);
|
215
admin/pages/mass_account.php
Normal file
215
admin/pages/mass_account.php
Normal file
@@ -0,0 +1,215 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Account Admin Tool
|
||||
*
|
||||
* @package MyAAC
|
||||
* @author Slawkens <slawkens@gmail.com>
|
||||
* @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) {
|
||||
displayMessage('Points not supported.');
|
||||
return;
|
||||
}
|
||||
|
||||
$statement = $db->prepare('UPDATE `accounts` SET `premium_points` = `premium_points` + :points');
|
||||
if (!$statement) {
|
||||
displayMessage('Failed to prepare query statement.');
|
||||
return;
|
||||
}
|
||||
|
||||
if (!$statement->execute([
|
||||
'points' => $points
|
||||
])) {
|
||||
displayMessage('Failed to add points.');
|
||||
return;
|
||||
}
|
||||
displayMessage($points . ' points added to all accounts.', true);
|
||||
}
|
||||
|
||||
function admin_give_coins($coins)
|
||||
{
|
||||
global $db, $hasCoinsColumn;
|
||||
|
||||
if (!$hasCoinsColumn) {
|
||||
displayMessage('Coins not supported.');
|
||||
return;
|
||||
}
|
||||
|
||||
$statement = $db->prepare('UPDATE `accounts` SET `coins` = `coins` + :coins');
|
||||
if (!$statement) {
|
||||
displayMessage('Failed to prepare query statement.');
|
||||
return;
|
||||
}
|
||||
|
||||
if (!$statement->execute([
|
||||
'coins' => $coins
|
||||
])) {
|
||||
displayMessage('Failed to add coins.');
|
||||
return;
|
||||
}
|
||||
|
||||
displayMessage($coins . ' coins added to all accounts.', true);
|
||||
}
|
||||
|
||||
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) {
|
||||
displayMessage('Failed to prepare query statement.');
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!$statement->execute($params)) {
|
||||
displayMessage('Failed to add premium days.');
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
function admin_give_premdays($days)
|
||||
{
|
||||
global $db, $freePremium;
|
||||
|
||||
if ($freePremium) {
|
||||
displayMessage('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])) {
|
||||
displayMessage($days . ' premium days added to all accounts.', true);
|
||||
return;
|
||||
} else {
|
||||
displayMessage('Failed to execute set query.');
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
displayMessage('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])) {
|
||||
displayMessage($days . ' premium days added to all accounts.', true);
|
||||
return;
|
||||
} else {
|
||||
displayMessage('Failed to execute set query.');
|
||||
return;
|
||||
}
|
||||
|
||||
return;
|
||||
} else {
|
||||
displayMessage('Failed to execute append query.');
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
displayMessage('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])) {
|
||||
displayMessage($days . ' premium days added to all accounts.', true);
|
||||
return;
|
||||
} else {
|
||||
displayMessage('Failed to execute set query.');
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
displayMessage('Failed to execute append query.');
|
||||
return;
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
displayMessage('Premium Days not supported.');
|
||||
}
|
||||
|
||||
if (isset($_POST['action']) && $_POST['action']) {
|
||||
|
||||
$action = $_POST['action'];
|
||||
|
||||
if (preg_match("/[^A-z0-9_\-]/", $action)) {
|
||||
displayMessage('Invalid action.');
|
||||
} else {
|
||||
$value = isset($_POST['value']) ? intval($_POST['value']) : 0;
|
||||
|
||||
if (!$value) {
|
||||
displayMessage('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:
|
||||
displayMessage('Action ' . $action . 'not found.');
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
$twig->display('admin.tools.account.html.twig', array(
|
||||
'hasCoinsColumn' => $hasCoinsColumn,
|
||||
'hasPointsColumn' => $hasPointsColumn,
|
||||
'freePremium' => $freePremium,
|
||||
));
|
||||
}
|
||||
|
||||
function displayMessage($message, $success = false) {
|
||||
global $twig, $hasCoinsColumn, $hasPointsColumn, $freePremium;
|
||||
|
||||
$success ? success($message): error($message);
|
||||
|
||||
$twig->display('admin.tools.account.html.twig', array(
|
||||
'hasCoinsColumn' => $hasCoinsColumn,
|
||||
'hasPointsColumn' => $hasPointsColumn,
|
||||
'freePremium' => $freePremium,
|
||||
));
|
||||
}
|
116
admin/pages/mass_teleport.php
Normal file
116
admin/pages/mass_teleport.php
Normal file
@@ -0,0 +1,116 @@
|
||||
<?php
|
||||
/**
|
||||
* Teleport Admin Tool
|
||||
*
|
||||
* @package MyAAC
|
||||
* @author Slawkens <slawkens@gmail.com>
|
||||
* @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) {
|
||||
displayMessage('Failed to prepare query statement.');
|
||||
return;
|
||||
}
|
||||
|
||||
if (!$statement->execute([
|
||||
'x' => $x, 'y' => $y, 'z' => $z
|
||||
])) {
|
||||
displayMessage('Failed to execute query.');
|
||||
return;
|
||||
}
|
||||
|
||||
displayMessage('Player\'s position updated.', true);
|
||||
}
|
||||
|
||||
function admin_teleport_town($town_id) {
|
||||
global $db;
|
||||
$statement = $db->prepare('UPDATE `players` SET `town_id` = :town_id');
|
||||
if (!$statement) {
|
||||
displayMessage('Failed to prepare query statement.');
|
||||
return;
|
||||
}
|
||||
|
||||
if (!$statement->execute([
|
||||
'town_id' => $town_id
|
||||
])) {
|
||||
displayMessage('Failed to execute query.');
|
||||
return;
|
||||
}
|
||||
|
||||
displayMessage('Player\'s town updated.', true);
|
||||
}
|
||||
|
||||
if (isset($_POST['action']) && $_POST['action']) {
|
||||
|
||||
$action = $_POST['action'];
|
||||
|
||||
if (preg_match("/[^A-z0-9_\-]/", $action)) {
|
||||
displayMessage('Invalid action.');
|
||||
} else {
|
||||
|
||||
$playersOnline = 0;
|
||||
if($db->hasTable('players_online')) {// tfs 1.0
|
||||
$query = $db->query('SELECT count(*) AS `count` FROM `players_online`');
|
||||
} else {
|
||||
$query = $db->query('SELECT count(*) AS `count` FROM `players` WHERE `players`.`online` > 0');
|
||||
}
|
||||
|
||||
$playersOnline = $query->fetch(PDO::FETCH_ASSOC);
|
||||
if ($playersOnline['count'] > 0) {
|
||||
displayMessage('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']) : null;
|
||||
$posx = isset($_POST['posx']) ? intval($_POST['posx']) : null;
|
||||
$posy = isset($_POST['posy']) ? intval($_POST['posy']) : null;
|
||||
$posz = isset($_POST['posz']) ? intval($_POST['posz']) : null;
|
||||
$to_temple = $_POST['to_temple'] ?? null;
|
||||
|
||||
switch ($action) {
|
||||
case 'set-town':
|
||||
if (!$town_id) {
|
||||
displayMessage('Please fill all inputs');
|
||||
return;
|
||||
}
|
||||
|
||||
if (!isset($config['towns'][$town_id])) {
|
||||
displayMessage('Specified town does not exist');
|
||||
return;
|
||||
}
|
||||
|
||||
admin_teleport_town($town_id);
|
||||
break;
|
||||
case 'set-position':
|
||||
if (!$to_temple && ($posx < 0 || $posx > 65535 || $posy < 0 || $posy > 65535|| $posz < 0 || $posz > 16)) {
|
||||
displayMessage('Invalid Position');
|
||||
return;
|
||||
}
|
||||
|
||||
admin_teleport_position($posx, $posy, $posz);
|
||||
break;
|
||||
default:
|
||||
displayMessage('Action ' . $action . 'not found.');
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
else {
|
||||
$twig->display('admin.tools.teleport.html.twig', array());
|
||||
}
|
||||
|
||||
|
||||
function displayMessage($message, $success = false) {
|
||||
global $twig;
|
||||
|
||||
$success ? success($message): error($message);
|
||||
$twig->display('admin.tools.teleport.html.twig', array());
|
||||
}
|
139
admin/pages/menus.php
Normal file
139
admin/pages/menus.php
Normal file
@@ -0,0 +1,139 @@
|
||||
<?php
|
||||
/**
|
||||
* Menus
|
||||
*
|
||||
* @package MyAAC
|
||||
* @author Slawkens <slawkens@gmail.com>
|
||||
* @copyright 2019 MyAAC
|
||||
* @link https://my-aac.org
|
||||
*/
|
||||
defined('MYAAC') or die('Direct access not allowed!');
|
||||
$title = 'Menus';
|
||||
|
||||
if (!hasFlag(FLAG_CONTENT_MENUS) && !superAdmin()) {
|
||||
echo 'Access denied.';
|
||||
return;
|
||||
}
|
||||
|
||||
if (isset($_REQUEST['template'])) {
|
||||
$template = $_REQUEST['template'];
|
||||
|
||||
if (isset($_REQUEST['menu'])) {
|
||||
$post_menu = $_REQUEST['menu'];
|
||||
$post_menu_link = $_REQUEST['menu_link'];
|
||||
$post_menu_blank = $_REQUEST['menu_blank'];
|
||||
$post_menu_color = $_REQUEST['menu_color'];
|
||||
if (count($post_menu) != count($post_menu_link)) {
|
||||
echo 'Menu count is not equal menu links. Something went wrong when sending form.';
|
||||
return;
|
||||
}
|
||||
|
||||
$db->query('DELETE FROM `' . TABLE_PREFIX . 'menu` WHERE `template` = ' . $db->quote($template));
|
||||
foreach ($post_menu as $category => $menus) {
|
||||
foreach ($menus as $i => $menu) {
|
||||
if (empty($menu)) // don't save empty menu item
|
||||
continue;
|
||||
|
||||
try {
|
||||
$db->insert(TABLE_PREFIX . 'menu', array('template' => $template, 'name' => $menu, 'link' => $post_menu_link[$category][$i], 'blank' => $post_menu_blank[$category][$i] == 'on' ? 1 : 0, 'color' => str_replace('#', '', $post_menu_color[$category][$i]), 'category' => $category, 'ordering' => $i));
|
||||
} catch (PDOException $error) {
|
||||
warning('Error while adding menu item (' . $menu . '): ' . $error->getMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$cache = Cache::getInstance();
|
||||
if ($cache->enabled()) {
|
||||
$cache->delete('template_menus');
|
||||
}
|
||||
success('Saved at ' . date('H:i'));
|
||||
}
|
||||
|
||||
$file = TEMPLATES . $template . '/config.php';
|
||||
if (file_exists($file)) {
|
||||
require_once $file;
|
||||
} else {
|
||||
echo 'Cannot find template config.php file.';
|
||||
return;
|
||||
}
|
||||
if (!isset($config['menu_categories'])) {
|
||||
echo "No menu categories set in template config.php.<br/>This template doesn't support dynamic menus.";
|
||||
return;
|
||||
}
|
||||
|
||||
$title = 'Menus - ' . $template;
|
||||
?>
|
||||
<div align="center" class="text-center">
|
||||
<p class="note">You are editing: <?= $template ?><br/><br/>
|
||||
Hint: You can drag menu items.<br/>
|
||||
Hint: Add links to external sites using: <b>http://</b> or <b>https://</b> prefix.<br/>
|
||||
Not all templates support blank and colorful links.
|
||||
</p>
|
||||
</div>
|
||||
<?php
|
||||
$menus = array();
|
||||
$menus_db = $db->query('SELECT `name`, `link`, `blank`, `color`, `category`, `ordering` FROM `' . TABLE_PREFIX . 'menu` WHERE `enabled` = 1 AND `template` = ' . $db->quote($template) . ' ORDER BY `ordering` ASC;')->fetchAll();
|
||||
foreach ($menus_db as $menu) {
|
||||
$menus[$menu['category']][] = array('name' => $menu['name'], 'link' => $menu['link'], 'blank' => $menu['blank'], 'color' => $menu['color'], 'ordering' => $menu['ordering']);
|
||||
}
|
||||
$last_id = array();
|
||||
?>
|
||||
<form method="post" id="menus-form" action="?p=menus">
|
||||
<input type="hidden" name="template" value="<?php echo $template ?>"/>
|
||||
<div class="row">
|
||||
<?php foreach ($config['menu_categories'] as $id => $cat): ?>
|
||||
<div class="col-md-12 col-lg-6">
|
||||
<div class="card card-info card-outline">
|
||||
<div class="card-header">
|
||||
<h5 class="m-0"><?php echo $cat['name'] ?> <i class="far fa-plus-square add-button" id="add-button-<?php echo $id ?>"></i></h5>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<ul class="sortable" id="sortable-<?php echo $id ?>">
|
||||
<?php
|
||||
if (isset($menus[$id])) {
|
||||
foreach ($menus[$id] as $i => $menu):
|
||||
?>
|
||||
<li class="ui-state-default" id="list-<?php echo $id ?>-<?php echo $i ?>"><label>Name:</label> <input type="text" name="menu[<?php echo $id ?>][]" value="<?php echo escapeHtml($menu['name']); ?>"/>
|
||||
<label>Link:</label> <input type="text" name="menu_link[<?php echo $id ?>][]" value="<?php echo $menu['link'] ?>"/>
|
||||
<input type="hidden" name="menu_blank[<?php echo $id ?>][]" value="0"/>
|
||||
<label><input class="blank-checkbox" type="checkbox" <?php echo($menu['blank'] == 1 ? 'checked' : '') ?>/><span title="Open in New Window">New Window</span></label>
|
||||
<input class="color-picker" type="text" name="menu_color[<?php echo $id ?>][]" value="#<?php echo $menu['color'] ?>"/>
|
||||
<a class="remove-button" id="remove-button-<?php echo $id ?>-<?php echo $i ?>"><i class="fas fa-trash"></a></i></li>
|
||||
<?php $last_id[$id] = $i;
|
||||
endforeach;
|
||||
} ?>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<?php endforeach ?>
|
||||
</div>
|
||||
<div class="row pb-2">
|
||||
<div class="col-md-12">
|
||||
<button type="submit" class="btn btn-info"><i class="fas fa-update"></i> Save</button>
|
||||
<?php
|
||||
echo '<button type="button" class="btn btn-danger float-right" value="Cancel" onclick="window.location = \'' . ADMIN_URL . '?p=menus\';"><i class="fas fa-cancel"></i> Cancel</button>';
|
||||
?>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
<?php
|
||||
$twig->display('admin.menus.js.html.twig', array(
|
||||
'menus' => $menus,
|
||||
'last_id' => $last_id
|
||||
));
|
||||
?>
|
||||
<?php
|
||||
} else {
|
||||
$templates = $db->query('SELECT `template` FROM `' . TABLE_PREFIX . 'menu` GROUP BY `template`;')->fetchAll();
|
||||
foreach ($templates as $key => $value) {
|
||||
$file = TEMPLATES . $value['template'] . '/config.php';
|
||||
if (!file_exists($file)) {
|
||||
unset($templates[$key]);
|
||||
}
|
||||
}
|
||||
|
||||
$twig->display('admin.menus.form.html.twig', array(
|
||||
'templates' => $templates
|
||||
));
|
||||
}
|
6
admin/pages/modules/balance.php
Normal file
6
admin/pages/modules/balance.php
Normal file
@@ -0,0 +1,6 @@
|
||||
<?php
|
||||
$balance = ($db->hasColumn('players', 'balance') ? $db->query('SELECT `balance`, `id`, `name`,`level` FROM `players` ORDER BY `balance` DESC LIMIT 10;') : 0);
|
||||
|
||||
$twig->display('balance.html.twig', array(
|
||||
'balance' => $balance
|
||||
));
|
6
admin/pages/modules/coins.php
Normal file
6
admin/pages/modules/coins.php
Normal file
@@ -0,0 +1,6 @@
|
||||
<?php
|
||||
$coins = ($db->hasColumn('accounts', 'coins') ? $db->query('SELECT `coins`, `' . (USE_ACCOUNT_NAME ? 'name' : 'id') . '` as `name` FROM `accounts` ORDER BY `coins` DESC LIMIT 10;') : 0);
|
||||
|
||||
$twig->display('coins.html.twig', array(
|
||||
'coins' => $coins
|
||||
));
|
6
admin/pages/modules/created.php
Normal file
6
admin/pages/modules/created.php
Normal file
@@ -0,0 +1,6 @@
|
||||
<?php
|
||||
$players = ($db->hasColumn('accounts', 'created') ? $db->query('SELECT `created`, `' . (USE_ACCOUNT_NAME ? 'name' : 'id') . '` as `name` FROM `accounts` ORDER BY `created` DESC LIMIT 10;') : 0);
|
||||
|
||||
$twig->display('created.html.twig', array(
|
||||
'players' => $players,
|
||||
));
|
0
admin/pages/modules/index.html
Normal file
0
admin/pages/modules/index.html
Normal file
5
admin/pages/modules/lastlogin.php
Normal file
5
admin/pages/modules/lastlogin.php
Normal file
@@ -0,0 +1,5 @@
|
||||
<?php
|
||||
$players = ($db->hasColumn('players', 'lastlogin') ? $db->query('SELECT name, level, lastlogin FROM players ORDER BY lastlogin DESC LIMIT 10;') : 0);
|
||||
$twig->display('lastlogin.html.twig', array(
|
||||
'players' => $players,
|
||||
));
|
6
admin/pages/modules/points.php
Normal file
6
admin/pages/modules/points.php
Normal file
@@ -0,0 +1,6 @@
|
||||
<?php
|
||||
$points = ($db->hasColumn('accounts', 'premium_points') ? $db->query('SELECT `premium_points`, `' . (USE_ACCOUNT_NAME ? 'name' : 'id') . '` as `name` FROM `accounts` ORDER BY `premium_points` DESC LIMIT 10;') : 0);
|
||||
|
||||
$twig->display('points.html.twig', array(
|
||||
'points' => $points,
|
||||
));
|
46
admin/pages/modules/server_status.php
Normal file
46
admin/pages/modules/server_status.php
Normal file
@@ -0,0 +1,46 @@
|
||||
<?php
|
||||
defined('MYAAC') or die('Direct access not allowed!');
|
||||
if (isset($status)) {
|
||||
|
||||
$error_icon = '<i class="fas fa-exclamation-circle text-danger"></i>'; ?>
|
||||
<div class=" col-md-6 col-lg-6">
|
||||
<div class="card card-info card-outline">
|
||||
<div class="card-header border-bottom-0">
|
||||
<span class="font-weight-bold m-0">Server Status</span> <span class="float-right small"><b>Last checked</b>: <?php echo(isset($status['lastCheck']) ? date("l, d.m.Y H:i:s", $status['lastCheck']) : $error_icon); ?></span>
|
||||
</div>
|
||||
<div class="card-body p-0 ">
|
||||
<table class="table">
|
||||
<tbody>
|
||||
<tr>
|
||||
<th width="30%">Server</th>
|
||||
<td><?php echo(isset($status['server']) & isset($status['serverVersion']) ? $status['server'] . ' x ' . $status['serverVersion'] : $error_icon) ?></td>
|
||||
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Client</th>
|
||||
<td><?php echo(isset($status['clientVersion']) ? $status['clientVersion'] : $error_icon) ?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Map</th>
|
||||
<td>
|
||||
<?php if (isset($status['mapName']) & isset($status['mapAuthor']) & isset($status['mapWidth']) & isset($status['mapHeight'])) {
|
||||
echo $status['mapName'] . ' by <b>' . $status['mapAuthor'] . '</b><br/>' . $status['mapWidth'] . ' x ' . $status['mapHeight'];
|
||||
} else {
|
||||
echo $error_icon;
|
||||
} ?>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Monsters</th>
|
||||
<td><?php echo (isset($status['monsters']) ? $status['monsters'] : $error_icon); ?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>MOTD:</th>
|
||||
<td><?php echo(isset($status['motd']) ? $status['motd'] : $error_icon); ?></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<?php } ?>
|
12
admin/pages/modules/statistics.php
Normal file
12
admin/pages/modules/statistics.php
Normal file
@@ -0,0 +1,12 @@
|
||||
<?php
|
||||
defined('MYAAC') or die('Direct access not allowed!');
|
||||
$count = $db->query('SELECT
|
||||
(SELECT COUNT(*) FROM `accounts`) as total_accounts,
|
||||
(SELECT COUNT(*) FROM `players`) as total_players,
|
||||
(SELECT COUNT(*) FROM `guilds`) as total_guilds,
|
||||
(SELECT COUNT(*) FROM `' . TABLE_PREFIX . 'monsters`) as total_monsters,
|
||||
(SELECT COUNT(*) FROM `houses`) as total_houses;')->fetch();
|
||||
|
||||
$twig->display('statistics.html.twig', array(
|
||||
'count' => $count,
|
||||
));
|
31
admin/pages/modules/templates/balance.html.twig
Normal file
31
admin/pages/modules/templates/balance.html.twig
Normal file
@@ -0,0 +1,31 @@
|
||||
{% if balance is iterable %}
|
||||
<div class=" col-md-6 col-lg-3">
|
||||
<div class="card card-info card-outline">
|
||||
<div class="card-header">
|
||||
<h5 class="m-0">Top 10 - Balance</h5>
|
||||
</div>
|
||||
<div class="card-body p-0">
|
||||
<table class="table table-striped table-condensed">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>#</th>
|
||||
<th>Player</th>
|
||||
<th>Balance</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% set i = 0 %}
|
||||
{% for result in balance %}
|
||||
{% set i = i + 1 %}
|
||||
<tr>
|
||||
<th>{{ i }}</th>
|
||||
<td><a href="?p=players&search_name={{ result.name }}">{{ result.name }}</a></td>
|
||||
<td>{{ result.balance }}</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
31
admin/pages/modules/templates/coins.html.twig
Normal file
31
admin/pages/modules/templates/coins.html.twig
Normal file
@@ -0,0 +1,31 @@
|
||||
{% if coins is iterable %}
|
||||
<div class=" col-md-6 col-lg-3">
|
||||
<div class="card card-info card-outline">
|
||||
<div class="card-header">
|
||||
<h5 class="m-0">Top 10 - Most coins</h5>
|
||||
</div>
|
||||
<div class="card-body p-0">
|
||||
<table class="table table-striped table-condensed">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>#</th>
|
||||
<th>Account</th>
|
||||
<th>Tibia coins</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% set i = 0 %}
|
||||
{% for result in coins %}
|
||||
{% set i = i + 1 %}
|
||||
<tr>
|
||||
<th>{{ i }}</th>
|
||||
<td><a href="?p=accounts&search_name={{ result.name }}">{{ result.name }}</a></td>
|
||||
<td>{{ result.coins }}</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
31
admin/pages/modules/templates/created.html.twig
Normal file
31
admin/pages/modules/templates/created.html.twig
Normal file
@@ -0,0 +1,31 @@
|
||||
{% if players is iterable %}
|
||||
<div class=" col-md-6 col-lg-3">
|
||||
<div class="card card-info card-outline">
|
||||
<div class="card-header">
|
||||
<h5 class="m-0">Last 10 created</h5>
|
||||
</div>
|
||||
<div class="card-body p-0">
|
||||
<table class="table table-striped table-condensed">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>#</th>
|
||||
<th>Account</th>
|
||||
<th>Creation Date</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% set i = 0 %}
|
||||
{% for result in players %}
|
||||
{% set i = i + 1 %}
|
||||
<tr>
|
||||
<th>{{ i }}</th>
|
||||
<td><a href="?p=accounts&search_name={{ result.name }}">{{ result.name }}</a></td>
|
||||
<td>{{ result.created|date("M d Y, H:i:s") }}</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
0
admin/pages/modules/templates/index.html
Normal file
0
admin/pages/modules/templates/index.html
Normal file
31
admin/pages/modules/templates/lastlogin.html.twig
Normal file
31
admin/pages/modules/templates/lastlogin.html.twig
Normal file
@@ -0,0 +1,31 @@
|
||||
{% if players is iterable %}
|
||||
<div class=" col-md-6 col-lg-3">
|
||||
<div class="card card-info card-outline">
|
||||
<div class="card-header">
|
||||
<h5 class="m-0">Last 10 logins</h5>
|
||||
</div>
|
||||
<div class="card-body p-0">
|
||||
<table class="table table-striped table-condensed">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>#</th>
|
||||
<th>Player</th>
|
||||
<th>Login Date</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% set i = 0 %}
|
||||
{% for result in players %}
|
||||
{% set i = i + 1 %}
|
||||
<tr>
|
||||
<th>{{ i }}</th>
|
||||
<td><a href="?p=players&search_name={{ result.name }}">{{ result.name }}</a></td>
|
||||
<td>{{ result.lastlogin|date("M d Y, H:i:s") }}</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
31
admin/pages/modules/templates/points.html.twig
Normal file
31
admin/pages/modules/templates/points.html.twig
Normal file
@@ -0,0 +1,31 @@
|
||||
{% if points is iterable %}
|
||||
<div class=" col-md-6 col-lg-3">
|
||||
<div class="card card-info card-outline">
|
||||
<div class="card-header">
|
||||
<h5 class="m-0">Top 10 - Most premium points</h5>
|
||||
</div>
|
||||
<div class="card-body p-0">
|
||||
<table class="table table-striped table-condensed">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>#</th>
|
||||
<th>Account</th>
|
||||
<th>Premium points</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% set i = 0 %}
|
||||
{% for result in points %}
|
||||
{% set i = i + 1 %}
|
||||
<tr>
|
||||
<th>{{ i }}</th>
|
||||
<td><a href="?p=accounts&search_name={{ result.name }}">{{ result.name }}</a></td>
|
||||
<td>{{ result.premium_points }}</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
45
admin/pages/modules/templates/statistics.html.twig
Normal file
45
admin/pages/modules/templates/statistics.html.twig
Normal file
@@ -0,0 +1,45 @@
|
||||
<div class="col">
|
||||
<div class="info-box">
|
||||
<span class="info-box-icon bg-info elevation-1"><i class="fas fa-user-plus"></i></span>
|
||||
<div class="info-box-content">
|
||||
<span class="info-box-text">Accounts:</span>
|
||||
<span class="info-box-number">{{ count.total_accounts }}</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col">
|
||||
<div class="info-box">
|
||||
<span class="info-box-icon bg-red elevation-1"><i class="fas fa-user-plus"></i></span>
|
||||
<div class="info-box-content">
|
||||
<span class="info-box-text">Players:</span>
|
||||
<span class="info-box-number">{{ count.total_players }}</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col">
|
||||
<div class="info-box">
|
||||
<span class="info-box-icon bg-teal elevation-1"><i class="fas fa-pastafarianism"></i></span>
|
||||
<div class="info-box-content">
|
||||
<span class="info-box-text">Monsters:</span>
|
||||
<span class="info-box-number">{{ count.total_monsters }}</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col">
|
||||
<div class="info-box">
|
||||
<span class="info-box-icon bg-green elevation-1"><i class="fas fa-chart-pie"></i></span>
|
||||
<div class="info-box-content">
|
||||
<span class="info-box-text">Guilds:</span>
|
||||
<span class="info-box-number">{{ count.total_guilds }}</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col">
|
||||
<div class="info-box">
|
||||
<span class="info-box-icon bg-yellow elevation-1"><i class="fas fa-home"></i></span>
|
||||
<div class="info-box-content">
|
||||
<span class="info-box-text">Houses:</span>
|
||||
<span class="info-box-number">{{ count.total_houses }}</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
39
admin/pages/modules/templates/web_status.twig
Normal file
39
admin/pages/modules/templates/web_status.twig
Normal file
@@ -0,0 +1,39 @@
|
||||
<div class="col-12 col-md-6">
|
||||
<div class="card card-warning card-outline">
|
||||
<form action="?p=dashboard&maintenance" method="post" class="form-horizontal">
|
||||
<div class="card-header">
|
||||
<span class="m-0">Website Status<span class="float-right">
|
||||
<div class="custom-control custom-switch custom-switch-off-danger custom-switch-on-success">
|
||||
<input type="checkbox" class="custom-control-input" name="status" id="status" value="true" {% if not is_closed %} checked{% endif %}>
|
||||
<label id="status-label" class="custom-control-label" for="status"> {% if is_closed %}Closed{% else %}Open{% endif %}</label>
|
||||
</div></span>
|
||||
</span>
|
||||
</div>
|
||||
<div class="card-body p-2">
|
||||
<div class="col-sm-12">
|
||||
<label for="message" class="col-form-label">Maintenance Message</label>
|
||||
<textarea name="message" class="form-control" cols="40" rows="3" maxlength="255" placeholder="Enter ...">{{ closed_message }}</textarea>
|
||||
<small>(only visible if closed)</small>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card-footer">
|
||||
<button type="submit" class="btn btn-info"><i class="far fa-update"></i> Update</button>
|
||||
<a href="?p=dashboard&clear_cache" onclick="return confirm('Are you sure?');" class="float-right">
|
||||
<span class="btn btn-danger"><i class="fas fa-clear"></i>Clear cache</span>
|
||||
</a>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
$(function() {
|
||||
$("#status").change(function() {
|
||||
$statusLabel = $("#status-label");
|
||||
$statusLabel.html("Closed");
|
||||
if ($(this).is(':checked')) {
|
||||
$statusLabel.html("Open");
|
||||
}
|
||||
});
|
||||
});
|
||||
</script>
|
10
admin/pages/modules/web_status.php
Normal file
10
admin/pages/modules/web_status.php
Normal file
@@ -0,0 +1,10 @@
|
||||
<?php
|
||||
defined('MYAAC') or die('Direct access not allowed!');
|
||||
|
||||
$twig->display('web_status.twig', array(
|
||||
'is_closed' => $is_closed,
|
||||
'closed_message' => $closed_message,
|
||||
'status' => $status,
|
||||
'account_type' => USE_ACCOUNT_NAME ? 'name' : 'number'
|
||||
));
|
||||
?>
|
155
admin/pages/news.php
Normal file
155
admin/pages/news.php
Normal file
@@ -0,0 +1,155 @@
|
||||
<?php
|
||||
/**
|
||||
* Pages
|
||||
*
|
||||
* @package MyAAC
|
||||
* @author Slawkens <slawkens@gmail.com>
|
||||
* @copyright 2019 MyAAC
|
||||
* @link https://my-aac.org
|
||||
*/
|
||||
defined('MYAAC') or die('Direct access not allowed!');
|
||||
|
||||
require_once LIBS . 'forum.php';
|
||||
require_once LIBS . 'news.php';
|
||||
|
||||
$title = 'News Panel';
|
||||
$use_datatable = true;
|
||||
|
||||
if (!hasFlag(FLAG_CONTENT_PAGES) && !superAdmin()) {
|
||||
echo 'Access denied.';
|
||||
return;
|
||||
}
|
||||
|
||||
header('X-XSS-Protection:0');
|
||||
|
||||
// some constants, used mainly by database (cannot by modified without schema changes)
|
||||
define('NEWS_TITLE_LIMIT', 100);
|
||||
define('NEWS_BODY_LIMIT', 65535); // maximum news body length
|
||||
define('ARTICLE_TEXT_LIMIT', 300);
|
||||
define('ARTICLE_IMAGE_LIMIT', 100);
|
||||
|
||||
$name = $p_title = '';
|
||||
if(!empty($action))
|
||||
{
|
||||
$id = isset($_REQUEST['id']) ? $_REQUEST['id'] : null;
|
||||
$p_title = isset($_REQUEST['title']) ? $_REQUEST['title'] : null;
|
||||
$body = isset($_REQUEST['body']) ? stripslashes($_REQUEST['body']) : null;
|
||||
$comments = isset($_REQUEST['comments']) ? $_REQUEST['comments'] : null;
|
||||
$type = isset($_REQUEST['type']) ? (int)$_REQUEST['type'] : null;
|
||||
$category = isset($_REQUEST['category']) ? (int)$_REQUEST['category'] : null;
|
||||
$player_id = isset($_REQUEST['player_id']) ? (int)$_REQUEST['player_id'] : null;
|
||||
$article_text = isset($_REQUEST['article_text']) ? $_REQUEST['article_text'] : null;
|
||||
$article_image = isset($_REQUEST['article_image']) ? $_REQUEST['article_image'] : null;
|
||||
$forum_section = isset($_REQUEST['forum_section']) ? $_REQUEST['forum_section'] : null;
|
||||
$errors = array();
|
||||
|
||||
if($action == 'new') {
|
||||
if(isset($forum_section) && $forum_section != '-1') {
|
||||
$forum_add = Forum::add_thread($p_title, $body, $forum_section, $player_id, $account_logged->getId(), $errors);
|
||||
}
|
||||
|
||||
if(isset($p_title) && News::add($p_title, $body, $type, $category, $player_id, isset($forum_add) && $forum_add != 0 ? $forum_add : 0, $article_text, $article_image, $errors)) {
|
||||
$p_title = $body = $comments = $article_text = $article_image = '';
|
||||
$type = $category = $player_id = 0;
|
||||
|
||||
success("Added successful.");
|
||||
}
|
||||
}
|
||||
else if($action == 'delete') {
|
||||
News::delete($id, $errors);
|
||||
success("Deleted successful.");
|
||||
}
|
||||
else if($action == 'edit')
|
||||
{
|
||||
if(isset($id) && !isset($p_title)) {
|
||||
$news = News::get($id);
|
||||
$p_title = $news['title'];
|
||||
$body = $news['body'];
|
||||
$comments = $news['comments'];
|
||||
$type = $news['type'];
|
||||
$category = $news['category'];
|
||||
$player_id = $news['player_id'];
|
||||
$article_text = $news['article_text'];
|
||||
$article_image = $news['article_image'];
|
||||
}
|
||||
else {
|
||||
if(News::update($id, $p_title, $body, $type, $category, $player_id, $forum_section, $article_text, $article_image, $errors)) {
|
||||
// update forum thread if exists
|
||||
if(isset($forum_section) && Validator::number($forum_section)) {
|
||||
$db->query("UPDATE `" . TABLE_PREFIX . "forum` SET `author_guid` = ".(int) $player_id.", `post_text` = ".$db->quote($body).", `post_topic` = ".$db->quote($p_title).", `edit_date` = " . time() . " WHERE `id` = " . $db->quote($forum_section));
|
||||
}
|
||||
|
||||
$action = $p_title = $body = $comments = $article_text = $article_image = '';
|
||||
$type = $category = $player_id = 0;
|
||||
|
||||
success("Updated successful.");
|
||||
}
|
||||
}
|
||||
}
|
||||
else if($action == 'hide') {
|
||||
News::toggleHidden($id, $errors, $status);
|
||||
success(($status == 1 ? 'Show' : 'Hide') . " successful.");
|
||||
}
|
||||
|
||||
if(!empty($errors))
|
||||
error(implode(", ", $errors));
|
||||
}
|
||||
|
||||
$categories = array();
|
||||
foreach($db->query('SELECT `id`, `name`, `icon_id` FROM `' . TABLE_PREFIX . 'news_categories` WHERE `hidden` != 1') as $cat)
|
||||
{
|
||||
$categories[$cat['id']] = array(
|
||||
'name' => $cat['name'],
|
||||
'icon_id' => $cat['icon_id']
|
||||
);
|
||||
}
|
||||
|
||||
if($action == 'edit' || $action == 'new') {
|
||||
if($action == 'edit') {
|
||||
$player = new OTS_Player();
|
||||
$player->load($player_id);
|
||||
}
|
||||
|
||||
$account_players = $account_logged->getPlayersList();
|
||||
$account_players->orderBy('group_id', POT::ORDER_DESC);
|
||||
$twig->display('admin.news.form.html.twig', array(
|
||||
'action' => $action,
|
||||
'news_link' => getLink(PAGE),
|
||||
'news_link_form' => '?p=news&action=' . ($action == 'edit' ? 'edit' : 'new'),
|
||||
'news_id' => $id ?? null,
|
||||
'title' => $p_title ?? '',
|
||||
'body' => isset($body) ? escapeHtml($body) : '',
|
||||
'type' => $type ?? null,
|
||||
'player' => isset($player) && $player->isLoaded() ? $player : null,
|
||||
'player_id' => $player_id ?? null,
|
||||
'account_players' => $account_players,
|
||||
'category' => $category ?? 0,
|
||||
'categories' => $categories,
|
||||
'forum_boards' => getForumBoards(),
|
||||
'forum_section' => $forum_section ?? null,
|
||||
'comments' => $comments ?? null,
|
||||
'article_text' => $article_text ?? null,
|
||||
'article_image' => $article_image ?? null
|
||||
));
|
||||
}
|
||||
|
||||
$query = $db->query('SELECT * FROM ' . $db->tableName(TABLE_PREFIX . 'news'));
|
||||
$newses = array();
|
||||
foreach ($query as $_news) {
|
||||
$_player = new OTS_Player();
|
||||
$_player->load($_news['player_id']);
|
||||
|
||||
$newses[$_news['type']][] = array(
|
||||
'id' => $_news['id'],
|
||||
'hidden' => $_news['hidden'],
|
||||
'archive_link' => getLink('news') . '/archive/' . $_news['id'],
|
||||
'title' => $_news['title'],
|
||||
'date' => $_news['date'],
|
||||
'player_name' => isset($_player) && $_player->isLoaded() ? $_player->getName() : '',
|
||||
'player_link' => isset($_player) && $_player->isLoaded() ? getPlayerLink($_player->getName(), false) : '',
|
||||
);
|
||||
}
|
||||
|
||||
$twig->display('admin.news.html.twig', array(
|
||||
'newses' => $newses
|
||||
));
|
52
admin/pages/notepad.php
Normal file
52
admin/pages/notepad.php
Normal file
@@ -0,0 +1,52 @@
|
||||
<?php
|
||||
/**
|
||||
* Notepad
|
||||
*
|
||||
* @package MyAAC
|
||||
* @author Slawkens <slawkens@gmail.com>
|
||||
* @copyright 2019 MyAAC
|
||||
* @link https://my-aac.org
|
||||
*/
|
||||
defined('MYAAC') or die('Direct access not allowed!');
|
||||
$title = 'Notepad';
|
||||
|
||||
$notepad_content = Notepad::get($account_logged->getId());
|
||||
if (isset($_POST['content'])) {
|
||||
$_content = html_entity_decode(stripslashes($_POST['content']));
|
||||
if (!$notepad_content)
|
||||
Notepad::create($account_logged->getId(), $_content);
|
||||
else
|
||||
Notepad::update($account_logged->getId(), $_content);
|
||||
|
||||
echo '<div class="success" style="text-align: center;">Saved at ' . date('H:i') . '</div>';
|
||||
} else {
|
||||
if ($notepad_content !== false)
|
||||
$_content = $notepad_content;
|
||||
}
|
||||
|
||||
$twig->display('admin.notepad.html.twig', array('content' => isset($_content) ? $_content : null));
|
||||
|
||||
class Notepad
|
||||
{
|
||||
static public function get($account_id)
|
||||
{
|
||||
global $db;
|
||||
$query = $db->select(TABLE_PREFIX . 'notepad', array('account_id' => $account_id));
|
||||
if ($query !== false)
|
||||
return $query['content'];
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
static public function create($account_id, $content = '')
|
||||
{
|
||||
global $db;
|
||||
$db->insert(TABLE_PREFIX . 'notepad', array('account_id' => $account_id, 'content' => $content));
|
||||
}
|
||||
|
||||
static public function update($account_id, $content = '')
|
||||
{
|
||||
global $db;
|
||||
$db->update(TABLE_PREFIX . 'notepad', array('content' => $content), array('account_id' => $account_id));
|
||||
}
|
||||
}
|
14
admin/pages/open_source.php
Normal file
14
admin/pages/open_source.php
Normal file
@@ -0,0 +1,14 @@
|
||||
<?php
|
||||
/**
|
||||
* Open Source libraries
|
||||
*
|
||||
* @package MyAAC
|
||||
* @author Slawkens <slawkens@gmail.com>
|
||||
* @copyright 2023 MyAAC
|
||||
* @link https://my-aac.org
|
||||
*/
|
||||
defined('MYAAC') or die('Direct access not allowed!');
|
||||
|
||||
$title = 'Open Source';
|
||||
|
||||
$twig->display('admin.open_source.html.twig');
|
258
admin/pages/pages.php
Normal file
258
admin/pages/pages.php
Normal file
@@ -0,0 +1,258 @@
|
||||
<?php
|
||||
/**
|
||||
* Pages
|
||||
*
|
||||
* @package MyAAC
|
||||
* @author Slawkens <slawkens@gmail.com>
|
||||
* @copyright 2019 MyAAC
|
||||
* @link https://my-aac.org
|
||||
*/
|
||||
defined('MYAAC') or die('Direct access not allowed!');
|
||||
$title = 'Pages';
|
||||
$use_datatable = true;
|
||||
|
||||
if (!hasFlag(FLAG_CONTENT_PAGES) && !superAdmin()) {
|
||||
echo 'Access denied.';
|
||||
return;
|
||||
}
|
||||
|
||||
header('X-XSS-Protection:0');
|
||||
|
||||
$name = $p_title = null;
|
||||
$groups = new OTS_Groups_List();
|
||||
|
||||
$php = false;
|
||||
$enable_tinymce = true;
|
||||
$access = 0;
|
||||
|
||||
// some constants, used mainly by database (cannot by modified without schema changes)
|
||||
define('PAGE_TITLE_LIMIT', 30);
|
||||
define('PAGE_NAME_LIMIT', 30);
|
||||
define('PAGE_BODY_LIMIT', 65535); // maximum page body length
|
||||
|
||||
if (!empty($action)) {
|
||||
if ($action == 'delete' || $action == 'edit' || $action == 'hide')
|
||||
$id = $_REQUEST['id'];
|
||||
|
||||
if (isset($_REQUEST['name']))
|
||||
$name = $_REQUEST['name'];
|
||||
|
||||
if (isset($_REQUEST['title']))
|
||||
$p_title = $_REQUEST['title'];
|
||||
|
||||
$php = isset($_REQUEST['php']) && $_REQUEST['php'] == 1;
|
||||
$enable_tinymce = isset($_REQUEST['enable_tinymce']) && $_REQUEST['enable_tinymce'] == 1;
|
||||
if ($php)
|
||||
$body = $_REQUEST['body'];
|
||||
else if (isset($_REQUEST['body'])) {
|
||||
//$body = $_REQUEST['body'];
|
||||
$body = html_entity_decode(stripslashes($_REQUEST['body']));
|
||||
}
|
||||
|
||||
if (isset($_REQUEST['access']))
|
||||
$access = $_REQUEST['access'];
|
||||
|
||||
$errors = array();
|
||||
$player_id = 1;
|
||||
|
||||
if ($action == 'new') {
|
||||
if (isset($p_title) && Pages::add($name, $p_title, $body, $player_id, $php, $enable_tinymce, $access, $errors)) {
|
||||
$name = $p_title = $body = '';
|
||||
$player_id = $access = 0;
|
||||
$php = false;
|
||||
$enable_tinymce = true;
|
||||
success('Added successful.');
|
||||
}
|
||||
} else if ($action == 'delete') {
|
||||
if (Pages::delete($id, $errors))
|
||||
success('Page with id ' . $id . ' has been deleted');
|
||||
} else if ($action == 'edit') {
|
||||
if (isset($id) && !isset($_REQUEST['name'])) {
|
||||
$_page = Pages::get($id);
|
||||
$name = $_page['name'];
|
||||
$p_title = $_page['title'];
|
||||
$body = $_page['body'];
|
||||
$php = $_page['php'] == '1';
|
||||
$enable_tinymce = $_page['enable_tinymce'] == '1';
|
||||
$access = $_page['access'];
|
||||
} else {
|
||||
if(Pages::update($id, $name, $p_title, $body, $player_id, $php, $enable_tinymce, $access)) {
|
||||
$action = $name = $p_title = $body = '';
|
||||
$player_id = 1;
|
||||
$access = 0;
|
||||
$php = false;
|
||||
$enable_tinymce = true;
|
||||
success("Updated successful.");
|
||||
}
|
||||
}
|
||||
} else if ($action == 'hide') {
|
||||
Pages::toggleHidden($id, $errors, $status);
|
||||
success(($status == 1 ? 'Show' : 'Hide') . " successful.");
|
||||
}
|
||||
|
||||
if (!empty($errors))
|
||||
error(implode(", ", $errors));
|
||||
}
|
||||
|
||||
$query =
|
||||
$db->query('SELECT * FROM ' . $db->tableName(TABLE_PREFIX . 'pages'));
|
||||
|
||||
$pages = array();
|
||||
foreach ($query as $_page) {
|
||||
$pages[] = array(
|
||||
'link' => getFullLink($_page['name'], $_page['name'], true),
|
||||
'title' => substr($_page['title'], 0, 20),
|
||||
'php' => $_page['php'] == '1',
|
||||
'id' => $_page['id'],
|
||||
'hidden' => $_page['hidden']
|
||||
);
|
||||
}
|
||||
|
||||
$twig->display('admin.pages.form.html.twig', array(
|
||||
'action' => $action,
|
||||
'id' => $action == 'edit' ? $id : null,
|
||||
'name' => $name,
|
||||
'title' => $p_title,
|
||||
'php' => $php,
|
||||
'enable_tinymce' => $enable_tinymce,
|
||||
'body' => isset($body) ? escapeHtml($body) : '',
|
||||
'groups' => $groups->getGroups(),
|
||||
'access' => $access
|
||||
));
|
||||
|
||||
$twig->display('admin.pages.html.twig', array(
|
||||
'pages' => $pages
|
||||
));
|
||||
|
||||
class Pages
|
||||
{
|
||||
static public function verify($name, $title, $body, $player_id, $php, $enable_tinymce, $access, &$errors)
|
||||
{
|
||||
if(!isset($title[0]) || !isset($body[0])) {
|
||||
$errors[] = 'Please fill all inputs.';
|
||||
return false;
|
||||
}
|
||||
if(strlen($name) > PAGE_NAME_LIMIT) {
|
||||
$errors[] = 'Page name cannot be longer than ' . PAGE_NAME_LIMIT . ' characters.';
|
||||
return false;
|
||||
}
|
||||
if(strlen($title) > PAGE_TITLE_LIMIT) {
|
||||
$errors[] = 'Page title cannot be longer than ' . PAGE_TITLE_LIMIT . ' characters.';
|
||||
return false;
|
||||
}
|
||||
if(strlen($body) > PAGE_BODY_LIMIT) {
|
||||
$errors[] = 'Page content cannot be longer than ' . PAGE_BODY_LIMIT . ' characters.';
|
||||
return false;
|
||||
}
|
||||
if(!isset($player_id) || $player_id == 0) {
|
||||
$errors[] = 'Player ID is wrong.';
|
||||
return false;
|
||||
}
|
||||
if(!isset($php) || ($php != 0 && $php != 1)) {
|
||||
$errors[] = 'Enable PHP is wrong.';
|
||||
return false;
|
||||
}
|
||||
if(!isset($enable_tinymce) || ($enable_tinymce != 0 && $enable_tinymce != 1)) {
|
||||
$errors[] = 'Enable TinyMCE is wrong.';
|
||||
return false;
|
||||
}
|
||||
if(!isset($access) || $access < 0 || $access > PHP_INT_MAX) {
|
||||
$errors[] = 'Access is wrong.';
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static public function get($id)
|
||||
{
|
||||
global $db;
|
||||
$query = $db->select(TABLE_PREFIX . 'pages', array('id' => $id));
|
||||
if ($query !== false)
|
||||
return $query;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
static public function add($name, $title, $body, $player_id, $php, $enable_tinymce, $access, &$errors)
|
||||
{
|
||||
if(!self::verify($name, $title, $body, $player_id, $php, $enable_tinymce, $access, $errors)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
global $db;
|
||||
$query = $db->select(TABLE_PREFIX . 'pages', array('name' => $name));
|
||||
if ($query === false)
|
||||
$db->insert(TABLE_PREFIX . 'pages',
|
||||
array(
|
||||
'name' => $name,
|
||||
'title' => $title,
|
||||
'body' => $body,
|
||||
'player_id' => $player_id,
|
||||
'php' => $php ? '1' : '0',
|
||||
'enable_tinymce' => $enable_tinymce ? '1' : '0',
|
||||
'access' => $access
|
||||
)
|
||||
);
|
||||
else
|
||||
$errors[] = 'Page with this link already exists.';
|
||||
|
||||
return !count($errors);
|
||||
}
|
||||
|
||||
static public function update($id, $name, $title, $body, $player_id, $php, $enable_tinymce, $access)
|
||||
{
|
||||
if(!self::verify($name, $title, $body, $player_id, $php, $enable_tinymce, $access, $errors)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
global $db;
|
||||
$db->update(TABLE_PREFIX . 'pages',
|
||||
array(
|
||||
'name' => $name,
|
||||
'title' => $title,
|
||||
'body' => $body,
|
||||
'player_id' => $player_id,
|
||||
'php' => $php ? '1' : '0',
|
||||
'enable_tinymce' => $enable_tinymce ? '1' : '0',
|
||||
'access' => $access
|
||||
),
|
||||
array('id' => $id));
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static public function delete($id, &$errors)
|
||||
{
|
||||
global $db;
|
||||
if (isset($id)) {
|
||||
if ($db->select(TABLE_PREFIX . 'pages', array('id' => $id)) !== false)
|
||||
$db->delete(TABLE_PREFIX . 'pages', array('id' => $id));
|
||||
else
|
||||
$errors[] = 'Page with id ' . $id . ' does not exists.';
|
||||
} else
|
||||
$errors[] = 'id not set';
|
||||
|
||||
return !count($errors);
|
||||
}
|
||||
|
||||
static public function toggleHidden($id, &$errors, &$status)
|
||||
{
|
||||
global $db;
|
||||
if (isset($id)) {
|
||||
$query = $db->select(TABLE_PREFIX . 'pages', array('id' => $id));
|
||||
if ($query !== false) {
|
||||
$db->update(TABLE_PREFIX . 'pages', array('hidden' => ($query['hidden'] == 1 ? 0 : 1)), array('id' => $id));
|
||||
$status = $query['hidden'];
|
||||
}
|
||||
else {
|
||||
$errors[] = 'Page with id ' . $id . ' does not exists.';
|
||||
}
|
||||
} else
|
||||
$errors[] = 'id not set';
|
||||
|
||||
return !count($errors);
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
19
admin/pages/phpinfo.php
Normal file
19
admin/pages/phpinfo.php
Normal file
@@ -0,0 +1,19 @@
|
||||
<?php
|
||||
/**
|
||||
* PHP Info
|
||||
*
|
||||
* @package MyAAC
|
||||
* @author Slawkens <slawkens@gmail.com>
|
||||
* @copyright 2019 MyAAC
|
||||
* @link https://my-aac.org
|
||||
*/
|
||||
defined('MYAAC') or die('Direct access not allowed!');
|
||||
$title = 'PHP Info';
|
||||
|
||||
if (!function_exists('phpinfo')) { ?>
|
||||
<b>phpinfo()</b> function is disabled in your webserver config.<br/>
|
||||
You can enable it by editing <b>php.ini</b> file.
|
||||
<?php return;
|
||||
}
|
||||
?>
|
||||
<iframe src="<?php echo BASE_URL; ?>admin/tools/phpinfo.php" width="1024" height="550"></iframe>
|
901
admin/pages/players.php
Normal file
901
admin/pages/players.php
Normal file
@@ -0,0 +1,901 @@
|
||||
<?php
|
||||
/**
|
||||
* Players editor
|
||||
*
|
||||
* @package MyAAC
|
||||
* @author Slawkens <slawkens@gmail.com>
|
||||
* @copyright 2019 MyAAC
|
||||
* @link https://my-aac.org
|
||||
*/
|
||||
defined('MYAAC') or die('Direct access not allowed!');
|
||||
|
||||
$title = 'Player editor';
|
||||
$player_base = BASE_URL . 'admin/?p=players';
|
||||
|
||||
$use_datatable = true;
|
||||
require_once LIBS . 'forum.php';
|
||||
|
||||
$skills = array(
|
||||
POT::SKILL_FIST => array('Fist fighting', 'fist'),
|
||||
POT::SKILL_CLUB => array('Club fighting', 'club'),
|
||||
POT::SKILL_SWORD => array('Sword fighting', 'sword'),
|
||||
POT::SKILL_AXE => array('Axe fighting', 'axe'),
|
||||
POT::SKILL_DIST => array('Distance fighting', 'dist'),
|
||||
POT::SKILL_SHIELD => array('Shielding', 'shield'),
|
||||
POT::SKILL_FISH => array('Fishing', 'fish')
|
||||
);
|
||||
|
||||
$hasBlessingsColumn = $db->hasColumn('players', 'blessings');
|
||||
$hasBlessingColumn = $db->hasColumn('players', 'blessings1');
|
||||
$hasLookAddons = $db->hasColumn('players', 'lookaddons');
|
||||
|
||||
$skull_type = array("None", "Yellow", "Green", "White", "Red", "Black", "Orange");
|
||||
?>
|
||||
|
||||
<link rel="stylesheet" type="text/css" href="<?php echo BASE_URL; ?>tools/css/jquery.datetimepicker.css"/ >
|
||||
<script src="<?php echo BASE_URL; ?>tools/js/jquery.datetimepicker.js"></script>
|
||||
|
||||
<?php
|
||||
$id = 0;
|
||||
$search_player = '';
|
||||
if (isset($_REQUEST['id']))
|
||||
$id = (int)$_REQUEST['id'];
|
||||
else if (isset($_REQUEST['search'])) {
|
||||
$search_player = $_REQUEST['search'];
|
||||
if (strlen($search_player) < 3 && !Validator::number($search_player)) {
|
||||
echo_error('Player name is too short.');
|
||||
} else {
|
||||
$query = $db->query('SELECT `id` FROM `players` WHERE `name` = ' . $db->quote($search_player));
|
||||
if ($query->rowCount() == 1) {
|
||||
$query = $query->fetch();
|
||||
$id = (int)$query['id'];
|
||||
} else {
|
||||
$query = $db->query('SELECT `id`, `name` FROM `players` WHERE `name` LIKE ' . $db->quote('%' . $search_player . '%'));
|
||||
if ($query->rowCount() > 0 && $query->rowCount() <= 10) {
|
||||
$str_construct = 'Do you mean?<ul>';
|
||||
foreach ($query as $row)
|
||||
$str_construct .= '<li><a href="' . $player_base . '&id=' . $row['id'] . '">' . $row['name'] . '</a></li>';
|
||||
$str_construct .= '</ul>';
|
||||
echo_error($str_construct);
|
||||
} else if ($query->rowCount() > 10)
|
||||
echo_error('Specified name resulted with too many players.');
|
||||
else
|
||||
echo_error('No entries found.');
|
||||
}
|
||||
}
|
||||
}
|
||||
?>
|
||||
<div class="row">
|
||||
<?php
|
||||
$groups = new OTS_Groups_List();
|
||||
if ($id > 0) {
|
||||
$player = new OTS_Player();
|
||||
$player->load($id);
|
||||
|
||||
if (isset($player) && $player->isLoaded() && isset($_POST['save'])) {// we want to save
|
||||
$error = false;
|
||||
|
||||
if ($player->isOnline())
|
||||
echo_error('This player is actually online. You can\'t edit online players.');
|
||||
|
||||
$name = $_POST['name'];
|
||||
$_error = '';
|
||||
if (!Validator::characterName($name))
|
||||
echo_error(Validator::getLastError());
|
||||
|
||||
//if(!Validator::newCharacterName($name)
|
||||
// echo_error(Validator::getLastError());
|
||||
|
||||
$player_db = new OTS_Player();
|
||||
$player_db->find($name);
|
||||
if ($player_db->isLoaded() && $player->getName() != $name)
|
||||
echo_error('This name is already used. Please choose another name!');
|
||||
|
||||
$account_id = $_POST['account_id'];
|
||||
verify_number($account_id, 'Account id', 11);
|
||||
|
||||
$account_db = new OTS_Account();
|
||||
$account_db->load($account_id);
|
||||
if (!$account_db->isLoaded())
|
||||
echo_error('Account with this id doesn\'t exist.');
|
||||
|
||||
$group = $_POST['group'];
|
||||
if ($groups->getGroup($group) == false)
|
||||
echo_error('Group with this id doesn\'t exist');
|
||||
|
||||
$level = $_POST['level'];
|
||||
verify_number($level, 'Level', 11);
|
||||
|
||||
$experience = $_POST['experience'];
|
||||
verify_number($experience, 'Experience', 20);
|
||||
|
||||
$vocation = $_POST['vocation'];
|
||||
verify_number($vocation, 'Vocation id', 11);
|
||||
|
||||
if (!isset($config['vocations'][$vocation])) {
|
||||
echo_error("Vocation with this id doesn't exist.");
|
||||
}
|
||||
|
||||
// health
|
||||
$health = $_POST['health'];
|
||||
verify_number($health, 'Health', 11);
|
||||
$health_max = $_POST['health_max'];
|
||||
verify_number($health_max, 'Health max', 11);
|
||||
|
||||
// mana
|
||||
$magic_level = $_POST['magic_level'];
|
||||
verify_number($magic_level, 'Magic_level', 11);
|
||||
$mana = $_POST['mana'];
|
||||
verify_number($mana, 'Mana', 11);
|
||||
$mana_max = $_POST['mana_max'];
|
||||
verify_number($mana_max, 'Mana max', 11);
|
||||
$mana_spent = $_POST['mana_spent'];
|
||||
verify_number($mana_spent, 'Mana spent', 11);
|
||||
|
||||
// look
|
||||
$look_body = $_POST['look_body'];
|
||||
verify_number($look_body, 'Look body', 11);
|
||||
$look_feet = $_POST['look_feet'];
|
||||
verify_number($look_feet, 'Look feet', 11);
|
||||
$look_head = $_POST['look_head'];
|
||||
verify_number($look_head, 'Look head', 11);
|
||||
$look_legs = $_POST['look_legs'];
|
||||
verify_number($look_legs, 'Look legs', 11);
|
||||
$look_type = $_POST['look_type'];
|
||||
verify_number($look_type, 'Look type', 11);
|
||||
if ($hasLookAddons) {
|
||||
$look_addons = $_POST['look_addons'];
|
||||
verify_number($look_addons, 'Look addons', 11);
|
||||
}
|
||||
|
||||
// pos
|
||||
$pos_x = $_POST['pos_x'];
|
||||
verify_number($pos_x, 'Position x', 11);
|
||||
$pos_y = $_POST['pos_y'];
|
||||
verify_number($pos_y, 'Position y', 11);
|
||||
$pos_z = $_POST['pos_z'];
|
||||
verify_number($pos_z, 'Position z', 11);
|
||||
|
||||
$soul = $_POST['soul'];
|
||||
verify_number($soul, 'Soul', 10);
|
||||
|
||||
$town = $_POST['town'];
|
||||
verify_number($town, 'Town', 11);
|
||||
|
||||
$capacity = $_POST['capacity'];
|
||||
verify_number($capacity, 'Capacity', 11);
|
||||
$sex = $_POST['sex'];
|
||||
verify_number($sex, 'Sex', 1);
|
||||
|
||||
$lastlogin = strtotime($_POST['lastlogin']);
|
||||
verify_number($lastlogin, 'Last login', 20);
|
||||
$lastlogout = strtotime($_POST['lastlogout']);
|
||||
verify_number($lastlogout, 'Last logout', 20);
|
||||
|
||||
$skull = $_POST['skull'];
|
||||
verify_number($skull, 'Skull', 1);
|
||||
$skull_time = $_POST['skull_time'];
|
||||
verify_number($skull_time, 'Skull time', 11);
|
||||
|
||||
if ($db->hasColumn('players', 'loss_experience')) {
|
||||
$loss_experience = $_POST['loss_experience'];
|
||||
verify_number($loss_experience, 'Loss experience', 11);
|
||||
$loss_mana = $_POST['loss_mana'];
|
||||
verify_number($loss_mana, 'Loss mana', 11);
|
||||
$loss_skills = $_POST['loss_skills'];
|
||||
verify_number($loss_skills, 'Loss skills', 11);
|
||||
$loss_containers = $_POST['loss_containers'];
|
||||
verify_number($loss_containers, 'Loss loss_containers', 11);
|
||||
$loss_items = $_POST['loss_items'];
|
||||
verify_number($loss_items, 'Loss items', 11);
|
||||
}
|
||||
if ($db->hasColumn('players', 'offlinetraining_time')) {
|
||||
$offlinetraining = $_POST['offlinetraining'];
|
||||
verify_number($offlinetraining, 'Offline Training time', 11);
|
||||
}
|
||||
|
||||
if ($hasBlessingsColumn) {
|
||||
$blessings = $_POST['blessings'];
|
||||
verify_number($blessings, 'Blessings', 2);
|
||||
}
|
||||
|
||||
$balance = $_POST['balance'];
|
||||
verify_number($balance, 'Balance', 20);
|
||||
if ($db->hasColumn('players', 'stamina')) {
|
||||
$stamina = $_POST['stamina'];
|
||||
verify_number($stamina, 'Stamina', 20);
|
||||
}
|
||||
|
||||
$deleted = (isset($_POST['deleted']) && $_POST['deleted'] == 'true');
|
||||
$hidden = (isset($_POST['hidden']) && $_POST['hidden'] == 'true');
|
||||
|
||||
$created = strtotime($_POST['created']);
|
||||
verify_number($created, 'Created', 11);
|
||||
|
||||
$comment = isset($_POST['comment']) ? htmlspecialchars(stripslashes(substr($_POST['comment'], 0, 2000))) : NULL;
|
||||
|
||||
foreach ($_POST['skills'] as $skill => $value)
|
||||
verify_number($value, $skills[$skill][0], 10);
|
||||
foreach ($_POST['skills_tries'] as $skill => $value)
|
||||
verify_number($value, $skills[$skill][0] . ' tries', 10);
|
||||
|
||||
if ($hasBlessingColumn) {
|
||||
$bless_count = $_POST['blesscount'];
|
||||
for ($i = 1; $i <= $bless_count; $i++) {
|
||||
$a = 'blessing' . $i;
|
||||
${'blessing' . $i} = (isset($_POST[$a]) && $_POST[$a] == 'true');
|
||||
}
|
||||
}
|
||||
|
||||
if (!$error) {
|
||||
$player->setName($name);
|
||||
$player->setAccount($account_db);
|
||||
$player->setGroup($groups->getGroup($group));
|
||||
$player->setLevel($level);
|
||||
$player->setExperience($experience);
|
||||
$player->setVocation($vocation);
|
||||
$player->setHealth($health);
|
||||
$player->setHealthMax($health_max);
|
||||
$player->setMagLevel($magic_level);
|
||||
$player->setMana($mana);
|
||||
$player->setManaMax($mana_max);
|
||||
$player->setManaSpent($mana_spent);
|
||||
$player->setLookBody($look_body);
|
||||
$player->setLookFeet($look_feet);
|
||||
$player->setLookHead($look_head);
|
||||
$player->setLookLegs($look_legs);
|
||||
$player->setLookType($look_type);
|
||||
if ($hasLookAddons)
|
||||
$player->setLookAddons($look_addons);
|
||||
if ($db->hasColumn('players', 'offlinetraining_time'))
|
||||
$player->setCustomField('offlinetraining_time', $offlinetraining);
|
||||
$player->setPosX($pos_x);
|
||||
$player->setPosY($pos_y);
|
||||
$player->setPosZ($pos_z);
|
||||
$player->setSoul($soul);
|
||||
$player->setTownId($town);
|
||||
$player->setCap($capacity);
|
||||
$player->setSex($sex);
|
||||
$player->setLastLogin($lastlogin);
|
||||
$player->setLastLogout($lastlogout);
|
||||
//$player->setLastIP(ip2long($lastip));
|
||||
$player->setSkull($skull);
|
||||
$player->setSkullTime($skull_time);
|
||||
if ($db->hasColumn('players', 'loss_experience')) {
|
||||
$player->setLossExperience($loss_experience);
|
||||
$player->setLossMana($loss_mana);
|
||||
$player->setLossSkills($loss_skills);
|
||||
$player->setLossContainers($loss_containers);
|
||||
$player->setLossItems($loss_items);
|
||||
}
|
||||
if ($db->hasColumn('players', 'blessings'))
|
||||
$player->setBlessings($blessings);
|
||||
|
||||
if ($hasBlessingColumn) {
|
||||
for ($i = 1; $i <= $bless_count; $i++) {
|
||||
$a = 'blessing' . $i;
|
||||
$player->setCustomField('blessings' . $i, ${'blessing' . $i} ? '1' : '0');
|
||||
}
|
||||
}
|
||||
$player->setBalance($balance);
|
||||
if ($db->hasColumn('players', 'stamina'))
|
||||
$player->setStamina($stamina);
|
||||
if ($db->hasColumn('players', 'deletion'))
|
||||
$player->setCustomField('deletion', $deleted ? '1' : '0');
|
||||
else
|
||||
$player->setCustomField('deleted', $deleted ? '1' : '0');
|
||||
$player->setCustomField('hidden', $hidden ? '1' : '0');
|
||||
$player->setCustomField('created', $created);
|
||||
if (isset($comment))
|
||||
$player->setCustomField('comment', $comment);
|
||||
|
||||
foreach ($_POST['skills'] as $skill => $value) {
|
||||
$player->setSkill($skill, $value);
|
||||
}
|
||||
foreach ($_POST['skills_tries'] as $skill => $value) {
|
||||
$player->setSkillTries($skill, $value);
|
||||
}
|
||||
$player->save();
|
||||
echo_success('Player saved at: ' . date('G:i'));
|
||||
$player->load($id);
|
||||
}
|
||||
}
|
||||
} else if ($id == 0) {
|
||||
$players_db = $db->query('SELECT `id`, `name`, `level` FROM `players` ORDER BY `id` asc');
|
||||
?>
|
||||
<div class="col-12 col-sm-12 col-lg-10">
|
||||
<div class="card card-info card-outline">
|
||||
<div class="card-header">
|
||||
<h5 class="m-0">Players</h5>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<table class="player_datatable table table-striped table-bordered table-responsive d-md-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>ID</th>
|
||||
<th>Name</th>
|
||||
<th>Level</th>
|
||||
<th style="width: 40px">Edit</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<?php foreach ($players_db as $player_db): ?>
|
||||
<tr>
|
||||
<th><?php echo $player_db['id']; ?></th>
|
||||
<td><?php echo $player_db['name']; ?></a></td>
|
||||
<td><?php echo $player_db['level']; ?></a></td>
|
||||
|
||||
<td><a href="?p=players&id=<?php echo $player_db['id']; ?>" class="btn btn-success btn-sm" title="Edit">
|
||||
<i class="fas fa-pencil-alt"></i>
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
<?php endforeach; ?>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<?php } ?>
|
||||
|
||||
<?php
|
||||
if (isset($player) && $player->isLoaded()) {
|
||||
$account = $player->getAccount();
|
||||
?>
|
||||
<div class="col-12 col-sm-12 col-lg-10">
|
||||
<div class="card card-primary card-outline card-outline-tabs">
|
||||
<div class="card-header p-0 border-bottom-0">
|
||||
<ul class="nav nav-tabs" id="tabs-tab" role="tablist">
|
||||
<li class="nav-item">
|
||||
<a class="nav-link active" id="tabs-home-tab" data-toggle="pill" href="#tabs-home">Player</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" id="tabs-home-tab" data-toggle="pill" href="#tabs-stats">Stats</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" id="tabs-home-tab" data-toggle="pill" href="#tabs-skills">Skills</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" id="tabs-home-tab" data-toggle="pill" href="#tabs-pos">Pos/Look</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" id="tabs-home-tab" data-toggle="pill" href="#tabs-misc">Misc</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" id="tabs-posts-tab" data-toggle="pill" href="#tabs-posts">Posts</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" id="tabs-chars-tab" data-toggle="pill" href="#tabs-chars">Characters</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<form action="<?php echo $player_base . ((isset($id) && $id > 0) ? '&id=' . $id : ''); ?>" method="post">
|
||||
<div class="card-body">
|
||||
<div class="tab-content" id="tabs-tabContent">
|
||||
<div class="tab-pane fade active show" id="tabs-home">
|
||||
<div class="form-group row">
|
||||
<div class="col-12 col-sm-12 col-lg-6">
|
||||
<label for="name" class="control-label">Name</label>
|
||||
<input type="text" class="form-control" id="name" name="name" autocomplete="off" value="<?php echo $player->getName(); ?>"/>
|
||||
</div>
|
||||
<div class="col-12 col-sm-12 col-lg-6">
|
||||
<label for="account_id">Account id:</label>
|
||||
<input type="text" class="form-control" id="account_id" name="account_id" autocomplete="off" size="8" maxlength="11" value="<?php echo $account->getId(); ?>"/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group row">
|
||||
<div class="col-12 col-sm-12 col-lg-6">
|
||||
<label for="group">Group:</label>
|
||||
<select name="group" id="group" class="form-control custom-select">
|
||||
<?php foreach ($groups->getGroups() as $id => $group): ?>
|
||||
<option value="<?php echo $id; ?>" <?php echo($player->getGroup()->getId() == $id ? 'selected' : ''); ?>><?php echo $group->getName(); ?></option>
|
||||
<?php endforeach; ?>
|
||||
</select>
|
||||
</div>
|
||||
<div class="col-12 col-sm-12 col-lg-6">
|
||||
<label for="vocation">Vocation</label>
|
||||
<select name="vocation" id="vocation" class="form-control custom-select">
|
||||
<?php
|
||||
foreach ($config['vocations'] as $id => $name) {
|
||||
echo '<option value=' . $id . ($id == $player->getVocation() ? ' selected' : '') . '>' . $name . '</option>';
|
||||
}
|
||||
?>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group row">
|
||||
<div class="col-12 col-sm-12 col-lg-6">
|
||||
<label for="sex">Sex:</label>
|
||||
<select name="sex" id="sex" class="form-control custom-select">>
|
||||
<?php foreach ($config['genders'] as $id => $sex): ?>
|
||||
<option value="<?php echo $id; ?>" <?php echo($player->getSex() == $id ? 'selected' : ''); ?>><?php echo strtolower($sex); ?></option>
|
||||
<?php endforeach; ?>
|
||||
</select>
|
||||
</div>
|
||||
<div class="col-12 col-sm-12 col-lg-6">
|
||||
<label for="town">Town:</label>
|
||||
<select name="town" id="town" class="form-control">
|
||||
<?php
|
||||
$configTowns = config('towns');
|
||||
if (!isset($configTowns[$player->getTownId()])) {
|
||||
$configTowns[$player->getTownId()] = 'Unknown Town';
|
||||
}
|
||||
|
||||
foreach ($configTowns as $id => $town): ?>
|
||||
<option value="<?php echo $id; ?>" <?php echo($player->getTownId() == $id ? 'selected' : ''); ?>><?php echo $town; ?></option>
|
||||
<?php endforeach; ?>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group row">
|
||||
<div class="col-12 col-sm-12 col-lg-6">
|
||||
<label for="skull">Skull:</label>
|
||||
<select name="skull" id="skull" class="form-control custom-select">
|
||||
<?php
|
||||
|
||||
foreach ($skull_type as $id => $s_name) {
|
||||
echo '<option value=' . $id . ($id == $player->getSkull() ? ' selected' : '') . '>' . $s_name . '</option>';
|
||||
}
|
||||
?>
|
||||
</select>
|
||||
</div>
|
||||
<div class="col-12 col-sm-12 col-lg-6">
|
||||
<label for="skull_time">Skull time:</label>
|
||||
<input type="text" class="form-control" id="skull_time" name="skull_time"
|
||||
autocomplete="off" maxlength="11"
|
||||
value="<?php echo $player->getSkullTime(); ?>"/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group row">
|
||||
<?php if ($hasBlessingColumn):
|
||||
$bless_count = $player->countBlessings();
|
||||
$bless = $player->checkBlessings($bless_count); ?>
|
||||
<input type="hidden" name="blesscount" value="<?php echo $bless_count; ?>"/>
|
||||
<div class="col-12 col-sm-12 col-lg-6">
|
||||
<label>Blessings:</label><br/>
|
||||
<?php for ($i = 1; $i <= $bless_count; $i++): ?>
|
||||
<label><input class="" type="checkbox" name="blessing<?php echo $i; ?>" id="blessing<?php echo $i; ?>" value="true"<?php echo(($bless[$i - 1] == 1) ? ' checked' : '') ?>/><?php echo $i; ?></label>
|
||||
<?php endfor ?>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
<?php if ($hasBlessingsColumn): ?>
|
||||
<div class="col-12 col-sm-12 col-lg-6">
|
||||
<label for="blessings">Blessings:</label>
|
||||
<input type="text" class="form-control" id="blessings" name="blessings" autocomplete="off" maxlength="11" value="<?php echo $player->getBlessings(); ?>"/>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
<div class="col-12 col-sm-12 col-lg-6">
|
||||
<label for="balance" class="control-label">Bank Balance:</label>
|
||||
<input type="text" class="form-control" id="balance" name="balance" autocomplete="off" maxlength="20" value="<?php echo $player->getBalance(); ?>"/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group row">
|
||||
<div class="col-12 col-sm-12 col-lg-6">
|
||||
<div class="custom-control custom-switch custom-switch-on-danger">
|
||||
<input type="checkbox" class="custom-control-input" name="deleted" id="deleted" value="true" <?php echo($player->getCustomField($db->hasColumn('players', 'deletion') ? 'deletion' : 'deleted') == '1' ? ' checked' : ''); ?>>
|
||||
<label class="custom-control-label" for="deleted">Deleted</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-12 col-sm-12 col-lg-6">
|
||||
<div class="custom-control custom-switch custom-switch-on-success">
|
||||
<input type="checkbox" class="custom-control-input" name="hidden" id="hidden" value="true" <?php echo($player->isHidden() ? ' checked' : ''); ?>>
|
||||
<label class="custom-control-label" for="hidden">Hidden</label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="tab-pane fade" id="tabs-stats">
|
||||
<div class="form-group row">
|
||||
<div class="col-12 col-sm-12 col-lg-6">
|
||||
<label for="level" class="control-label">Level:</label>
|
||||
<input type="text" class="form-control" id="level" name="level" autocomplete="off" value="<?php echo $player->getLevel(); ?>"/>
|
||||
</div>
|
||||
<div class="col-12 col-sm-12 col-lg-6">
|
||||
<label for="experience" class="control-label">Experience:</label>
|
||||
<input type="text" class="form-control" id="experience" name="experience" autocomplete="off" value="<?php echo $player->getExperience(); ?>"/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group row">
|
||||
<div class="col-12 col-sm-12 col-lg-6">
|
||||
<label for="magic_level" class="control-label">Magic level:</label>
|
||||
<input type="text" class="form-control" id="magic_level" name="magic_level" autocomplete="off" size="8" maxlength="11" value="<?php echo $player->getMagLevel(); ?>"/>
|
||||
</div>
|
||||
<div class="col-12 col-sm-12 col-lg-6">
|
||||
<label for="mana_spent" class="control-label">Mana spent:</label>
|
||||
<input type="text" class="form-control" id="mana_spent" name="mana_spent" autocomplete="off" size="3" maxlength="11" value="<?php echo $player->getManaSpent(); ?>"/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group row">
|
||||
<div class="col-12 col-sm-12 col-lg-6">
|
||||
<label for="health" class="control-label">Health:</label>
|
||||
<input type="text" class="form-control" id="health" name="health" autocomplete="off" size="5" maxlength="11" value="<?php echo $player->getHealth(); ?>"/>
|
||||
</div>
|
||||
<div class="col-12 col-sm-12 col-lg-6">
|
||||
<label for="health_max" class="control-label">Health max:</label>
|
||||
<input type="text" class="form-control" id="health_max" name="health_max" autocomplete="off" size="5" maxlength="11" value="<?php echo $player->getHealthMax(); ?>"/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group row">
|
||||
<div class="col-12 col-sm-12 col-lg-6">
|
||||
<label for="mana" class="control-label">Mana:</label>
|
||||
<input type="text" class="form-control" id="mana" name="mana" autocomplete="off" size="3" maxlength="11" value="<?php echo $player->getMana(); ?>"/>
|
||||
</div>
|
||||
<div class="col-12 col-sm-12 col-lg-6">
|
||||
<label for="mana_max" class="control-label">Mana max:</label>
|
||||
<input type="text" class="form-control" id="mana_max" name="mana_max" autocomplete="off" size="3" maxlength="11" value="<?php echo $player->getManaMax(); ?>"/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group row">
|
||||
<div class="col-12 col-sm-12 col-lg-6">
|
||||
<label for="capacity" class="control-label">Capacity:</label>
|
||||
<input type="text" class="form-control" id="capacity" name="capacity" autocomplete="off" size="3" maxlength="11" value="<?php echo $player->getCap(); ?>"/>
|
||||
</div>
|
||||
<div class="col-12 col-sm-12 col-lg-6">
|
||||
<label for="soul" class="control-label">Soul:</label>
|
||||
<input type="text" class="form-control" id="soul" name="soul" autocomplete="off" size="3" maxlength="10" value="<?php echo $player->getSoul(); ?>"/>
|
||||
</div>
|
||||
<?php if ($db->hasColumn('players', 'stamina')): ?>
|
||||
<div class="col-12 col-sm-12 col-lg-6">
|
||||
<label for="stamina" class="control-label">Stamina:</label>
|
||||
<input type="text" class="form-control" id="stamina" name="stamina" autocomplete="off" maxlength="20" value="<?php echo $player->getStamina(); ?>"/>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
<?php if ($db->hasColumn('players', 'offlinetraining_time')): ?>
|
||||
<div class="col-12 col-sm-12 col-lg-6">
|
||||
<label for="offlinetraining" class="control-label">Offline Training
|
||||
Time:</label>
|
||||
<input type="text" class="form-control" id="offlinetraining" name="offlinetraining" autocomplete="off" maxlength="11" value="<?php echo $player->getCustomField('offlinetraining_time'); ?>"/>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
</div>
|
||||
<div class="tab-pane fade" id="tabs-skills">
|
||||
<?php
|
||||
foreach ($skills as $id => $info) {
|
||||
?>
|
||||
<div class="form-group row">
|
||||
<div class="col-12 col-sm-12 col-lg-6">
|
||||
<?php echo '<label for="skills[' . $id . ']" class="control-label">' . $info[0] . '</label>
|
||||
<input type="text" class="form-control" id="skills[' . $id . ']" name="skills[' . $id . ']" maxlength="10" autocomplete="off" value="' . $player->getSkill($id) . '"/>'; ?>
|
||||
</div>
|
||||
<div class="col-12 col-sm-12 col-lg-6">
|
||||
<?php echo '<label for="skills_tries[' . $id . ']" class="control-label">' . $info[0] . ' tries</label>
|
||||
<input type="text" class="form-control" id="skills_tries[' . $id . ']" name="skills_tries[' . $id . ']" maxlength="10" autocomplete="off" value="' . $player->getSkillTries($id) . '"/>'; ?>
|
||||
</div>
|
||||
</div>
|
||||
<?php } ?>
|
||||
</div>
|
||||
<div class="tab-pane fade" id="tabs-pos">
|
||||
<?php $outfit = $config['outfit_images_url'] . '?id=' . $player->getLookType() . ($hasLookAddons ? '&addons=' . $player->getLookAddons() : '') . '&head=' . $player->getLookHead() . '&body=' . $player->getLookBody() . '&legs=' . $player->getLookLegs() . '&feet=' . $player->getLookFeet(); ?>
|
||||
<div id="imgchar" style="width:64px;height:64px;position:absolute; top:30px; right:30px">
|
||||
<img id="player_outfit" style="margin-left:0;margin-top:0;width:64px;height:64px;" src="<?php echo $outfit; ?>" alt="player outfit"/>
|
||||
</div>
|
||||
<td>Position:</td>
|
||||
<div class="form-group row">
|
||||
<div class="col-12 col-sm-12 col-lg-4">
|
||||
<label for="pos_x" class="control-label">X:</label>
|
||||
<input type="text" class="form-control" id="pos_x" name="pos_x" autocomplete="off" maxlength="11" value="<?php echo $player->getPosX(); ?>"/>
|
||||
</div>
|
||||
<div class="col-12 col-sm-12 col-lg-4">
|
||||
<label for="pos_y" class="control-label">Y:</label>
|
||||
<input type="text" class="form-control" id="pos_y" name="pos_y" autocomplete="off" maxlength="11" value="<?php echo $player->getPosY(); ?>"/>
|
||||
</div>
|
||||
<div class="col-12 col-sm-12 col-lg-4">
|
||||
<label for="pos_z" class="control-label">Z:</label>
|
||||
<input type="text" class="form-control" id="pos_z" name="pos_z" autocomplete="off" maxlength="11" value="<?php echo $player->getPosZ(); ?>"/>
|
||||
</div>
|
||||
</div>
|
||||
<td>Look:</td>
|
||||
<div class="form-group row">
|
||||
<div class="col-12 col-sm-12 col-lg-3">
|
||||
<label for="look_head" class="control-label">Head: <span id="look_head_val" class="font-weight-bold text-primary"></span></label>
|
||||
<input class="custom-range" type="range" min="0" max="132" id="look_head" name="look_head" value="<?php echo $player->getLookHead(); ?>"/>
|
||||
</div>
|
||||
<div class="col-12 col-sm-12 col-lg-3">
|
||||
<label for="look_body" class="control-label">Body: <span id="look_body_val" class="font-weight-bold text-primary"></span></label>
|
||||
<input type="range" min="0" max="132"
|
||||
value="<?php echo $player->getLookBody(); ?>"
|
||||
class="custom-range" id="look_body" name="look_body">
|
||||
</div>
|
||||
<div class="col-12 col-sm-12 col-lg-3">
|
||||
<label for="look_legs" class="control-label">Legs: <span id="look_legs_val" class="font-weight-bold text-primary"></span></label>
|
||||
<input type="range" min="0" max="132"
|
||||
value="<?php echo $player->getLookLegs(); ?>"
|
||||
class="custom-range" id="look_legs" name="look_legs">
|
||||
</div>
|
||||
<div class="col-12 col-sm-12 col-lg-3">
|
||||
<label for="look_feet" class="control-label">Feet: <span id="look_feet_val" class="font-weight-bold text-primary"></span></label>
|
||||
<input type="range" min="0" max="132"
|
||||
value="<?php echo $player->getLookBody(); ?>"
|
||||
class="custom-range" id="look_feet" name="look_feet">
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group row">
|
||||
<div class="col-12 col-sm-12 col-lg-6">
|
||||
<label for="look_type" class="control-label">Type:</label>
|
||||
<?php
|
||||
$outfitlist = null;
|
||||
$outfitlist = Outfits_loadfromXML();
|
||||
if ($outfitlist) { ?>
|
||||
<select name="look_type" id="look_type" class="form-control custom-select">
|
||||
<?php
|
||||
foreach ($outfitlist as $id => $outfit) {
|
||||
if ($outfit['enabled'] == 'yes') ;
|
||||
echo '<option value=' . $outfit['id'] . ($outfit['id'] == $player->getLookType() ? ' selected' : '') . '>' . $outfit['name'] . ' - ' . ($outfit['type'] == 1 ? 'Male' : 'Female') . '</option>';
|
||||
}
|
||||
?>
|
||||
</select>
|
||||
<?php } else { ?>
|
||||
<input type="text" class="form-control" id="look_type" name="look_type" autocomplete="off" maxlength="11" value="<?php echo $player->getLookType(); ?>"/>
|
||||
<?php } ?>
|
||||
</div>
|
||||
<?php if ($hasLookAddons): ?>
|
||||
<div class="col-12 col-sm-12 col-lg-6">
|
||||
<label for="look_addons" class="control-label">Addons:</label>
|
||||
<select name="look_addons" id="look_addons" class="form-control custom-select">
|
||||
<?php
|
||||
$addon_type = array("None", "First", "Second", "Both");
|
||||
foreach ($addon_type as $id => $s_name) {
|
||||
echo '<option value=' . $id . ($id == $player->getLookAddons() ? ' selected' : '') . '>' . $s_name . '</option>';
|
||||
}
|
||||
?>
|
||||
</select>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
</div>
|
||||
<div class="tab-pane fade" id="tabs-misc">
|
||||
<div class="form-group row">
|
||||
<div class="col-12 col-sm-12 col-lg-6">
|
||||
<label for="created" class="control-label">Created:</label>
|
||||
<input type="text" class="form-control" id="created" name="created"
|
||||
autocomplete="off"
|
||||
maxlength="10"
|
||||
value="<?php echo date("M d Y, H:i:s", $player->getCustomField('created')); ?>"/>
|
||||
</div>
|
||||
<div class="col-12 col-sm-12 col-lg-6">
|
||||
<label for="lastlogin" class="control-label">Last login:</label>
|
||||
<input type="text" class="form-control" id="lastlogin" name="lastlogin" autocomplete="off" maxlength="20" value="<?php echo date("M d Y, H:i:s", $player->getLastLogin()); ?>"/>
|
||||
</div>
|
||||
<div class="col-12 col-sm-12 col-lg-6">
|
||||
<label for="lastlogout" class="control-label">Last logout:</label>
|
||||
<input type="text" class="form-control" id="lastlogout" name="lastlogout" autocomplete="off" maxlength="20" value="<?php echo date("M d Y, H:i:s", $player->getLastLogout()); ?>"/>
|
||||
</div>
|
||||
<div class="col-12 col-sm-12 col-lg-6">
|
||||
<label for="lastip" class="control-label">Last IP:</label>
|
||||
<input type="text" class="form-control" id="lastip" name="lastip" autocomplete="off" maxlength="10" value="<?php echo longToIp($player->getLastIP()); ?>" readonly/>
|
||||
</div>
|
||||
</div>
|
||||
<?php if ($db->hasColumn('players', 'loss_experience')): ?>
|
||||
<div class="form-group row">
|
||||
<div class="col-12 col-sm-12 col-lg-6">
|
||||
<label for="loss_experience" class="control-label">Experience
|
||||
Loss:</label>
|
||||
<input type="text" class="form-control" id="loss_experience" name="loss_experience" autocomplete="off" maxlength="11" value="<?php echo $player->getLossExperience(); ?>"/>
|
||||
</div>
|
||||
<div class="col-12 col-sm-12 col-lg-6">
|
||||
<label for="loss_mana" class="control-label">Mana Loss:</label>
|
||||
<input type="text" class="form-control" id="loss_mana" name="loss_mana" autocomplete="off" maxlength="11" value="<?php echo $player->getLossMana(); ?>"/>
|
||||
</div>
|
||||
<div class="col-12 col-sm-12 col-lg-6">
|
||||
<label for="loss_skills" class="control-label">Skills Loss:</label>
|
||||
<input type="text" class="form-control" id="loss_skills" name="loss_skills" autocomplete="off" maxlength="11" value="<?php echo $player->getLossSkills(); ?>"/>
|
||||
</div>
|
||||
<div class="col-12 col-sm-12 col-lg-6">
|
||||
<label for="loss_containers" class="control-label">Containers Loss:</label>
|
||||
<input type="text" class="form-control" id="loss_containers" name="loss_containers" autocomplete="off" maxlength="11" value="<?php echo $player->getLossContainers(); ?>"/>
|
||||
</div>
|
||||
<div class="col-12 col-sm-12 col-lg-6">
|
||||
<label for="loss_items" class="control-label">Items Loss:</label>
|
||||
<input type="text" class="form-control" id="loss_items" name="loss_items" autocomplete="off" maxlength="11" value="<?php echo $player->getLossItems(); ?>"/>
|
||||
</div>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
<div class="form-group row">
|
||||
<div class="col-12">
|
||||
<label for="comment" class="control-label">Comment:</label>
|
||||
<textarea class="form-control" name="comment" rows="10" cols="50" wrap="virtual"><?php echo $player->getCustomField("comment"); ?></textarea>
|
||||
<small>[max. length: 2000 chars, 50 lines (ENTERs)]</small>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="tab-pane fade" id="tabs-posts">
|
||||
<table class="table table-striped table-condensed table-responsive d-md-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="w-25">Topic</th>
|
||||
<th>Content</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<?php
|
||||
$posts = $db->query('SELECT `author_guid`,`section`,`first_post`,`post_text`,`post_date`, `post_topic`,`post_html`,`post_smile`,`' . TABLE_PREFIX . 'forum_boards`.`name` AS `forum_Name` FROM `' .
|
||||
TABLE_PREFIX . 'forum` LEFT JOIN `' . TABLE_PREFIX . 'forum_boards` ON `' .
|
||||
TABLE_PREFIX . 'forum`.section = `' . TABLE_PREFIX . 'forum_boards`.id WHERE `author_guid` = "' . $player->getId() . '" ORDER BY `post_date` DESC LIMIT 10');
|
||||
if ($posts->rowCount() > 0) {
|
||||
$posts = $posts->fetchAll();
|
||||
foreach ($posts as $post) {
|
||||
$text = ($post['post_html'] > 0 ? $post['post_text'] : htmlspecialchars($post['post_text']));
|
||||
$post['content'] = ($post['post_html'] > 0 ? $text : Forum::parseBBCode(nl2br($text), $post['post_smile'] == 0));
|
||||
?>
|
||||
<tr>
|
||||
<th><?php echo htmlspecialchars($post['post_topic']); ?><br/><small><?php echo date('d M y H:i:s', $post['post_date']); ?></small><br/>
|
||||
Topic: <a href="<?php echo getForumThreadLink($post['first_post']); ?>" class="link-black text-sm"><i class="fa fa-share margin-r-5"></i> Link</a><br/>
|
||||
Forum: <a href="<?php echo getForumBoardLink($post['section']); ?>" class="link-black text-sm"><i class="fa fa-share margin-r-5"></i> <?php echo $post['forum_Name']; ?></a></th>
|
||||
<th><?php echo $post['content']; ?></th>
|
||||
</tr>
|
||||
<?php
|
||||
}
|
||||
unset($post);
|
||||
} else {
|
||||
echo '<tr><td colspan="2">This user has no posts</td></tr>';
|
||||
}; ?>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div class="tab-pane fade" id="tabs-chars">
|
||||
<div class="row">
|
||||
<?php
|
||||
if (isset($account) && $account->isLoaded()) {
|
||||
$account_players = $account->getPlayersList();
|
||||
$account_players->orderBy('id');
|
||||
if (isset($account_players)) { ?>
|
||||
<table class="table table-striped table-condensed table-responsive d-md-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>#</th>
|
||||
<th>Name</th>
|
||||
<th>Level</th>
|
||||
<th>Vocation</th>
|
||||
<th style="width: 40px">Edit</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<?php foreach ($account_players as $i => $player):
|
||||
$player_vocation = $player->getVocation();
|
||||
$player_promotion = $player->getPromotion();
|
||||
if (isset($player_promotion)) {
|
||||
if ((int)$player_promotion > 0)
|
||||
$player_vocation += ($player_promotion * $config['vocations_amount']);
|
||||
}
|
||||
|
||||
if (isset($config['vocations'][$player_vocation])) {
|
||||
$vocation_name = $config['vocations'][$player_vocation];
|
||||
} ?>
|
||||
<tr>
|
||||
<th><?php echo $i; ?></th>
|
||||
<td><?php echo $player->getName(); ?></td>
|
||||
<td><?php echo $player->getLevel(); ?></td>
|
||||
<td><?php echo $vocation_name; ?></td>
|
||||
<td><a href="?p=players&id=<?php echo $player->getId() ?>" class=" btn btn-success btn-sm" title="Edit"><i class="fas fa-pencil-alt"></i></a></td>
|
||||
</tr>
|
||||
<?php endforeach ?>
|
||||
</tbody>
|
||||
</table>
|
||||
<?php
|
||||
}
|
||||
} ?>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card-footer text-center">
|
||||
<input type="hidden" name="save" value="yes"/>
|
||||
<button type="submit" class="btn btn-info float-left"><i class="fas fa-update"></i> Update</button>
|
||||
<a href="<?php echo ADMIN_URL; ?>?p=accounts&id=<?php echo $account->getId(); ?>" class="btn btn-secondary">Edit Account</a>
|
||||
<a href="<?php echo ADMIN_URL; ?>?p=players" class="btn btn-danger float-right"><i class="fas fa-cancel"></i> Cancel</a>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script type="text/javascript">
|
||||
$('#lastlogin').datetimepicker({format: "M d Y, H:i:s",});
|
||||
$('#lastlogout').datetimepicker({format: "M d Y, H:i:s",});
|
||||
$('#created').datetimepicker({format: "M d Y, H:i:s",});
|
||||
|
||||
$(document).ready(function () {
|
||||
const $headSpan = $('#look_head_val');
|
||||
const $headvalue = $('#look_head');
|
||||
$headSpan.html($headvalue.val());
|
||||
$headvalue.on('input', () => {
|
||||
$headSpan.html($headvalue.val());
|
||||
});
|
||||
$headvalue.on('change', () => {
|
||||
updateOutfit();
|
||||
});
|
||||
|
||||
const $bodySpan = $('#look_body_val');
|
||||
const $bodyvalue = $('#look_body');
|
||||
$bodySpan.html($bodyvalue.val());
|
||||
$bodyvalue.on('input', () => {
|
||||
$bodySpan.html($bodyvalue.val());
|
||||
});
|
||||
$bodyvalue.on('change', () => {
|
||||
updateOutfit();
|
||||
});
|
||||
|
||||
const $legsSpan = $('#look_legs_val');
|
||||
const $legsvalue = $('#look_legs');
|
||||
$legsSpan.html($legsvalue.val());
|
||||
$legsvalue.on('input', () => {
|
||||
$legsSpan.html($legsvalue.val());
|
||||
});
|
||||
$legsvalue.on('change', () => {
|
||||
updateOutfit();
|
||||
});
|
||||
|
||||
const $feetSpan = $('#look_feet_val');
|
||||
const $feetvalue = $('#look_feet');
|
||||
$feetSpan.html($feetvalue.val());
|
||||
$feetvalue.on('input', () => {
|
||||
$feetSpan.html($feetvalue.val());
|
||||
});
|
||||
$feetvalue.on('change', () => {
|
||||
updateOutfit();
|
||||
});
|
||||
|
||||
const $lookvalue = $('#look_type');
|
||||
$lookvalue.on('change', () => {
|
||||
updateOutfit();
|
||||
});
|
||||
|
||||
<?php if($hasLookAddons): ?>
|
||||
const $addonvalue = $('#look_addons');
|
||||
$('#look_addons').on('change', () => {
|
||||
updateOutfit();
|
||||
});
|
||||
<?php endif; ?>
|
||||
});
|
||||
|
||||
function updateOutfit() {
|
||||
const look_head = $('#look_head').val();
|
||||
const look_body = $('#look_body').val();
|
||||
const look_legs = $('#look_legs').val();
|
||||
const look_feet = $('#look_feet').val();
|
||||
const look_type = $('#look_type').val();
|
||||
|
||||
let look_addons = '';
|
||||
<?php if($hasLookAddons): ?>
|
||||
look_addons = '&addons=' + $('#look_addons').val();
|
||||
<?php endif; ?>
|
||||
$("#player_outfit").attr("src", '<?= $config['outfit_images_url']; ?>?id=' + look_type + look_addons + '&head=' + look_head + '&body=' + look_body + '&legs=' + look_legs + '&feet=' + look_feet);
|
||||
}
|
||||
</script>
|
||||
<?php } ?>
|
||||
<div class="col-12 col-sm-12 col-lg-2">
|
||||
<div class="card card-info card-outline">
|
||||
<div class="card-header">
|
||||
<h5 class="m-0">Search Player</h5>
|
||||
</div>
|
||||
<div class="card-body row">
|
||||
<div class="col-6 col-lg-12">
|
||||
<form action="<?php echo $player_base; ?>" method="post">
|
||||
<label for="name">Player Name:</label>
|
||||
<div class="input-group input-group-sm">
|
||||
<input type="text" class="form-control" name="search" value="<?php echo $search_player; ?>" maxlength="32" size="32">
|
||||
<span class="input-group-append"><button type="submit" class="btn btn-info btn-flat">Search</button></span>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
<div class="col-6 col-lg-12">
|
||||
<form action="<?php echo $player_base; ?>" method="post">
|
||||
<label for="name">Player ID:</label>
|
||||
<div class="input-group input-group-sm">
|
||||
<input type="text" class="form-control" name="id" value="" maxlength="32" size="32">
|
||||
<span class="input-group-append"><button type="submit" class="btn btn-info btn-flat">Search</button></span>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
$(document).ready(function () {
|
||||
$('.player_datatable').DataTable({
|
||||
"order": [[0, "asc"]]
|
||||
});
|
||||
});
|
||||
</script>
|
115
admin/pages/plugins.php
Normal file
115
admin/pages/plugins.php
Normal file
@@ -0,0 +1,115 @@
|
||||
<?php
|
||||
/**
|
||||
* Plugins
|
||||
*
|
||||
* @package MyAAC
|
||||
* @author Slawkens <slawkens@gmail.com>
|
||||
* @copyright 2019 MyAAC
|
||||
* @link https://my-aac.org
|
||||
*/
|
||||
defined('MYAAC') or die('Direct access not allowed!');
|
||||
$title = 'Plugin manager';
|
||||
$use_datatable = true;
|
||||
|
||||
require_once LIBS . 'plugins.php';
|
||||
|
||||
$twig->display('admin.plugins.form.html.twig');
|
||||
|
||||
if (isset($_REQUEST['uninstall'])) {
|
||||
$uninstall = $_REQUEST['uninstall'];
|
||||
|
||||
if (Plugins::uninstall($uninstall)) {
|
||||
success('Successfully uninstalled plugin ' . $uninstall);
|
||||
} else {
|
||||
error('Error while uninstalling plugin ' . $uninstall . ': ' . Plugins::getError());
|
||||
}
|
||||
} else if (isset($_FILES["plugin"]["name"])) {
|
||||
$file = $_FILES["plugin"];
|
||||
$filename = $file["name"];
|
||||
$tmp_name = $file["tmp_name"];
|
||||
$type = $file["type"];
|
||||
|
||||
$name = explode(".", $filename);
|
||||
$accepted_types = array('application/zip', 'application/x-zip-compressed', 'multipart/x-zip', 'application/x-compressed', 'application/octet-stream', 'application/zip-compressed');
|
||||
|
||||
if (isset($file['error'])) {
|
||||
$error = 'Error uploading file';
|
||||
switch ($file['error']) {
|
||||
case UPLOAD_ERR_OK:
|
||||
$error = false;
|
||||
break;
|
||||
case UPLOAD_ERR_INI_SIZE:
|
||||
case UPLOAD_ERR_FORM_SIZE:
|
||||
$error .= ' - file too large (limit of ' . ini_get('upload_max_filesize') . ' bytes). You can enlarge the limits by changing "upload_max_filesize" in php.ini';
|
||||
break;
|
||||
case UPLOAD_ERR_PARTIAL:
|
||||
$error .= ' - file upload was not completed.';
|
||||
break;
|
||||
case UPLOAD_ERR_NO_FILE:
|
||||
$error .= ' - zero-length file uploaded.';
|
||||
break;
|
||||
default:
|
||||
$error .= ' - internal error #' . $file['error'];
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (isset($error) && $error != false) {
|
||||
error($error);
|
||||
} else {
|
||||
if (is_uploaded_file($file['tmp_name'])) {
|
||||
$filetype = strtolower(pathinfo($filename, PATHINFO_EXTENSION));
|
||||
if ($filetype == 'zip') // check if it is zipped/compressed file
|
||||
{
|
||||
$tmp_filename = pathinfo($filename, PATHINFO_FILENAME);
|
||||
$targetzip = BASE . 'plugins/' . $tmp_filename . '.zip';
|
||||
|
||||
if (move_uploaded_file($tmp_name, $targetzip)) { // move uploaded file
|
||||
if (Plugins::install($targetzip)) {
|
||||
foreach (Plugins::getWarnings() as $warning) {
|
||||
warning($warning);
|
||||
}
|
||||
|
||||
$info = Plugins::getPluginJson();
|
||||
success((isset($info['name']) ? '<strong>' . $info['name'] . '</strong> p' : 'P') . 'lugin has been successfully installed.');
|
||||
} else {
|
||||
$error = Plugins::getError();
|
||||
error(!empty($error) ? $error : 'Unexpected error happened while installing plugin. Please try again later.');
|
||||
}
|
||||
|
||||
unlink($targetzip); // delete the Zipped file
|
||||
} else
|
||||
error('There was a problem with the upload. Please try again.');
|
||||
} else {
|
||||
error('The file you are trying to upload is not a .zip file. Please try again.');
|
||||
}
|
||||
} else {
|
||||
error('Error uploading file - unknown error.');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$plugins = array();
|
||||
foreach (get_plugins() as $plugin) {
|
||||
$string = file_get_contents(BASE . 'plugins/' . $plugin . '.json');
|
||||
$string = Plugins::removeComments($string);
|
||||
$plugin_info = json_decode($string, true);
|
||||
|
||||
if ($plugin_info == false) {
|
||||
warning('Cannot load plugin info ' . $plugin . '.json');
|
||||
} else {
|
||||
$plugins[] = array(
|
||||
'name' => isset($plugin_info['name']) ? $plugin_info['name'] : '',
|
||||
'description' => isset($plugin_info['description']) ? $plugin_info['description'] : '',
|
||||
'version' => isset($plugin_info['version']) ? $plugin_info['version'] : '',
|
||||
'author' => isset($plugin_info['author']) ? $plugin_info['author'] : '',
|
||||
'contact' => isset($plugin_info['contact']) ? $plugin_info['contact'] : '',
|
||||
'file' => $plugin,
|
||||
'uninstall' => isset($plugin_info['uninstall'])
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
$twig->display('admin.plugins.html.twig', array(
|
||||
'plugins' => $plugins
|
||||
));
|
61
admin/pages/reports.php
Normal file
61
admin/pages/reports.php
Normal file
@@ -0,0 +1,61 @@
|
||||
<?php
|
||||
/**
|
||||
* Reports
|
||||
*
|
||||
* @package MyAAC
|
||||
* @author Lee
|
||||
* @copyright 2020 MyAAC
|
||||
* @link https://my-aac.org
|
||||
*/
|
||||
defined('MYAAC') or die('Direct access not allowed!');
|
||||
$title = 'Report Viewer';
|
||||
$use_datatable = true;
|
||||
|
||||
$files = array();
|
||||
$server_path_reports = $config['data_path'] . 'reports/';
|
||||
|
||||
if (file_exists($server_path_reports)) {
|
||||
foreach (scandir($server_path_reports, SCANDIR_SORT_ASCENDING) as $f) {
|
||||
if ($f[0] === '.') {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (is_dir($server_path_reports . $f)) {
|
||||
foreach (scandir($server_path_reports . $f, SCANDIR_SORT_ASCENDING) as $f2) {
|
||||
if ($f2[0] === '.') {
|
||||
continue;
|
||||
}
|
||||
|
||||
$files[] = array($f . '/' . $f2, $server_path_reports);
|
||||
}
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
$files[] = array($f, $server_path_reports);
|
||||
}
|
||||
}
|
||||
|
||||
foreach ($files as &$f) {
|
||||
$f['mtime'] = filemtime($f[1] . $f[0]);
|
||||
$f['name'] = $f[0];
|
||||
}
|
||||
|
||||
unset($f);
|
||||
|
||||
$file = isset($_GET['file']) ? $_GET['file'] : NULL;
|
||||
if (!empty($file)) {
|
||||
if (!preg_match('/[^A-z0-9\' _\/\-\.]/', $file)) {
|
||||
if (file_exists($server_path_reports . $file)) {
|
||||
$file_content = nl2br(file_get_contents($server_path_reports . $file));
|
||||
|
||||
$twig->display('admin.logs.view.html.twig', array('file' => $file, 'content' => $file_content));
|
||||
} else {
|
||||
echo 'Specified file does not exist.';
|
||||
}
|
||||
} else {
|
||||
echo 'Invalid file name specified.';
|
||||
}
|
||||
}
|
||||
|
||||
$twig->display('admin.reports.html.twig', array('files' => $files));
|
39
admin/pages/statistics.php
Normal file
39
admin/pages/statistics.php
Normal file
@@ -0,0 +1,39 @@
|
||||
<?php
|
||||
/**
|
||||
* Statistics
|
||||
*
|
||||
* @package MyAAC
|
||||
* @author Slawkens <slawkens@gmail.com>
|
||||
* @copyright 2019 MyAAC
|
||||
* @link https://my-aac.org
|
||||
*/
|
||||
defined('MYAAC') or die('Direct access not allowed!');
|
||||
$title = 'Statistics';
|
||||
|
||||
$query = $db->query('SELECT count(*) as `how_much` FROM `accounts`;');
|
||||
$query = $query->fetch();
|
||||
$total_accounts = $query['how_much'];
|
||||
|
||||
$query = $db->query('SELECT count(*) as `how_much` FROM `players`;');
|
||||
$query = $query->fetch();
|
||||
$total_players = $query['how_much'];
|
||||
|
||||
$query = $db->query('SELECT count(*) as `how_much` FROM `guilds`;');
|
||||
$query = $query->fetch();
|
||||
$total_guilds = $query['how_much'];
|
||||
|
||||
$query = $db->query('SELECT count(*) as `how_much` FROM `houses`;');
|
||||
$query = $query->fetch();
|
||||
$total_houses = $query['how_much'];
|
||||
|
||||
$points = $db->query('SELECT `premium_points`, `' . (USE_ACCOUNT_NAME ? 'name' : 'id') . '` as `name` FROM `accounts` ORDER BY `premium_points` DESC LIMIT 10;');
|
||||
|
||||
$twig->display('admin.statistics.html.twig', array(
|
||||
'total_accounts' => $total_accounts,
|
||||
'total_players' => $total_players,
|
||||
'total_guilds' => $total_guilds,
|
||||
'total_houses' => $total_houses,
|
||||
'account_type' => (USE_ACCOUNT_NAME ? 'name' : 'number'),
|
||||
'points' => $points
|
||||
));
|
||||
?>
|
33
admin/pages/tools.php
Normal file
33
admin/pages/tools.php
Normal file
@@ -0,0 +1,33 @@
|
||||
<?php
|
||||
/**
|
||||
* Tools
|
||||
*
|
||||
* @package MyAAC
|
||||
* @author Slawkens <slawkens@gmail.com>
|
||||
* @copyright 2019 MyAAC
|
||||
* @link https://my-aac.org
|
||||
*/
|
||||
defined('MYAAC') or die('Direct access not allowed!');
|
||||
$title = 'Tools';
|
||||
|
||||
if (!isset($_GET['tool'])) {
|
||||
echo 'Tool not set.';
|
||||
return;
|
||||
}
|
||||
|
||||
$tool = $_GET['tool'];
|
||||
if (preg_match("/[^A-z0-9_\-]/", $tool)) {
|
||||
echo 'Invalid tool.';
|
||||
return;
|
||||
}
|
||||
|
||||
$file = ADMIN . 'tools/' . $tool . '.php';
|
||||
|
||||
if (@file_exists($file)) {
|
||||
require $file;
|
||||
return;
|
||||
}
|
||||
|
||||
echo 'Tool <strong>' . $tool . '</strong> not found.';
|
||||
|
||||
?>
|
50
admin/pages/version.php
Normal file
50
admin/pages/version.php
Normal file
@@ -0,0 +1,50 @@
|
||||
<?php
|
||||
/**
|
||||
* Version check
|
||||
*
|
||||
* @package MyAAC
|
||||
* @author Slawkens <slawkens@gmail.com>
|
||||
* @copyright 2019 MyAAC
|
||||
* @link https://my-aac.org
|
||||
*/
|
||||
defined('MYAAC') or die('Direct access not allowed!');
|
||||
$title = 'Version check';
|
||||
|
||||
// fetch version
|
||||
//$file = @fopen('https://my-aac.org/VERSION', 'r') or die('Error while fetching version.');
|
||||
//$myaac_version = fgets($file);
|
||||
$myaac_version = @file_get_contents('https://my-aac.org/VERSION');
|
||||
if (!$myaac_version) {
|
||||
warning('Error while fetching version info from https://my-aac.org<br/>
|
||||
Please try again later.');
|
||||
return;
|
||||
}
|
||||
|
||||
// compare them
|
||||
$version_compare = version_compare($myaac_version, MYAAC_VERSION);
|
||||
if ($version_compare == 0) {
|
||||
success('MyAAC latest version is ' . $myaac_version . '. You\'re using the latest version.
|
||||
<br/>View CHANGELOG ' . generateLink(ADMIN_URL . '?p=clmd', 'here'));
|
||||
} else if ($version_compare < 0) {
|
||||
success('Woah, seems you\'re using newer version as latest released one! MyAAC latest released version is ' . $myaac_version . ', and you\'re using version ' . MYAAC_VERSION . '.
|
||||
<br/>View CHANGELOG ' . generateLink(ADMIN_URL . '?p=clmd', 'here'));
|
||||
} else {
|
||||
warning('You\'re using outdated version.<br/>
|
||||
Your version: <b>' . MYAAC_VERSION . '</b><br/>
|
||||
Latest version: <b>' . $myaac_version . '</b><br/>
|
||||
Download available at: <a href="https://my-aac.org" target="_blank">www.my-aac.org</a>');
|
||||
}
|
||||
|
||||
/*
|
||||
function version_revert($version)
|
||||
{
|
||||
$major = floor($version / 10000);
|
||||
$version -= $major * 10000;
|
||||
|
||||
$minor = floor($version / 100);
|
||||
$version -= $minor * 100;
|
||||
|
||||
$release = $version;
|
||||
return $major . '.' . $minor . '.' . $release;
|
||||
}*/
|
||||
?>
|
37
admin/pages/visitors.php
Normal file
37
admin/pages/visitors.php
Normal file
@@ -0,0 +1,37 @@
|
||||
<?php
|
||||
/**
|
||||
* Visitors viewer
|
||||
*
|
||||
* @package MyAAC
|
||||
* @author Slawkens <slawkens@gmail.com>
|
||||
* @copyright 2019 MyAAC
|
||||
* @link https://my-aac.org
|
||||
*/
|
||||
defined('MYAAC') or die('Direct access not allowed!');
|
||||
$title = 'Visitors';
|
||||
$use_datatable = true;
|
||||
|
||||
if (!$config['visitors_counter']): ?>
|
||||
Visitors counter is disabled.<br/>
|
||||
You can enable it by editing this configurable in <b>config.local.php</b> file:<br/>
|
||||
<p style="margin-left: 3em;"><b>$config['visitors_counter'] = true;</b></p>
|
||||
<?php
|
||||
return;
|
||||
endif;
|
||||
|
||||
require SYSTEM . 'libs/visitors.php';
|
||||
$visitors = new Visitors($config['visitors_counter_ttl']);
|
||||
|
||||
function compare($a, $b)
|
||||
{
|
||||
return $a['lastvisit'] > $b['lastvisit'] ? -1 : 1;
|
||||
}
|
||||
|
||||
$tmp = $visitors->getVisitors();
|
||||
usort($tmp, 'compare');
|
||||
|
||||
$twig->display('admin.visitors.html.twig', array(
|
||||
'config_visitors_counter_ttl' => $config['visitors_counter_ttl'],
|
||||
'visitors' => $tmp
|
||||
));
|
||||
?>
|
@@ -4,23 +4,23 @@ $menus = [
|
||||
['name' => 'Dashboard', 'icon' => 'tachometer-alt', 'order' => 10, 'link' => 'dashboard'],
|
||||
['name' => 'News', 'icon' => 'newspaper', 'order' => 20, 'link' =>
|
||||
[
|
||||
['name' => 'View', 'link' => 'news', 'order' => 10],
|
||||
['name' => 'Add news', 'link' => 'news&action=new&type=1', 'order' => 20],
|
||||
['name' => 'Add ticker', 'link' => 'news&action=new&type=2', 'order' => 30],
|
||||
['name' => 'Add article', 'link' => 'news&action=new&type=3', 'order' => 40],
|
||||
['name' => 'View', 'link' => 'news', 'icon' => 'list', 'order' => 10],
|
||||
['name' => 'Add news', 'link' => 'news&action=new&type=1', 'icon' => 'plus', 'order' => 20],
|
||||
['name' => 'Add ticker', 'link' => 'news&action=new&type=2', 'icon' => 'plus', 'order' => 30],
|
||||
['name' => 'Add article', 'link' => 'news&action=new&type=3', 'icon' => 'plus', 'order' => 40],
|
||||
],
|
||||
],
|
||||
['name' => 'Changelogs', 'icon' => 'newspaper', 'order' => 30, 'link' =>
|
||||
[
|
||||
['name' => 'View', 'link' => 'changelog', 'order' => 10],
|
||||
['name' => 'Add', 'link' => 'changelog&action=new', 'order' => 20],
|
||||
['name' => 'View', 'link' => 'changelog', 'icon' => 'list', 'order' => 10],
|
||||
['name' => 'Add', 'link' => 'changelog&action=new', 'icon' => 'plus', 'order' => 20],
|
||||
],
|
||||
],
|
||||
['name' => 'Mailer', 'icon' => 'envelope', 'order' => 40, 'link' => 'mailer', 'disabled' => !config('mail_enabled')],
|
||||
['name' => 'Pages', 'icon' => 'book', 'order' => 50, 'link' =>
|
||||
[
|
||||
['name' => 'View', 'link' => 'pages', 'order' => 10],
|
||||
['name' => 'Add', 'link' => 'pages&action=new', 'order' => 20],
|
||||
['name' => 'View', 'link' => 'pages', 'icon' => 'list', 'order' => 10],
|
||||
['name' => 'Add', 'link' => 'pages&action=new', 'icon' => 'plus', 'order' => 20],
|
||||
],
|
||||
],
|
||||
['name' => 'Menus', 'icon' => 'list', 'order' => 60, 'link' => 'menus'],
|
||||
@@ -28,23 +28,23 @@ $menus = [
|
||||
['name' => 'Server Data', 'icon' => 'gavel', 'order' => 80, 'link' => 'data'],
|
||||
['name' => 'Editor', 'icon' => 'edit', 'order' => 90, 'link' =>
|
||||
[
|
||||
['name' => 'Accounts', 'link' => 'accounts', 'order' => 10],
|
||||
['name' => 'Players', 'link' => 'players', 'order' => 20],
|
||||
['name' => 'Accounts', 'link' => 'accounts', 'icon' => 'users', 'order' => 10],
|
||||
['name' => 'Players', 'link' => 'players', 'icon' => 'user-astronaut', 'order' => 20],
|
||||
],
|
||||
],
|
||||
['name' => 'Tools', 'icon' => 'tools', 'order' => 100, 'link' =>
|
||||
[
|
||||
['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' => 'Mass Account Actions', 'link' => 'mass_account', 'icon' => 'globe', 'order' => 10],
|
||||
['name' => 'Mass Teleport Actions', 'link' => 'mass_teleport', 'icon' => 'globe', 'order' => 20],
|
||||
['name' => 'Notepad', 'link' => 'notepad', 'icon' => 'marker', 'order' => 30],
|
||||
['name' => 'phpinfo', 'link' => 'phpinfo', 'icon' => 'server', 'order' => 40],
|
||||
],
|
||||
],
|
||||
['name' => 'Logs', 'icon' => 'bug', 'order' => 110, 'link' =>
|
||||
[
|
||||
['name' => 'Logs', 'link' => 'logs', 'order' => 10],
|
||||
['name' => 'Reports', 'link' => 'reports', 'order' => 20],
|
||||
['name' => 'Visitors', 'icon' => 'user', 'link' => 'visitors', 'order' => 30],
|
||||
['name' => 'Logs', 'link' => 'logs', 'icon' => 'book', 'order' => 10],
|
||||
['name' => 'Reports', 'link' => 'reports', 'icon' => 'book', 'order' => 20],
|
||||
['name' => 'Visitors', 'link' => 'visitors', 'icon' => 'user', 'order' => 30],
|
||||
],
|
||||
],
|
||||
];
|
||||
|
@@ -79,12 +79,12 @@
|
||||
$nav_construct .= ' active';
|
||||
$used_menu = true;
|
||||
}
|
||||
$nav_construct .= '"><i class="far fa-' . (isset($sub_menu['icon']) ? $sub_menu['icon'] : 'circle') . ' nav-icon"></i><p>' . $sub_menu['name'] . '</p></a></li>';
|
||||
$nav_construct .= '"><i class="fas fa-' . ($sub_menu['icon'] ?? 'circle') . ' nav-icon"></i><p>' . $sub_menu['name'] . '</p></a></li>';
|
||||
}
|
||||
?>
|
||||
<li class="nav-item has-treeview<?php echo($used_menu ? ' menu-open' : '') ?>">
|
||||
<a href="#" class="nav-link<?php echo($used_menu ? ' active' : '') ?>">
|
||||
<i class="nav-icon fas fa-<?php echo(isset($menu['icon']) ? $menu['icon'] : 'link') ?>"></i>
|
||||
<i class="nav-icon fas fa-<?php echo($menu['icon'] ?? 'link') ?>"></i>
|
||||
<p><?php echo $menu['name'] ?></p><i class="right fas fa-angle-left"></i>
|
||||
</a>
|
||||
<ul class="nav nav-treeview">
|
||||
@@ -159,6 +159,9 @@
|
||||
|
||||
<p><h5><a href="http://my-aac.org/" target="_blank"><i class="fas fa-shoe-prints"></i> MyAAC Official</a></h5>
|
||||
<small>Goto MyAAC Official Website</small></p>
|
||||
|
||||
<p><h5><a href="?p=open_source"><i class="fas fa-wrench"></i> Open Source</a></h5>
|
||||
<small>View Open Source Software MyAAC is using</small></p>
|
||||
</div>
|
||||
</aside>
|
||||
|
||||
|
Reference in New Issue
Block a user