mirror of
https://github.com/slawkens/myaac.git
synced 2025-09-14 20:43:34 +02:00
Compare commits
83 Commits
v1.7
...
feature/re
Author | SHA1 | Date | |
---|---|---|---|
![]() |
233bf001ce | ||
![]() |
d2f1f41576 | ||
![]() |
2f9ae38c19 | ||
![]() |
a6032093b2 | ||
![]() |
b1b536ce68 | ||
![]() |
25695a039d | ||
![]() |
e27d974c46 | ||
![]() |
4eab805d26 | ||
![]() |
3f24f961b1 | ||
![]() |
0b86459940 | ||
![]() |
7a9b11434e | ||
![]() |
9725a3c2bd | ||
![]() |
46adeefce3 | ||
![]() |
e4b66f34ac | ||
![]() |
2465bb6f9a | ||
![]() |
42671c5c19 | ||
![]() |
fec773ba4b | ||
![]() |
1b9f68c9ec | ||
![]() |
7a08f91d3f | ||
![]() |
4b948e9510 | ||
![]() |
17ca93d020 | ||
![]() |
bcc4b48eb0 | ||
![]() |
f8c4332e03 | ||
![]() |
235e0f394d | ||
![]() |
3451715e96 | ||
![]() |
d85681880e | ||
![]() |
4701461b1f | ||
![]() |
482f4067b2 | ||
![]() |
2f26748112 | ||
![]() |
98073a110a | ||
![]() |
11dae90fa9 | ||
![]() |
20f99903ae | ||
![]() |
b6e1620f14 | ||
![]() |
9cb7792623 | ||
![]() |
0db908be18 | ||
![]() |
785d38312b | ||
![]() |
e1c04ed28e | ||
![]() |
c836308601 | ||
![]() |
0efe47ce71 | ||
![]() |
3b47e9df2f | ||
![]() |
43415cf35d | ||
![]() |
cf7fd20452 | ||
![]() |
080cc2781f | ||
![]() |
20d69a641c | ||
![]() |
2d4be327b2 | ||
![]() |
bb097b69ce | ||
![]() |
6e5a4ff8c7 | ||
![]() |
caf326a658 | ||
![]() |
bccf8e056d | ||
![]() |
7d27e5a0ba | ||
![]() |
9b6f410459 | ||
![]() |
c06b0017f1 | ||
![]() |
d8132d4d76 | ||
![]() |
1566deb84a | ||
![]() |
536b29be95 | ||
![]() |
5271633bdb | ||
![]() |
ce5b1cf2a6 | ||
![]() |
83f84172e0 | ||
![]() |
34fead906e | ||
![]() |
ec11c14024 | ||
![]() |
2fe9924437 | ||
![]() |
f0f2e3785f | ||
![]() |
36ca755243 | ||
![]() |
f17269e44c | ||
![]() |
dcb96f4ce1 | ||
![]() |
a89f9a8484 | ||
![]() |
45d6047031 | ||
![]() |
c92148d467 | ||
![]() |
b4b62442fe | ||
![]() |
047742848b | ||
![]() |
fe8281594e | ||
![]() |
0bff910a05 | ||
![]() |
6d43fc181f | ||
![]() |
13d33822b5 | ||
![]() |
f78ebad136 | ||
![]() |
d90fa323d7 | ||
![]() |
181131f7f3 | ||
![]() |
0da524fefe | ||
![]() |
6cf4b9dac5 | ||
![]() |
5cfa3a697f | ||
![]() |
67f54eacbc | ||
![]() |
cde8891b9b | ||
![]() |
50a8b8169f |
@@ -1,5 +1,66 @@
|
|||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
|
## [1.8.1 - 05.09.2025]
|
||||||
|
|
||||||
|
### Added
|
||||||
|
* New Commands: plugin:enable/disable/uninstall {plugin-name} (https://github.com/slawkens/myaac/commit/7a08f91d3fc0897c1ff76089ef3c649a2c6d2003, https://github.com/slawkens/myaac/commit/fec773ba4b740f35c0a3ef92ca8444a4c7d02082)
|
||||||
|
* Gifts: Added Transferable Coins to the store dropdown menu in the admin area (by @andreoam, #321) (https://github.com/slawkens/myaac/commit/42671c5c199dd9e91c774d8c9d30da9e12f1b695)
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
* Commands: Allow settings to be changed/reset by plugin name (https://github.com/slawkens/myaac/commit/f8c4332e03e838d285ea0afb4b72b7c23e324d45, https://github.com/slawkens/myaac/commit/4b948e9510f7ba69d00f84d7fdaea8b3bf05b630)
|
||||||
|
* Templates: Menus should be saved for each template separately (https://github.com/slawkens/myaac/commit/482f4067b2a2e7513d9ba214274a361ffaf123d8)
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
* Online: Fix skulls display (#320) (https://github.com/slawkens/myaac/commit/98073a110ae13f9592ec9d2c4d1d1aace87587a9)
|
||||||
|
* Online: Fix if there is no world_id in the server_record table (https://github.com/slawkens/myaac/commit/b6e1620f14c20eecfc9001a7d86dfb67942985c6) (Reported by @gesior in #318)
|
||||||
|
* tibiacom: some fixes to menus (https://github.com/slawkens/myaac/commit/20f99903ae80c74ad66c1cf5a5ea8d0b0fc2fd70, https://github.com/slawkens/myaac/commit/11dae90fa94fbbf47447017db5e5847c33d6aadf)
|
||||||
|
* Guilds: Fix for some servers that don't have guild_invites table (https://github.com/slawkens/myaac/commit/9725a3c2bdb7003f5cb48febb77604c31a9b805b)
|
||||||
|
|
||||||
|
## [1.8 - 02.08.2025]
|
||||||
|
|
||||||
|
### Added
|
||||||
|
* Templates - Kathrine: Possibility to add custom menu categories (https://github.com/slawkens/myaac/commit/ec11c1402417c25980582467546d1c1e9bb8267f)
|
||||||
|
* Admin Panel - Accounts Editor: Add Coins Transferable (https://github.com/slawkens/myaac/commit/45d6047031c9c3a0e7e512dc5d15c75629aec5a2, https://github.com/slawkens/myaac/commit/bb097b69ce106500a49686d6f4fe604348eaa310)
|
||||||
|
* Highscores:
|
||||||
|
* Revamped: (https://github.com/slawkens/myaac/commit/d8132d4d76e03d5aa0c042be426320655a601392)
|
||||||
|
* Show real rank, if 2 or more players have the same skill, show them with same rank
|
||||||
|
* New setting: highscores_online_status
|
||||||
|
* Additional fields passed to twig: updatedAt, totalResults, page, baseLink
|
||||||
|
* Add new Setting: Display Skills Box (https://github.com/slawkens/myaac/commit/36ca755243ef1c83f6ac87465b426d4d8d3b0bb9)
|
||||||
|
* Functions: Add getExperienceForLevel (level) (https://github.com/slawkens/myaac/commit/1566deb84a082176b8c683fda205d828bc38fbcc)
|
||||||
|
* Commands - cache:clear : Add warning about APCu clear in CLI (https://github.com/slawkens/myaac/commit/83f84172e02e8ea2ccb6dca29bc033e44c35aebc)
|
||||||
|
* Models - PlayerOnline: Add missing $fillable into model (https://github.com/slawkens/myaac/commit/43415cf35db1c1307f2684c1728693d65065ffff)
|
||||||
|
* Twig: add cache variable (https://github.com/slawkens/myaac/commit/0efe47ce71c4b364a9e96bc5a55b1655326ae6da)
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
* pages/online: add cache, resulting in 20x performance boost
|
||||||
|
* (for an example server with 2k players) (https://github.com/slawkens/myaac/commit/c8363086015cbb6e8786c398c7b9ac3959a26ec4)
|
||||||
|
* Admin Bar: Move admin bar code into body_start place_holder (https://github.com/slawkens/myaac/commit/f17269e44ce9dd38447bd2e2a8e1bdb065d4161f)
|
||||||
|
* Cache::remember: $ttl = 0 means no cache (https://github.com/slawkens/myaac/commit/3b47e9df2f4051807c5ff87892f7fa3d348f9c55)
|
||||||
|
* Templates: Load config.ini with $process_sections set to true (https://github.com/slawkens/myaac/commit/a89f9a84847630eb75b4890fdcc8b7a7bfa6b8ac)
|
||||||
|
* Twig: Allow for timestamp as integer in the timeago twig function
|
||||||
|
(https://github.com/slawkens/myaac/commit/34fead906ea13b9f09d7a3c41ed88109d34d386c)
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
* Settings: Fixed two exceptions (https://github.com/slawkens/myaac/commit/6e5a4ff8c78ff5373aba091baa66cae029557643, https://github.com/slawkens/myaac/commit/20d69a641c0a933d14889a89da6d32f6a4bc6c7d)
|
||||||
|
* Models\Account + OTS_Account -> isPremium -> ignore config.freePremium (https://github.com/slawkens/myaac/commit/5271633bdbfbbfed0b1d59c403093ce6fc2b7d20)
|
||||||
|
* Admin Panel - Mailer:
|
||||||
|
* Fix send to email link redirecting from accounts page (https://github.com/slawkens/myaac/commit/080cc2781f034c844af658229e495e9a47fd2298)
|
||||||
|
* Option to send only to verified accounts - only if setting('core.account_mail_verify') enabled (https://github.com/slawkens/myaac/commit/cf7fd20452e863980045bb5d6012ec86c6e8e01f)
|
||||||
|
|
||||||
|
### Internal
|
||||||
|
* Rewrite to use constants (account transferable coins) (https://github.com/slawkens/myaac/commit/bccf8e056df985bbe1bab5f7ab5492f714d6b62b)
|
||||||
|
* Refactor to use HAS_ACCOUNT_COINS (https://github.com/slawkens/myaac/commit/caf326a6584a234775ebc6c8000ea02b3fecd160)
|
||||||
|
|
||||||
|
## [1.7.1 - 27.06.2025]
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
* Rename plugin:install:install to plugin:setup, also add alias to previous command (https://github.com/slawkens/myaac/commit/13d33822b59df349199e885a78a3d6beb0863d0b)
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
* Fix commands: setup + cache:clear (https://github.com/slawkens/myaac/commit/0da524fefe93b3028392e9014550eea3324d3a22, https://github.com/slawkens/myaac/commit/fe8281594e989f00280ba1adc734a9198c6b5cc1)
|
||||||
|
* Fix polls link in tibiacom template (https://github.com/slawkens/myaac/commit/d90fa323d7c77d81768df60feeb1c374b1650a0c)
|
||||||
|
|
||||||
## [1.7 - 22.06.2025]
|
## [1.7 - 22.06.2025]
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
|
@@ -26,7 +26,6 @@ if (setting('core.account_country'))
|
|||||||
$nameOrNumberColumn = getAccountIdentityColumn();
|
$nameOrNumberColumn = getAccountIdentityColumn();
|
||||||
|
|
||||||
$hasSecretColumn = $db->hasColumn('accounts', 'secret');
|
$hasSecretColumn = $db->hasColumn('accounts', 'secret');
|
||||||
$hasCoinsColumn = $db->hasColumn('accounts', 'coins');
|
|
||||||
$hasPointsColumn = $db->hasColumn('accounts', 'premium_points');
|
$hasPointsColumn = $db->hasColumn('accounts', 'premium_points');
|
||||||
$hasTypeColumn = $db->hasColumn('accounts', 'type');
|
$hasTypeColumn = $db->hasColumn('accounts', 'type');
|
||||||
$hasGroupColumn = $db->hasColumn('accounts', 'group_id');
|
$hasGroupColumn = $db->hasColumn('accounts', 'group_id');
|
||||||
@@ -136,11 +135,18 @@ else if (isset($_REQUEST['search'])) {
|
|||||||
if (!Validator::email($email))
|
if (!Validator::email($email))
|
||||||
$errors['email'] = Validator::getLastError();
|
$errors['email'] = Validator::getLastError();
|
||||||
|
|
||||||
//tibia coins
|
// tibia coins
|
||||||
if ($hasCoinsColumn) {
|
if (HAS_ACCOUNT_COINS) {
|
||||||
$t_coins = $_POST['t_coins'];
|
$t_coins = $_POST['t_coins'];
|
||||||
verify_number($t_coins, 'Tibia coins', 12);
|
verify_number($t_coins, 'Tibia coins', 12);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// transferable tibia coins
|
||||||
|
if (HAS_ACCOUNT_COINS_TRANSFERABLE || HAS_ACCOUNT_TRANSFERABLE_COINS) {
|
||||||
|
$t_coins_transferable = $_POST['t_coins_transferable'];
|
||||||
|
verify_number($t_coins_transferable, 'Transferable Tibia coins', 12);
|
||||||
|
}
|
||||||
|
|
||||||
// prem days
|
// prem days
|
||||||
$p_days = (int)$_POST['p_days'];
|
$p_days = (int)$_POST['p_days'];
|
||||||
verify_number($p_days, 'Prem days', 11);
|
verify_number($p_days, 'Prem days', 11);
|
||||||
@@ -185,12 +191,18 @@ else if (isset($_REQUEST['search'])) {
|
|||||||
if ($hasSecretColumn) {
|
if ($hasSecretColumn) {
|
||||||
$account->setCustomField('secret', $secret);
|
$account->setCustomField('secret', $secret);
|
||||||
}
|
}
|
||||||
|
|
||||||
$account->setCustomField('key', $key);
|
$account->setCustomField('key', $key);
|
||||||
$account->setEMail($email);
|
$account->setEMail($email);
|
||||||
if ($hasCoinsColumn) {
|
|
||||||
|
if (HAS_ACCOUNT_COINS) {
|
||||||
$account->setCustomField('coins', $t_coins);
|
$account->setCustomField('coins', $t_coins);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (HAS_ACCOUNT_COINS_TRANSFERABLE || HAS_ACCOUNT_TRANSFERABLE_COINS) {
|
||||||
|
$account->setCustomField(ACCOUNT_COINS_TRANSFERABLE_COLUMN, $t_coins_transferable);
|
||||||
|
}
|
||||||
|
|
||||||
$lastDay = 0;
|
$lastDay = 0;
|
||||||
if($p_days != 0 && $p_days != OTS_Account::GRATIS_PREMIUM_DAYS) {
|
if($p_days != 0 && $p_days != OTS_Account::GRATIS_PREMIUM_DAYS) {
|
||||||
$lastDay = time();
|
$lastDay = time();
|
||||||
@@ -223,9 +235,6 @@ else if (isset($_REQUEST['search'])) {
|
|||||||
|
|
||||||
$password = encrypt($password);
|
$password = encrypt($password);
|
||||||
$account->setPassword($password);
|
$account->setPassword($password);
|
||||||
|
|
||||||
if (USE_ACCOUNT_SALT)
|
|
||||||
$account->setCustomField('salt', $salt);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
$account->save();
|
$account->save();
|
||||||
@@ -395,12 +404,18 @@ else if (isset($_REQUEST['search'])) {
|
|||||||
<label for="email">Email:</label><?php echo (setting('core.mail_enabled') ? ' (<a href="' . ADMIN_URL . '?p=mailer&mail_to=' . $account->getEMail() . '">Send Mail</a>)' : ''); ?>
|
<label for="email">Email:</label><?php echo (setting('core.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(); ?>"/>
|
<input type="text" class="form-control" id="email" name="email" autocomplete="off" value="<?php echo $account->getEMail(); ?>"/>
|
||||||
</div>
|
</div>
|
||||||
<?php if ($hasCoinsColumn): ?>
|
<?php if (HAS_ACCOUNT_COINS): ?>
|
||||||
<div class="col-12 col-sm-12 col-lg-6">
|
<div class="col-12 col-sm-12 col-lg-6">
|
||||||
<label for="t_coins">Tibia Coins:</label>
|
<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') ?>"/>
|
<input type="text" class="form-control" id="t_coins" name="t_coins" autocomplete="off" maxlength="11" value="<?php echo $account->getCustomField('coins') ?>"/>
|
||||||
</div>
|
</div>
|
||||||
<?php endif; ?>
|
<?php endif; ?>
|
||||||
|
<?php if (HAS_ACCOUNT_COINS_TRANSFERABLE || HAS_ACCOUNT_TRANSFERABLE_COINS): ?>
|
||||||
|
<div class="col-12 col-sm-12 col-lg-6">
|
||||||
|
<label for="t_coins_transferable">Transferable Tibia Coins:</label>
|
||||||
|
<input type="text" class="form-control" id="t_coins_transferable" name="t_coins_transferable" autocomplete="off" maxlength="11" value="<?php echo $account->getCustomField(ACCOUNT_COINS_TRANSFERABLE_COLUMN) ?>"/>
|
||||||
|
</div>
|
||||||
|
<?php endif; ?>
|
||||||
<div class="col-12 col-sm-12 col-lg-6">
|
<div class="col-12 col-sm-12 col-lg-6">
|
||||||
<label for="p_days">Premium Days:</label>
|
<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(); ?>"/>
|
<input type="text" class="form-control" id="p_days" name="p_days" autocomplete="off" maxlength="11" value="<?php echo $account->getPremDays(); ?>"/>
|
||||||
|
@@ -25,9 +25,10 @@ if (!setting('core.mail_enabled')) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
$mail_to = isset($_POST['mail_to']) ? stripslashes(trim($_POST['mail_to'])) : null;
|
$mail_to = isset($_REQUEST['mail_to']) ? stripslashes(trim($_REQUEST['mail_to'])) : null;
|
||||||
$mail_subject = isset($_POST['mail_subject']) ? stripslashes($_POST['mail_subject']) : null;
|
$mail_subject = isset($_POST['mail_subject']) ? stripslashes($_POST['mail_subject']) : null;
|
||||||
$mail_content = isset($_POST['mail_content']) ? stripslashes($_POST['mail_content']) : null;
|
$mail_content = isset($_POST['mail_content']) ? stripslashes($_POST['mail_content']) : null;
|
||||||
|
$mail_verified_only = $_POST['mail_verified_only'] ?? false;
|
||||||
|
|
||||||
if (isset($_POST['submit'])) {
|
if (isset($_POST['submit'])) {
|
||||||
if (empty($mail_subject)) {
|
if (empty($mail_subject)) {
|
||||||
@@ -58,14 +59,14 @@ if (!empty($mail_content) && !empty($mail_subject) && empty($mail_to)) {
|
|||||||
$success = 0;
|
$success = 0;
|
||||||
$failed = 0;
|
$failed = 0;
|
||||||
|
|
||||||
$add = '';
|
$query = Account::where('email', '!=', '');
|
||||||
if (setting('core.account_mail_verify')) {
|
|
||||||
note('Note: Sending only to users with verified E-Mail.');
|
if ($mail_verified_only) {
|
||||||
$add = ' AND `email_verified` = 1';
|
info('Note: Sending only to users with verified E-Mail.');
|
||||||
|
$query->where('email_verified', 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
$query = Account::where('email', '!=', '')->get(['email']);
|
foreach ($query->get(['email']) as $email) {
|
||||||
foreach ($query as $email) {
|
|
||||||
if (_mail($email->email, $mail_subject, $mail_content)) {
|
if (_mail($email->email, $mail_subject, $mail_content)) {
|
||||||
$success++;
|
$success++;
|
||||||
}
|
}
|
||||||
@@ -84,5 +85,6 @@ if (!empty($mail_content) && !empty($mail_subject) && empty($mail_to)) {
|
|||||||
$twig->display('admin.mailer.html.twig', [
|
$twig->display('admin.mailer.html.twig', [
|
||||||
'mail_to' => $mail_to,
|
'mail_to' => $mail_to,
|
||||||
'mail_subject' => $mail_subject,
|
'mail_subject' => $mail_subject,
|
||||||
'mail_content' => $mail_content
|
'mail_content' => $mail_content,
|
||||||
|
'mail_verified_only' => $mail_verified_only,
|
||||||
]);
|
]);
|
||||||
|
@@ -18,7 +18,6 @@ $title = 'Mass Account Actions';
|
|||||||
|
|
||||||
csrfProtect();
|
csrfProtect();
|
||||||
|
|
||||||
$hasCoinsColumn = $db->hasColumn('accounts', 'coins');
|
|
||||||
$hasPointsColumn = $db->hasColumn('accounts', 'premium_points');
|
$hasPointsColumn = $db->hasColumn('accounts', 'premium_points');
|
||||||
$freePremium = $config['lua']['freePremium'];
|
$freePremium = $config['lua']['freePremium'];
|
||||||
|
|
||||||
@@ -40,9 +39,7 @@ function admin_give_points($points)
|
|||||||
|
|
||||||
function admin_give_coins($coins)
|
function admin_give_coins($coins)
|
||||||
{
|
{
|
||||||
global $hasCoinsColumn;
|
if (!HAS_ACCOUNT_COINS) {
|
||||||
|
|
||||||
if (!$hasCoinsColumn) {
|
|
||||||
displayMessage('Coins not supported.');
|
displayMessage('Coins not supported.');
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -167,19 +164,19 @@ if (!empty(ACTION) && isRequestMethod('post')) {
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
$twig->display('admin.tools.account.html.twig', array(
|
$twig->display('admin.tools.account.html.twig', array(
|
||||||
'hasCoinsColumn' => $hasCoinsColumn,
|
'hasCoinsColumn' => HAS_ACCOUNT_COINS,
|
||||||
'hasPointsColumn' => $hasPointsColumn,
|
'hasPointsColumn' => $hasPointsColumn,
|
||||||
'freePremium' => $freePremium,
|
'freePremium' => $freePremium,
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
function displayMessage($message, $success = false) {
|
function displayMessage($message, $success = false) {
|
||||||
global $twig, $hasCoinsColumn, $hasPointsColumn, $freePremium;
|
global $twig, $hasPointsColumn, $freePremium;
|
||||||
|
|
||||||
$success ? success($message): error($message);
|
$success ? success($message): error($message);
|
||||||
|
|
||||||
$twig->display('admin.tools.account.html.twig', array(
|
$twig->display('admin.tools.account.html.twig', array(
|
||||||
'hasCoinsColumn' => $hasCoinsColumn,
|
'hasCoinsColumn' => HAS_ACCOUNT_COINS,
|
||||||
'hasPointsColumn' => $hasPointsColumn,
|
'hasPointsColumn' => $hasPointsColumn,
|
||||||
'freePremium' => $freePremium,
|
'freePremium' => $freePremium,
|
||||||
));
|
));
|
||||||
|
@@ -6,7 +6,7 @@ defined('MYAAC') or die('Direct access not allowed!');
|
|||||||
|
|
||||||
$coins = 0;
|
$coins = 0;
|
||||||
|
|
||||||
if ($db->hasColumn('accounts', 'coins')) {
|
if (HAS_ACCOUNT_COINS) {
|
||||||
$whatToGet = ['id', 'coins'];
|
$whatToGet = ['id', 'coins'];
|
||||||
if (USE_ACCOUNT_NAME) {
|
if (USE_ACCOUNT_NAME) {
|
||||||
$whatToGet[] = 'name';
|
$whatToGet[] = 'name';
|
||||||
|
@@ -26,7 +26,7 @@
|
|||||||
if (version_compare(phpversion(), '8.1', '<')) die('PHP version 8.1 or higher is required.');
|
if (version_compare(phpversion(), '8.1', '<')) die('PHP version 8.1 or higher is required.');
|
||||||
|
|
||||||
const MYAAC = true;
|
const MYAAC = true;
|
||||||
const MYAAC_VERSION = '1.7';
|
const MYAAC_VERSION = '1.8.2-dev';
|
||||||
const DATABASE_VERSION = 45;
|
const DATABASE_VERSION = 45;
|
||||||
const TABLE_PREFIX = 'myaac_';
|
const TABLE_PREFIX = 'myaac_';
|
||||||
define('START_TIME', microtime(true));
|
define('START_TIME', microtime(true));
|
||||||
|
@@ -162,15 +162,6 @@ if(setting('core.anonymous_usage_statistics')) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @var OTS_Account $account_logged
|
|
||||||
*/
|
|
||||||
if ($logged && admin()) {
|
|
||||||
$content .= $twig->render('admin-bar.html.twig', [
|
|
||||||
'username' => USE_ACCOUNT_NAME ? $account_logged->getName() : $account_logged->getId()
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
|
|
||||||
$title_full = (isset($title) ? $title . ' - ' : '') . $config['lua']['serverName'];
|
$title_full = (isset($title) ? $title . ' - ' : '') . $config['lua']['serverName'];
|
||||||
require $template_path . '/' . $template_index;
|
require $template_path . '/' . $template_index;
|
||||||
|
|
||||||
|
@@ -42,45 +42,44 @@ if(!$error) {
|
|||||||
$configToSave['cache_prefix'] = 'myaac_' . generateRandomString(8, true, false, true);
|
$configToSave['cache_prefix'] = 'myaac_' . generateRandomString(8, true, false, true);
|
||||||
$configToSave['database_auto_migrate'] = true;
|
$configToSave['database_auto_migrate'] = true;
|
||||||
|
|
||||||
if(!$error) {
|
$content = '';
|
||||||
$content = '';
|
$saved = Settings::saveConfig($configToSave, BASE . 'config.local.php', $content);
|
||||||
$saved = Settings::saveConfig($configToSave, BASE . 'config.local.php', $content);
|
if ($saved || file_exists(BASE . 'config.local.php')) {
|
||||||
if ($saved) {
|
success($locale['step_database_config_saved']);
|
||||||
success($locale['step_database_config_saved']);
|
$_SESSION['saved'] = true;
|
||||||
$_SESSION['saved'] = true;
|
|
||||||
|
|
||||||
require BASE . 'config.local.php';
|
require BASE . 'config.local.php';
|
||||||
require BASE . 'install/includes/config.php';
|
require BASE . 'install/includes/config.php';
|
||||||
|
|
||||||
if (!$error) {
|
if (!$error) {
|
||||||
require BASE . 'install/includes/database.php';
|
require BASE . 'install/includes/database.php';
|
||||||
|
|
||||||
if (isset($database_error)) { // we failed connect to the database
|
if (isset($database_error)) { // we failed connect to the database
|
||||||
error($database_error);
|
error($database_error);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (!$db->hasTable('accounts')) {
|
||||||
|
$tmp = str_replace('$TABLE$', 'accounts', $locale['step_database_error_table']);
|
||||||
|
error($tmp);
|
||||||
|
$error = true;
|
||||||
}
|
}
|
||||||
else {
|
|
||||||
if (!$db->hasTable('accounts')) {
|
|
||||||
$tmp = str_replace('$TABLE$', 'accounts', $locale['step_database_error_table']);
|
|
||||||
error($tmp);
|
|
||||||
$error = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!$error) {
|
if (!$error) {
|
||||||
$twig->display('install.installer.html.twig', array(
|
$twig->display('install.installer.html.twig', array(
|
||||||
'url' => 'tools/5-database.php',
|
'url' => 'tools/5-database.php',
|
||||||
'message' => $locale['loading_spinner']
|
'message' => $locale['loading_spinner']
|
||||||
));
|
));
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
$_SESSION['config_content'] = $content;
|
|
||||||
unset($_SESSION['saved']);
|
|
||||||
|
|
||||||
$locale['step_database_error_file'] = str_replace('$FILE$', '<b>' . BASE . 'config.php</b>', $locale['step_database_error_file']);
|
|
||||||
error($locale['step_database_error_file'] . '<br/>
|
|
||||||
<textarea cols="70" rows="10">' . $content . '</textarea>');
|
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
$error = true;
|
||||||
|
$_SESSION['config_content'] = $content;
|
||||||
|
unset($_SESSION['saved']);
|
||||||
|
|
||||||
|
$locale['step_database_error_file'] = str_replace('$FILE$', '<b>' . BASE . 'config.local.php</b>', $locale['step_database_error_file']);
|
||||||
|
error($locale['step_database_error_file'] . '<br/>
|
||||||
|
<textarea cols="70" rows="10">' . $content . '</textarea>');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
?>
|
?>
|
||||||
|
13
package-lock.json
generated
13
package-lock.json
generated
@@ -976,15 +976,16 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/form-data": {
|
"node_modules/form-data": {
|
||||||
"version": "4.0.2",
|
"version": "4.0.4",
|
||||||
"resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz",
|
"resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz",
|
||||||
"integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==",
|
"integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"asynckit": "^0.4.0",
|
"asynckit": "^0.4.0",
|
||||||
"combined-stream": "^1.0.8",
|
"combined-stream": "^1.0.8",
|
||||||
"es-set-tostringtag": "^2.1.0",
|
"es-set-tostringtag": "^2.1.0",
|
||||||
|
"hasown": "^2.0.2",
|
||||||
"mime-types": "^2.1.12"
|
"mime-types": "^2.1.12"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
@@ -2084,9 +2085,9 @@
|
|||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
"node_modules/tmp": {
|
"node_modules/tmp": {
|
||||||
"version": "0.2.3",
|
"version": "0.2.4",
|
||||||
"resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz",
|
"resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.4.tgz",
|
||||||
"integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==",
|
"integrity": "sha512-UdiSoX6ypifLmrfQ/XfiawN6hkjSBpCjhKxxZcWlUUmoXLaCKQU0bx4HF/tdDK2uzRuchf1txGvrWBzYREssoQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"engines": {
|
"engines": {
|
||||||
|
@@ -28,10 +28,9 @@ parameters:
|
|||||||
- '#Variable \$guild might not be defined#'
|
- '#Variable \$guild might not be defined#'
|
||||||
- '#Variable \$[a-zA-Z0-9\\_]+ might not be defined#'
|
- '#Variable \$[a-zA-Z0-9\\_]+ might not be defined#'
|
||||||
# Eloquent models
|
# Eloquent models
|
||||||
|
- '#Call to an undefined method [a-zA-Z0-9\\_]+::[a-zA-Z0-9\\_]+\(\)#'
|
||||||
- '#Call to an undefined static method [a-zA-Z0-9\\_]+::[a-zA-Z0-9\\_]+\(\)#'
|
- '#Call to an undefined static method [a-zA-Z0-9\\_]+::[a-zA-Z0-9\\_]+\(\)#'
|
||||||
- '#Call to an undefined method object::toArray\(\)#'
|
|
||||||
# system/pages/highscores.php
|
# system/pages/highscores.php
|
||||||
- '#Call to an undefined method Illuminate\\Database\\Query\\Builder::withOnlineStatus\(\)#'
|
|
||||||
- '#Access to an undefined property Illuminate\\Database\\Eloquent\\Model::\$online_status#'
|
- '#Access to an undefined property Illuminate\\Database\\Eloquent\\Model::\$online_status#'
|
||||||
- '#Access to an undefined property Illuminate\\Database\\Eloquent\\Model::\$vocation_name#'
|
- '#Access to an undefined property Illuminate\\Database\\Eloquent\\Model::\$vocation_name#'
|
||||||
-
|
-
|
||||||
|
@@ -512,6 +512,13 @@ function template_place_holder($type): string
|
|||||||
}
|
}
|
||||||
elseif ($type === 'body_start') {
|
elseif ($type === 'body_start') {
|
||||||
$ret .= $twig->render('browsehappy.html.twig');
|
$ret .= $twig->render('browsehappy.html.twig');
|
||||||
|
|
||||||
|
if (admin()) {
|
||||||
|
global $account_logged;
|
||||||
|
$ret .= $twig->render('admin-bar.html.twig', [
|
||||||
|
'username' => USE_ACCOUNT_NAME ? $account_logged->getName() : $account_logged->getId()
|
||||||
|
]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
elseif($type === 'body_end') {
|
elseif($type === 'body_end') {
|
||||||
$ret .= template_ga_code();
|
$ret .= template_ga_code();
|
||||||
@@ -767,6 +774,10 @@ function formatExperience($exp, $color = true)
|
|||||||
return $ret;
|
return $ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function getExperienceForLevel($level): float|int {
|
||||||
|
return ( 50 / 3 ) * pow( $level, 3 ) - ( 100 * pow( $level, 2 ) ) + ( ( 850 / 3 ) * $level ) - 200;
|
||||||
|
}
|
||||||
|
|
||||||
function get_locales()
|
function get_locales()
|
||||||
{
|
{
|
||||||
$ret = array();
|
$ret = array();
|
||||||
@@ -982,11 +993,12 @@ function load_config_lua($filename)
|
|||||||
foreach($lines as $ln => $line)
|
foreach($lines as $ln => $line)
|
||||||
{
|
{
|
||||||
$line = trim($line);
|
$line = trim($line);
|
||||||
if(@$line[0] === '{' || @$line[0] === '}') {
|
if(isset($line[0]) && ($line[0] === '{' || $line[0] === '}')) {
|
||||||
// arrays are not supported yet
|
// arrays are not supported yet
|
||||||
// just ignore the error
|
// just ignore the error
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
$tmp_exp = explode('=', $line, 2);
|
$tmp_exp = explode('=', $line, 2);
|
||||||
if(str_contains($line, 'dofile')) {
|
if(str_contains($line, 'dofile')) {
|
||||||
$delimiter = '"';
|
$delimiter = '"';
|
||||||
@@ -1216,7 +1228,8 @@ function setting($key)
|
|||||||
return $settings[$key[0]] = $key[1];
|
return $settings[$key[0]] = $key[1];
|
||||||
}
|
}
|
||||||
|
|
||||||
return $settings[$key]['value'];
|
$ret = $settings[$key];
|
||||||
|
return isset($ret) ? $ret['value'] : null;
|
||||||
}
|
}
|
||||||
|
|
||||||
function clearCache()
|
function clearCache()
|
||||||
@@ -1274,9 +1287,6 @@ function clearCache()
|
|||||||
deleteDirectory(CACHE . 'plugins', ['index.html'], true);
|
deleteDirectory(CACHE . 'plugins', ['index.html'], true);
|
||||||
deleteDirectory(CACHE, ['signatures', 'twig', 'plugins', 'index.html', 'persistent'], true);
|
deleteDirectory(CACHE, ['signatures', 'twig', 'plugins', 'index.html', 'persistent'], true);
|
||||||
|
|
||||||
// routes cache
|
|
||||||
clearRouteCache();
|
|
||||||
|
|
||||||
global $hooks;
|
global $hooks;
|
||||||
$hooks->trigger(HOOK_CACHE_CLEAR, ['cache' => Cache::getInstance()]);
|
$hooks->trigger(HOOK_CACHE_CLEAR, ['cache' => Cache::getInstance()]);
|
||||||
|
|
||||||
|
@@ -144,6 +144,15 @@ $ots = POT::getInstance();
|
|||||||
$eloquentConnection = null;
|
$eloquentConnection = null;
|
||||||
require_once SYSTEM . 'database.php';
|
require_once SYSTEM . 'database.php';
|
||||||
|
|
||||||
|
define('USE_ACCOUNT_NAME', $db->hasColumn('accounts', 'name'));
|
||||||
|
define('USE_ACCOUNT_NUMBER', $db->hasColumn('accounts', 'number'));
|
||||||
|
define('USE_ACCOUNT_SALT', $db->hasColumn('accounts', 'salt'));
|
||||||
|
|
||||||
|
define('HAS_ACCOUNT_COINS', $db->hasColumn('accounts', 'coins'));
|
||||||
|
define('HAS_ACCOUNT_COINS_TRANSFERABLE', $db->hasColumn('accounts', 'coins_transferable'));
|
||||||
|
define('HAS_ACCOUNT_TRANSFERABLE_COINS', $db->hasColumn('accounts', 'transferable_coins'));
|
||||||
|
const ACCOUNT_COINS_TRANSFERABLE_COLUMN = (HAS_ACCOUNT_COINS_TRANSFERABLE ? 'coins_transferable' : 'transferable_coins');
|
||||||
|
|
||||||
$twig->addGlobal('logged', false);
|
$twig->addGlobal('logged', false);
|
||||||
$twig->addGlobal('account_logged', new \OTS_Account());
|
$twig->addGlobal('account_logged', new \OTS_Account());
|
||||||
|
|
||||||
@@ -188,10 +197,6 @@ if($settingsItemImagesURL[strlen($settingsItemImagesURL) - 1] !== '/') {
|
|||||||
setting(['core.item_images_url', $settingsItemImagesURL . '/']);
|
setting(['core.item_images_url', $settingsItemImagesURL . '/']);
|
||||||
}
|
}
|
||||||
|
|
||||||
define('USE_ACCOUNT_NAME', $db->hasColumn('accounts', 'name'));
|
|
||||||
define('USE_ACCOUNT_NUMBER', $db->hasColumn('accounts', 'number'));
|
|
||||||
define('USE_ACCOUNT_SALT', $db->hasColumn('accounts', 'salt'));
|
|
||||||
|
|
||||||
$towns = Cache::remember('towns', 10 * 60, function () use ($db) {
|
$towns = Cache::remember('towns', 10 * 60, function () use ($db) {
|
||||||
if ($db->hasTable('towns') && Town::count() > 0) {
|
if ($db->hasTable('towns') && Town::count() > 0) {
|
||||||
return Town::orderBy('id', 'ASC')->pluck('name', 'id')->toArray();
|
return Town::orderBy('id', 'ASC')->pluck('name', 'id')->toArray();
|
||||||
|
@@ -473,12 +473,9 @@ class OTS_Account extends OTS_Row_DAO implements IteratorAggregate, Countable
|
|||||||
|
|
||||||
public function isPremium()
|
public function isPremium()
|
||||||
{
|
{
|
||||||
global $config;
|
if(isset($this->data['premium_ends_at'])) {
|
||||||
if(isset($config['lua']['freePremium']) && getBoolean($config['lua']['freePremium'])) return true;
|
return $this->data['premium_ends_at'] > time();
|
||||||
|
}
|
||||||
if(isset($this->data['premium_ends_at'])) {
|
|
||||||
return $this->data['premium_ends_at'] > time();
|
|
||||||
}
|
|
||||||
|
|
||||||
if(isset($this->data['premend'])) {
|
if(isset($this->data['premend'])) {
|
||||||
return $this->data['premend'] > time();
|
return $this->data['premend'] > time();
|
||||||
|
@@ -8,7 +8,7 @@
|
|||||||
* @link https://my-aac.org
|
* @link https://my-aac.org
|
||||||
*/
|
*/
|
||||||
defined('MYAAC') or die('Direct access not allowed!');
|
defined('MYAAC') or die('Direct access not allowed!');
|
||||||
$title = '404 Not Found';
|
$title = 'Not Found';
|
||||||
|
|
||||||
header('HTTP/1.0 404 Not Found');
|
header('HTTP/1.0 404 Not Found');
|
||||||
?>
|
?>
|
||||||
|
@@ -8,7 +8,7 @@
|
|||||||
* @link https://my-aac.org
|
* @link https://my-aac.org
|
||||||
*/
|
*/
|
||||||
defined('MYAAC') or die('Direct access not allowed!');
|
defined('MYAAC') or die('Direct access not allowed!');
|
||||||
$title = '405 Method Not Allowed';
|
$title = 'Method Not Allowed';
|
||||||
|
|
||||||
header('HTTP/1.0 405 Method Not Allowed');
|
header('HTTP/1.0 405 Method Not Allowed');
|
||||||
?>
|
?>
|
||||||
|
@@ -227,10 +227,15 @@ if($save)
|
|||||||
}
|
}
|
||||||
|
|
||||||
$accountDefaultCoins = setting('core.account_coins');
|
$accountDefaultCoins = setting('core.account_coins');
|
||||||
if($db->hasColumn('accounts', 'coins') && $accountDefaultCoins > 0) {
|
if(HAS_ACCOUNT_COINS && $accountDefaultCoins > 0) {
|
||||||
$new_account->setCustomField('coins', $accountDefaultCoins);
|
$new_account->setCustomField('coins', $accountDefaultCoins);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$accountDefaultCoinsTransferable = setting('core.account_coins_transferable');
|
||||||
|
if((HAS_ACCOUNT_COINS_TRANSFERABLE || HAS_ACCOUNT_TRANSFERABLE_COINS) && $accountDefaultCoinsTransferable > 0) {
|
||||||
|
$new_account->setCustomField(ACCOUNT_COINS_TRANSFERABLE_COLUMN, $accountDefaultCoinsTransferable);
|
||||||
|
}
|
||||||
|
|
||||||
$tmp_account = $email;
|
$tmp_account = $email;
|
||||||
if (!config('account_login_by_email')) {
|
if (!config('account_login_by_email')) {
|
||||||
$tmp_account = (USE_ACCOUNT_NAME ? $account_name : $account_id);
|
$tmp_account = (USE_ACCOUNT_NAME ? $account_name : $account_id);
|
||||||
|
@@ -9,540 +9,11 @@
|
|||||||
* @link https://my-aac.org
|
* @link https://my-aac.org
|
||||||
*/
|
*/
|
||||||
defined('MYAAC') or die('Direct access not allowed!');
|
defined('MYAAC') or die('Direct access not allowed!');
|
||||||
$title = 'Lost Account Interface';
|
$title = 'Lost Account';
|
||||||
|
|
||||||
if(!setting('core.mail_enabled'))
|
if(!setting('core.mail_enabled')) {
|
||||||
{
|
echo "<b>Account maker is not configured to send e-mails, you can't use Lost Account Interface. Contact with admin to get help.</b>";
|
||||||
echo '<b>Account maker is not configured to send e-mails, you can\'t use Lost Account Interface. Contact with admin to get help.</b>';
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
$action_type = isset($_REQUEST['action_type']) ? $_REQUEST['action_type'] : '';
|
$twig->display('account/lost/form.html.twig');
|
||||||
if($action == '')
|
|
||||||
{
|
|
||||||
$twig->display('account.lost.form.html.twig');
|
|
||||||
}
|
|
||||||
else if($action == 'step1' && $action_type == '') {
|
|
||||||
$twig->display('account.lost.noaction.html.twig');
|
|
||||||
}
|
|
||||||
elseif($action == 'step1' && $action_type == 'email')
|
|
||||||
{
|
|
||||||
$nick = stripslashes($_REQUEST['nick']);
|
|
||||||
if(Validator::characterName($nick))
|
|
||||||
{
|
|
||||||
$player = new OTS_Player();
|
|
||||||
$account = new OTS_Account();
|
|
||||||
$player->find($nick);
|
|
||||||
if($player->isLoaded())
|
|
||||||
$account = $player->getAccount();
|
|
||||||
|
|
||||||
if($account->isLoaded())
|
|
||||||
{
|
|
||||||
if($account->getCustomField('email_next') < time())
|
|
||||||
echo 'Please enter e-mail to account with this character.<BR>
|
|
||||||
<form action="' . getLink('account/lost') . '?action=sendcode" method=post>
|
|
||||||
<input type=hidden name="character">
|
|
||||||
<table cellspacing=1 cellpadding=4 border=0 width=100%>
|
|
||||||
<TR><TD BGCOLOR="'.$config['vdarkborder'].'" class="white"><B>Please enter e-mail to account</B></TD></TR>
|
|
||||||
<TR><TD BGCOLOR="'.$config['darkborder'].'">
|
|
||||||
Character: <INPUT TYPE=text NAME="nick" VALUE="'.$nick.'" SIZE="40" readonly="readonly"><BR>
|
|
||||||
E-mail to account:<INPUT TYPE=text NAME="email" VALUE="" SIZE="40"><BR>
|
|
||||||
</TD></TR>
|
|
||||||
</TABLE>
|
|
||||||
<BR>
|
|
||||||
<TABLE CELLSPACING=0 CELLPADDING=0 BORDER=0 WIDTH=100%><TR><TD><div style="text-align:center">
|
|
||||||
' . $twig->render('buttons.submit.html.twig') . '</div>
|
|
||||||
</TD></TR></FORM></TABLE></TABLE>';
|
|
||||||
else
|
|
||||||
{
|
|
||||||
$insec = (int)$account->getCustomField('email_next') - time();
|
|
||||||
$minutesleft = floor($insec / 60);
|
|
||||||
$secondsleft = $insec - ($minutesleft * 60);
|
|
||||||
$timeleft = $minutesleft.' minutes '.$secondsleft.' seconds';
|
|
||||||
echo 'Account of selected character (<b>'.$nick.'</b>) received e-mail in last '.ceil(setting('core.mail_lost_account_interval') / 60).' minutes. You must wait '.$timeleft.' before you can use Lost Account Interface again.';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
echo 'Player or account of player <b>' . $nick . '</b> doesn\'t exist.';
|
|
||||||
}
|
|
||||||
else
|
|
||||||
echo 'Invalid player name format. If you have other characters on account try with other name.';
|
|
||||||
echo '<BR /><TABLE CELLSPACING=0 CELLPADDING=0 BORDER=0 WIDTH=100%><TR><TD><div style="text-align:center">
|
|
||||||
<a href="' . getLink('account/lost') . '" border="0"><IMG SRC="'.$template_path.'/images/global/buttons/sbutton_back.gif" NAME="Back" ALT="Back" BORDER=0 WIDTH=120 HEIGHT=18></a></div>
|
|
||||||
</TD></TR></FORM></TABLE></TABLE>';
|
|
||||||
}
|
|
||||||
elseif($action == 'sendcode')
|
|
||||||
{
|
|
||||||
$email = $_REQUEST['email'];
|
|
||||||
$nick = stripslashes($_REQUEST['nick']);
|
|
||||||
if(Validator::characterName($nick))
|
|
||||||
{
|
|
||||||
$player = new OTS_Player();
|
|
||||||
$account = new OTS_Account();
|
|
||||||
$player->find($nick);
|
|
||||||
if($player->isLoaded())
|
|
||||||
$account = $player->getAccount();
|
|
||||||
|
|
||||||
if($account->isLoaded())
|
|
||||||
{
|
|
||||||
if($account->getCustomField('email_next') < time())
|
|
||||||
{
|
|
||||||
if($account->getEMail() == $email)
|
|
||||||
{
|
|
||||||
$newcode = generateRandomString(30, true, false, true);
|
|
||||||
$mailBody = '
|
|
||||||
You asked to reset your ' . $config['lua']['serverName'] . ' password.<br/>
|
|
||||||
<p>Account name: '.$account->getName().'</p>
|
|
||||||
<br />
|
|
||||||
To do so, please click this link:
|
|
||||||
<p><a href="' . getLink('account/lost') . '?action=checkcode&code='.$newcode.'&character='.urlencode($nick).'">' . getLink('account/lost') . '?action=checkcode&code='.$newcode.'&character='.urlencode($nick).'</a></p>
|
|
||||||
<p>or open page: <i>' . getLink('account/lost') . '?action=checkcode</i> and in field "code" write <b>'.$newcode.'</b></p>
|
|
||||||
<br/>
|
|
||||||
<p>If you did not request a password change, you may ignore this message and your password will remain unchanged.';
|
|
||||||
|
|
||||||
$account_mail = $account->getCustomField('email');
|
|
||||||
if(_mail($account_mail, $config['lua']['serverName'].' - Recover your account', $mailBody))
|
|
||||||
{
|
|
||||||
$account->setCustomField('email_code', $newcode);
|
|
||||||
$account->setCustomField('email_next', (time() + setting('core.mail_lost_account_interval')));
|
|
||||||
echo '<br />Details about steps required to recover your account has been sent to <b>' . $account_mail . '</b>. You should receive this email within 15 minutes. Please check your inbox/spam directory.';
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
$account->setCustomField('email_next', (time() + 60));
|
|
||||||
echo '<br /><p class="error">An error occurred while sending email! Try again later or contact with admin. For Admin: More info can be found in system/logs/mailer-error.log</p>';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
echo 'Invalid e-mail to account of character <b>'.$nick.'</b>. Try again.';
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
$insec = (int)$account->getCustomField('email_next') - time();
|
|
||||||
$minutesleft = floor($insec / 60);
|
|
||||||
$secondsleft = $insec - ($minutesleft * 60);
|
|
||||||
$timeleft = $minutesleft.' minutes '.$secondsleft.' seconds';
|
|
||||||
echo 'Account of selected character (<b>'.$nick.'</b>) received e-mail in last '.ceil(setting('core.mail_lost_account_interval') / 60).' minutes. You must wait '.$timeleft.' before you can use Lost Account Interface again.';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
echo 'Player or account of player <b>'.$nick.'</b> doesn\'t exist.';
|
|
||||||
}
|
|
||||||
else
|
|
||||||
echo 'Invalid player name format. If you have other characters on account try with other name.';
|
|
||||||
echo '<BR /><TABLE CELLSPACING=0 CELLPADDING=0 BORDER=0 WIDTH=100%><TR><TD><div style="text-align:center">
|
|
||||||
<a href="' . getLink('account/lost') . '?action=step1&action_type=email&nick='.urlencode($nick).'" border="0"><IMG SRC="'.$template_path.'/images/global/buttons/sbutton_back.gif" NAME="Back" ALT="Back" BORDER=0 WIDTH=120 HEIGHT=18></a></div>
|
|
||||||
</TD></TR></FORM></TABLE></TABLE>';
|
|
||||||
}
|
|
||||||
elseif($action == 'step1' && $action_type == 'reckey')
|
|
||||||
{
|
|
||||||
$nick = stripslashes($_REQUEST['nick']);
|
|
||||||
if(Validator::characterName($nick))
|
|
||||||
{
|
|
||||||
$player = new OTS_Player();
|
|
||||||
$account = new OTS_Account();
|
|
||||||
$player->find($nick);
|
|
||||||
if($player->isLoaded())
|
|
||||||
$account = $player->getAccount();
|
|
||||||
if($account->isLoaded())
|
|
||||||
{
|
|
||||||
$account_key = $account->getCustomField('key');
|
|
||||||
if(!empty($account_key))
|
|
||||||
{
|
|
||||||
echo 'If you enter right recovery key you will see form to set new e-mail and password to account. To this e-mail will be send your new password and account name.<BR>
|
|
||||||
<FORM ACTION="' . getLink('account/lost') . '?action=step2" METHOD=post>
|
|
||||||
<TABLE CELLSPACING=1 CELLPADDING=4 BORDER=0 WIDTH=100%>
|
|
||||||
<TR><TD BGCOLOR="'.$config['vdarkborder'].'" class="white"><B>Please enter your recovery key</B></TD></TR>
|
|
||||||
<TR><TD BGCOLOR="'.$config['darkborder'].'">
|
|
||||||
Character name: <INPUT TYPE=text NAME="nick" VALUE="'.$nick.'" SIZE="40" readonly="readonly"><BR />
|
|
||||||
Recovery key: <INPUT TYPE=text NAME="key" VALUE="" SIZE="40"><BR>
|
|
||||||
</TD></TR>
|
|
||||||
</TABLE>
|
|
||||||
<BR>
|
|
||||||
<TABLE CELLSPACING=0 CELLPADDING=0 BORDER=0 WIDTH=100%><TR><TD><div style="text-align:center">
|
|
||||||
' . $twig->render('buttons.submit.html.twig') . '</div>
|
|
||||||
</TD></TR></FORM></TABLE></TABLE>';
|
|
||||||
}
|
|
||||||
else
|
|
||||||
echo 'Account of this character has no recovery key!';
|
|
||||||
}
|
|
||||||
else
|
|
||||||
echo 'Player or account of player <b>'.$nick.'</b> doesn\'t exist.';
|
|
||||||
}
|
|
||||||
else
|
|
||||||
echo 'Invalid player name format. If you have other characters on account try with other name.';
|
|
||||||
echo '<BR /><TABLE CELLSPACING=0 CELLPADDING=0 BORDER=0 WIDTH=100%><TR><TD><div style="text-align:center">
|
|
||||||
<a href="' . getLink('account/lost') . '" border="0"><IMG SRC="'.$template_path.'/images/global/buttons/sbutton_back.gif" NAME="Back" ALT="Back" BORDER=0 WIDTH=120 HEIGHT=18></a></div>
|
|
||||||
</TD></TR></FORM></TABLE></TABLE>';
|
|
||||||
}
|
|
||||||
elseif($action == 'step2')
|
|
||||||
{
|
|
||||||
$rec_key = trim($_REQUEST['key']);
|
|
||||||
$nick = stripslashes($_REQUEST['nick']);
|
|
||||||
if(Validator::characterName($nick))
|
|
||||||
{
|
|
||||||
$player = new OTS_Player();
|
|
||||||
$account = new OTS_Account();
|
|
||||||
$player->find($nick);
|
|
||||||
if($player->isLoaded())
|
|
||||||
$account = $player->getAccount();
|
|
||||||
if($account->isLoaded())
|
|
||||||
{
|
|
||||||
$account_key = $account->getCustomField('key');
|
|
||||||
if(!empty($account_key))
|
|
||||||
{
|
|
||||||
if($account_key == $rec_key)
|
|
||||||
{
|
|
||||||
echo '<script type="text/javascript">
|
|
||||||
function validate_required(field,alerttxt)
|
|
||||||
{
|
|
||||||
with (field)
|
|
||||||
{
|
|
||||||
if (value==null||value==""||value==" ")
|
|
||||||
{alert(alerttxt);return false;}
|
|
||||||
else {return true}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
function validate_email(field,alerttxt)
|
|
||||||
{
|
|
||||||
with (field)
|
|
||||||
{
|
|
||||||
apos=value.indexOf("@");
|
|
||||||
dotpos=value.lastIndexOf(".");
|
|
||||||
if (apos<1||dotpos-apos<2)
|
|
||||||
{alert(alerttxt);return false;}
|
|
||||||
else {return true;}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
function validate_form(thisform)
|
|
||||||
{
|
|
||||||
with (thisform)
|
|
||||||
{
|
|
||||||
if (validate_required(email,"Please enter your e-mail!")==false)
|
|
||||||
{email.focus();return false;}
|
|
||||||
if (validate_email(email,"Invalid e-mail format!")==false)
|
|
||||||
{email.focus();return false;}
|
|
||||||
if (validate_required(passor,"Please enter password!")==false)
|
|
||||||
{passor.focus();return false;}
|
|
||||||
if (validate_required(passor2,"Please repeat password!")==false)
|
|
||||||
{passor2.focus();return false;}
|
|
||||||
if (passor2.value!=passor.value)
|
|
||||||
{alert(\'Repeated password is not equal to password!\');return false;}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>';
|
|
||||||
echo 'Set new password and e-mail to your account.<BR>
|
|
||||||
<FORM ACTION="' . getLink('account/lost') . '?action=step3" onsubmit="return validate_form(this)" METHOD=post>
|
|
||||||
<INPUT TYPE=hidden NAME="character" VALUE="">
|
|
||||||
<TABLE CELLSPACING=1 CELLPADDING=4 BORDER=0 WIDTH=100%>
|
|
||||||
<TR><TD BGCOLOR="'.$config['vdarkborder'].'" class="white"><B>Please enter new password and e-mail</B></TD></TR>
|
|
||||||
<TR><TD BGCOLOR="'.$config['darkborder'].'">
|
|
||||||
Account of character: <INPUT TYPE=text NAME="nick" VALUE="'.$nick.'" SIZE="40" readonly="readonly"><BR />
|
|
||||||
New password: <INPUT id="passor" TYPE=password NAME="passor" VALUE="" SIZE="40"><BR>
|
|
||||||
Repeat new password: <INPUT id="passor2" TYPE=password NAME="passor" VALUE="" SIZE="40"><BR>
|
|
||||||
New e-mail address: <INPUT id="email" TYPE=text NAME="email" VALUE="" SIZE="40"><BR>
|
|
||||||
<INPUT TYPE=hidden NAME="key" VALUE="'.$rec_key.'">
|
|
||||||
</TD></TR>
|
|
||||||
</TABLE>
|
|
||||||
<BR>
|
|
||||||
<TABLE CELLSPACING=0 CELLPADDING=0 BORDER=0 WIDTH=100%><TR><TD><div style="text-align:center">
|
|
||||||
' . $twig->render('buttons.submit.html.twig') . '</div>
|
|
||||||
</TD></TR></FORM></TABLE></TABLE>';
|
|
||||||
}
|
|
||||||
else
|
|
||||||
echo 'Wrong recovery key!';
|
|
||||||
}
|
|
||||||
else
|
|
||||||
echo 'Account of this character has no recovery key!';
|
|
||||||
}
|
|
||||||
else
|
|
||||||
echo 'Player or account of player <b>'.$nick.'</b> doesn\'t exist.';
|
|
||||||
}
|
|
||||||
else
|
|
||||||
echo 'Invalid player name format. If you have other characters on account try with other name.';
|
|
||||||
echo '<BR /><TABLE CELLSPACING=0 CELLPADDING=0 BORDER=0 WIDTH=100%><TR><TD><div style="text-align:center">
|
|
||||||
<a href="' . getLink('account/lost') . '?action=step1&action_type=reckey&nick='.urlencode($nick).'" border="0"><IMG SRC="'.$template_path.'/images/global/buttons/sbutton_back.gif" NAME="Back" ALT="Back" BORDER=0 WIDTH=120 HEIGHT=18></a></div>
|
|
||||||
</TD></TR></FORM></TABLE></TABLE>';
|
|
||||||
}
|
|
||||||
elseif($action == 'step3')
|
|
||||||
{
|
|
||||||
$rec_key = trim($_REQUEST['key']);
|
|
||||||
$nick = stripslashes($_REQUEST['nick']);
|
|
||||||
$new_pass = trim($_REQUEST['passor']);
|
|
||||||
$new_email = trim($_REQUEST['email']);
|
|
||||||
if(Validator::characterName($nick))
|
|
||||||
{
|
|
||||||
$player = new OTS_Player();
|
|
||||||
$account = new OTS_Account();
|
|
||||||
$player->find($nick);
|
|
||||||
if($player->isLoaded())
|
|
||||||
$account = $player->getAccount();
|
|
||||||
if($account->isLoaded())
|
|
||||||
{
|
|
||||||
$account_key = $account->getCustomField('key');
|
|
||||||
if(!empty($account_key))
|
|
||||||
{
|
|
||||||
if($account_key == $rec_key)
|
|
||||||
{
|
|
||||||
if(Validator::password($new_pass))
|
|
||||||
{
|
|
||||||
if(Validator::email($new_email))
|
|
||||||
{
|
|
||||||
$account->setEMail($new_email);
|
|
||||||
|
|
||||||
$tmp_new_pass = $new_pass;
|
|
||||||
if(USE_ACCOUNT_SALT)
|
|
||||||
{
|
|
||||||
$salt = generateRandomString(10, false, true, true);
|
|
||||||
$tmp_new_pass = $salt . $new_pass;
|
|
||||||
}
|
|
||||||
|
|
||||||
$account->setPassword(encrypt($tmp_new_pass));
|
|
||||||
$account->save();
|
|
||||||
|
|
||||||
if(USE_ACCOUNT_SALT)
|
|
||||||
$account->setCustomField('salt', $salt);
|
|
||||||
|
|
||||||
echo 'Your account name, new password and new e-mail.<BR>
|
|
||||||
<FORM ACTION="' . getLink('account/manage') . '" onsubmit="return validate_form(this)" METHOD=post>
|
|
||||||
<INPUT TYPE=hidden NAME="character" VALUE="">
|
|
||||||
<TABLE CELLSPACING=1 CELLPADDING=4 BORDER=0 WIDTH=100%>
|
|
||||||
<TR><TD BGCOLOR="'.$config['vdarkborder'].'" class="white"><B>Your account name, new password and new e-mail</B></TD></TR>
|
|
||||||
<TR><TD BGCOLOR="'.$config['darkborder'].'">
|
|
||||||
Account name: <b>'.$account->getName().'</b><BR>
|
|
||||||
New password: <b>'.$new_pass.'</b><BR>
|
|
||||||
New e-mail address: <b>'.$new_email.'</b><BR>';
|
|
||||||
if($account->getCustomField('email_next') < time())
|
|
||||||
{
|
|
||||||
$mailBody = '
|
|
||||||
<h3>Your account name and new password!</h3>
|
|
||||||
<p>Changed password and e-mail to your account in Lost Account Interface on server <a href="'.BASE_URL.'"><b>'.$config['lua']['serverName'].'</b></a></p>
|
|
||||||
<p>Account name: <b>'.$account->getName().'</b></p>
|
|
||||||
<p>New password: <b>'.$new_pass.'</b></p>
|
|
||||||
<p>E-mail: <b>'.$new_email.'</b> (this e-mail)</p>
|
|
||||||
<br />
|
|
||||||
<p><u>It\'s automatic e-mail from OTS Lost Account System. Do not reply!</u></p>';
|
|
||||||
|
|
||||||
if(_mail($account->getCustomField('email'), $config['lua']['serverName']." - New password to your account", $mailBody))
|
|
||||||
{
|
|
||||||
echo '<br /><small>Sent e-mail with your account name and password to new e-mail. You should receive this e-mail in 15 minutes. You can login now with new password!</small>';
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
echo '<br /><p class="error">An error occurred while sending email! You will not receive e-mail with this informations. For Admin: More info can be found in system/logs/mailer-error.log</p>';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
echo '<br /><small>You will not receive e-mail with this informations.</small>';
|
|
||||||
}
|
|
||||||
echo '<INPUT TYPE=hidden NAME="account_login" VALUE="'.$account->getId().'">
|
|
||||||
<INPUT TYPE=hidden NAME="password_login" VALUE="'.$new_pass.'">
|
|
||||||
</TD></TR></TABLE><BR>
|
|
||||||
<TABLE CELLSPACING=0 CELLPADDING=0 BORDER=0 WIDTH=100%><TR><TD><div style="text-align:center">
|
|
||||||
<INPUT TYPE=image NAME="Login" ALT="Login" SRC="'.$template_path.'/images/global/buttons/sbutton_login.gif" BORDER=0 WIDTH=120 HEIGHT=18></div>
|
|
||||||
</TD></TR></FORM></TABLE></TABLE>';
|
|
||||||
}
|
|
||||||
else
|
|
||||||
echo Validator::getLastError();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
echo Validator::getLastError();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
echo 'Wrong recovery key!';
|
|
||||||
}
|
|
||||||
else
|
|
||||||
echo 'Account of this character has no recovery key!';
|
|
||||||
}
|
|
||||||
else
|
|
||||||
echo 'Player or account of player <b>'.$nick.'</b> doesn\'t exist.';
|
|
||||||
}
|
|
||||||
else
|
|
||||||
echo 'Invalid player name format. If you have other characters on account try with other name.';
|
|
||||||
echo '<BR /><TABLE CELLSPACING=0 CELLPADDING=0 BORDER=0 WIDTH=100%><TR><TD><div style="text-align:center">
|
|
||||||
<a href="' . getLink('account/lost') . '?action=step1&action_type=reckey&nick='.urlencode($nick).'" border="0"><IMG SRC="'.$template_path.'/images/global/buttons/sbutton_back.gif" NAME="Back" ALT="Back" BORDER=0 WIDTH=120 HEIGHT=18></a></div>
|
|
||||||
</TD></TR></FORM></TABLE></TABLE>';
|
|
||||||
}
|
|
||||||
elseif($action == 'checkcode')
|
|
||||||
{
|
|
||||||
$code = trim($_REQUEST['code']);
|
|
||||||
$character = stripslashes(trim($_REQUEST['character']));
|
|
||||||
if(empty($code) || empty($character))
|
|
||||||
echo 'Please enter code from e-mail and name of one character from account. Then press Submit.<BR>
|
|
||||||
<FORM ACTION="' . getLink('account/lost') . '?action=checkcode" METHOD=post>
|
|
||||||
<TABLE CELLSPACING=1 CELLPADDING=4 BORDER=0 WIDTH=100%>
|
|
||||||
<TR><TD BGCOLOR="'.$config['vdarkborder'].'" class="white"><B>Code & character name</B></TD></TR>
|
|
||||||
<TR><TD BGCOLOR="'.$config['darkborder'].'">
|
|
||||||
Your code: <INPUT TYPE=text NAME="code" VALUE="" SIZE="40")><BR />
|
|
||||||
Character: <INPUT TYPE=text NAME="character" VALUE="" SIZE="40")><BR />
|
|
||||||
</TD></TR>
|
|
||||||
</TABLE>
|
|
||||||
<BR>
|
|
||||||
<TABLE CELLSPACING=0 CELLPADDING=0 BORDER=0 WIDTH=100%><TR><TD><div style="text-align:center">
|
|
||||||
' . $twig->render('buttons.submit.html.twig') . '</div>
|
|
||||||
</TD></TR></FORM></TABLE></TABLE>';
|
|
||||||
else
|
|
||||||
{
|
|
||||||
$player = new OTS_Player();
|
|
||||||
$account = new OTS_Account();
|
|
||||||
$player->find($character);
|
|
||||||
if($player->isLoaded())
|
|
||||||
$account = $player->getAccount();
|
|
||||||
if($account->isLoaded())
|
|
||||||
{
|
|
||||||
if($account->getCustomField('email_code') == $code)
|
|
||||||
{
|
|
||||||
echo '<script type="text/javascript">
|
|
||||||
function validate_required(field,alerttxt)
|
|
||||||
{
|
|
||||||
with (field)
|
|
||||||
{
|
|
||||||
if (value==null||value==""||value==" ")
|
|
||||||
{alert(alerttxt);return false;}
|
|
||||||
else {return true}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function validate_form(thisform)
|
|
||||||
{
|
|
||||||
with (thisform)
|
|
||||||
{
|
|
||||||
if (validate_required(passor,"Please enter password!")==false)
|
|
||||||
{passor.focus();return false;}
|
|
||||||
if (validate_required(passor2,"Please repeat password!")==false)
|
|
||||||
{passor2.focus();return false;}
|
|
||||||
if (passor2.value!=passor.value)
|
|
||||||
{alert(\'Repeated password is not equal to password!\');return false;}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
Please enter new password to your account and repeat to make sure you remember password.<BR>
|
|
||||||
<FORM ACTION="' . getLink('account/lost') . '?action=setnewpassword" onsubmit="return validate_form(this)" METHOD=post>
|
|
||||||
<INPUT TYPE=hidden NAME="character" VALUE="'.$character.'">
|
|
||||||
<INPUT TYPE=hidden NAME="code" VALUE="'.$code.'">
|
|
||||||
<TABLE CELLSPACING=1 CELLPADDING=4 BORDER=0 WIDTH=100%>
|
|
||||||
<TR><TD BGCOLOR="'.$config['vdarkborder'].'" class="white"><B>Code & account name</B></TD></TR>
|
|
||||||
<TR><TD BGCOLOR="'.$config['darkborder'].'">
|
|
||||||
New password: <INPUT TYPE=password ID="passor" NAME="passor" VALUE="" SIZE="40")><BR />
|
|
||||||
Repeat new password: <INPUT TYPE=password ID="passor2" NAME="passor2" VALUE="" SIZE="40")><BR />
|
|
||||||
</TD></TR>
|
|
||||||
</TABLE>
|
|
||||||
<BR>
|
|
||||||
<TABLE CELLSPACING=0 CELLPADDING=0 BORDER=0 WIDTH=100%><TR><TD><div style="text-align:center">
|
|
||||||
' . $twig->render('buttons.submit.html.twig') . '</div>
|
|
||||||
</TD></TR></FORM></TABLE></TABLE>';
|
|
||||||
}
|
|
||||||
else
|
|
||||||
$error= 'Wrong code to change password.';
|
|
||||||
}
|
|
||||||
else
|
|
||||||
$error = 'Account of this character or this character doesn\'t exist.';
|
|
||||||
}
|
|
||||||
if(!empty($error))
|
|
||||||
echo '<span style="color: red"><b>'.$error.'</b></span><br />Please enter code from e-mail and name of one character from account. Then press Submit.<BR>
|
|
||||||
<FORM ACTION="' . getLink('account/lost') . '?action=checkcode" METHOD=post>
|
|
||||||
<TABLE CELLSPACING=1 CELLPADDING=4 BORDER=0 WIDTH=100%>
|
|
||||||
<TR><TD BGCOLOR="'.$config['vdarkborder'].'" class="white"><B>Code & character name</B></TD></TR>
|
|
||||||
<TR><TD BGCOLOR="'.$config['darkborder'].'">
|
|
||||||
Your code: <INPUT TYPE=text NAME="code" VALUE="" SIZE="40")><BR />
|
|
||||||
Character: <INPUT TYPE=text NAME="character" VALUE="" SIZE="40")><BR />
|
|
||||||
</TD></TR>
|
|
||||||
</TABLE>
|
|
||||||
<BR>
|
|
||||||
<TABLE CELLSPACING=0 CELLPADDING=0 BORDER=0 WIDTH=100%><TR><TD><div style="text-align:center">
|
|
||||||
' . $twig->render('buttons.submit.html.twig') . '</div>
|
|
||||||
</TD></TR></FORM></TABLE></TABLE>';
|
|
||||||
}
|
|
||||||
elseif($action == 'setnewpassword')
|
|
||||||
{
|
|
||||||
$newpassword = $_REQUEST['passor'];
|
|
||||||
$code = $_REQUEST['code'];
|
|
||||||
$character = stripslashes($_REQUEST['character']);
|
|
||||||
echo '';
|
|
||||||
if(empty($code) || empty($character) || empty($newpassword))
|
|
||||||
echo '<span style="color: red"><b>Error. Try again.</b></span><br />Please enter code from e-mail and name of one character from account. Then press Submit.<BR>
|
|
||||||
<BR><FORM ACTION="' . getLink('account/lost') . '?action=checkcode" METHOD=post>
|
|
||||||
<TABLE CELLSPACING=0 CELLPADDING=0 BORDER=0 WIDTH=100%><TR><TD><div style="text-align:center">
|
|
||||||
<INPUT TYPE=image NAME="Back" ALT="Back" SRC="'.$template_path.'/images/global/buttons/sbutton_back.gif" BORDER=0 WIDTH=120 HEIGHT=18></div>
|
|
||||||
</TD></TR></FORM></TABLE></TABLE>';
|
|
||||||
else
|
|
||||||
{
|
|
||||||
$player = new OTS_Player();
|
|
||||||
$account = new OTS_Account();
|
|
||||||
$player->find($character);
|
|
||||||
if($player->isLoaded())
|
|
||||||
$account = $player->getAccount();
|
|
||||||
if($account->isLoaded())
|
|
||||||
{
|
|
||||||
if($account->getCustomField('email_code') == $code)
|
|
||||||
{
|
|
||||||
if(Validator::password($newpassword))
|
|
||||||
{
|
|
||||||
$tmp_new_pass = $newpassword;
|
|
||||||
if(USE_ACCOUNT_SALT)
|
|
||||||
{
|
|
||||||
$salt = generateRandomString(10, false, true, true);
|
|
||||||
$tmp_new_pass = $salt . $newpassword;
|
|
||||||
$account->setCustomField('salt', $salt);
|
|
||||||
}
|
|
||||||
|
|
||||||
$account->setPassword(encrypt($tmp_new_pass ));
|
|
||||||
$account->save();
|
|
||||||
$account->setCustomField('email_code', '');
|
|
||||||
echo 'New password to your account is below. Now you can login.<BR>
|
|
||||||
<INPUT TYPE=hidden NAME="character" VALUE="'.$character.'">
|
|
||||||
<TABLE CELLSPACING=1 CELLPADDING=4 BORDER=0 WIDTH=100%>
|
|
||||||
<TR><TD BGCOLOR="'.$config['vdarkborder'].'" class="white"><B>Changed password</B></TD></TR>
|
|
||||||
<TR><TD BGCOLOR="'.$config['darkborder'].'">
|
|
||||||
New password: <b>'.$newpassword.'</b><BR />
|
|
||||||
Account name: <i>(Already on your e-mail)</i><BR />';
|
|
||||||
|
|
||||||
$mailBody = '
|
|
||||||
<h3>Your account name and password!</h3>
|
|
||||||
<p>Changed password to your account in Lost Account Interface on server <a href="'.BASE_URL.'"><b>'.$config['lua']['serverName'].'</b></a></p>
|
|
||||||
<p>Account name: <b>'.$account->getName().'</b></p>
|
|
||||||
<p>New password: <b>'.$newpassword.'</b></p>
|
|
||||||
<br />
|
|
||||||
<p><u>It\'s automatic e-mail from OTS Lost Account System. Do not reply!</u></p>';
|
|
||||||
|
|
||||||
if(_mail($account->getCustomField('email'), $config['lua']['serverName']." - Your new password", $mailBody))
|
|
||||||
{
|
|
||||||
echo '<br /><small>New password work! Sent e-mail with your password and account name. You should receive this e-mail in 15 minutes. You can login now with new password!';
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
echo '<br /><p class="error">New password work! An error occurred while sending email! You will not receive e-mail with new password. For Admin: More info can be found in system/logs/mailer-error.log';
|
|
||||||
}
|
|
||||||
echo '</TD></TR>
|
|
||||||
</TABLE>
|
|
||||||
<BR>
|
|
||||||
<TABLE CELLSPACING=0 CELLPADDING=0 BORDER=0 WIDTH=100%><TR><TD><div style="text-align:center">
|
|
||||||
<FORM ACTION="' . getLink('account/manage') . '" METHOD=post>
|
|
||||||
<INPUT TYPE=image NAME="Login" ALT="Login" SRC="'.$template_path.'/images/global/buttons/sbutton_login.gif" BORDER=0 WIDTH=120 HEIGHT=18></div>
|
|
||||||
</TD></TR></FORM></TABLE></TABLE>';
|
|
||||||
}
|
|
||||||
else
|
|
||||||
$error= Validator::getLastError();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
$error= 'Wrong code to change password.';
|
|
||||||
}
|
|
||||||
else
|
|
||||||
$error = 'Account of this character or this character doesn\'t exist.';
|
|
||||||
}
|
|
||||||
if(!empty($error))
|
|
||||||
echo '<span style="color: red"><b>'.$error.'</b></span><br />Please enter code from e-mail and name of one character from account. Then press Submit.<BR>
|
|
||||||
<FORM ACTION="' . getLink('account/lost') . '?action=checkcode" METHOD=post>
|
|
||||||
<TABLE CELLSPACING=1 CELLPADDING=4 BORDER=0 WIDTH=100%>
|
|
||||||
<TR><TD BGCOLOR="'.$config['vdarkborder'].'" class="white"><B>Code & character name</B></TD></TR>
|
|
||||||
<TR><TD BGCOLOR="'.$config['darkborder'].'">
|
|
||||||
Your code: <INPUT TYPE=text NAME="code" VALUE="" SIZE="40")><BR />
|
|
||||||
Character: <INPUT TYPE=text NAME="character" VALUE="" SIZE="40")><BR />
|
|
||||||
</TD></TR>
|
|
||||||
</TABLE>
|
|
||||||
<BR>
|
|
||||||
<TABLE CELLSPACING=0 CELLPADDING=0 BORDER=0 WIDTH=100%><TR><TD><div style="text-align:center">
|
|
||||||
' . $twig->render('buttons.submit.html.twig') . '</div>
|
|
||||||
</TD></TR></FORM></TABLE></TABLE>';
|
|
||||||
}
|
|
||||||
|
49
system/pages/account/lost/check-code.php
Normal file
49
system/pages/account/lost/check-code.php
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
<?php
|
||||||
|
defined('MYAAC') or die('Direct access not allowed!');
|
||||||
|
|
||||||
|
$title = 'Lost Account';
|
||||||
|
|
||||||
|
$code = isset($_REQUEST['code']) ? trim($_REQUEST['code']) : '';
|
||||||
|
$character = isset($_REQUEST['character']) ? stripslashes(trim($_REQUEST['character'])) : '';
|
||||||
|
|
||||||
|
if(empty($code) || empty($character))
|
||||||
|
$twig->display('account/lost/check-code.html.twig', [
|
||||||
|
'code' => $code,
|
||||||
|
'characters' => $character,
|
||||||
|
]);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$player = new OTS_Player();
|
||||||
|
$account = new OTS_Account();
|
||||||
|
$player->find($character);
|
||||||
|
if($player->isLoaded()) {
|
||||||
|
$account = $player->getAccount();
|
||||||
|
}
|
||||||
|
|
||||||
|
if($account->isLoaded()) {
|
||||||
|
if($account->getCustomField('email_code') == $code) {
|
||||||
|
$twig->display('account/lost/check-code.finish.html.twig', [
|
||||||
|
'character' => $character,
|
||||||
|
'code' => $code,
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$error = 'Wrong code to change password.';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$error = "Account of this character or this character doesn't exist.";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!empty($error)) {
|
||||||
|
$twig->display('error_box.html.twig', [
|
||||||
|
'errors' => [$error],
|
||||||
|
]);
|
||||||
|
|
||||||
|
echo '<br/>';
|
||||||
|
|
||||||
|
$twig->display('account/lost/check-code.html.twig', [
|
||||||
|
|
||||||
|
]);
|
||||||
|
}
|
61
system/pages/account/lost/email/send-code.php
Normal file
61
system/pages/account/lost/email/send-code.php
Normal file
@@ -0,0 +1,61 @@
|
|||||||
|
<?php
|
||||||
|
defined('MYAAC') or die('Direct access not allowed!');
|
||||||
|
|
||||||
|
$title = 'Lost Account';
|
||||||
|
|
||||||
|
$email = $_REQUEST['email'];
|
||||||
|
$nick = stripslashes($_REQUEST['nick']);
|
||||||
|
|
||||||
|
$player = new OTS_Player();
|
||||||
|
$account = new OTS_Account();
|
||||||
|
$player->find($nick);
|
||||||
|
if($player->isLoaded()) {
|
||||||
|
$account = $player->getAccount();
|
||||||
|
}
|
||||||
|
|
||||||
|
if($account->isLoaded()) {
|
||||||
|
if($account->getCustomField('email_next') < time()) {
|
||||||
|
if($account->getEMail() == $email) {
|
||||||
|
$newCode = generateRandomString(30, true, false, true);
|
||||||
|
$mailBody = $twig->render('mail.account.lost.code.html.twig', [
|
||||||
|
'newCode' => $newCode,
|
||||||
|
'account' => $account,
|
||||||
|
'nick' => $nick,
|
||||||
|
]);
|
||||||
|
|
||||||
|
$accountEMail = $account->getCustomField('email');
|
||||||
|
if(_mail($accountEMail, configLua('serverName') . ' - Recover your account', $mailBody)) {
|
||||||
|
$account->setCustomField('email_code', $newCode);
|
||||||
|
$account->setCustomField('email_next', (time() + setting('core.mail_lost_account_interval')));
|
||||||
|
|
||||||
|
echo '<br />Details about steps required to recover your account has been sent to <b>' . $accountEMail . '</b>. You should receive this email within 15 minutes. Please check your inbox/spam directory.';
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$account->setCustomField('email_next', (time() + 60));
|
||||||
|
error('An error occurred while sending email! Try again later or contact with admin. For Admin: More info can be found in system/logs/mailer-error.log</p>');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
echo 'Invalid e-mail to account of character <b>' . htmlspecialchars($nick) . '</b>. Try again.';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$inSec = (int)$account->getCustomField('email_next') - time();
|
||||||
|
$minutesLeft = floor($inSec / 60);
|
||||||
|
$secondsLeft = $inSec - ($minutesLeft * 60);
|
||||||
|
$timeLeft = $minutesLeft.' minutes '.$secondsLeft.' seconds';
|
||||||
|
|
||||||
|
$timeRounded = ceil(setting('core.mail_lost_account_interval') / 60);
|
||||||
|
|
||||||
|
echo "Account of selected character (<b>" . escapeHtml($nick) . "</b>) received e-mail in last $timeRounded minutes. You must wait $timeLeft before you can use Lost Account Interface again.";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
echo "Player or account of player <b>" . htmlspecialchars($nick) . "</b> doesn't exist.";
|
||||||
|
}
|
||||||
|
|
||||||
|
$twig->display('account.back_button.html.twig', [
|
||||||
|
'new_line' => true,
|
||||||
|
'center' => true,
|
||||||
|
'action' => getLink('account/lost') . '?action=step1&action_type=email&nick=' . urlencode($nick),
|
||||||
|
]);
|
84
system/pages/account/lost/email/set-new-password.php
Normal file
84
system/pages/account/lost/email/set-new-password.php
Normal file
@@ -0,0 +1,84 @@
|
|||||||
|
<?php
|
||||||
|
defined('MYAAC') or die('Direct access not allowed!');
|
||||||
|
|
||||||
|
$title = 'Lost Account';
|
||||||
|
|
||||||
|
$newPassword = $_REQUEST['passor'];
|
||||||
|
$code = $_REQUEST['code'];
|
||||||
|
$character = stripslashes($_REQUEST['character']);
|
||||||
|
|
||||||
|
if(empty($code) || empty($character) || empty($newPassword)) {
|
||||||
|
echo '<span style="color: red"><b>Error. Try again.</b></span><br/>Please enter code from e-mail and name of one character from account. Then press Submit.<br>';
|
||||||
|
|
||||||
|
$twig->display('account.back_button.html.twig', [
|
||||||
|
'new_line' => true,
|
||||||
|
'center' => true,
|
||||||
|
'action' => getLink('account/lost/check-code')
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$player = new OTS_Player();
|
||||||
|
$account = new OTS_Account();
|
||||||
|
$player->find($character);
|
||||||
|
if($player->isLoaded()) {
|
||||||
|
$account = $player->getAccount();
|
||||||
|
}
|
||||||
|
|
||||||
|
if($account->isLoaded()) {
|
||||||
|
if($account->getCustomField('email_code') == $code) {
|
||||||
|
if(Validator::password($newPassword)) {
|
||||||
|
$tmp_new_pass = $newPassword;
|
||||||
|
if(USE_ACCOUNT_SALT) {
|
||||||
|
$salt = generateRandomString(10, false, true, true);
|
||||||
|
$tmp_new_pass = $salt . $newPassword;
|
||||||
|
$account->setCustomField('salt', $salt);
|
||||||
|
}
|
||||||
|
|
||||||
|
$account->setPassword(encrypt($tmp_new_pass));
|
||||||
|
$account->save();
|
||||||
|
$account->setCustomField('email_code', '');
|
||||||
|
|
||||||
|
$mailBody = $twig->render('mail.account.lost.new-password.html.twig', [
|
||||||
|
'account' => $account,
|
||||||
|
'newPassword' => $newPassword,
|
||||||
|
]);
|
||||||
|
|
||||||
|
$statusMsg = '';
|
||||||
|
if(_mail($account->getCustomField('email'), configLua('serverName') . ' - Your new password', $mailBody)) {
|
||||||
|
$statusMsg = '<br /><small>New password work! Sent e-mail with your password and account name. You should receive this e-mail in 15 minutes. You can login now with new password!';
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$statusMsg = '<br /><p class="error">New password work! An error occurred while sending email! You will not receive e-mail with new password. For Admin: More info can be found in system/logs/mailer-error.log';
|
||||||
|
}
|
||||||
|
|
||||||
|
$twig->display('account/lost/finish.new-password.html.twig', [
|
||||||
|
'statusMsg' => $statusMsg,
|
||||||
|
'newPassword' => $newPassword,
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$error = Validator::getLastError();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$error = 'Wrong code to change password.';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$error = "Account of this character or this character doesn't exist.";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!empty($error)) {
|
||||||
|
$twig->display('error_box.html.twig', [
|
||||||
|
'errors' => [$error],
|
||||||
|
]);
|
||||||
|
|
||||||
|
echo '<br/>';
|
||||||
|
|
||||||
|
$twig->display('account/lost/check-code.html.twig', [
|
||||||
|
'code' => $code,
|
||||||
|
'character' => $character,
|
||||||
|
]);
|
||||||
|
}
|
30
system/pages/account/lost/email/step-1.php
Normal file
30
system/pages/account/lost/email/step-1.php
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
$title = 'Lost Account';
|
||||||
|
|
||||||
|
if($account->isLoaded()) {
|
||||||
|
if($account->getCustomField('email_next') < time()) {
|
||||||
|
$twig->display('account/lost/email.html.twig', [
|
||||||
|
'nick' => $nick,
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$inSec = (int)$account->getCustomField('email_next') - time();
|
||||||
|
$minutesLeft = floor($inSec / 60);
|
||||||
|
$secondsLeft = $inSec - ($minutesLeft * 60);
|
||||||
|
$timeLeft = $minutesLeft.' minutes '.$secondsLeft.' seconds';
|
||||||
|
|
||||||
|
$timeRounded = ceil(setting('core.mail_lost_account_interval') / 60);
|
||||||
|
|
||||||
|
echo "Account of selected character (<b>" . escapeHtml($nick) . "</b>) received e-mail in last $timeRounded minutes. You must wait $timeLeft before you can use Lost Account Interface again.";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
echo "Player or account of player <b>" . escapeHtml($nick) . "</b> doesn't exist.";
|
||||||
|
}
|
||||||
|
|
||||||
|
$twig->display('account.back_button.html.twig', [
|
||||||
|
'new_line' => true,
|
||||||
|
'center' => true,
|
||||||
|
'action' => getLink('account/lost'),
|
||||||
|
]);
|
26
system/pages/account/lost/recovery-key/step-1.php
Normal file
26
system/pages/account/lost/recovery-key/step-1.php
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
<?php
|
||||||
|
defined('MYAAC') or die('Direct access not allowed!');
|
||||||
|
|
||||||
|
$title = 'Lost Account';
|
||||||
|
|
||||||
|
if($account->isLoaded()) {
|
||||||
|
$account_key = $account->getCustomField('key');
|
||||||
|
|
||||||
|
if(!empty($account_key)) {
|
||||||
|
$twig->display('account/lost/recovery-key.html.twig', [
|
||||||
|
'nick' => $nick,
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
echo 'Account of this character has no recovery key!';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
echo "Player or account of player <b>" . escapeHtml($nick) . "</b> doesn't exist.";
|
||||||
|
}
|
||||||
|
|
||||||
|
$twig->display('account.back_button.html.twig', [
|
||||||
|
'new_line' => true,
|
||||||
|
'center' => true,
|
||||||
|
'action' => getLink('account/lost'),
|
||||||
|
]);
|
40
system/pages/account/lost/recovery-key/step-2.php
Normal file
40
system/pages/account/lost/recovery-key/step-2.php
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
<?php
|
||||||
|
defined('MYAAC') or die('Direct access not allowed!');
|
||||||
|
|
||||||
|
$title = 'Lost Account';
|
||||||
|
|
||||||
|
$recKey = trim($_REQUEST['key']);
|
||||||
|
$nick = stripslashes($_REQUEST['nick']);
|
||||||
|
|
||||||
|
$player = new OTS_Player();
|
||||||
|
$account = new OTS_Account();
|
||||||
|
$player->find($nick);
|
||||||
|
if($player->isLoaded()) {
|
||||||
|
$account = $player->getAccount();
|
||||||
|
}
|
||||||
|
|
||||||
|
if($account->isLoaded()) {
|
||||||
|
$accountKey = $account->getCustomField('key');
|
||||||
|
if(!empty($accountKey)) {
|
||||||
|
if($accountKey == $recKey) {
|
||||||
|
$twig->display('account/lost/step2.html.twig', [
|
||||||
|
'nick' => $nick,
|
||||||
|
'recKey' => $recKey,
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
echo 'Wrong recovery key!';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
echo 'Account of this character has no recovery key!';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
echo "Player or account of player <b>" . escapeHtml($nick) . "</b> doesn't exist.";
|
||||||
|
|
||||||
|
$twig->display('account.back_button.html.twig', [
|
||||||
|
'new_line' => true,
|
||||||
|
'center' => true,
|
||||||
|
'action' => getLink('account/lost') . '?action=step1&action_type=reckey&nick=' . urlencode($nick),
|
||||||
|
]);
|
91
system/pages/account/lost/recovery-key/step-3.php
Normal file
91
system/pages/account/lost/recovery-key/step-3.php
Normal file
@@ -0,0 +1,91 @@
|
|||||||
|
<?php
|
||||||
|
defined('MYAAC') or die('Direct access not allowed!');
|
||||||
|
|
||||||
|
$title = 'Lost Account';
|
||||||
|
|
||||||
|
$recKey = trim($_REQUEST['key']);
|
||||||
|
$nick = stripslashes($_REQUEST['nick']);
|
||||||
|
$newPassword = trim($_REQUEST['passor']);
|
||||||
|
$newEmail = trim($_REQUEST['email']);
|
||||||
|
|
||||||
|
$player = new OTS_Player();
|
||||||
|
$account = new OTS_Account();
|
||||||
|
$player->find($nick);
|
||||||
|
if($player->isLoaded()) {
|
||||||
|
$account = $player->getAccount();
|
||||||
|
}
|
||||||
|
|
||||||
|
if($account->isLoaded()) {
|
||||||
|
$accountKey = $account->getCustomField('key');
|
||||||
|
|
||||||
|
if(!empty($accountKey)) {
|
||||||
|
if($accountKey == $recKey) {
|
||||||
|
if(Validator::password($newPassword)) {
|
||||||
|
if(Validator::email($newEmail)) {
|
||||||
|
$account->setEMail($newEmail);
|
||||||
|
|
||||||
|
$tmp_new_pass = $newPassword;
|
||||||
|
if(USE_ACCOUNT_SALT)
|
||||||
|
{
|
||||||
|
$salt = generateRandomString(10, false, true, true);
|
||||||
|
$tmp_new_pass = $salt . $newPassword;
|
||||||
|
}
|
||||||
|
|
||||||
|
$account->setPassword(encrypt($tmp_new_pass));
|
||||||
|
$account->save();
|
||||||
|
|
||||||
|
if(USE_ACCOUNT_SALT) {
|
||||||
|
$account->setCustomField('salt', $salt);
|
||||||
|
}
|
||||||
|
|
||||||
|
$statusMsg = '';
|
||||||
|
if($account->getCustomField('email_next') < time()) {
|
||||||
|
$mailBody = $twig->render('mail.account.lost.new-email.html.twig', [
|
||||||
|
'account' => $account,
|
||||||
|
'newPassword' => $newPassword,
|
||||||
|
'newEmail' => $newEmail,
|
||||||
|
]);
|
||||||
|
|
||||||
|
if(_mail($account->getCustomField('email'), $config['lua']['serverName']." - New password to your account", $mailBody)) {
|
||||||
|
$statusMsg = '<br /><small>Sent e-mail with your account name and password to new e-mail. You should receive this e-mail in 15 minutes. You can login now with new password!</small>';
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$statusMsg = '<br /><p class="error">An error occurred while sending email! You will not receive e-mail with this informations. For Admin: More info can be found in system/logs/mailer-error.log</p>';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$statusMsg = '<br /><small>You will not receive e-mail with this informations.</small>';
|
||||||
|
}
|
||||||
|
|
||||||
|
$twig->display('account/lost/finish.new-email.html.twig', [
|
||||||
|
'statusMsg' => $statusMsg,
|
||||||
|
'account' => $account,
|
||||||
|
'newPassword' => $newPassword,
|
||||||
|
'newEmail' => $newEmail,
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
echo Validator::getLastError();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
echo Validator::getLastError();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
echo 'Wrong recovery key!';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
echo 'Account of this character has no recovery key!';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
echo "Player or account of player <b>" . escapeHtml($nick) . "</b> doesn't exist.";
|
||||||
|
}
|
||||||
|
|
||||||
|
$twig->display('account.back_button.html.twig', [
|
||||||
|
'new_line' => true,
|
||||||
|
'center' => true,
|
||||||
|
'action' => getLink('account/lost') . '?action=step1&action_type=reckey&nick=' . urlencode($nick),
|
||||||
|
]);
|
24
system/pages/account/lost/step-1.php
Normal file
24
system/pages/account/lost/step-1.php
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
<?php
|
||||||
|
defined('MYAAC') or die('Direct access not allowed!');
|
||||||
|
|
||||||
|
$title = 'Lost Account';
|
||||||
|
|
||||||
|
$nick = stripslashes($_REQUEST['nick']);
|
||||||
|
|
||||||
|
$player = new OTS_Player();
|
||||||
|
$account = new OTS_Account();
|
||||||
|
$player->find($nick);
|
||||||
|
if($player->isLoaded()) {
|
||||||
|
$account = $player->getAccount();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ACTION == 'email') {
|
||||||
|
require __DIR__ . '/email/step-1.php';
|
||||||
|
}
|
||||||
|
else if (ACTION == 'recovery-key') {
|
||||||
|
require __DIR__ . '/recovery-key/step-1.php';
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$twig->display('account/lost/no-action.html.twig');
|
||||||
|
}
|
||||||
|
|
@@ -23,6 +23,12 @@ if(!Validator::guildName($guild_name)) {
|
|||||||
$errors[] = Validator::getLastError();
|
$errors[] = Validator::getLastError();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!$db->hasTableAndColumns('guild_invites', ['player_id'])) {
|
||||||
|
$errors[] = "Guild invite is not possible on this website.";
|
||||||
|
$twig->display('error_box.html.twig', ['errors' => $errors]);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if(empty($errors)) {
|
if(empty($errors)) {
|
||||||
$guild = new OTS_Guild();
|
$guild = new OTS_Guild();
|
||||||
$guild->find($guild_name);
|
$guild->find($guild_name);
|
||||||
@@ -58,7 +64,7 @@ if(empty($errors)) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!$guild_vice) {
|
if(empty($errors) && !$guild_vice) {
|
||||||
$errors[] = 'You are not a leader or vice leader of guild <b>'.$guild_name.'</b>.'.$level_in_guild;
|
$errors[] = 'You are not a leader or vice leader of guild <b>'.$guild_name.'</b>.'.$level_in_guild;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -84,6 +90,7 @@ if(isset($_POST['todo']) && $_POST['todo'] == 'save') {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(empty($errors)) {
|
if(empty($errors)) {
|
||||||
include(SYSTEM . 'libs/pot/InvitesDriver.php');
|
include(SYSTEM . 'libs/pot/InvitesDriver.php');
|
||||||
new InvitesDriver($guild);
|
new InvitesDriver($guild);
|
||||||
@@ -104,6 +111,7 @@ if(!empty($errors)) {
|
|||||||
else {
|
else {
|
||||||
if(isset($_POST['todo']) && $_POST['todo'] == 'save') {
|
if(isset($_POST['todo']) && $_POST['todo'] == 'save') {
|
||||||
$guild->invite($player);
|
$guild->invite($player);
|
||||||
|
|
||||||
$twig->display('success.html.twig', array(
|
$twig->display('success.html.twig', array(
|
||||||
'title' => 'Invite player',
|
'title' => 'Invite player',
|
||||||
'description' => 'Player with name <b>' . $player->getName() . '</b> has been invited to your guild.',
|
'description' => 'Player with name <b>' . $player->getName() . '</b> has been invited to your guild.',
|
||||||
|
@@ -121,25 +121,28 @@ foreach($rank_list as $rank)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
include(SYSTEM . 'libs/pot/InvitesDriver.php');
|
$invited_list = [];
|
||||||
new InvitesDriver($guild);
|
|
||||||
$invited_list = $guild->listInvites();
|
|
||||||
$show_accept_invite = 0;
|
$show_accept_invite = 0;
|
||||||
if($logged && count($invited_list) > 0)
|
|
||||||
{
|
if ($db->hasTableAndColumns('guild_invites', ['player_id'])) {
|
||||||
foreach($invited_list as $invited_player)
|
include(SYSTEM . 'libs/pot/InvitesDriver.php');
|
||||||
{
|
new InvitesDriver($guild);
|
||||||
if(count($account_players) > 0)
|
$invited_list = $guild->listInvites();
|
||||||
{
|
|
||||||
foreach($account_players as $player_from_acc)
|
if($logged && count($invited_list) > 0) {
|
||||||
{
|
foreach($invited_list as $invited_player) {
|
||||||
if($player_from_acc->isLoaded() && $invited_player->isLoaded() && $player_from_acc->getName() == $invited_player->getName())
|
if(count($account_players) > 0) {
|
||||||
$show_accept_invite++;
|
foreach($account_players as $player_from_acc) {
|
||||||
|
if($player_from_acc->isLoaded() && $invited_player->isLoaded() && $player_from_acc->getName() == $invited_player->getName()) {
|
||||||
|
$show_accept_invite++;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
$useGuildNick = $db->hasTable('guild_members') || $db->hasTable('guild_membership') || $db->hasColumn('players', 'guildnick');
|
$useGuildNick = $db->hasTable('guild_members') || $db->hasTable('guild_membership') || $db->hasColumn('players', 'guildnick');
|
||||||
|
|
||||||
$twig->display('guilds.view.html.twig', array(
|
$twig->display('guilds.view.html.twig', array(
|
||||||
|
@@ -123,16 +123,10 @@ if($db->hasColumn('players', 'promotion'))
|
|||||||
$promotion = ',players.promotion';
|
$promotion = ',players.promotion';
|
||||||
|
|
||||||
$outfit_addons = false;
|
$outfit_addons = false;
|
||||||
$outfit = '';
|
$outfit = ', lookbody, lookfeet, lookhead, looklegs, looktype';
|
||||||
|
if($db->hasColumn('players', 'lookaddons')) {
|
||||||
$settingHighscoresOutfit = setting('core.highscores_outfit');
|
$outfit .= ', lookaddons';
|
||||||
|
$outfit_addons = true;
|
||||||
if($settingHighscoresOutfit) {
|
|
||||||
$outfit = ', lookbody, lookfeet, lookhead, looklegs, looktype';
|
|
||||||
if($db->hasColumn('players', 'lookaddons')) {
|
|
||||||
$outfit .= ', lookaddons';
|
|
||||||
$outfit_addons = true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
$configHighscoresPerPage = setting('core.highscores_per_page');
|
$configHighscoresPerPage = setting('core.highscores_per_page');
|
||||||
@@ -146,17 +140,24 @@ $cache = Cache::getInstance();
|
|||||||
if ($cache->enabled() && $highscoresTTL > 0) {
|
if ($cache->enabled() && $highscoresTTL > 0) {
|
||||||
$tmp = '';
|
$tmp = '';
|
||||||
if ($cache->fetch($cacheKey, $tmp)) {
|
if ($cache->fetch($cacheKey, $tmp)) {
|
||||||
$highscores = unserialize($tmp);
|
$data = unserialize($tmp);
|
||||||
|
$totalResults = $data['totalResults'];
|
||||||
|
$highscores = $data['highscores'];
|
||||||
|
$updatedAt = $data['updatedAt'];
|
||||||
$needReCache = false;
|
$needReCache = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$offset = ($page - 1) * $configHighscoresPerPage;
|
$offset = ($page - 1) * $configHighscoresPerPage;
|
||||||
$query->join('accounts', 'accounts.id', '=', 'players.account_id')
|
$query->withOnlineStatus()
|
||||||
->withOnlineStatus()
|
|
||||||
->whereNotIn('players.id', setting('core.highscores_ids_hidden'))
|
->whereNotIn('players.id', setting('core.highscores_ids_hidden'))
|
||||||
->notDeleted()
|
->notDeleted()
|
||||||
->where('players.group_id', '<', setting('core.highscores_groups_hidden'))
|
->where('players.group_id', '<', setting('core.highscores_groups_hidden'));
|
||||||
|
|
||||||
|
$totalResultsQuery = clone $query;
|
||||||
|
|
||||||
|
$query
|
||||||
|
->join('accounts', 'accounts.id', '=', 'players.account_id')
|
||||||
->limit($limit)
|
->limit($limit)
|
||||||
->offset($offset)
|
->offset($offset)
|
||||||
->selectRaw('accounts.country, players.id, players.name, players.account_id, players.level, players.vocation' . $outfit . $promotion)
|
->selectRaw('accounts.country, players.id, players.name, players.account_id, players.level, players.vocation' . $outfit . $promotion)
|
||||||
@@ -215,17 +216,24 @@ if (empty($highscores)) {
|
|||||||
|
|
||||||
return $tmp;
|
return $tmp;
|
||||||
})->toArray();
|
})->toArray();
|
||||||
|
|
||||||
|
$updatedAt = time();
|
||||||
|
$totalResults = $totalResultsQuery->count();
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($highscoresTTL > 0 && $cache->enabled() && $needReCache) {
|
if ($highscoresTTL > 0 && $cache->enabled() && $needReCache) {
|
||||||
$cache->set($cacheKey, serialize($highscores), $highscoresTTL * 60);
|
$cache->set($cacheKey, serialize(
|
||||||
|
[
|
||||||
|
'totalResults' => $totalResults,
|
||||||
|
'highscores' => $highscores,
|
||||||
|
'updatedAt' => $updatedAt,
|
||||||
|
]
|
||||||
|
), $highscoresTTL * 60);
|
||||||
}
|
}
|
||||||
|
|
||||||
$show_link_to_next_page = false;
|
$show_link_to_next_page = false;
|
||||||
$i = 0;
|
$i = 0;
|
||||||
|
|
||||||
$settingHighscoresVocation = setting('core.highscores_vocation');
|
|
||||||
|
|
||||||
foreach($highscores as $id => &$player)
|
foreach($highscores as $id => &$player)
|
||||||
{
|
{
|
||||||
if(++$i <= $configHighscoresPerPage)
|
if(++$i <= $configHighscoresPerPage)
|
||||||
@@ -239,10 +247,22 @@ foreach($highscores as $id => &$player)
|
|||||||
|
|
||||||
$player['link'] = getPlayerLink($player['name'], false);
|
$player['link'] = getPlayerLink($player['name'], false);
|
||||||
$player['flag'] = getFlagImage($player['country']);
|
$player['flag'] = getFlagImage($player['country']);
|
||||||
if($settingHighscoresOutfit) {
|
$player['outfit'] = '<img style="position:absolute;margin-top:' . (in_array($player['looktype'], setting('core.outfit_images_wrong_looktypes')) ? '-15px;margin-left:5px' : '-45px;margin-left:-25px') . ';" src="' . $player['outfit_url'] . '" alt="" />';
|
||||||
$player['outfit'] = '<img style="position:absolute;margin-top:' . (in_array($player['looktype'], setting('core.outfit_images_wrong_looktypes')) ? '-15px;margin-left:5px' : '-45px;margin-left:-25px') . ';" src="' . $player['outfit_url'] . '" alt="" />';
|
|
||||||
|
if ($skill != POT::SKILL__LEVEL) {
|
||||||
|
if (isset($lastValue) && $lastValue == $player['value']) {
|
||||||
|
$player['rank'] = $lastRank;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$player['rank'] = $offset + $i;
|
||||||
|
}
|
||||||
|
|
||||||
|
$lastRank = $player['rank'] ;
|
||||||
|
$lastValue = $player['value'];
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$player['rank'] = $offset + $i;
|
||||||
}
|
}
|
||||||
$player['rank'] = $offset + $i;
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
unset($highscores[$id]);
|
unset($highscores[$id]);
|
||||||
@@ -263,6 +283,8 @@ if($show_link_to_next_page) {
|
|||||||
$linkNextPage = getLink('highscores') . '/' . $list . ($vocation !== 'all' ? '/' . $vocation : '') . '/' . ($page + 1);
|
$linkNextPage = getLink('highscores') . '/' . $list . ($vocation !== 'all' ? '/' . $vocation : '') . '/' . ($page + 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$baseLink = getLink('highscores') . '/' . $list . ($vocation !== 'all' ? '/' . $vocation : '') . '/';
|
||||||
|
|
||||||
$types = array(
|
$types = array(
|
||||||
'experience' => 'Experience',
|
'experience' => 'Experience',
|
||||||
'magic' => 'Magic',
|
'magic' => 'Magic',
|
||||||
@@ -297,4 +319,8 @@ $twig->display('highscores.html.twig', [
|
|||||||
'types' => $types,
|
'types' => $types,
|
||||||
'linkPreviousPage' => $linkPreviousPage,
|
'linkPreviousPage' => $linkPreviousPage,
|
||||||
'linkNextPage' => $linkNextPage,
|
'linkNextPage' => $linkNextPage,
|
||||||
|
'totalResults' => $totalResults,
|
||||||
|
'page' => $page,
|
||||||
|
'baseLink' => $baseLink,
|
||||||
|
'updatedAt' => $updatedAt,
|
||||||
]);
|
]);
|
||||||
|
@@ -9,18 +9,21 @@
|
|||||||
* @link https://my-aac.org
|
* @link https://my-aac.org
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
use MyAAC\Cache\Cache;
|
||||||
use MyAAC\Models\ServerConfig;
|
use MyAAC\Models\ServerConfig;
|
||||||
use MyAAC\Models\ServerRecord;
|
use MyAAC\Models\ServerRecord;
|
||||||
|
|
||||||
defined('MYAAC') or die('Direct access not allowed!');
|
defined('MYAAC') or die('Direct access not allowed!');
|
||||||
$title = 'Who is online?';
|
$title = 'Who is online?';
|
||||||
|
|
||||||
if (setting('core.account_country'))
|
if (setting('core.account_country')) {
|
||||||
require SYSTEM . 'countries.conf.php';
|
require SYSTEM . 'countries.conf.php';
|
||||||
|
}
|
||||||
|
|
||||||
$promotion = '';
|
$promotion = '';
|
||||||
if($db->hasColumn('players', 'promotion'))
|
if($db->hasColumn('players', 'promotion')) {
|
||||||
$promotion = '`promotion`,';
|
$promotion = '`promotion`,';
|
||||||
|
}
|
||||||
|
|
||||||
$order = $_GET['order'] ?? 'name_asc';
|
$order = $_GET['order'] ?? 'name_asc';
|
||||||
if(!in_array($order, ['country_asc', 'country_desc', 'name_asc', 'name_desc', 'level_asc', 'level_desc', 'vocation_asc', 'vocation_desc'])) {
|
if(!in_array($order, ['country_asc', 'country_desc', 'name_asc', 'name_desc', 'level_asc', 'level_desc', 'vocation_asc', 'vocation_desc'])) {
|
||||||
@@ -30,106 +33,116 @@ else if($order == 'vocation_asc' || $order == 'vocation_desc') {
|
|||||||
$order = $promotion . 'vocation_' . (str_contains($order, 'asc') ? 'asc' : 'desc');
|
$order = $promotion . 'vocation_' . (str_contains($order, 'asc') ? 'asc' : 'desc');
|
||||||
}
|
}
|
||||||
|
|
||||||
$orderExplode = explode('_', $order);
|
$cached = Cache::remember("online_$order", setting('core.online_cache_ttl') * 60, function() use($db, $promotion, $order) {
|
||||||
$orderSql = $orderExplode[0] . ' ' . $orderExplode[1];
|
$orderExplode = explode('_', $order);
|
||||||
|
$orderSql = $orderExplode[0] . ' ' . $orderExplode[1];
|
||||||
|
|
||||||
$skull_type = 'skull';
|
$skull_type = 'skull';
|
||||||
if($db->hasColumn('players', 'skull_type')) {
|
if($db->hasColumn('players', 'skull_type')) {
|
||||||
$skull_type = 'skull_type';
|
$skull_type = 'skull_type';
|
||||||
}
|
}
|
||||||
|
|
||||||
$skull_time = 'skulltime';
|
$skull_time = 'skulltime';
|
||||||
if($db->hasColumn('players', 'skull_time')) {
|
if($db->hasColumn('players', 'skull_time')) {
|
||||||
$skull_time = 'skull_time';
|
$skull_time = 'skull_time';
|
||||||
}
|
}
|
||||||
|
|
||||||
$outfit_addons = false;
|
$outfit_addons = false;
|
||||||
$outfit = '';
|
|
||||||
if (setting('core.online_outfit')) {
|
|
||||||
$outfit = ', lookbody, lookfeet, lookhead, looklegs, looktype';
|
$outfit = ', lookbody, lookfeet, lookhead, looklegs, looktype';
|
||||||
if($db->hasColumn('players', 'lookaddons')) {
|
if($db->hasColumn('players', 'lookaddons')) {
|
||||||
$outfit .= ', lookaddons';
|
$outfit .= ', lookaddons';
|
||||||
$outfit_addons = true;
|
$outfit_addons = true;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
$vocs = [];
|
$vocations = array_map(function ($name) {
|
||||||
if (setting('core.online_vocations')) {
|
return 0;
|
||||||
foreach($config['vocations'] as $id => $name) {
|
}, setting('core.vocations'));
|
||||||
$vocs[$id] = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if($db->hasTable('players_online')) // tfs 1.0
|
if($db->hasTable('players_online')) // tfs 1.0
|
||||||
$playersOnline = $db->query('SELECT `accounts`.`country`, `players`.`name`, `players`.`level`, `players`.`vocation`' . $outfit . ', `' . $skull_time . '` as `skulltime`, `' . $skull_type . '` as `skull` FROM `accounts`, `players`, `players_online` WHERE `players`.`id` = `players_online`.`player_id` AND `accounts`.`id` = `players`.`account_id` ORDER BY ' . $orderSql);
|
$playersOnline = $db->query('SELECT `accounts`.`country`, `players`.`name`, `players`.`level`, `players`.`vocation`' . $outfit . ', `' . $skull_time . '` as `skulltime`, `' . $skull_type . '` as `skull` FROM `accounts`, `players`, `players_online` WHERE `players`.`id` = `players_online`.`player_id` AND `accounts`.`id` = `players`.`account_id` ORDER BY ' . $orderSql);
|
||||||
else
|
else
|
||||||
$playersOnline = $db->query('SELECT `accounts`.`country`, `players`.`name`, `players`.`level`, `players`.`vocation`' . $outfit . ', ' . $promotion . ' `' . $skull_time . '` as `skulltime`, `' . $skull_type . '` as `skull` FROM `accounts`, `players` WHERE `players`.`online` > 0 AND `accounts`.`id` = `players`.`account_id` ORDER BY ' . $orderSql);
|
$playersOnline = $db->query('SELECT `accounts`.`country`, `players`.`name`, `players`.`level`, `players`.`vocation`' . $outfit . ', ' . $promotion . ' `' . $skull_time . '` as `skulltime`, `' . $skull_type . '` as `skull` FROM `accounts`, `players` WHERE `players`.`online` > 0 AND `accounts`.`id` = `players`.`account_id` ORDER BY ' . $orderSql);
|
||||||
|
|
||||||
$players_data = [];
|
$settingVocations = setting('core.vocations');
|
||||||
$players = 0;
|
$settingVocationsAmount = setting('core.vocations_amount');
|
||||||
$data = '';
|
|
||||||
foreach($playersOnline as $player) {
|
$players = [];
|
||||||
$skull = '';
|
foreach($playersOnline as $player) {
|
||||||
if (setting('core.online_skulls'))
|
$skull = '';
|
||||||
{
|
if($player['skulltime'] > 0) {
|
||||||
if($player['skulltime'] > 0)
|
if($player['skull'] == 3) {
|
||||||
{
|
|
||||||
if($player['skull'] == 3)
|
|
||||||
$skull = ' <img style="border: 0;" src="images/white_skull.gif"/>';
|
$skull = ' <img style="border: 0;" src="images/white_skull.gif"/>';
|
||||||
elseif($player['skull'] == 4)
|
}
|
||||||
|
elseif($player['skull'] == 4) {
|
||||||
$skull = ' <img style="border: 0;" src="images/red_skull.gif"/>';
|
$skull = ' <img style="border: 0;" src="images/red_skull.gif"/>';
|
||||||
elseif($player['skull'] == 5)
|
}
|
||||||
|
elseif($player['skull'] == 5) {
|
||||||
$skull = ' <img style="border: 0;" src="images/black_skull.gif"/>';
|
$skull = ' <img style="border: 0;" src="images/black_skull.gif"/>';
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(isset($player['promotion'])) {
|
|
||||||
if((int)$player['promotion'] > 0)
|
|
||||||
$player['vocation'] += ($player['promotion'] * $config['vocations_amount']);
|
|
||||||
}
|
|
||||||
|
|
||||||
$players_data[] = array(
|
|
||||||
'name' => getPlayerLink($player['name']),
|
|
||||||
'player' => $player,
|
|
||||||
'level' => $player['level'],
|
|
||||||
'vocation' => $config['vocations'][$player['vocation']],
|
|
||||||
'country_image' => setting('core.account_country') ? getFlagImage($player['country']) : null,
|
|
||||||
'outfit' => setting('core.online_outfit') ? setting('core.outfit_images_url') . '?id=' . $player['looktype'] . ($outfit_addons ? '&addons=' . $player['lookaddons'] : '') . '&head=' . $player['lookhead'] . '&body=' . $player['lookbody'] . '&legs=' . $player['looklegs'] . '&feet=' . $player['lookfeet'] : null
|
|
||||||
);
|
|
||||||
|
|
||||||
if (setting('core.online_vocations')) {
|
|
||||||
$vocs[($player['vocation'] > $config['vocations_amount'] ? $player['vocation'] - $config['vocations_amount'] : $player['vocation'])]++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$record = '';
|
|
||||||
if(count($players_data) > 0) {
|
|
||||||
if( setting('core.online_record')) {
|
|
||||||
$result = null;
|
|
||||||
$timestamp = false;
|
|
||||||
if($db->hasTable('server_record')) {
|
|
||||||
$timestamp = true;
|
|
||||||
$result = ServerRecord::where('world_id', $config['lua']['worldId'])->orderByDesc('record')->first()->toArray();
|
|
||||||
} else if($db->hasTable('server_config')) { // tfs 1.0
|
|
||||||
$row = ServerConfig::where('config', 'players_record')->first();
|
|
||||||
if ($row) {
|
|
||||||
$result = ['record' => $row->value];
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if($result) {
|
if(isset($player['promotion'])) {
|
||||||
$record = $result['record'] . ' player' . ($result['record'] > 1 ? 's' : '') . ($timestamp ? ' (on ' . date("M d Y, H:i:s", $result['timestamp']) . ')' : '');
|
if((int)$player['promotion'] > 0)
|
||||||
|
$player['vocation'] += ($player['promotion'] * $settingVocationsAmount);
|
||||||
|
}
|
||||||
|
|
||||||
|
$players[] = array(
|
||||||
|
'name' => getPlayerLink($player['name']),
|
||||||
|
'player' => $player,
|
||||||
|
'level' => $player['level'],
|
||||||
|
'vocation' => $settingVocations[$player['vocation']],
|
||||||
|
'skull' => $skull,
|
||||||
|
'country_image' => getFlagImage($player['country']),
|
||||||
|
'outfit' => setting('core.outfit_images_url') . '?id=' . $player['looktype'] . ($outfit_addons ? '&addons=' . $player['lookaddons'] : '') . '&head=' . $player['lookhead'] . '&body=' . $player['lookbody'] . '&legs=' . $player['looklegs'] . '&feet=' . $player['lookfeet'],
|
||||||
|
);
|
||||||
|
|
||||||
|
$vocations[($player['vocation'] > $settingVocationsAmount ? $player['vocation'] - $settingVocationsAmount : $player['vocation'])]++;
|
||||||
|
}
|
||||||
|
|
||||||
|
$record = '';
|
||||||
|
if(count($players) > 0) {
|
||||||
|
if( setting('core.online_record')) {
|
||||||
|
$result = null;
|
||||||
|
$timestamp = false;
|
||||||
|
if($db->hasTable('server_record')) {
|
||||||
|
$timestamp = $db->hasColumn('server_record', 'timestamp');
|
||||||
|
$serverRecordQuery = ServerRecord::query();
|
||||||
|
|
||||||
|
if ($db->hasColumn('server_record', 'world_id')) {
|
||||||
|
$serverRecordQuery->where('world_id', configLua('worldId'));
|
||||||
|
}
|
||||||
|
|
||||||
|
$result = $serverRecordQuery->orderByDesc('record')->first();
|
||||||
|
if ($result) {
|
||||||
|
$result = $result->toArray();
|
||||||
|
}
|
||||||
|
} else if($db->hasTable('server_config')) { // tfs 1.0
|
||||||
|
$row = ServerConfig::where('config', 'players_record')->first();
|
||||||
|
if ($row) {
|
||||||
|
$result = ['record' => $row->value];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if($result) {
|
||||||
|
$record = $result['record'] . ' player' . ($result['record'] > 1 ? 's' : '') . ($timestamp ? ' (on ' . date("M d Y, H:i:s", $result['timestamp']) . ')' : '');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
return [
|
||||||
|
'players' => $players,
|
||||||
|
'record' => $record,
|
||||||
|
'vocations' => $vocations,
|
||||||
|
];
|
||||||
|
});
|
||||||
|
|
||||||
$twig->display('online.html.twig', array(
|
$twig->display('online.html.twig', array(
|
||||||
'players' => $players_data,
|
'players' => $cached['players'],
|
||||||
'record' => $record,
|
'record' => $cached['record'],
|
||||||
'vocs' => $vocs,
|
'vocations' => $cached['vocations'],
|
||||||
|
'vocs' => $cached['vocations'], // deprecated, to be removed
|
||||||
'order' => $order,
|
'order' => $order,
|
||||||
));
|
));
|
||||||
|
|
||||||
//search bar
|
// search bar
|
||||||
$twig->display('characters.form.html.twig');
|
$twig->display('characters.form.html.twig');
|
||||||
?>
|
|
||||||
|
@@ -94,19 +94,30 @@ $dispatcher = FastRoute\cachedDispatcher(function (FastRoute\RouteCollector $r)
|
|||||||
$routesFinal[] = ['*', $page, '__database__/' . $page, 100];
|
$routesFinal[] = ['*', $page, '__database__/' . $page, 100];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$routes = require SYSTEM . 'routes.php';
|
||||||
Plugins::clearWarnings();
|
Plugins::clearWarnings();
|
||||||
foreach (Plugins::getRoutes() as $route) {
|
|
||||||
$routesFinal[] = [$route[0], $route[1], $route[2], $route[3] ?? 1000];
|
foreach (Plugins::getRoutes() as $pluginRoute) {
|
||||||
|
|
||||||
|
$routesFinal[] = [$pluginRoute[0], $pluginRoute[1], $pluginRoute[2], $pluginRoute[3] ?? 1000];
|
||||||
|
|
||||||
|
// Possibility to override routes with plugins pages, like characters.php
|
||||||
|
foreach ($routes as &$route) {
|
||||||
|
if (str_contains($pluginRoute[2], 'pages/' . $route[2])) {
|
||||||
|
$route[2] = $pluginRoute[2];
|
||||||
|
}
|
||||||
|
}
|
||||||
/*
|
/*
|
||||||
echo '<pre>';
|
echo '<pre>';
|
||||||
var_dump($route[1], $route[3], $route[2]);
|
var_dump($pluginRoute[1], $pluginRoute[3], $pluginRoute[2]);
|
||||||
echo '/<pre>';
|
echo '/<pre>';
|
||||||
*/
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
$routes = require SYSTEM . 'routes.php';
|
|
||||||
foreach ($routes as $route) {
|
foreach ($routes as $route) {
|
||||||
if (!str_contains($route[2], '__redirect__') && !str_contains($route[2], '__database__')) {
|
if (!str_contains($route[2], '__redirect__') && !str_contains($route[2], '__database__')
|
||||||
|
&& !str_contains($route[2], 'plugins/')
|
||||||
|
) {
|
||||||
if (!is_file(BASE . 'system/pages/' . $route[2])) {
|
if (!is_file(BASE . 'system/pages/' . $route[2])) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@@ -28,6 +28,15 @@ if (!IS_CLI) {
|
|||||||
$siteURL = $serverUrl . $baseDir;
|
$siteURL = $serverUrl . $baseDir;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$donateColumnOptions = [
|
||||||
|
'premium_points' => 'Premium Points',
|
||||||
|
'coins' => 'Coins',
|
||||||
|
];
|
||||||
|
|
||||||
|
if (defined('HAS_ACCOUNT_COINS_TRANSFERABLE') && (HAS_ACCOUNT_COINS_TRANSFERABLE || HAS_ACCOUNT_TRANSFERABLE_COINS)) {
|
||||||
|
$donateColumnOptions[ACCOUNT_COINS_TRANSFERABLE_COLUMN] = 'Coins Transferable';
|
||||||
|
}
|
||||||
|
|
||||||
return [
|
return [
|
||||||
'name' => 'MyAAC',
|
'name' => 'MyAAC',
|
||||||
'settings' => [
|
'settings' => [
|
||||||
@@ -694,7 +703,14 @@ Sent by MyAAC,<br/>
|
|||||||
'name' => 'Default Account Coins',
|
'name' => 'Default Account Coins',
|
||||||
'type' => 'number',
|
'type' => 'number',
|
||||||
'desc' => 'Default coins on new account',
|
'desc' => 'Default coins on new account',
|
||||||
'hidden' => ($db && !$db->hasColumn('accounts', 'coins')),
|
'hidden' => ($db && !HAS_ACCOUNT_COINS),
|
||||||
|
'default' => 0,
|
||||||
|
],
|
||||||
|
'account_coins_transferable' => [
|
||||||
|
'name' => 'Default Account Transferable Coins',
|
||||||
|
'type' => 'number',
|
||||||
|
'desc' => 'Default transferable coins on new account',
|
||||||
|
'hidden' => ($db && !HAS_ACCOUNT_COINS_TRANSFERABLE && !HAS_ACCOUNT_TRANSFERABLE_COINS),
|
||||||
'default' => 0,
|
'default' => 0,
|
||||||
],
|
],
|
||||||
'account_mail_change' => [
|
'account_mail_change' => [
|
||||||
@@ -1062,6 +1078,12 @@ Sent by MyAAC,<br/>
|
|||||||
'desc' => 'How often to update highscores from database in minutes. Too low may slow down your website.<br/>0 to disable.',
|
'desc' => 'How often to update highscores from database in minutes. Too low may slow down your website.<br/>0 to disable.',
|
||||||
'default' => 15,
|
'default' => 15,
|
||||||
],
|
],
|
||||||
|
'highscores_skills_box' => [
|
||||||
|
'name' => 'Display Skills Box',
|
||||||
|
'type' => 'boolean',
|
||||||
|
'desc' => 'show "Choose a skill" box on the highscores (allowing peoples to sort highscores by skill)?',
|
||||||
|
'default' => true,
|
||||||
|
],
|
||||||
'highscores_vocation_box' => [
|
'highscores_vocation_box' => [
|
||||||
'name' => 'Display Vocation Box',
|
'name' => 'Display Vocation Box',
|
||||||
'type' => 'boolean',
|
'type' => 'boolean',
|
||||||
@@ -1074,6 +1096,12 @@ Sent by MyAAC,<br/>
|
|||||||
'desc' => 'Show player vocation under his nickname?',
|
'desc' => 'Show player vocation under his nickname?',
|
||||||
'default' => true,
|
'default' => true,
|
||||||
],
|
],
|
||||||
|
'highscores_online_status' => [
|
||||||
|
'name' => 'Display Online Status',
|
||||||
|
'type' => 'boolean',
|
||||||
|
'desc' => 'Show player status as red (offline) or green (online)',
|
||||||
|
'default' => false,
|
||||||
|
],
|
||||||
'highscores_frags' => [
|
'highscores_frags' => [
|
||||||
'name' => 'Display Top Frags',
|
'name' => 'Display Top Frags',
|
||||||
'type' => 'boolean',
|
'type' => 'boolean',
|
||||||
@@ -1228,6 +1256,14 @@ Sent by MyAAC,<br/>
|
|||||||
'type' => 'section',
|
'type' => 'section',
|
||||||
'title' => 'Online Page'
|
'title' => 'Online Page'
|
||||||
],
|
],
|
||||||
|
'online_cache_ttl' => [
|
||||||
|
'name' => 'Online Cache TTL (in minutes)',
|
||||||
|
'type' => 'number',
|
||||||
|
'min' => 0,
|
||||||
|
'desc' => 'How often to update online list from database in minutes. Too low may slow down your website.' . PHP_EOL .
|
||||||
|
'0 to disable.',
|
||||||
|
'default' => 15,
|
||||||
|
],
|
||||||
'online_record' => [
|
'online_record' => [
|
||||||
'name' => 'Display Players Record',
|
'name' => 'Display Players Record',
|
||||||
'type' => 'boolean',
|
'type' => 'boolean',
|
||||||
@@ -1268,7 +1304,7 @@ Sent by MyAAC,<br/>
|
|||||||
'name' => 'Data Center',
|
'name' => 'Data Center',
|
||||||
'type' => 'text',
|
'type' => 'text',
|
||||||
'desc' => 'Server Location, will be shown on online page',
|
'desc' => 'Server Location, will be shown on online page',
|
||||||
'default' => 'Frankfurt - Germany',
|
'default' => 'Poland - Warsaw',
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
'type' => 'section',
|
'type' => 'section',
|
||||||
@@ -1571,13 +1607,14 @@ Sent by MyAAC,<br/>
|
|||||||
'name' => 'Donate Column',
|
'name' => 'Donate Column',
|
||||||
'type' => 'options',
|
'type' => 'options',
|
||||||
'desc' => 'What to give to player after donation - what column in accounts table to use.',
|
'desc' => 'What to give to player after donation - what column in accounts table to use.',
|
||||||
'options' => ['premium_points' => 'Premium Points', 'coins' => 'Coins'],
|
'options' => $donateColumnOptions,
|
||||||
'default' => 'premium_points',
|
'default' => 'premium_points',
|
||||||
'callbacks' => [
|
'callbacks' => [
|
||||||
'beforeSave' => function($key, $value, &$errorMessage) {
|
'beforeSave' => function($key, $value, &$errorMessage) {
|
||||||
global $db;
|
global $db;
|
||||||
if ($value == 'coins' && !$db->hasColumn('accounts', 'coins')) {
|
|
||||||
$errorMessage = "Shop: Donate Column: Cannot set column to coins, because it doesn't exist in database.";
|
if (!$db->hasColumn('accounts', $value)) {
|
||||||
|
$errorMessage = "Shop: Donate Column: Cannot set column to $value, because it doesn't exist in database.";
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
|
@@ -106,7 +106,7 @@ class Cache
|
|||||||
public static function remember($key, $ttl, $callback)
|
public static function remember($key, $ttl, $callback)
|
||||||
{
|
{
|
||||||
$cache = self::getInstance();
|
$cache = self::getInstance();
|
||||||
if (!$cache->enabled()) {
|
if (!$cache->enabled() || $ttl == 0) {
|
||||||
return $callback();
|
return $callback();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
namespace MyAAC\Commands;
|
namespace MyAAC\Commands;
|
||||||
|
|
||||||
|
use MyAAC\Cache\Cache;
|
||||||
use MyAAC\Hooks;
|
use MyAAC\Hooks;
|
||||||
use Symfony\Component\Console\Input\InputInterface;
|
use Symfony\Component\Console\Input\InputInterface;
|
||||||
use Symfony\Component\Console\Output\OutputInterface;
|
use Symfony\Component\Console\Output\OutputInterface;
|
||||||
@@ -17,10 +18,7 @@ class CacheClearCommand extends Command
|
|||||||
|
|
||||||
protected function execute(InputInterface $input, OutputInterface $output): int
|
protected function execute(InputInterface $input, OutputInterface $output): int
|
||||||
{
|
{
|
||||||
global $hooks;
|
require SYSTEM . 'init.php';
|
||||||
$hooks = new Hooks();
|
|
||||||
$hooks->load();
|
|
||||||
$hooks->trigger(HOOK_INIT);
|
|
||||||
|
|
||||||
$io = new SymfonyStyle($input, $output);
|
$io = new SymfonyStyle($input, $output);
|
||||||
|
|
||||||
@@ -29,6 +27,13 @@ class CacheClearCommand extends Command
|
|||||||
return Command::FAILURE;
|
return Command::FAILURE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$cacheEngine = config('cache_engine') == 'auto' ?
|
||||||
|
Cache::detect() : config('cache_engine');
|
||||||
|
|
||||||
|
if (config('env') !== 'dev' && $cacheEngine == 'apcu') {
|
||||||
|
$io->warning('APCu cache cannot be cleared in CLI. Please visit the Admin Panel and clear there.');
|
||||||
|
}
|
||||||
|
|
||||||
$io->success('Cache cleared');
|
$io->success('Cache cleared');
|
||||||
return Command::SUCCESS;
|
return Command::SUCCESS;
|
||||||
}
|
}
|
||||||
|
@@ -12,9 +12,10 @@ class MailSendCommand extends Command
|
|||||||
{
|
{
|
||||||
protected function configure(): void
|
protected function configure(): void
|
||||||
{
|
{
|
||||||
$this->setName('mail:send')
|
$this->setName('email:send')
|
||||||
|
->setAliases(['mail:send'])
|
||||||
->setDescription('This command sends E-Mail to single user. Message can be provided as follows: ' . PHP_EOL
|
->setDescription('This command sends E-Mail to single user. Message can be provided as follows: ' . PHP_EOL
|
||||||
. ' echo "Hello World" | php sa email:send --subject="This is the subject" test@test.com')
|
. ' echo "Hello World" | php aac email:send --subject="This is the subject" test@test.com')
|
||||||
->addArgument('recipient', InputArgument::REQUIRED, 'Email, Account Name, Account id or Player Name')
|
->addArgument('recipient', InputArgument::REQUIRED, 'Email, Account Name, Account id or Player Name')
|
||||||
->addOption('subject', 's', InputOption::VALUE_REQUIRED, 'Subject');
|
->addOption('subject', 's', InputOption::VALUE_REQUIRED, 'Subject');
|
||||||
}
|
}
|
||||||
|
@@ -45,6 +45,22 @@ class MigrateRunCommand extends Command
|
|||||||
|
|
||||||
$down = $input->getOption('down') ?? false;
|
$down = $input->getOption('down') ?? false;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sort according to $down option.
|
||||||
|
* Do we really want it?
|
||||||
|
* Or should we use order provided by user,
|
||||||
|
* even when it's not sorted correctly?
|
||||||
|
* Leaving it for consideration.
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
if ($down) {
|
||||||
|
rsort($ids);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
sort($ids);
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
foreach ($ids as $id) {
|
foreach ($ids as $id) {
|
||||||
$this->executeMigration($id, $io, !$down);
|
$this->executeMigration($id, $io, !$down);
|
||||||
}
|
}
|
||||||
|
36
system/src/Commands/PluginDisableCommand.php
Normal file
36
system/src/Commands/PluginDisableCommand.php
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace MyAAC\Commands;
|
||||||
|
|
||||||
|
use MyAAC\Plugins;
|
||||||
|
use Symfony\Component\Console\Input\InputArgument;
|
||||||
|
use Symfony\Component\Console\Input\InputInterface;
|
||||||
|
use Symfony\Component\Console\Output\OutputInterface;
|
||||||
|
use Symfony\Component\Console\Style\SymfonyStyle;
|
||||||
|
|
||||||
|
class PluginDisableCommand extends Command
|
||||||
|
{
|
||||||
|
protected function configure(): void
|
||||||
|
{
|
||||||
|
$this->setName('plugin:disable')
|
||||||
|
->setDescription('This command disables plugin')
|
||||||
|
->addArgument('plugin-name', InputArgument::REQUIRED, 'Plugin that you want to disable');
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function execute(InputInterface $input, OutputInterface $output): int
|
||||||
|
{
|
||||||
|
require SYSTEM . 'init.php';
|
||||||
|
|
||||||
|
$io = new SymfonyStyle($input, $output);
|
||||||
|
|
||||||
|
$pluginName = $input->getArgument('plugin-name');
|
||||||
|
|
||||||
|
if (!Plugins::disable($pluginName)) {
|
||||||
|
$io->error('Error while disabling plugin ' . $pluginName . ': ' . Plugins::getError());
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
$io->success('Successfully disabled plugin ' . $pluginName);
|
||||||
|
return Command::SUCCESS;
|
||||||
|
}
|
||||||
|
}
|
36
system/src/Commands/PluginEnableCommand.php
Normal file
36
system/src/Commands/PluginEnableCommand.php
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace MyAAC\Commands;
|
||||||
|
|
||||||
|
use MyAAC\Plugins;
|
||||||
|
use Symfony\Component\Console\Input\InputArgument;
|
||||||
|
use Symfony\Component\Console\Input\InputInterface;
|
||||||
|
use Symfony\Component\Console\Output\OutputInterface;
|
||||||
|
use Symfony\Component\Console\Style\SymfonyStyle;
|
||||||
|
|
||||||
|
class PluginEnableCommand extends Command
|
||||||
|
{
|
||||||
|
protected function configure(): void
|
||||||
|
{
|
||||||
|
$this->setName('plugin:enable')
|
||||||
|
->setDescription('This command enables plugin')
|
||||||
|
->addArgument('plugin-name', InputArgument::REQUIRED, 'Plugin that you want to enable');
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function execute(InputInterface $input, OutputInterface $output): int
|
||||||
|
{
|
||||||
|
require SYSTEM . 'init.php';
|
||||||
|
|
||||||
|
$io = new SymfonyStyle($input, $output);
|
||||||
|
|
||||||
|
$pluginName = $input->getArgument('plugin-name');
|
||||||
|
|
||||||
|
if (!Plugins::enable($pluginName)) {
|
||||||
|
$io->error('Error while enabling plugin ' . $pluginName . ': ' . Plugins::getError());
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
$io->success('Successfully enabled plugin ' . $pluginName);
|
||||||
|
return Command::SUCCESS;
|
||||||
|
}
|
||||||
|
}
|
@@ -8,11 +8,12 @@ use Symfony\Component\Console\Input\InputInterface;
|
|||||||
use Symfony\Component\Console\Output\OutputInterface;
|
use Symfony\Component\Console\Output\OutputInterface;
|
||||||
use Symfony\Component\Console\Style\SymfonyStyle;
|
use Symfony\Component\Console\Style\SymfonyStyle;
|
||||||
|
|
||||||
class PluginInstallInstallCommand extends Command
|
class PluginSetupCommand extends Command
|
||||||
{
|
{
|
||||||
protected function configure(): void
|
protected function configure(): void
|
||||||
{
|
{
|
||||||
$this->setName('plugin:install:install')
|
$this->setName('plugin:setup')
|
||||||
|
->setAliases(['plugin:install:install'])
|
||||||
->setDescription('This command executes the "install" part of the plugin')
|
->setDescription('This command executes the "install" part of the plugin')
|
||||||
->addArgument('plugin', InputArgument::REQUIRED, 'Plugin name');
|
->addArgument('plugin', InputArgument::REQUIRED, 'Plugin name');
|
||||||
}
|
}
|
40
system/src/Commands/PluginUninstallCommand.php
Normal file
40
system/src/Commands/PluginUninstallCommand.php
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace MyAAC\Commands;
|
||||||
|
|
||||||
|
use MyAAC\Plugins;
|
||||||
|
use Symfony\Component\Console\Input\InputArgument;
|
||||||
|
use Symfony\Component\Console\Input\InputInterface;
|
||||||
|
use Symfony\Component\Console\Output\OutputInterface;
|
||||||
|
use Symfony\Component\Console\Style\SymfonyStyle;
|
||||||
|
|
||||||
|
class PluginUninstallCommand extends Command
|
||||||
|
{
|
||||||
|
protected function configure(): void
|
||||||
|
{
|
||||||
|
$this->setName('plugin:uninstall')
|
||||||
|
->setDescription('This command uninstalls plugin')
|
||||||
|
->addArgument('plugin-name', InputArgument::REQUIRED, 'Plugin that you want to uninstall');
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function execute(InputInterface $input, OutputInterface $output): int
|
||||||
|
{
|
||||||
|
require SYSTEM . 'init.php';
|
||||||
|
|
||||||
|
$io = new SymfonyStyle($input, $output);
|
||||||
|
|
||||||
|
$pluginName = $input->getArgument('plugin-name');
|
||||||
|
|
||||||
|
if (!Plugins::uninstall($pluginName)) {
|
||||||
|
$io->error('Error while uninstalling plugin ' . $pluginName . ': ' . Plugins::getError());
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach(Plugins::getWarnings() as $warning) {
|
||||||
|
$io->warning($warning);
|
||||||
|
}
|
||||||
|
|
||||||
|
$io->success('Successfully uninstalled plugin ' . $pluginName);
|
||||||
|
return Command::SUCCESS;
|
||||||
|
}
|
||||||
|
}
|
@@ -3,6 +3,7 @@
|
|||||||
namespace MyAAC\Commands;
|
namespace MyAAC\Commands;
|
||||||
|
|
||||||
use MyAAC\Models\Settings as SettingsModel;
|
use MyAAC\Models\Settings as SettingsModel;
|
||||||
|
use MyAAC\Plugins;
|
||||||
use MyAAC\Settings;
|
use MyAAC\Settings;
|
||||||
use Symfony\Component\Console\Input\InputArgument;
|
use Symfony\Component\Console\Input\InputArgument;
|
||||||
use Symfony\Component\Console\Input\InputInterface;
|
use Symfony\Component\Console\Input\InputInterface;
|
||||||
@@ -34,7 +35,14 @@ class SettingsResetCommand extends Command
|
|||||||
return Command::FAILURE;
|
return Command::FAILURE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!$name) {
|
// find by plugin name
|
||||||
|
foreach (Plugins::getAllPluginsSettings() as $key => $setting) {
|
||||||
|
if ($setting['pluginFilename'] === $name) {
|
||||||
|
$name = $key;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (empty($name)) {
|
||||||
SettingsModel::truncate();
|
SettingsModel::truncate();
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@@ -3,6 +3,7 @@
|
|||||||
namespace MyAAC\Commands;
|
namespace MyAAC\Commands;
|
||||||
|
|
||||||
use MyAAC\Models\Settings as SettingsModel;
|
use MyAAC\Models\Settings as SettingsModel;
|
||||||
|
use MyAAC\Plugins;
|
||||||
use MyAAC\Settings;
|
use MyAAC\Settings;
|
||||||
use Symfony\Component\Console\Input\InputArgument;
|
use Symfony\Component\Console\Input\InputArgument;
|
||||||
use Symfony\Component\Console\Input\InputInterface;
|
use Symfony\Component\Console\Input\InputInterface;
|
||||||
@@ -17,7 +18,7 @@ class SettingsSetCommand extends Command
|
|||||||
->setDescription('Updates the setting specified by argument in database')
|
->setDescription('Updates the setting specified by argument in database')
|
||||||
->addArgument('key',
|
->addArgument('key',
|
||||||
InputArgument::REQUIRED,
|
InputArgument::REQUIRED,
|
||||||
'Setting name/key'
|
'Setting key in format name.key'
|
||||||
)
|
)
|
||||||
->addArgument('value',
|
->addArgument('value',
|
||||||
InputArgument::REQUIRED,
|
InputArgument::REQUIRED,
|
||||||
@@ -34,6 +35,18 @@ class SettingsSetCommand extends Command
|
|||||||
$key = $input->getArgument('key');
|
$key = $input->getArgument('key');
|
||||||
$value = $input->getArgument('value');
|
$value = $input->getArgument('value');
|
||||||
|
|
||||||
|
// format settings_name.key
|
||||||
|
// example: core.template
|
||||||
|
$explode = explode('.', $key);
|
||||||
|
|
||||||
|
// find by plugin name
|
||||||
|
foreach (Plugins::getAllPluginsSettings() as $_key => $setting) {
|
||||||
|
if ($setting['pluginFilename'] === $explode[0]) {
|
||||||
|
$explode[0] = $_key;
|
||||||
|
$key = implode('.', $explode);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
$settings = Settings::getInstance();
|
$settings = Settings::getInstance();
|
||||||
$settings->clearCache();
|
$settings->clearCache();
|
||||||
$settings->load();
|
$settings->load();
|
||||||
@@ -44,10 +57,6 @@ class SettingsSetCommand extends Command
|
|||||||
return Command::FAILURE;
|
return Command::FAILURE;
|
||||||
}
|
}
|
||||||
|
|
||||||
// format plugin_name.key
|
|
||||||
// example: core.template
|
|
||||||
$explode = explode('.', $key);
|
|
||||||
|
|
||||||
$settings->updateInDatabase($explode[0], $explode[1], $value);
|
$settings->updateInDatabase($explode[0], $explode[1], $value);
|
||||||
$settings->clearCache();
|
$settings->clearCache();
|
||||||
|
|
||||||
|
@@ -53,12 +53,9 @@ class Account extends Model {
|
|||||||
|
|
||||||
public function getIsPremiumAttribute()
|
public function getIsPremiumAttribute()
|
||||||
{
|
{
|
||||||
global $config;
|
if(isset($this->premium_ends_at)) {
|
||||||
if(isset($config['lua']['freePremium']) && getBoolean($config['lua']['freePremium'])) return true;
|
return $this->premium_ends_at > time();
|
||||||
|
}
|
||||||
if(isset($this->premium_ends_at)) {
|
|
||||||
return $this->premium_ends_at > time();
|
|
||||||
}
|
|
||||||
|
|
||||||
if(isset($this->premend)) {
|
if(isset($this->premend)) {
|
||||||
return $this->premend > time();
|
return $this->premend > time();
|
||||||
|
@@ -9,6 +9,10 @@ class PlayerOnline extends Model {
|
|||||||
|
|
||||||
public $timestamps = false;
|
public $timestamps = false;
|
||||||
|
|
||||||
|
protected $fillable = [
|
||||||
|
'player_id',
|
||||||
|
];
|
||||||
|
|
||||||
public function player()
|
public function player()
|
||||||
{
|
{
|
||||||
return $this->belongsTo(Player::class);
|
return $this->belongsTo(Player::class);
|
||||||
|
@@ -532,193 +532,192 @@ class Plugins {
|
|||||||
self::$plugin_json = $plugin_json;
|
self::$plugin_json = $plugin_json;
|
||||||
if ($plugin_json == null) {
|
if ($plugin_json == null) {
|
||||||
self::$warnings[] = 'Cannot load ' . $file_name . '. File might be not a valid json code.';
|
self::$warnings[] = 'Cannot load ' . $file_name . '. File might be not a valid json code.';
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
else {
|
|
||||||
$continue = true;
|
|
||||||
|
|
||||||
if(!isset($plugin_json['name']) || empty(trim($plugin_json['name']))) {
|
$continue = true;
|
||||||
self::$error = 'Plugin "name" tag is not set.';
|
|
||||||
|
if(!isset($plugin_json['name']) || empty(trim($plugin_json['name']))) {
|
||||||
|
self::$error = 'Plugin "name" tag is not set.';
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!isset($plugin_json['version']) || empty(trim($plugin_json['version']))) {
|
||||||
|
self::$warnings[] = 'Plugin "version" tag is not set.';
|
||||||
|
}
|
||||||
|
|
||||||
|
if(isset($plugin_json['require'])) {
|
||||||
|
$require = $plugin_json['require'];
|
||||||
|
|
||||||
|
$myaac_satified = true;
|
||||||
|
if(isset($require['myaac_'])) {
|
||||||
|
$require_myaac = $require['myaac_'];
|
||||||
|
if(!Semver::satisfies(MYAAC_VERSION, $require_myaac)) {
|
||||||
|
$myaac_satified = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if(isset($require['myaac'])) {
|
||||||
|
$require_myaac = $require['myaac'];
|
||||||
|
if(version_compare(MYAAC_VERSION, $require_myaac, '<')) {
|
||||||
|
$myaac_satified = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!$myaac_satified) {
|
||||||
|
self::$error = "Your AAC version doesn't meet the requirement of this plugin. Required version is: " . $require_myaac . ", and you're using version " . MYAAC_VERSION . ".";
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!isset($plugin_json['version']) || empty(trim($plugin_json['version']))) {
|
$php_satisfied = true;
|
||||||
self::$warnings[] = 'Plugin "version" tag is not set.';
|
if(isset($require['php_'])) {
|
||||||
|
$require_php = $require['php_'];
|
||||||
|
if(!Semver::satisfies(phpversion(), $require_php)) {
|
||||||
|
$php_satisfied = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if(isset($require['php'])) {
|
||||||
|
$require_php = $require['php'];
|
||||||
|
if(version_compare(phpversion(), $require_php, '<')) {
|
||||||
|
$php_satisfied = false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(isset($plugin_json['require'])) {
|
if(!$php_satisfied) {
|
||||||
$require = $plugin_json['require'];
|
self::$error = "Your PHP version doesn't meet the requirement of this plugin. Required version is: " . $require_php . ", and you're using version " . phpversion() . ".";
|
||||||
|
$continue = false;
|
||||||
|
}
|
||||||
|
|
||||||
$myaac_satified = true;
|
$database_satisfied = true;
|
||||||
if(isset($require['myaac_'])) {
|
if(isset($require['database_'])) {
|
||||||
$require_myaac = $require['myaac_'];
|
$require_database = $require['database_'];
|
||||||
if(!Semver::satisfies(MYAAC_VERSION, $require_myaac)) {
|
if(!Semver::satisfies(DATABASE_VERSION, $require_database)) {
|
||||||
$myaac_satified = false;
|
$database_satisfied = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if(isset($require['database'])) {
|
||||||
|
$require_database = $require['database'];
|
||||||
|
if(version_compare(DATABASE_VERSION, $require_database, '<')) {
|
||||||
|
$database_satisfied = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!$database_satisfied) {
|
||||||
|
self::$error = "Your database version doesn't meet the requirement of this plugin. Required version is: " . $require_database . ", and you're using version " . DATABASE_VERSION . ".";
|
||||||
|
$continue = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if($continue) {
|
||||||
|
foreach($require as $req => $version) {
|
||||||
|
$req = strtolower(trim($req));
|
||||||
|
$version = trim($version);
|
||||||
|
|
||||||
|
if(in_array($req, array('myaac', 'myaac_', 'php', 'php_', 'database', 'database_'))) {
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
else if(isset($require['myaac'])) {
|
|
||||||
$require_myaac = $require['myaac'];
|
|
||||||
if(version_compare(MYAAC_VERSION, $require_myaac, '<')) {
|
|
||||||
$myaac_satified = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(!$myaac_satified) {
|
if(in_array($req, array('php-ext', 'php-extension'))) { // require php extension
|
||||||
self::$error = "Your AAC version doesn't meet the requirement of this plugin. Required version is: " . $require_myaac . ", and you're using version " . MYAAC_VERSION . ".";
|
$tmpDisplayError = false;
|
||||||
return false;
|
$explode = explode(',', $version);
|
||||||
}
|
|
||||||
|
|
||||||
$php_satisfied = true;
|
foreach ($explode as $item) {
|
||||||
if(isset($require['php_'])) {
|
if(!extension_loaded($item)) {
|
||||||
$require_php = $require['php_'];
|
$errors[] = "This plugin requires php extension: " . $item . " to be installed.";
|
||||||
if(!Semver::satisfies(phpversion(), $require_php)) {
|
$tmpDisplayError = true;
|
||||||
$php_satisfied = false;
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
else if(isset($require['php'])) {
|
|
||||||
$require_php = $require['php'];
|
|
||||||
if(version_compare(phpversion(), $require_php, '<')) {
|
|
||||||
$php_satisfied = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(!$php_satisfied) {
|
|
||||||
self::$error = "Your PHP version doesn't meet the requirement of this plugin. Required version is: " . $require_php . ", and you're using version " . phpversion() . ".";
|
|
||||||
$continue = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
$database_satisfied = true;
|
|
||||||
if(isset($require['database_'])) {
|
|
||||||
$require_database = $require['database_'];
|
|
||||||
if(!Semver::satisfies(DATABASE_VERSION, $require_database)) {
|
|
||||||
$database_satisfied = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if(isset($require['database'])) {
|
|
||||||
$require_database = $require['database'];
|
|
||||||
if(version_compare(DATABASE_VERSION, $require_database, '<')) {
|
|
||||||
$database_satisfied = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(!$database_satisfied) {
|
|
||||||
self::$error = "Your database version doesn't meet the requirement of this plugin. Required version is: " . $require_database . ", and you're using version " . DATABASE_VERSION . ".";
|
|
||||||
$continue = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if($continue) {
|
|
||||||
foreach($require as $req => $version) {
|
|
||||||
$req = strtolower(trim($req));
|
|
||||||
$version = trim($version);
|
|
||||||
|
|
||||||
if(in_array($req, array('myaac', 'myaac_', 'php', 'php_', 'database', 'database_'))) {
|
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if(in_array($req, array('php-ext', 'php-extension'))) { // require php extension
|
if ($tmpDisplayError) {
|
||||||
$tmpDisplayError = false;
|
self::$error = implode('<br/>', $errors);
|
||||||
$explode = explode(',', $version);
|
|
||||||
|
|
||||||
foreach ($explode as $item) {
|
|
||||||
if(!extension_loaded($item)) {
|
|
||||||
$errors[] = "This plugin requires php extension: " . $item . " to be installed.";
|
|
||||||
$tmpDisplayError = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($tmpDisplayError) {
|
|
||||||
self::$error = implode('<br/>', $errors);
|
|
||||||
$continue = false;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if($req == 'table') {
|
|
||||||
$tmpDisplayError = false;
|
|
||||||
$explode = explode(',', $version);
|
|
||||||
foreach ($explode as $item) {
|
|
||||||
if(!$db->hasTable($item)) {
|
|
||||||
$errors[] = "This plugin requires table: " . $item . " to exist in the database.";
|
|
||||||
$tmpDisplayError = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($tmpDisplayError) {
|
|
||||||
self::$error = implode('<br/>', $errors);
|
|
||||||
$continue = false;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if($req == 'column') {
|
|
||||||
$tmpDisplayError = false;
|
|
||||||
$explode = explode(',', $version);
|
|
||||||
foreach ($explode as $item) {
|
|
||||||
$tmp = explode('.', $item);
|
|
||||||
|
|
||||||
if(count($tmp) == 2) {
|
|
||||||
if(!$db->hasColumn($tmp[0], $tmp[1])) {
|
|
||||||
$errors[] = "This plugin requires database column: " . $tmp[0] . "." . $tmp[1] . " to exist in database.";
|
|
||||||
$tmpDisplayError = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
self::$warnings[] = "Invalid plugin require column: " . $item;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($tmpDisplayError) {
|
|
||||||
self::$error = implode('<br/>', $errors);
|
|
||||||
$continue = false;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if(strpos($req, 'ext-') !== false) {
|
|
||||||
$tmp = explode('-', $req);
|
|
||||||
if(count($tmp) == 2) {
|
|
||||||
if(!extension_loaded($tmp[1]) || !Semver::satisfies(phpversion($tmp[1]), $version)) {
|
|
||||||
self::$error = "This plugin requires php extension: " . $tmp[1] . ", version " . $version . " to be installed.";
|
|
||||||
$continue = false;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if(!self::is_installed($req, $version)) {
|
|
||||||
self::$error = "This plugin requires another plugin to run correctly. The another plugin is: " . $req . ", with version " . $version . ".";
|
|
||||||
$continue = false;
|
$continue = false;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
else if($req == 'table') {
|
||||||
}
|
$tmpDisplayError = false;
|
||||||
|
$explode = explode(',', $version);
|
||||||
|
foreach ($explode as $item) {
|
||||||
|
if(!$db->hasTable($item)) {
|
||||||
|
$errors[] = "This plugin requires table: " . $item . " to exist in the database.";
|
||||||
|
$tmpDisplayError = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if($continue) {
|
if ($tmpDisplayError) {
|
||||||
if(!$zip->extractTo(BASE)) { // "Real" Install
|
self::$error = implode('<br/>', $errors);
|
||||||
self::$error = 'There was a problem with extracting zip archive to base directory.';
|
$continue = false;
|
||||||
$zip->close();
|
break;
|
||||||
return false;
|
}
|
||||||
}
|
|
||||||
|
|
||||||
$install = $plugin_json['install'] ?? '';
|
|
||||||
if (self::getAutoLoadOption($plugin_json, 'install', true) && is_file(PLUGINS . $pluginFilename . '/install.php')) {
|
|
||||||
$install = 'plugins/' . $pluginFilename . '/install.php';
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!empty($install)) {
|
|
||||||
if (file_exists(BASE . $install)) {
|
|
||||||
$db->revalidateCache();
|
|
||||||
require BASE . $install;
|
|
||||||
$db->revalidateCache();
|
|
||||||
}
|
}
|
||||||
else {
|
else if($req == 'column') {
|
||||||
self::$warnings[] = 'Cannot load install script. Your plugin might be not working correctly.';
|
$tmpDisplayError = false;
|
||||||
|
$explode = explode(',', $version);
|
||||||
|
foreach ($explode as $item) {
|
||||||
|
$tmp = explode('.', $item);
|
||||||
|
|
||||||
|
if(count($tmp) == 2) {
|
||||||
|
if(!$db->hasColumn($tmp[0], $tmp[1])) {
|
||||||
|
$errors[] = "This plugin requires database column: " . $tmp[0] . "." . $tmp[1] . " to exist in database.";
|
||||||
|
$tmpDisplayError = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
self::$warnings[] = "Invalid plugin require column: " . $item;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($tmpDisplayError) {
|
||||||
|
self::$error = implode('<br/>', $errors);
|
||||||
|
$continue = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if(strpos($req, 'ext-') !== false) {
|
||||||
|
$tmp = explode('-', $req);
|
||||||
|
if(count($tmp) == 2) {
|
||||||
|
if(!extension_loaded($tmp[1]) || !Semver::satisfies(phpversion($tmp[1]), $version)) {
|
||||||
|
self::$error = "This plugin requires php extension: " . $tmp[1] . ", version " . $version . " to be installed.";
|
||||||
|
$continue = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if(!self::is_installed($req, $version)) {
|
||||||
|
self::$error = "This plugin requires another plugin to run correctly. The another plugin is: " . $req . ", with version " . $version . ".";
|
||||||
|
$continue = false;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
clearCache();
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
if(!$continue) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!$zip->extractTo(BASE)) { // "Real" Install
|
||||||
|
self::$error = 'There was a problem with extracting zip archive to base directory.';
|
||||||
|
$zip->close();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
$install = $plugin_json['install'] ?? '';
|
||||||
|
if (self::getAutoLoadOption($plugin_json, 'install', true) && is_file(PLUGINS . $pluginFilename . '/install.php')) {
|
||||||
|
$install = 'plugins/' . $pluginFilename . '/install.php';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!empty($install)) {
|
||||||
|
if (file_exists(BASE . $install)) {
|
||||||
|
$db->revalidateCache();
|
||||||
|
require BASE . $install;
|
||||||
|
$db->revalidateCache();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
self::$warnings[] = 'Cannot load install script. Your plugin might be not working correctly.';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
clearCache();
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static function isEnabled($pluginFileName): bool
|
public static function isEnabled($pluginFileName): bool
|
||||||
@@ -781,15 +780,20 @@ class Plugins {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!isset($plugin_json['install'])) {
|
$install = $plugin_json['install'] ?? '';
|
||||||
self::$error = "Plugin doesn't have install options defined. Skipping...";
|
if (self::getAutoLoadOption($plugin_json, 'install', true) && is_file(PLUGINS . $plugin_name . '/install.php')) {
|
||||||
|
$install = 'plugins/' . $plugin_name . '/install.php';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (empty($install)) {
|
||||||
|
self::$error = "This plugin doesn't seem to have install script defined.";
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
global $db;
|
global $db;
|
||||||
if (file_exists(BASE . $plugin_json['install'])) {
|
if (file_exists(BASE . $install)) {
|
||||||
$db->revalidateCache();
|
$db->revalidateCache();
|
||||||
require BASE . $plugin_json['install'];
|
require BASE . $install;
|
||||||
$db->revalidateCache();
|
$db->revalidateCache();
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@@ -7,16 +7,13 @@ use MyAAC\Models\Settings as ModelsSettings;
|
|||||||
|
|
||||||
class Settings implements \ArrayAccess
|
class Settings implements \ArrayAccess
|
||||||
{
|
{
|
||||||
static private $instance;
|
static private ?Settings $instance = null;
|
||||||
private $settingsFile = [];
|
private array $settingsFile = [];
|
||||||
private $settingsDatabase = [];
|
private array $settingsDatabase = [];
|
||||||
private $cache = [];
|
private array $cache = [];
|
||||||
private $valuesAsked = [];
|
private array $valuesAsked = [];
|
||||||
private $errors = [];
|
private array $errors = [];
|
||||||
|
|
||||||
/**
|
|
||||||
* @return Settings
|
|
||||||
*/
|
|
||||||
public static function getInstance(): Settings
|
public static function getInstance(): Settings
|
||||||
{
|
{
|
||||||
if (!self::$instance) {
|
if (!self::$instance) {
|
||||||
@@ -26,28 +23,21 @@ class Settings implements \ArrayAccess
|
|||||||
return self::$instance;
|
return self::$instance;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function load()
|
public function load(): void
|
||||||
{
|
{
|
||||||
$cache = Cache::getInstance();
|
$this->settingsDatabase = Cache::remember('settings', 10 * 60, function () {
|
||||||
if ($cache->enabled()) {
|
$settingsDatabase = [];
|
||||||
$tmp = '';
|
|
||||||
if ($cache->fetch('settings', $tmp)) {
|
$settings = ModelsSettings::all();
|
||||||
$this->settingsDatabase = unserialize($tmp);
|
foreach ($settings as $setting) {
|
||||||
return;
|
$settingsDatabase[$setting->name][$setting->key] = $setting->value;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
$settings = ModelsSettings::all();
|
return $settingsDatabase;
|
||||||
foreach ($settings as $setting) {
|
});
|
||||||
$this->settingsDatabase[$setting->name][$setting->key] = $setting->value;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($cache->enabled()) {
|
|
||||||
$cache->set('settings', serialize($this->settingsDatabase), 600);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function save($pluginName, $values)
|
public function save($pluginName, $values): bool
|
||||||
{
|
{
|
||||||
$this->loadPlugin($pluginName);
|
$this->loadPlugin($pluginName);
|
||||||
|
|
||||||
@@ -104,7 +94,7 @@ class Settings implements \ArrayAccess
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function updateInDatabase($pluginName, $key, $value)
|
public function updateInDatabase($pluginName, $key, $value): void
|
||||||
{
|
{
|
||||||
if (ModelsSettings::where(['name' => $pluginName, 'key' => $key])->exists()) {
|
if (ModelsSettings::where(['name' => $pluginName, 'key' => $key])->exists()) {
|
||||||
ModelsSettings::where(['name' => $pluginName, 'key' => $key])->update(['value' => $value]);
|
ModelsSettings::where(['name' => $pluginName, 'key' => $key])->update(['value' => $value]);
|
||||||
@@ -117,7 +107,7 @@ class Settings implements \ArrayAccess
|
|||||||
$this->clearCache();
|
$this->clearCache();
|
||||||
}
|
}
|
||||||
|
|
||||||
public function deleteFromDatabase($pluginName, $key = null)
|
public function deleteFromDatabase($pluginName, $key = null): void
|
||||||
{
|
{
|
||||||
if (!isset($key)) {
|
if (!isset($key)) {
|
||||||
ModelsSettings::where('name', $pluginName)->delete();
|
ModelsSettings::where('name', $pluginName)->delete();
|
||||||
@@ -217,7 +207,7 @@ class Settings implements \ArrayAccess
|
|||||||
if (isset($setting['hidden']) && $setting['hidden']) {
|
if (isset($setting['hidden']) && $setting['hidden']) {
|
||||||
$value = '';
|
$value = '';
|
||||||
if ($setting['type'] === 'boolean') {
|
if ($setting['type'] === 'boolean') {
|
||||||
$value = ($setting['default'] ? 'true' : 'false');
|
$value = (getBoolean($setting['default']) ? 'true' : 'false');
|
||||||
}
|
}
|
||||||
else if (in_array($setting['type'], ['text', 'number', 'float', 'double', 'email', 'password', 'textarea'])) {
|
else if (in_array($setting['type'], ['text', 'number', 'float', 'double', 'email', 'password', 'textarea'])) {
|
||||||
$value = $setting['default'];
|
$value = $setting['default'];
|
||||||
@@ -230,12 +220,7 @@ class Settings implements \ArrayAccess
|
|||||||
}
|
}
|
||||||
else if ($setting['type'] === 'boolean') {
|
else if ($setting['type'] === 'boolean') {
|
||||||
if(isset($settingsDb[$key])) {
|
if(isset($settingsDb[$key])) {
|
||||||
if($settingsDb[$key] === 'true') {
|
$value = getBoolean($settingsDb[$key]);
|
||||||
$value = true;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
$value = false;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
$value = ($setting['default'] ?? false);
|
$value = ($setting['default'] ?? false);
|
||||||
@@ -383,7 +368,7 @@ class Settings implements \ArrayAccess
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[\ReturnTypeWillChange]
|
#[\ReturnTypeWillChange]
|
||||||
public function offsetSet($offset, $value)
|
public function offsetSet($offset, $value): void
|
||||||
{
|
{
|
||||||
if (is_null($offset)) {
|
if (is_null($offset)) {
|
||||||
throw new \RuntimeException("Settings: You cannot set empty offset with value: $value!");
|
throw new \RuntimeException("Settings: You cannot set empty offset with value: $value!");
|
||||||
@@ -423,7 +408,7 @@ class Settings implements \ArrayAccess
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[\ReturnTypeWillChange]
|
#[\ReturnTypeWillChange]
|
||||||
public function offsetUnset($offset)
|
public function offsetUnset($offset): void
|
||||||
{
|
{
|
||||||
$this->loadPlugin($offset);
|
$this->loadPlugin($offset);
|
||||||
|
|
||||||
@@ -455,7 +440,7 @@ class Settings implements \ArrayAccess
|
|||||||
* @return array|mixed
|
* @return array|mixed
|
||||||
*/
|
*/
|
||||||
#[\ReturnTypeWillChange]
|
#[\ReturnTypeWillChange]
|
||||||
public function offsetGet($offset)
|
public function offsetGet($offset): mixed
|
||||||
{
|
{
|
||||||
// try cache hit
|
// try cache hit
|
||||||
if(isset($this->cache[$offset])) {
|
if(isset($this->cache[$offset])) {
|
||||||
@@ -472,24 +457,22 @@ class Settings implements \ArrayAccess
|
|||||||
if (!isset($this->settingsFile[$pluginKeyName]['settings'])) {
|
if (!isset($this->settingsFile[$pluginKeyName]['settings'])) {
|
||||||
throw new \RuntimeException('Unknown plugin settings: ' . $pluginKeyName);
|
throw new \RuntimeException('Unknown plugin settings: ' . $pluginKeyName);
|
||||||
}
|
}
|
||||||
|
|
||||||
return $this->settingsFile[$pluginKeyName]['settings'];
|
return $this->settingsFile[$pluginKeyName]['settings'];
|
||||||
}
|
}
|
||||||
|
|
||||||
$ret = [];
|
if (!isset($this->settingsFile[$pluginKeyName]['settings'][$key])) {
|
||||||
if(isset($this->settingsFile[$pluginKeyName]['settings'][$key])) {
|
return null;
|
||||||
$ret = $this->settingsFile[$pluginKeyName]['settings'][$key];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$ret = $this->settingsFile[$pluginKeyName]['settings'][$key];
|
||||||
|
|
||||||
if(isset($this->settingsDatabase[$pluginKeyName][$key])) {
|
if(isset($this->settingsDatabase[$pluginKeyName][$key])) {
|
||||||
$value = $this->settingsDatabase[$pluginKeyName][$key];
|
$value = $this->settingsDatabase[$pluginKeyName][$key];
|
||||||
|
|
||||||
$ret['value'] = $value;
|
$ret['value'] = $value;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (!isset($this->settingsFile[$pluginKeyName]['settings'][$key])) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
$ret['value'] = $this->settingsFile[$pluginKeyName]['settings'][$key]['default'];
|
$ret['value'] = $this->settingsFile[$pluginKeyName]['settings'][$key]['default'];
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -523,7 +506,7 @@ class Settings implements \ArrayAccess
|
|||||||
return $ret;
|
return $ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
private function updateValuesAsked($offset)
|
private function updateValuesAsked($offset): void
|
||||||
{
|
{
|
||||||
$pluginKeyName = $offset;
|
$pluginKeyName = $offset;
|
||||||
if (strpos($offset, '.')) {
|
if (strpos($offset, '.')) {
|
||||||
@@ -539,7 +522,7 @@ class Settings implements \ArrayAccess
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private function loadPlugin($offset)
|
private function loadPlugin($offset): void
|
||||||
{
|
{
|
||||||
$this->updateValuesAsked($offset);
|
$this->updateValuesAsked($offset);
|
||||||
|
|
||||||
@@ -568,7 +551,7 @@ class Settings implements \ArrayAccess
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static function saveConfig($config, $filename, &$content = '')
|
public static function saveConfig($config, $filename, &$content = ''): bool|int
|
||||||
{
|
{
|
||||||
$content = "<?php" . PHP_EOL;
|
$content = "<?php" . PHP_EOL;
|
||||||
|
|
||||||
|
@@ -91,7 +91,7 @@ else {
|
|||||||
$file = BASE . $template_path . '/layout_config.ini';
|
$file = BASE . $template_path . '/layout_config.ini';
|
||||||
}
|
}
|
||||||
|
|
||||||
$template_ini = parse_ini_file($file);
|
$template_ini = parse_ini_file($file, true);
|
||||||
unset($file);
|
unset($file);
|
||||||
|
|
||||||
if ($cache->enabled()) {
|
if ($cache->enabled()) {
|
||||||
@@ -148,7 +148,7 @@ function get_template_menus(): array
|
|||||||
{
|
{
|
||||||
global $template_name;
|
global $template_name;
|
||||||
|
|
||||||
$result = Cache::remember('template_menus', 10 * 60, function () use ($template_name) {
|
$result = Cache::remember('template_menus_' . $template_name, 10 * 60, function () use ($template_name) {
|
||||||
$result = Menu::select(['name', 'link', 'blank', 'color', 'category'])
|
$result = Menu::select(['name', 'link', 'blank', 'color', 'category'])
|
||||||
->where('template', $template_name)
|
->where('template', $template_name)
|
||||||
->orderBy('category')
|
->orderBy('category')
|
||||||
|
@@ -1,7 +1,26 @@
|
|||||||
{% if new_line is defined and new_line %}
|
{% if new_line is defined and new_line %}
|
||||||
<br/>
|
<br/>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
<form action="{% if action is not defined %}{{ getLink('account/manage') }}{% else %}{{ action }}{% endif %}" method="post">
|
|
||||||
{{ csrf() }}
|
{% set _center = false %}
|
||||||
{{ include('buttons.back.html.twig') }}
|
|
||||||
</form>
|
{% if center is defined and center %}
|
||||||
|
{% set _center = true %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if _center %}
|
||||||
|
<table border="0" cellspacing="1" cellpadding="4" width="100%">
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td align="center">
|
||||||
|
{% endif %}
|
||||||
|
<form action="{% if action is not defined %}{{ getLink('account/manage') }}{% else %}{{ action }}{% endif %}" method="post">
|
||||||
|
{{ csrf() }}
|
||||||
|
{{ include('buttons.back.html.twig') }}
|
||||||
|
</form>
|
||||||
|
{% if _center %}
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
{% endif %}
|
||||||
|
@@ -1,36 +0,0 @@
|
|||||||
The Lost Account Interface can help you to get back your account name and password. Please enter your character name and select what you want to do.<br/>
|
|
||||||
<form action="{{ getLink('account/lost') }}?action=step1" method="post">
|
|
||||||
{{ csrf() }}
|
|
||||||
<input type="hidden" name="character" value="">
|
|
||||||
<table cellspacing="1" cellpadding="4" border="0" width="100%">
|
|
||||||
<tr>
|
|
||||||
<td bgcolor="{{ config.vdarkborder }}" class="white"><b>Please enter your character name</b></td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td bgcolor="{{ config.darkborder }}">
|
|
||||||
<input type="text" name="nick" size="40" autofocus/><br>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
</table>
|
|
||||||
<table cellspacing="1" cellpadding="4" border="0" width="100%">
|
|
||||||
<tr>
|
|
||||||
<td bgcolor="{{ config.vdarkborder }}" class="white"><b>What do you want?</b></td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td bgcolor="{{ config.darkborder }}">
|
|
||||||
<input type="radio" name="action_type" id="action_type_email" value="email">
|
|
||||||
<label for="action_type_email"> Send me new password and my account name to account e-mail adress.</label><br/>
|
|
||||||
<input type=radio name="action_type" id="action_type_key" value="reckey">
|
|
||||||
<label for="action_type_key"> I got <b>recovery key</b> and want set new password and e-mail adress to my account.</label><br/>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
</table>
|
|
||||||
<br/>
|
|
||||||
<table cellspacing="0" cellpadding="0" border="0" width="100%">
|
|
||||||
<tr>
|
|
||||||
<td align="center">
|
|
||||||
{{ include('buttons.submit.html.twig') }}
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
</table>
|
|
||||||
</form>
|
|
@@ -1,10 +0,0 @@
|
|||||||
Please select action.<br/>
|
|
||||||
<table cellspacing="0" cellpadding="0" border="0" width="100%">
|
|
||||||
<tr>
|
|
||||||
<td align="center">
|
|
||||||
<a href="{{ getLink('account/lost') }}" border="0">
|
|
||||||
{{ include('buttons.back.html.twig') }}
|
|
||||||
</a>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
</table>
|
|
33
system/templates/account/lost/check-code.finish.html.twig
Normal file
33
system/templates/account/lost/check-code.finish.html.twig
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
Please enter new password to your account and repeat to make sure you remember password.<BR>
|
||||||
|
<form action="{{ getLink('account/lost/email/set-new-password') }}" method="post">
|
||||||
|
<input type="hidden" name="character" value="{{ character }}">
|
||||||
|
<input type="hidden" name="code" value="{{ code }}">
|
||||||
|
<table class="myaac-table" style="width: 100%;">
|
||||||
|
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th class="white"><B>Passwords</B></th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
New password: <input type="password" ID="passor" name="passor" value="" size="40"><br/>
|
||||||
|
Repeat new password: <input TYPE="password" ID="passor2" name="passor2" value="" size="40"><br/>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
<br/>
|
||||||
|
<table style="width: 100%">
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<div style="text-align: center">
|
||||||
|
{% set button_name = 'Submit' %}
|
||||||
|
{% include('buttons.base.html.twig') %}
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</form>
|
30
system/templates/account/lost/check-code.html.twig
Normal file
30
system/templates/account/lost/check-code.html.twig
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
Please enter code from e-mail and name of one character from account. Then press Submit.<br/>
|
||||||
|
<form action="{{ getLink('account/lost/check-code') }}" method="post">
|
||||||
|
<table class="myaac-table" style="width: 100%;">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th class="white">
|
||||||
|
<b>Code & character name</b>
|
||||||
|
</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
Your code: <input type="text" name="code" value="{{ code }}" size="40"><br/>
|
||||||
|
Character: <input type="text" name="character" value="{{ character }}" size="40"><br/>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
<br>
|
||||||
|
<table style="width: 100%">
|
||||||
|
<tr>
|
||||||
|
<td align="center">
|
||||||
|
{% set button_name = 'Submit' %}
|
||||||
|
{% include('buttons.base.html.twig') %}
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</form>
|
33
system/templates/account/lost/email.html.twig
Normal file
33
system/templates/account/lost/email.html.twig
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
Please enter e-mail to account with this character.<br/>
|
||||||
|
<form action="{{ getLink('account/lost/email/send-code') }}" method="post">
|
||||||
|
<input type=hidden name="character">
|
||||||
|
<table class="myaac-table" style="width: 100%;">
|
||||||
|
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th class="white"><b>Please enter e-mail to account</b></th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
Character: <input type=text name="nick" value="{{ nick }}" size="40" readonly="readonly"><br/>
|
||||||
|
E-mail to account: <input type=text name="email" value="" size="40"><br/>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
|
||||||
|
</table>
|
||||||
|
<br>
|
||||||
|
<table style="width: 100%">
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<div style="text-align:center">
|
||||||
|
{% set button_name = 'Submit' %}
|
||||||
|
{% include('buttons.base.html.twig') %}
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</form>
|
33
system/templates/account/lost/finish.new-email.html.twig
Normal file
33
system/templates/account/lost/finish.new-email.html.twig
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
Your account name, new password and new e-mail.<br/>
|
||||||
|
<table class="myaac-table" style="width: 100%;">
|
||||||
|
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th class="white">
|
||||||
|
<b>Your account name, new password and new e-mail</b>
|
||||||
|
</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
Account name: <b>{{ account.getName() }}</b><br/>
|
||||||
|
New password: <b>{{ newPassword }}</b><br/>
|
||||||
|
New e-mail address: <b>{{ newEmail }}</b><br/>
|
||||||
|
{{ statusMsg|raw }}
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
|
||||||
|
</table>
|
||||||
|
<br>
|
||||||
|
<table style="width: 100%">
|
||||||
|
<tr>
|
||||||
|
<td align="center">
|
||||||
|
<form action="{{ getLink('account/manage') }}" method="post">
|
||||||
|
{{ include('buttons.login.html.twig') }}
|
||||||
|
</form>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
30
system/templates/account/lost/finish.new-password.html.twig
Normal file
30
system/templates/account/lost/finish.new-password.html.twig
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
New password to your account is below. Now you can log in.<BR>
|
||||||
|
<table class="myaac-table" style="width: 100%;">
|
||||||
|
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th class="white"><b>Changed password</b></th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
New password: <b>{{ newPassword }}</b><br/>
|
||||||
|
Account name: <i>(Already on your e-mail)</i><br/>
|
||||||
|
{{ statusMsg|raw }}
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
<br/>
|
||||||
|
<table style="width: 100%">
|
||||||
|
<tr>
|
||||||
|
<td align="center">
|
||||||
|
<form action="{{ getLink('account/manage') }}">
|
||||||
|
{% set button_name = 'Login' %}
|
||||||
|
{% include('buttons.base.html.twig') %}
|
||||||
|
</form>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
41
system/templates/account/lost/form.html.twig
Normal file
41
system/templates/account/lost/form.html.twig
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
The Lost Account Interface can help you to get back your account name and password. Please enter your character name and select what you want to do.<br/>
|
||||||
|
<form action="{{ getLink('account/lost/step-1') }}" method="post">
|
||||||
|
{{ csrf() }}
|
||||||
|
<input type="hidden" name="character" value="">
|
||||||
|
<table class="myaac-table" style="width: 100%">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th class="white"><b>Please enter your character name</b></th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<input type="text" name="nick" size="40" autofocus/><br>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
<table style="width: 100%; border-spacing: 1px">
|
||||||
|
<tr>
|
||||||
|
<td style="padding: 4px; background: {{ config('vdarkborder') }}" class="white"><b>What do you want?</b></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td style="padding: 4px; background: {{ config('darkborder') }}">
|
||||||
|
<input type="radio" name="action" id="action_type_email" value="email">
|
||||||
|
<label for="action_type_email"> Send me new password and my account name to account e-mail address.</label><br/>
|
||||||
|
<input type=radio name="action" id="action_type_key" value="recovery-key">
|
||||||
|
<label for="action_type_key"> I got <b>recovery key</b> and want set new password and e-mail address to my account.</label><br/>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
<br/>
|
||||||
|
<table style="width: 100%">
|
||||||
|
<tr>
|
||||||
|
<td align="center">
|
||||||
|
{% set button_name = 'Submit' %}
|
||||||
|
{% include('buttons.base.html.twig') %}
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</form>
|
10
system/templates/account/lost/no-action.html.twig
Normal file
10
system/templates/account/lost/no-action.html.twig
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
Please select action.<br/>
|
||||||
|
<table style="width: 100%">
|
||||||
|
<tr>
|
||||||
|
<td align="center">
|
||||||
|
<a href="{{ getLink('account/lost') }}">
|
||||||
|
{{ include('buttons.back.html.twig') }}
|
||||||
|
</a>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
34
system/templates/account/lost/recovery-key.html.twig
Normal file
34
system/templates/account/lost/recovery-key.html.twig
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
If you enter right recovery key you will see form to set new e-mail and password to account. To this e-mail will be send your new password and account name.<BR>
|
||||||
|
<form action="{{ getLink('account/lost/recovery-key/step-2') }}" method="post">
|
||||||
|
<table class="myaac-table" style="width: 100%;">
|
||||||
|
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th class="white">
|
||||||
|
<b>Please enter your recovery key</b>
|
||||||
|
</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
Character name: <input type=text name="nick" value="{{ nick }}" size="40" readonly="readonly"><br/>
|
||||||
|
Recovery key: <input type="text" name="key" value="" size="40"><br/>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
|
||||||
|
</table>
|
||||||
|
<br>
|
||||||
|
<table style="width: 100%">
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<div style="text-align:center">
|
||||||
|
{% set button_name = 'Submit' %}
|
||||||
|
{% include('buttons.base.html.twig') %}
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</form>
|
35
system/templates/account/lost/step2.html.twig
Normal file
35
system/templates/account/lost/step2.html.twig
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
Set new password and e-mail to your account.<br>
|
||||||
|
<form action="{{ getLink('account/lost/step-3') }}" method="post">
|
||||||
|
<input type="hidden" name="character" value="">
|
||||||
|
<table class="myaac-table" style="width: 100%">
|
||||||
|
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th class="white">
|
||||||
|
<b>Please enter new password and e-mail</b>
|
||||||
|
</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
Account of character: <input type="text" name="nick" value="{{ nick }}" size="40" readonly="readonly"><br/>
|
||||||
|
New password: <input id="passor" type="password" name="passor" value="" size="40"><br/>
|
||||||
|
Repeat new password: <input id="passor2" type="password" name="passor" value="" size="40"><br/>
|
||||||
|
New e-mail address: <input id="email" type="text" name="email" value="" size="40"><br/>
|
||||||
|
<input type="hidden" name="key" VALUE="{{ recKey }}">
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
<br>
|
||||||
|
<table style="width: 100%">
|
||||||
|
<tr>
|
||||||
|
<td align="center">
|
||||||
|
{% set button_name = 'Submit' %}
|
||||||
|
{% include('buttons.base.html.twig') %}
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</form>
|
@@ -16,6 +16,13 @@
|
|||||||
<input class="form-control" type="text" id="mail_to" name="mail_to" value="{{ mail_to }}"/>
|
<input class="form-control" type="text" id="mail_to" name="mail_to" value="{{ mail_to }}"/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
{% if setting('core.account_mail_verify') %}
|
||||||
|
<div class="form-check">
|
||||||
|
<input type="checkbox" class="form-check-input" id="mail_verified_only" name="mail_verified_only" {% if mail_verified_only %}checked{% endif %}>
|
||||||
|
<label class="form-check-label" for="mail_verified_only">Mail only verified users</label>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
<div class="form-group row">
|
<div class="form-group row">
|
||||||
<label for="mail_subject">Subject:</label>
|
<label for="mail_subject">Subject:</label>
|
||||||
<input class="form-control" type="text" id="mail_subject" name="mail_subject" value="{{ mail_subject }}" maxlength="30"/>
|
<input class="form-control" type="text" id="mail_subject" name="mail_subject" value="{{ mail_subject }}" maxlength="30"/>
|
||||||
|
@@ -235,14 +235,16 @@
|
|||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
{% if isVice %}
|
{% if isVice %}
|
||||||
<form action="{{ getLink('guilds') }}?action=invite&guild={{ guild_name|url_encode }}" method="post">
|
{% if db.hasTableAndColumns('guild_invites', ['player_id']) %}
|
||||||
{{ csrf() }}
|
<form action="{{ getLink('guilds') }}?action=invite&guild={{ guild_name|url_encode }}" method="post">
|
||||||
<td>
|
{{ csrf() }}
|
||||||
{% set button_name = 'Invite Character' %}
|
<td>
|
||||||
{% set button_image = '_sbutton_invitecharacter' %}
|
{% set button_name = 'Invite Character' %}
|
||||||
{% include('buttons.base.html.twig') %}
|
{% set button_image = '_sbutton_invitecharacter' %}
|
||||||
</td>
|
{% include('buttons.base.html.twig') %}
|
||||||
</form>
|
</td>
|
||||||
|
</form>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
<form action="{{ getLink('guilds') }}?action=change_rank&guild={{ guild_name|url_encode }}" method="post">
|
<form action="{{ getLink('guilds') }}?action=change_rank&guild={{ guild_name|url_encode }}" method="post">
|
||||||
{{ csrf() }}
|
{{ csrf() }}
|
||||||
|
@@ -66,7 +66,7 @@
|
|||||||
|
|
||||||
<td>
|
<td>
|
||||||
<a href="{{ player.link }}">
|
<a href="{{ player.link }}">
|
||||||
<span style="color: {% if player.online > 0 %}green{% else %}red{% endif %}">{{ player.name }}</span>
|
<span {% if setting('core.highscores_online_status') %}style="color: {% if player.online > 0 %}green{% else %}red{% endif %}"{% endif %}>{{ player.name }}</span>
|
||||||
</a>
|
</a>
|
||||||
{% if setting('core.highscores_vocation') %}
|
{% if setting('core.highscores_vocation') %}
|
||||||
<br/><small>{{ player.vocation }}</small>
|
<br/><small>{{ player.vocation }}</small>
|
||||||
@@ -94,8 +94,10 @@
|
|||||||
{% endif %}
|
{% endif %}
|
||||||
</table>
|
</table>
|
||||||
</td>
|
</td>
|
||||||
|
{% if setting('core.highscores_skills_box') or setting('core.highscores_vocation_box') %}
|
||||||
<td width="5%"></td>
|
<td width="5%"></td>
|
||||||
<td width="15%" valign="top" align="right">
|
<td width="15%" valign="top" align="right">
|
||||||
|
{% if setting('core.highscores_skills_box') %}
|
||||||
<table style="border: 0; width: 100%" cellpadding="4" cellspacing="1">
|
<table style="border: 0; width: 100%" cellpadding="4" cellspacing="1">
|
||||||
<tr bgcolor="{{ config.vdarkborder }}">
|
<tr bgcolor="{{ config.vdarkborder }}">
|
||||||
<td class="white"><B>Choose a skill</B></TD>
|
<td class="white"><B>Choose a skill</B></TD>
|
||||||
@@ -109,7 +111,8 @@
|
|||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
<br/>
|
<br/>
|
||||||
{% if config.highscores_vocation_box %}
|
{% endif %}
|
||||||
|
{% if setting('core.highscores_vocation_box') %}
|
||||||
<table border="0" width="100%" cellpadding="4" cellspacing="1">
|
<table border="0" width="100%" cellpadding="4" cellspacing="1">
|
||||||
<tr bgcolor="{{ config.vdarkborder }}">
|
<tr bgcolor="{{ config.vdarkborder }}">
|
||||||
<td class="white"><b>Choose a vocation</b></td>
|
<td class="white"><b>Choose a vocation</b></td>
|
||||||
@@ -126,5 +129,6 @@
|
|||||||
{% endif %}
|
{% endif %}
|
||||||
</td>
|
</td>
|
||||||
<td style="width: 18px"></td>
|
<td style="width: 18px"></td>
|
||||||
|
{% endif %}
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
|
10
system/templates/mail.account.lost.code.html.twig
Normal file
10
system/templates/mail.account.lost.code.html.twig
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
You asked to reset your {{ config('lua')['serverName'] }} password.<br/>
|
||||||
|
<p>Account name: {{ account.getName() }}</p>
|
||||||
|
<br/>
|
||||||
|
To do so, please click this link:
|
||||||
|
<p>
|
||||||
|
<a href="{{ getLink('account/lost/check-code') }}?code={{ newCode }}&character={{ nick|urlencode }}">{{ getLink('account/lost/check-code') }}?code={{ newCode }}&character={{ nick|urlencode }}</a>
|
||||||
|
</p>
|
||||||
|
<p>or open page: <i>{{ getLink('account/lost/check-code') }}</i> and in field "code" write <b>{{ newCode }}</b></p>
|
||||||
|
<br/>
|
||||||
|
<p>If you did not request a password change, you may ignore this message and your password will remain unchanged.
|
7
system/templates/mail.account.lost.new-email.html.twig
Normal file
7
system/templates/mail.account.lost.new-email.html.twig
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
<h3>Your account name and new password!</h3>
|
||||||
|
<p>Changed password and e-mail to your account in Lost Account Interface on server <a href="{{ constant('BASE_URL') }}"><b>{{ config('lua')['serverName'] }}</b></a></p>
|
||||||
|
<p>Account name: <b>{{ account.getName() }}</b></p>
|
||||||
|
<p>New password: <b>{{ newPassword }}</b></p>
|
||||||
|
<p>E-mail: <b>{{ $newEmail }}</b> (this e-mail)</p>
|
||||||
|
<br/>
|
||||||
|
<p><u>It's automatic e-mail from OTS Lost Account System. Do not reply!</u></p>
|
@@ -0,0 +1,6 @@
|
|||||||
|
<h3>Your account name and password!</h3>
|
||||||
|
<p>Changed password to your account in Lost Account Interface on server <a href="{{ constant('BASE_URL') }}"><b>{{ config('lua')['serverName'] }}</b></a></p>
|
||||||
|
<p>Account name: <b>{{ account.getName() }}</b></p>
|
||||||
|
<p>New password: <b>{{ newPassword }}</b></p>
|
||||||
|
<br/>
|
||||||
|
<p><u>It's automatic e-mail from OTS Lost Account System. Do not reply!</u></p>
|
@@ -1,3 +1,9 @@
|
|||||||
|
{% set onlineTTL = setting('core.online_cache_ttl') %}
|
||||||
|
{% if onlineTTL > 0 and cache.enabled() %}
|
||||||
|
<small>*Note: Online List is updated every {{ onlineTTL > 1 ? ' ' ~ onlineTTL : '' }} minute{{ onlineTTL > 1 ? 's' : '' }}.</small>
|
||||||
|
<br/>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
{# vocation statistics #}
|
{# vocation statistics #}
|
||||||
{% if setting('core.online_vocations') %}
|
{% if setting('core.online_vocations') %}
|
||||||
<br/>
|
<br/>
|
||||||
@@ -84,7 +90,7 @@
|
|||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
|
||||||
{% if setting('core.online_record') %}
|
{% if setting('core.online_record') and record|length > 0 %}
|
||||||
<tr>
|
<tr>
|
||||||
<td class="LabelV150"><b>Online Record:</b></td>
|
<td class="LabelV150"><b>Online Record:</b></td>
|
||||||
<td>
|
<td>
|
||||||
@@ -155,7 +161,7 @@
|
|||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
<td style="width:70%; text-align:left">
|
<td style="width:70%; text-align:left">
|
||||||
{{ player.name|raw }}{{ player.skull }}
|
{{ player.name|raw }}{{ player.skull|raw }}
|
||||||
</td>
|
</td>
|
||||||
<td style="width:10%">{{ player.level }}</td>
|
<td style="width:10%">{{ player.level }}</td>
|
||||||
<td style="width:20%">{{ player.vocation }}</td>
|
<td style="width:20%">{{ player.vocation }}</td>
|
||||||
|
@@ -1,6 +1,9 @@
|
|||||||
<style>
|
<style>
|
||||||
|
.myaac-table {border-spacing: 1px;}
|
||||||
.myaac-table tbody tr:nth-child(even) {background: {{ config.lightborder }}}
|
.myaac-table tbody tr:nth-child(even) {background: {{ config.lightborder }}}
|
||||||
.myaac-table tbody tr:nth-child(odd) {background: {{ config.darkborder }}}
|
.myaac-table tbody tr:nth-child(odd) {background: {{ config.darkborder }}}
|
||||||
.myaac-table thead td {background: {{ config.vdarkborder }}; color: #ffffff !important;}
|
.myaac-table tbody td {padding: 4px; }
|
||||||
.myaac-table tfoot td {background: {{ config.vdarkborder }}; color: #ffffff !important;}
|
.myaac-table thead td {padding: 4px; background: {{ config.vdarkborder }}; color: #ffffff !important;}
|
||||||
|
.myaac-table thead th {padding: 4px; background: {{ config.vdarkborder }}; color: #ffffff !important;}
|
||||||
|
.myaac-table tfoot td {padding: 4px; background: {{ config.vdarkborder }}; color: #ffffff !important;}
|
||||||
</style>
|
</style>
|
||||||
|
@@ -36,7 +36,11 @@ $twig->addExtension(new MyAAC\Twig\Extension\TypeCastingExtension());
|
|||||||
|
|
||||||
$filter = new TwigFilter('timeago', function ($datetime) {
|
$filter = new TwigFilter('timeago', function ($datetime) {
|
||||||
|
|
||||||
$time = time() - strtotime($datetime);
|
if (!is_int($datetime)) {
|
||||||
|
$datetime = strtotime($datetime);
|
||||||
|
}
|
||||||
|
|
||||||
|
$time = time() - $datetime;
|
||||||
|
|
||||||
$units = array (
|
$units = array (
|
||||||
31536000 => 'year',
|
31536000 => 'year',
|
||||||
@@ -152,3 +156,5 @@ $twig->addFilter($filter);
|
|||||||
unset($function, $filter);
|
unset($function, $filter);
|
||||||
|
|
||||||
$hooks->trigger(HOOK_TWIG, ['twig' => $twig, 'twig_loader' => $twig_loader]);
|
$hooks->trigger(HOOK_TWIG, ['twig' => $twig, 'twig_loader' => $twig_loader]);
|
||||||
|
|
||||||
|
$twig->addGlobal('cache', $cache);
|
||||||
|
@@ -1,12 +1,18 @@
|
|||||||
<?php
|
<?php
|
||||||
$config['menu_default_links_color'] = '#ffffff';
|
$config['menu_default_links_color'] = '#ffffff';
|
||||||
|
|
||||||
$config['menu_categories'] = array(
|
// max 7 menus for kathrine
|
||||||
MENU_CATEGORY_NEWS => array('id' => 'news', 'name' => 'Latest News'),
|
$config['menu_categories'] = [
|
||||||
MENU_CATEGORY_ACCOUNT => array('id' => 'account', 'name' => 'Account'),
|
MENU_CATEGORY_NEWS => ['id' => 'news', 'name' => 'Latest News'],
|
||||||
MENU_CATEGORY_COMMUNITY => array('id' => 'community', 'name' => 'Community'),
|
// you can add custom menu by uncommenting this
|
||||||
MENU_CATEGORY_LIBRARY => array('id' => 'library', 'name' => 'Library'),
|
// after doing it, go to admin panel -> Menus and add your entries for this category
|
||||||
MENU_CATEGORY_SHOP => array('id' => 'shops', 'name' => 'Shop')
|
// tip: you can move it up/down to show it on specific position
|
||||||
);
|
//7 => array('id' => 'testing', 'name' => 'Test Menu 1'),
|
||||||
|
//8 => array('id' => 'testing2', 'name' => 'Test Menu 2'),
|
||||||
|
MENU_CATEGORY_ACCOUNT => ['id' => 'account', 'name' => 'Account'],
|
||||||
|
MENU_CATEGORY_COMMUNITY => ['id' => 'community', 'name' => 'Community'],
|
||||||
|
MENU_CATEGORY_LIBRARY => ['id' => 'library', 'name' => 'Library'],
|
||||||
|
MENU_CATEGORY_SHOP => ['id' => 'shops', 'name' => 'Shop']
|
||||||
|
];
|
||||||
|
|
||||||
$config['menus'] = require __DIR__ . '/menus.php';
|
$config['menus'] = require __DIR__ . '/menus.php';
|
||||||
|
@@ -1,42 +1,40 @@
|
|||||||
<?php
|
<?php
|
||||||
$menus = get_template_menus();
|
function get_template_pages($category): array
|
||||||
|
{
|
||||||
function get_template_pages($category) {
|
|
||||||
global $menus;
|
global $menus;
|
||||||
|
|
||||||
$ret = array();
|
$ret = array();
|
||||||
foreach($menus[$category] as $menu) {
|
foreach($menus[$category] ?? [] as $menu) {
|
||||||
$ret[] = $menu['link'];
|
$ret[] = $menu['link'];
|
||||||
}
|
}
|
||||||
|
|
||||||
return $ret;
|
return $ret;
|
||||||
}
|
}
|
||||||
?>
|
?>
|
||||||
var category = '<?php
|
let category = '<?php
|
||||||
if(strpos(URI, 'subtopic=') !== false) {
|
if(str_contains(URI, 'subtopic=')) {
|
||||||
$tmp = array($_REQUEST['subtopic']);
|
$tmp = [$_REQUEST['subtopic']];
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
$tmp = URI;
|
$tmp = URI;
|
||||||
if(empty($tmp)) {
|
if(empty($tmp)) {
|
||||||
$tmp = array('news');
|
$tmp = ['news'];
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
$tmp = explode('/', URI);
|
$tmp = explode('/', URI);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(in_array($tmp[0], get_template_pages(MENU_CATEGORY_NEWS)))
|
foreach (config('menu_categories') as $id => $info) {
|
||||||
echo 'news';
|
$templatePages = get_template_pages($id);
|
||||||
elseif(in_array($tmp[0], get_template_pages(MENU_CATEGORY_LIBRARY)))
|
|
||||||
echo 'library';
|
if ($id == MENU_CATEGORY_ACCOUNT) {
|
||||||
elseif(in_array($tmp[0], get_template_pages(MENU_CATEGORY_COMMUNITY)))
|
$templatePages = array_merge($templatePages, ['account']);
|
||||||
echo 'community';
|
}
|
||||||
elseif(in_array($tmp[0], array_merge(get_template_pages(MENU_CATEGORY_ACCOUNT), array('account'))))
|
|
||||||
echo 'account';
|
if (in_array($tmp[0], $templatePages)) {
|
||||||
elseif(in_array($tmp[0], get_template_pages(MENU_CATEGORY_SHOP)))
|
echo $info['id'];
|
||||||
echo 'shops';
|
break;
|
||||||
else {
|
}
|
||||||
echo 'news';
|
|
||||||
}
|
}
|
||||||
?>';
|
?>';
|
||||||
|
@@ -1,10 +1,10 @@
|
|||||||
var list = new Array();
|
var list = new Array();
|
||||||
{% set i = 0 %}
|
{% set i = 0 %}
|
||||||
{% for cat in categories %}
|
{% for id, cat in config('menu_categories') %}
|
||||||
{% if cat.id != 'shops' or setting('core.gifts_system') %}
|
{% if (cat.id != 'shops' or setting('core.gifts_system')) and menus[id]|length > 0 %}
|
||||||
list[{{ i }}] = '{{ cat.id }}';
|
list[{{ i }}] = '{{ cat.id }}';
|
||||||
|
{% set i = i + 1 %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% set i = i + 1 %}
|
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
|
||||||
function initMenu()
|
function initMenu()
|
||||||
|
@@ -27,11 +27,13 @@ body
|
|||||||
|
|
||||||
#tabs
|
#tabs
|
||||||
{
|
{
|
||||||
width: 580px;
|
width: 99%;
|
||||||
height: 32px;
|
height: 32px;
|
||||||
background: url('images/tabs-bg.png') no-repeat;
|
background: url('images/tabs-bg.png') no-repeat;
|
||||||
float: left;
|
|
||||||
padding-left: 200px;
|
padding-left: 200px;
|
||||||
|
position: relative;
|
||||||
|
display: inline-flex;
|
||||||
|
right: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#tabs .tab
|
#tabs .tab
|
||||||
|
@@ -8,7 +8,9 @@ defined('MYAAC') or die('Direct access not allowed!');
|
|||||||
<link rel="stylesheet" href="<?php echo $template_path; ?>/style.css" type="text/css" />
|
<link rel="stylesheet" href="<?php echo $template_path; ?>/style.css" type="text/css" />
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
<?php
|
<?php
|
||||||
$twig->display('menu.js.html.twig', array('categories' => $config['menu_categories']));
|
$menus = get_template_menus();
|
||||||
|
|
||||||
|
$twig->display('menu.js.html.twig', ['menus' => $menus]);
|
||||||
?>
|
?>
|
||||||
</script>
|
</script>
|
||||||
<script type="text/javascript" src="tools/basic.js"></script>
|
<script type="text/javascript" src="tools/basic.js"></script>
|
||||||
@@ -28,11 +30,24 @@ defined('MYAAC') or die('Direct access not allowed!');
|
|||||||
<div id="header"></div>
|
<div id="header"></div>
|
||||||
<!-- End -->
|
<!-- End -->
|
||||||
|
|
||||||
|
<!-- Custom Style for #tabs -->
|
||||||
|
<?php
|
||||||
|
$menusCount = count($menus);
|
||||||
|
$tabsStyle = '';
|
||||||
|
if ($menusCount > 6) {
|
||||||
|
$tabsStyle .= 'padding-left: 4px;';
|
||||||
|
$tabsStyle .= 'padding-right: 12px;';
|
||||||
|
}
|
||||||
|
elseif ($menusCount > 5) {
|
||||||
|
$tabsStyle .= 'padding-left: 90px;';
|
||||||
|
}
|
||||||
|
?>
|
||||||
|
|
||||||
<!-- Menu Section -->
|
<!-- Menu Section -->
|
||||||
<div id="tabs">
|
<div id="tabs" style="<?= $tabsStyle; ?>">
|
||||||
<?php
|
<?php
|
||||||
foreach($config['menu_categories'] as $id => $cat) {
|
foreach($config['menu_categories'] as $id => $cat) {
|
||||||
if($id != MENU_CATEGORY_SHOP || $config['gifts_system']) { ?>
|
if (($id != MENU_CATEGORY_SHOP || $config['gifts_system']) && isset($menus[$id])) { ?>
|
||||||
<span id="<?php echo $cat['id']; ?>" onclick="menuSwitch('<?php echo $cat['id']; ?>');"><?php echo $cat['name']; ?></span>
|
<span id="<?php echo $cat['id']; ?>" onclick="menuSwitch('<?php echo $cat['id']; ?>');"><?php echo $cat['name']; ?></span>
|
||||||
<?php
|
<?php
|
||||||
}
|
}
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
<div id="CurrentPollBox" class="Themebox" style="background-image:url({{ template_path }}/images/themeboxes/current-poll/currentpollbox.gif);">
|
<div id="CurrentPollBox" class="Themebox" style="background-image:url({{ template_path }}/images/themeboxes/current-poll/currentpollbox.gif);">
|
||||||
<div id="CurrentPollText">{{ poll.question }}</div>
|
<div id="CurrentPollText">{{ poll.question }}</div>
|
||||||
<a class="ThemeboxButton" href="{{ getLink('polls') }}/{{ poll.id }}" onMouseOver="MouseOverBigButton(this);" onMouseOut="MouseOutBigButton(this);" style="background-image:url({{ template_path }}/images/global/buttons/sbutton.gif);"><div class="BigButtonOver" style="background-image:url({{ template_path }}/images/global/buttons/sbutton_over.gif);"></div><div class="ButtonText" style="background-image:url({{ template_path }}/images/global/buttons/_sbutton_votenow.gif);"></div>
|
<a class="ThemeboxButton" href="{{ getLink('polls') }}?ìd={{ poll.id }}" onMouseOver="MouseOverBigButton(this);" onMouseOut="MouseOutBigButton(this);" style="background-image:url({{ template_path }}/images/global/buttons/sbutton.gif);"><div class="BigButtonOver" style="background-image:url({{ template_path }}/images/global/buttons/sbutton_over.gif);"></div><div class="ButtonText" style="background-image:url({{ template_path }}/images/global/buttons/_sbutton_votenow.gif);"></div>
|
||||||
</a>
|
</a>
|
||||||
<div class="Bottom" style="background-image:url({{ template_path }}/images/general/box-bottom.gif);"></div>
|
<div class="Bottom" style="background-image:url({{ template_path }}/images/general/box-bottom.gif);"></div>
|
||||||
</div>
|
</div>
|
||||||
|
@@ -164,6 +164,10 @@ if(isset($config['boxes']))
|
|||||||
function InitializeMenu()
|
function InitializeMenu()
|
||||||
{
|
{
|
||||||
for(menuItemName in menu[0]) {
|
for(menuItemName in menu[0]) {
|
||||||
|
if (!document.getElementById(menuItemName+"_Submenu")) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
if(menu[0][menuItemName] == "0") {
|
if(menu[0][menuItemName] == "0") {
|
||||||
document.getElementById(menuItemName+"_Submenu").style.visibility = "hidden";
|
document.getElementById(menuItemName+"_Submenu").style.visibility = "hidden";
|
||||||
document.getElementById(menuItemName+"_Submenu").style.display = "none";
|
document.getElementById(menuItemName+"_Submenu").style.display = "none";
|
||||||
@@ -387,7 +391,7 @@ foreach($config['menu_categories'] as $id => $cat) {
|
|||||||
?>
|
?>
|
||||||
</div>
|
</div>
|
||||||
<?php
|
<?php
|
||||||
if($id == MENU_CATEGORY_SHOP || (!setting('core.gifts_system') && $i == $countElements)) {
|
if ($i == $countElements) {
|
||||||
?>
|
?>
|
||||||
<div id='MenuBottom' style='background-image:url(<?php echo $template_path; ?>/images/general/box-bottom.gif);'></div>
|
<div id='MenuBottom' style='background-image:url(<?php echo $template_path; ?>/images/general/box-bottom.gif);'></div>
|
||||||
<?php
|
<?php
|
||||||
@@ -454,7 +458,7 @@ foreach($config['menu_categories'] as $id => $cat) {
|
|||||||
|
|
||||||
foreach($config['boxes'] as $box) {
|
foreach($config['boxes'] as $box) {
|
||||||
/** @var string $template_name */
|
/** @var string $template_name */
|
||||||
$file = TEMPLATES . $template_name . '/boxes/' . $box . '.php';
|
$file = __DIR__ . '/boxes/' . $box . '.php';
|
||||||
if(file_exists($file)) {
|
if(file_exists($file)) {
|
||||||
include($file); ?>
|
include($file); ?>
|
||||||
<?php
|
<?php
|
||||||
|
Reference in New Issue
Block a user