mirror of
https://github.com/slawkens/myaac.git
synced 2025-11-23 10:46:23 +01:00
Compare commits
37 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9c327336d3 | ||
|
|
1d21f4d682 | ||
|
|
603d860b56 | ||
|
|
6775a061be | ||
|
|
e440c0d6a6 | ||
|
|
780d4ccef7 | ||
|
|
0a6d44bf21 | ||
|
|
4d17001a0b | ||
|
|
946364f59d | ||
|
|
5861efdbe9 | ||
|
|
175e97828b | ||
|
|
9ce55db44c | ||
|
|
88532b0ebb | ||
|
|
1c7af30997 | ||
|
|
7ca05e47ff | ||
|
|
baec6c9ebf | ||
|
|
6367054487 | ||
|
|
ae7a47464f | ||
|
|
d201e75b11 | ||
|
|
4924696943 | ||
|
|
25a3db68e6 | ||
|
|
730a0f2912 | ||
|
|
fd729242ff | ||
|
|
26c5aa2e51 | ||
|
|
bc4107bd16 | ||
|
|
d24bde2c1d | ||
|
|
a2f8759a52 | ||
|
|
4b8c3ffae2 | ||
|
|
97321c9e80 | ||
|
|
2580edadf8 | ||
|
|
8f47b36dc8 | ||
|
|
6cd38ee1ec | ||
|
|
9d92a11fb7 | ||
|
|
44110a9496 | ||
|
|
727f68a575 | ||
|
|
07fd034fe4 | ||
|
|
13ea68cc0c |
3
.gitignore
vendored
3
.gitignore
vendored
@@ -4,7 +4,7 @@ Thumbs.db
|
||||
|
||||
#
|
||||
/.htaccess
|
||||
lua
|
||||
/lua
|
||||
|
||||
# composer
|
||||
composer.phar
|
||||
@@ -24,6 +24,7 @@ releases
|
||||
tmp
|
||||
|
||||
config.local.php
|
||||
config2.local.php
|
||||
|
||||
# all custom templates
|
||||
templates/*
|
||||
|
||||
@@ -1,5 +1,31 @@
|
||||
# Changelog
|
||||
|
||||
## [1.8.5 - 21.11.2025]
|
||||
|
||||
### Added
|
||||
* New Setting: Account Countries Most Popular (https://github.com/slawkens/myaac/commit/946364f59d7cd01472877108ab27ec78fb28307a)
|
||||
|
||||
### Changed
|
||||
* Status: Write to status-error.log if there is connection error (https://github.com/slawkens/myaac/commit/780d4ccef741c1dd45a00bfc121fba9f1a175313)
|
||||
* Settings: escapeHtml in values (support for html code) (https://github.com/slawkens/myaac/commit/5861efdbe900ccd35309913af0c0a5f3d4cdc1a8)
|
||||
* News Page: Don't display hidden news for admin - it's confusing (https://github.com/slawkens/myaac/commit/175e97828b9a08ec3080cc8d3fb4eb3f1c08649f)
|
||||
* Plugins System: Add plugin:remove + plugin:delete as alias for plugin:uninstall + plugin:activate/deactivate (https://github.com/slawkens/myaac/commit/6367054487368c92741bfd1dc7c70c52aea9ee87, https://github.com/slawkens/myaac/commit/baec6c9ebf5c342b3b2f7123427c6ba21dbb93bc)
|
||||
|
||||
### Fixed
|
||||
* Status: Fix $status['uptimeReadable'], was totally wrong (https://github.com/slawkens/myaac/commit/0a6d44bf21417562491aabc93543a2bc3a44b2df)
|
||||
* Guilds: Detect "deletion" column in guilds show/delete (https://github.com/slawkens/myaac/commit/6775a061bebc9ff449522f0173556d4a7a44fa5e, https://github.com/slawkens/myaac/commit/603d860b56bc7418db09e206f40aa06d0682c00e)
|
||||
* General: Ensure some cache folders & index.html exists (https://github.com/slawkens/myaac/commit/730a0f29124811f525207c24c06eb0d088fa3434)
|
||||
|
||||
## [1.8.4 - 27.10.2025]
|
||||
|
||||
### Changed
|
||||
* Reimport myaac_ tables on every install, this fixes errors when one table is missing or is duplicated (https://github.com/slawkens/myaac/commit/2580edadf84779f09fd395c21f92019b2c762f83)
|
||||
* Use custom env init on migrate, migrate:run and migrate:to (https://github.com/slawkens/myaac/commit/13ea68cc0c9349380c8e4051d702a6c2c8256f44, https://github.com/slawkens/myaac/commit/07fd034fe4cb0ffdb88667b1e400f414d0c6d06f)
|
||||
|
||||
### Fixed
|
||||
* Show if there is mysql error on import schema (https://github.com/slawkens/myaac/commit/44110a9496b4385e42c31b75de301037e711b6c3)
|
||||
* Fix the premium checks, introduced in v1.8.3 (https://github.com/slawkens/myaac/commit/9d92a11fb7cb6d7a1619d79c12faaa0b1c01f980)
|
||||
|
||||
## [1.8.3 - 21.10.2025]
|
||||
|
||||
### Added
|
||||
|
||||
4
aac
4
aac
@@ -25,7 +25,9 @@ foreach ($commandsGlob as $item) {
|
||||
}
|
||||
|
||||
$commandPre = '\\MyAAC\Commands\\';
|
||||
$application->add(new ($commandPre . $name));
|
||||
if (!trait_exists($class = $commandPre . $name)) {
|
||||
$application->add(new $class);
|
||||
}
|
||||
}
|
||||
|
||||
$pluginCommands = Plugins::getCommands();
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
* @package MyAAC
|
||||
* @author Slawkens <slawkens@gmail.com>
|
||||
* @author Lee
|
||||
* @author gpedro
|
||||
* @copyright 2020 MyAAC
|
||||
* @link https://my-aac.org
|
||||
*/
|
||||
@@ -19,9 +20,9 @@ $title = 'Mass Account Actions';
|
||||
csrfProtect();
|
||||
|
||||
$hasPointsColumn = $db->hasColumn('accounts', 'premium_points');
|
||||
$freePremium = $config['lua']['freePremium'];
|
||||
$freePremium = getBoolean(configLua('freePremium'));
|
||||
|
||||
function admin_give_points($points)
|
||||
function admin_give_points($points): void
|
||||
{
|
||||
global $hasPointsColumn;
|
||||
|
||||
@@ -37,7 +38,7 @@ function admin_give_points($points)
|
||||
displayMessage($points . ' points added to all accounts.', true);
|
||||
}
|
||||
|
||||
function admin_give_coins($coins)
|
||||
function admin_give_coins($coins): void
|
||||
{
|
||||
if (!HAS_ACCOUNT_COINS) {
|
||||
displayMessage('Coins not supported.');
|
||||
@@ -52,7 +53,7 @@ function admin_give_coins($coins)
|
||||
displayMessage($coins . ' coins added to all accounts.', true);
|
||||
}
|
||||
|
||||
function admin_give_premdays($days)
|
||||
function admin_give_premdays($days): void
|
||||
{
|
||||
global $db, $freePremium;
|
||||
|
||||
@@ -63,6 +64,7 @@ function admin_give_premdays($days)
|
||||
|
||||
$value = $days * 86400;
|
||||
$now = time();
|
||||
|
||||
// othire
|
||||
if ($db->hasColumn('accounts', 'premend')) {
|
||||
// append premend
|
||||
@@ -70,14 +72,11 @@ function admin_give_premdays($days)
|
||||
// set premend
|
||||
if (Account::where('premend', '<=', $now)->update(['premend' => $now + $value])) {
|
||||
displayMessage($days . ' premium days added to all accounts.', true);
|
||||
return;
|
||||
} else {
|
||||
displayMessage('Failed to execute set query.');
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
displayMessage('Failed to execute append query.');
|
||||
return;
|
||||
}
|
||||
|
||||
return;
|
||||
@@ -92,20 +91,14 @@ function admin_give_premdays($days)
|
||||
// set lastday
|
||||
if (Account::where('lastday', '<=', $now)->update(['lastday' => $now + $value])) {
|
||||
displayMessage($days . ' premium days added to all accounts.', true);
|
||||
return;
|
||||
} else {
|
||||
displayMessage('Failed to execute set query.');
|
||||
return;
|
||||
}
|
||||
|
||||
return;
|
||||
} else {
|
||||
displayMessage('Failed to execute append query.');
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
displayMessage('Failed to execute set days query.');
|
||||
return;
|
||||
}
|
||||
|
||||
return;
|
||||
@@ -118,14 +111,11 @@ function admin_give_premdays($days)
|
||||
// set premium_ends_at
|
||||
if (Account::where('premium_ends_at', '<=', $now)->update(['premium_ends_at' => $now + $value])) {
|
||||
displayMessage($days . ' premium days added to all accounts.', true);
|
||||
return;
|
||||
} else {
|
||||
displayMessage('Failed to execute set query.');
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
displayMessage('Failed to execute append query.');
|
||||
return;
|
||||
}
|
||||
|
||||
return;
|
||||
@@ -170,7 +160,8 @@ else {
|
||||
));
|
||||
}
|
||||
|
||||
function displayMessage($message, $success = false) {
|
||||
function displayMessage($message, $success = false): void
|
||||
{
|
||||
global $twig, $hasPointsColumn, $freePremium;
|
||||
|
||||
$success ? success($message): error($message);
|
||||
|
||||
@@ -60,7 +60,7 @@ usort($menus, function ($a, $b) {
|
||||
|
||||
foreach ($menus as $i => $menu) {
|
||||
if (isset($menu['link']) && is_array($menu['link'])) {
|
||||
usort($menus[$i]['link'], function ($a, $b) {
|
||||
usort($menu['link'], function ($a, $b) {
|
||||
return $a['order'] - $b['order'];
|
||||
});
|
||||
}
|
||||
|
||||
@@ -12,7 +12,7 @@ require SYSTEM . 'login.php';
|
||||
|
||||
if(!admin()) {
|
||||
http_response_code(500);
|
||||
die('Access denied.');
|
||||
die('You are not logged in. Probably session expired. Please login again.');
|
||||
}
|
||||
|
||||
csrfProtect();
|
||||
@@ -40,3 +40,6 @@ if (count($errors) > 0) {
|
||||
if ($success) {
|
||||
echo 'Saved at ' . date('H:i');
|
||||
}
|
||||
else {
|
||||
echo 'Something unexpected happened - it was impossible to save the settings, please try again later. If problem persists - contact MyAAC developers.';
|
||||
}
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
if (version_compare(phpversion(), '8.1', '<')) die('PHP version 8.1 or higher is required.');
|
||||
|
||||
const MYAAC = true;
|
||||
const MYAAC_VERSION = '1.8.3';
|
||||
const MYAAC_VERSION = '1.8.5';
|
||||
const DATABASE_VERSION = 46;
|
||||
const TABLE_PREFIX = 'myaac_';
|
||||
define('START_TIME', microtime(true));
|
||||
|
||||
BIN
images/facebook_16x16.png
Normal file
BIN
images/facebook_16x16.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 718 B |
BIN
images/instagram_16x16.png
Normal file
BIN
images/instagram_16x16.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 721 B |
BIN
images/whatsapp_16x16.png
Normal file
BIN
images/whatsapp_16x16.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 688 B |
69
install/includes/import_base_data.php
Normal file
69
install/includes/import_base_data.php
Normal file
@@ -0,0 +1,69 @@
|
||||
<?php
|
||||
defined('MYAAC') or die('Direct access not allowed!');
|
||||
|
||||
use MyAAC\Models\Changelog;
|
||||
use MyAAC\Models\Config;
|
||||
use MyAAC\Models\ForumBoard;
|
||||
use MyAAC\Models\Gallery;
|
||||
use MyAAC\Models\NewsCategory;
|
||||
|
||||
if (Changelog::count() === 0) {
|
||||
Changelog::create([
|
||||
'type' => 3,
|
||||
'where' => 2,
|
||||
'date' => time(),
|
||||
'body' => 'MyAAC installed. (:',
|
||||
'hide' => 0,
|
||||
]);
|
||||
}
|
||||
|
||||
if (Config::where('name', 'database_version')->count() === 0) {
|
||||
Config::create([
|
||||
'name' => 'database_version',
|
||||
'value' => DATABASE_VERSION,
|
||||
]);
|
||||
}
|
||||
|
||||
if (ForumBoard::count() === 0) {
|
||||
$forumBoards = [
|
||||
['name' => 'News', 'description' => 'News commenting', 'closed' => 1],
|
||||
['name' => 'Trade', 'description' => 'Trade offers.', 'closed' => 0],
|
||||
['name' => 'Quests', 'description' => 'Quest making.', 'closed' => 0],
|
||||
['name' => 'Pictures', 'description' => 'Your pictures.', 'closed' => 0],
|
||||
['name' => 'Bug Report', 'description' => 'Report bugs there.', 'closed' => 0],
|
||||
];
|
||||
|
||||
$i = 0;
|
||||
foreach ($forumBoards as $forumBoard) {
|
||||
ForumBoard::create([
|
||||
'name' => $forumBoard['name'],
|
||||
'description' => $forumBoard['description'],
|
||||
'ordering' => $i++,
|
||||
'closed' => $forumBoard['closed'],
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
if (NewsCategory::count() === 0) {
|
||||
$newsCategoriesIcons = [
|
||||
0, 1, 2, 3, 4
|
||||
];
|
||||
|
||||
foreach ($newsCategoriesIcons as $iconId) {
|
||||
NewsCategory::create([
|
||||
'icon_id' => $iconId,
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
if (Gallery::count() === 0) {
|
||||
Gallery::create([
|
||||
'comment' => 'Demon',
|
||||
'image' => 'images/gallery/demon.jpg',
|
||||
'thumb' => 'images/gallery/demon_thumb.gif',
|
||||
'author' => 'MyAAC',
|
||||
'ordering' => 0,
|
||||
]);
|
||||
}
|
||||
|
||||
success($locale['step_database_success_import_data']);
|
||||
@@ -1,6 +1,4 @@
|
||||
SET @myaac_database_version = 46;
|
||||
|
||||
CREATE TABLE `myaac_account_actions`
|
||||
CREATE TABLE IF NOT EXISTS `myaac_account_actions`
|
||||
(
|
||||
`account_id` int NOT NULL,
|
||||
`ip` int unsigned NOT NULL DEFAULT 0,
|
||||
@@ -10,7 +8,7 @@ CREATE TABLE `myaac_account_actions`
|
||||
KEY (`account_id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8mb4;
|
||||
|
||||
CREATE TABLE `myaac_account_emails_verify`
|
||||
CREATE TABLE IF NOT EXISTS `myaac_account_emails_verify`
|
||||
(
|
||||
`id` int NOT NULL AUTO_INCREMENT,
|
||||
`account_id` int NOT NULL,
|
||||
@@ -19,7 +17,7 @@ CREATE TABLE `myaac_account_emails_verify`
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8mb4;
|
||||
|
||||
CREATE TABLE `myaac_admin_menu`
|
||||
CREATE TABLE IF NOT EXISTS `myaac_admin_menu`
|
||||
(
|
||||
`id` int NOT NULL AUTO_INCREMENT,
|
||||
`name` varchar(255) NOT NULL DEFAULT '',
|
||||
@@ -30,7 +28,7 @@ CREATE TABLE `myaac_admin_menu`
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8mb4;
|
||||
|
||||
CREATE TABLE `myaac_changelog`
|
||||
CREATE TABLE IF NOT EXISTS `myaac_changelog`
|
||||
(
|
||||
`id` int NOT NULL AUTO_INCREMENT,
|
||||
`body` varchar(500) NOT NULL DEFAULT '',
|
||||
@@ -42,9 +40,7 @@ CREATE TABLE `myaac_changelog`
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8mb4;
|
||||
|
||||
INSERT INTO `myaac_changelog` (`id`, `type`, `where`, `date`, `body`, `hide`) VALUES (1, 3, 2, UNIX_TIMESTAMP(), 'MyAAC installed. (:', 0);
|
||||
|
||||
CREATE TABLE `myaac_config`
|
||||
CREATE TABLE IF NOT EXISTS `myaac_config`
|
||||
(
|
||||
`id` int NOT NULL AUTO_INCREMENT,
|
||||
`name` varchar(30) NOT NULL,
|
||||
@@ -53,9 +49,7 @@ CREATE TABLE `myaac_config`
|
||||
UNIQUE (`name`)
|
||||
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8mb4;
|
||||
|
||||
INSERT INTO `myaac_config` (`name`, `value`) VALUES ('database_version', @myaac_database_version);
|
||||
|
||||
CREATE TABLE `myaac_faq`
|
||||
CREATE TABLE IF NOT EXISTS `myaac_faq`
|
||||
(
|
||||
`id` int NOT NULL AUTO_INCREMENT,
|
||||
`question` varchar(255) NOT NULL DEFAULT '',
|
||||
@@ -65,7 +59,7 @@ CREATE TABLE `myaac_faq`
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8mb4;
|
||||
|
||||
CREATE TABLE `myaac_forum_boards`
|
||||
CREATE TABLE IF NOT EXISTS `myaac_forum_boards`
|
||||
(
|
||||
`id` int NOT NULL AUTO_INCREMENT,
|
||||
`name` varchar(32) NOT NULL,
|
||||
@@ -77,13 +71,8 @@ CREATE TABLE `myaac_forum_boards`
|
||||
`hide` tinyint NOT NULL DEFAULT 0,
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8mb4;
|
||||
INSERT INTO `myaac_forum_boards` (`id`, `name`, `description`, `ordering`, `closed`) VALUES (NULL, 'News', 'News commenting', 0, 1);
|
||||
INSERT INTO `myaac_forum_boards` (`id`, `name`, `description`, `ordering`) VALUES (NULL, 'Trade', 'Trade offers.', 1);
|
||||
INSERT INTO `myaac_forum_boards` (`id`, `name`, `description`, `ordering`) VALUES (NULL, 'Quests', 'Quest making.', 2);
|
||||
INSERT INTO `myaac_forum_boards` (`id`, `name`, `description`, `ordering`) VALUES (NULL, 'Pictures', 'Your pictures.', 3);
|
||||
INSERT INTO `myaac_forum_boards` (`id`, `name`, `description`, `ordering`) VALUES (NULL, 'Bug Report', 'Report bugs there.', 4);
|
||||
|
||||
CREATE TABLE `myaac_forum`
|
||||
CREATE TABLE IF NOT EXISTS `myaac_forum`
|
||||
(
|
||||
`id` int NOT NULL AUTO_INCREMENT,
|
||||
`first_post` int NOT NULL DEFAULT 0,
|
||||
@@ -107,7 +96,7 @@ CREATE TABLE `myaac_forum`
|
||||
KEY `section` (`section`)
|
||||
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8mb4;
|
||||
|
||||
CREATE TABLE `myaac_menu`
|
||||
CREATE TABLE IF NOT EXISTS `myaac_menu`
|
||||
(
|
||||
`id` int NOT NULL AUTO_INCREMENT,
|
||||
`template` varchar(255) NOT NULL,
|
||||
@@ -121,7 +110,7 @@ CREATE TABLE `myaac_menu`
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8mb4;
|
||||
|
||||
CREATE TABLE `myaac_monsters` (
|
||||
CREATE TABLE IF NOT EXISTS `myaac_monsters` (
|
||||
`id` int NOT NULL AUTO_INCREMENT,
|
||||
`hide` tinyint NOT NULL DEFAULT 0,
|
||||
`name` varchar(255) NOT NULL,
|
||||
@@ -154,7 +143,7 @@ CREATE TABLE `myaac_monsters` (
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8mb4;
|
||||
|
||||
CREATE TABLE `myaac_news`
|
||||
CREATE TABLE IF NOT EXISTS `myaac_news`
|
||||
(
|
||||
`id` int NOT NULL AUTO_INCREMENT,
|
||||
`title` varchar(100) NOT NULL,
|
||||
@@ -172,7 +161,7 @@ CREATE TABLE `myaac_news`
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8mb4;
|
||||
|
||||
CREATE TABLE `myaac_news_categories`
|
||||
CREATE TABLE IF NOT EXISTS `myaac_news_categories`
|
||||
(
|
||||
`id` int NOT NULL AUTO_INCREMENT,
|
||||
`name` varchar(50) NOT NULL DEFAULT "",
|
||||
@@ -182,13 +171,7 @@ CREATE TABLE `myaac_news_categories`
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8mb4;
|
||||
|
||||
INSERT INTO `myaac_news_categories` (`id`, `icon_id`) VALUES (NULL, 0);
|
||||
INSERT INTO `myaac_news_categories` (`id`, `icon_id`) VALUES (NULL, 1);
|
||||
INSERT INTO `myaac_news_categories` (`id`, `icon_id`) VALUES (NULL, 2);
|
||||
INSERT INTO `myaac_news_categories` (`id`, `icon_id`) VALUES (NULL, 3);
|
||||
INSERT INTO `myaac_news_categories` (`id`, `icon_id`) VALUES (NULL, 4);
|
||||
|
||||
CREATE TABLE `myaac_notepad`
|
||||
CREATE TABLE IF NOT EXISTS `myaac_notepad`
|
||||
(
|
||||
`id` int NOT NULL AUTO_INCREMENT,
|
||||
`account_id` int NOT NULL,
|
||||
@@ -198,7 +181,7 @@ CREATE TABLE `myaac_notepad`
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8mb4;
|
||||
|
||||
CREATE TABLE `myaac_pages`
|
||||
CREATE TABLE IF NOT EXISTS `myaac_pages`
|
||||
(
|
||||
`id` INT NOT NULL AUTO_INCREMENT,
|
||||
`name` varchar(30) NOT NULL,
|
||||
@@ -214,7 +197,7 @@ CREATE TABLE `myaac_pages`
|
||||
UNIQUE (`name`)
|
||||
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8mb4;
|
||||
|
||||
CREATE TABLE `myaac_gallery`
|
||||
CREATE TABLE IF NOT EXISTS `myaac_gallery`
|
||||
(
|
||||
`id` int NOT NULL AUTO_INCREMENT,
|
||||
`comment` varchar(255) NOT NULL DEFAULT '',
|
||||
@@ -226,9 +209,7 @@ CREATE TABLE `myaac_gallery`
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8mb4;
|
||||
|
||||
INSERT INTO `myaac_gallery` (`id`, `ordering`, `comment`, `image`, `thumb`, `author`) VALUES (NULL, 1, 'Demon', 'images/gallery/demon.jpg', 'images/gallery/demon_thumb.gif', 'MyAAC');
|
||||
|
||||
CREATE TABLE `myaac_settings`
|
||||
CREATE TABLE IF NOT EXISTS `myaac_settings`
|
||||
(
|
||||
`id` int NOT NULL AUTO_INCREMENT,
|
||||
`name` varchar(255) NOT NULL DEFAULT '',
|
||||
@@ -238,7 +219,7 @@ CREATE TABLE `myaac_settings`
|
||||
KEY `key` (`key`)
|
||||
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8mb4;
|
||||
|
||||
CREATE TABLE `myaac_spells`
|
||||
CREATE TABLE IF NOT EXISTS `myaac_spells`
|
||||
(
|
||||
`id` int NOT NULL AUTO_INCREMENT,
|
||||
`spell` varchar(255) NOT NULL DEFAULT '',
|
||||
@@ -261,7 +242,7 @@ CREATE TABLE `myaac_spells`
|
||||
UNIQUE (`name`)
|
||||
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8mb4;
|
||||
|
||||
CREATE TABLE `myaac_visitors`
|
||||
CREATE TABLE IF NOT EXISTS `myaac_visitors`
|
||||
(
|
||||
`ip` varchar(45) NOT NULL,
|
||||
`lastvisit` int NOT NULL DEFAULT 0,
|
||||
@@ -270,7 +251,7 @@ CREATE TABLE `myaac_visitors`
|
||||
UNIQUE (`ip`)
|
||||
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8mb4;
|
||||
|
||||
CREATE TABLE `myaac_weapons`
|
||||
CREATE TABLE IF NOT EXISTS `myaac_weapons`
|
||||
(
|
||||
`id` int NOT NULL,
|
||||
`level` int NOT NULL DEFAULT 0,
|
||||
|
||||
@@ -30,27 +30,23 @@ if(!$error) {
|
||||
}
|
||||
}
|
||||
|
||||
if($db->hasTable(TABLE_PREFIX . 'account_actions')) {
|
||||
$locale['step_database_error_table_exist'] = str_replace('$TABLE$', TABLE_PREFIX . 'account_actions', $locale['step_database_error_table_exist']);
|
||||
warning($locale['step_database_error_table_exist']);
|
||||
}
|
||||
else {
|
||||
// import schema
|
||||
try {
|
||||
// import schema
|
||||
try {
|
||||
$locale['step_database_importing'] = str_replace('$DATABASE_NAME$', config('database_name'), $locale['step_database_importing']);
|
||||
success($locale['step_database_importing']);
|
||||
|
||||
$db->query(file_get_contents(BASE . 'install/includes/schema.sql'));
|
||||
$db->exec(file_get_contents(BASE . 'install/includes/schema.sql'));
|
||||
|
||||
$locale['step_database_success_schema'] = str_replace('$PREFIX$', TABLE_PREFIX, $locale['step_database_success_schema']);
|
||||
success($locale['step_database_success_schema']);
|
||||
}
|
||||
catch(PDOException $error_) {
|
||||
}
|
||||
catch(PDOException $error_) {
|
||||
error($locale['step_database_error_schema'] . ' ' . $error_);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
require BASE . 'install/includes/import_base_data.php';
|
||||
|
||||
if(!$db->hasColumn('accounts', 'email')) {
|
||||
if(query("ALTER TABLE `accounts` ADD `email` varchar(255) NOT NULL DEFAULT '';"))
|
||||
success($locale['step_database_adding_field'] . ' accounts.email...');
|
||||
|
||||
@@ -433,16 +433,22 @@ function delete_guild($id)
|
||||
$rank_list->orderBy('level');
|
||||
|
||||
global $db;
|
||||
|
||||
$deletedColumn = 'deleted';
|
||||
if ($db->hasColumn('players', 'deletion')) {
|
||||
$deletedColumn = 'deletion';
|
||||
}
|
||||
|
||||
/**
|
||||
* @var OTS_GuildRank $rank_in_guild
|
||||
*/
|
||||
foreach($rank_list as $rank_in_guild) {
|
||||
if($db->hasTable('guild_members'))
|
||||
$players_with_rank = $db->query('SELECT `players`.`id` as `id`, `guild_members`.`rank_id` as `rank_id` FROM `players`, `guild_members` WHERE `guild_members`.`rank_id` = ' . $rank_in_guild->getId() . ' AND `players`.`id` = `guild_members`.`player_id` ORDER BY `name`;');
|
||||
$players_with_rank = $db->query('SELECT `players`.`id` as `id`, `guild_members`.`rank_id` as `rank_id` FROM `players`, `guild_members` WHERE `guild_members`.`rank_id` = ' . $rank_in_guild->getId() . ' AND `players`.`id` = `guild_members`.`player_id` AND `' . $deletedColumn . '` = 0 ORDER BY `name`;');
|
||||
else if($db->hasTable('guild_membership'))
|
||||
$players_with_rank = $db->query('SELECT `players`.`id` as `id`, `guild_membership`.`rank_id` as `rank_id` FROM `players`, `guild_membership` WHERE `guild_membership`.`rank_id` = ' . $rank_in_guild->getId() . ' AND `players`.`id` = `guild_membership`.`player_id` ORDER BY `name`;');
|
||||
$players_with_rank = $db->query('SELECT `players`.`id` as `id`, `guild_membership`.`rank_id` as `rank_id` FROM `players`, `guild_membership` WHERE `guild_membership`.`rank_id` = ' . $rank_in_guild->getId() . ' AND `players`.`id` = `guild_membership`.`player_id` AND `' . $deletedColumn . '` = 0 ORDER BY `name`;');
|
||||
else
|
||||
$players_with_rank = $db->query('SELECT `id`, `rank_id` FROM `players` WHERE `rank_id` = ' . $rank_in_guild->getId() . ' AND `deleted` = 0;');
|
||||
$players_with_rank = $db->query('SELECT `id`, `rank_id` FROM `players` WHERE `rank_id` = ' . $rank_in_guild->getId() . ' AND `' . $deletedColumn . '` = 0;');
|
||||
|
||||
$players_with_rank_number = $players_with_rank->rowCount();
|
||||
if($players_with_rank_number > 0) {
|
||||
@@ -1177,7 +1183,8 @@ function getTopPlayers($limit = 5, $skill = 'level') {
|
||||
});
|
||||
}
|
||||
|
||||
function deleteDirectory($dir, $ignore = array(), $contentOnly = false) {
|
||||
function deleteDirectory($dir, $ignore = array(), $contentOnly = false): bool
|
||||
{
|
||||
if(!file_exists($dir)) {
|
||||
return true;
|
||||
}
|
||||
@@ -1203,6 +1210,21 @@ function deleteDirectory($dir, $ignore = array(), $contentOnly = false) {
|
||||
return rmdir($dir);
|
||||
}
|
||||
|
||||
function ensureFolderExists($dir): void
|
||||
{
|
||||
if (!file_exists($dir)) {
|
||||
mkdir($dir, 0777, true);
|
||||
}
|
||||
}
|
||||
|
||||
function ensureIndexExists($dir): void
|
||||
{
|
||||
$dir = rtrim($dir, '/');
|
||||
if (!file_exists($file = $dir . '/index.html')) {
|
||||
touch($file);
|
||||
}
|
||||
}
|
||||
|
||||
function config($key) {
|
||||
global $config;
|
||||
if (is_array($key)) {
|
||||
@@ -1712,6 +1734,43 @@ function isCanary(): bool
|
||||
return isset($vipSystemEnabled);
|
||||
}
|
||||
|
||||
function getStatusUptimeReadable(int $uptime): string
|
||||
{
|
||||
$fullMinute = 60;
|
||||
$fullHour = (60 * $fullMinute);
|
||||
$fullDay = (24 * $fullHour);
|
||||
$fullMonth = (30 * $fullDay);
|
||||
$fullYear = (365 * $fullDay);
|
||||
|
||||
// years
|
||||
$years = floor($uptime / $fullYear);
|
||||
$y = ($years > 1 ? "$years years, " : ($years == 1 ? 'year, ' : ''));
|
||||
|
||||
$uptime -= $years * $fullYear;
|
||||
|
||||
// months
|
||||
$months = floor($uptime / $fullMonth);
|
||||
$m = ($months > 1 ? "$months months, " : ($months == 1 ? 'month, ' : ''));
|
||||
|
||||
$uptime -= $months * $fullMonth;
|
||||
|
||||
// days
|
||||
$days = floor($uptime / $fullDay);
|
||||
$d = ($days > 1 ? "$days days, " : ($days == 1 ? 'day, ' : ''));
|
||||
|
||||
$uptime -= $days * $fullDay;
|
||||
|
||||
// hours
|
||||
$hours = floor($uptime / $fullHour);
|
||||
|
||||
$uptime -= $hours * $fullHour;
|
||||
|
||||
// minutes
|
||||
$min = floor($uptime / $fullMinute);
|
||||
|
||||
return "{$y}{$m}{$d}{$hours}h {$min}m";
|
||||
}
|
||||
|
||||
// validator functions
|
||||
require_once SYSTEM . 'compat/base.php';
|
||||
|
||||
|
||||
@@ -18,6 +18,9 @@ use MyAAC\Settings;
|
||||
|
||||
defined('MYAAC') or die('Direct access not allowed!');
|
||||
|
||||
ensureIndexExists(CACHE);
|
||||
ensureIndexExists(CACHE . 'twig/');
|
||||
|
||||
global $config;
|
||||
if(!isset($config['installed']) || !$config['installed']) {
|
||||
throw new RuntimeException('MyAAC has not been installed yet or there was error during installation. Please install again.');
|
||||
|
||||
@@ -445,16 +445,11 @@ class OTS_Account extends OTS_Row_DAO implements IteratorAggregate, Countable
|
||||
|
||||
if(isset($this->data['premium_ends_at']) || isset($this->data['premend']) ||
|
||||
(isCanary() && isset($this->data['lastday']))) {
|
||||
$col = (isset($this->premium_ends_at) ? 'premium_ends_at' : (isset($this->data['lastday']) ? 'lastday' : 'premend'));
|
||||
$col = (isset($this->data['premium_ends_at']) ? 'premium_ends_at' : (isset($this->data['lastday']) ? 'lastday' : 'premend'));
|
||||
$ret = ceil(($this->data[$col] - time()) / (24 * 60 * 60));
|
||||
return max($ret, 0);
|
||||
}
|
||||
|
||||
if (isCanary() && isset($this->data['lastday'])) {
|
||||
$ret = ceil(($this->data['lastday'] - time()) / 86400);
|
||||
return max($ret, 0);
|
||||
}
|
||||
|
||||
if($this->data['premdays'] == 0) {
|
||||
return 0;
|
||||
}
|
||||
@@ -477,14 +472,16 @@ class OTS_Account extends OTS_Row_DAO implements IteratorAggregate, Countable
|
||||
return $this->data['lastday'];
|
||||
}
|
||||
|
||||
public function isPremium()
|
||||
public function isPremium(): bool
|
||||
{
|
||||
if(isset($this->data['premium_ends_at'])) {
|
||||
return $this->data['premium_ends_at'] > time();
|
||||
if(isset($this->data['premium_ends_at']) || isset($this->data['premend']) ||
|
||||
(isCanary() && isset($this->data['lastday']))) {
|
||||
$col = (isset($this->data['premium_ends_at']) ? 'premium_ends_at' : (isset($this->data['lastday']) ? 'lastday' : 'premend'));
|
||||
return $this->data[$col] > time();
|
||||
}
|
||||
|
||||
if(isset($this->data['premend'])) {
|
||||
return $this->data['premend'] > time();
|
||||
if($this->data['premdays'] == self::GRATIS_PREMIUM_DAYS){
|
||||
return true;
|
||||
}
|
||||
|
||||
return ($this->data['premdays'] - (date("z", time()) + (365 * (date("Y", time()) - date("Y", $this->data['lastday']))) - date("z", $this->data['lastday'])) > 0);
|
||||
|
||||
@@ -97,6 +97,8 @@ class OTS_ServerInfo
|
||||
return new OTS_Buffer($data);
|
||||
}
|
||||
|
||||
log_append('status-error.log', "Cannot connect to {$this->server}:{$this->port} - Error code: $error, message: $message");
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
@@ -78,6 +78,7 @@ $locale['step_database_error_mysql_connect_3'] = 'MySQL ist nicht richtig konfig
|
||||
$locale['step_database_error_mysql_connect_4'] = 'MySQL-Server läuft nicht.';
|
||||
$locale['step_database_error_schema'] = 'Fehler beim Importieren des Schemas:';
|
||||
$locale['step_database_success_schema'] = '$PREFIX$ Tabellen wurden erfolgreich installiert.';
|
||||
$locale['step_database_success_import_data'] = 'Import von Daten für Tabellen was erfolgreich.';
|
||||
$locale['step_database_error_file'] = '$FILE$ konnte nicht geöffnet werden. Bitte kopieren Sie diesen Inhalt und fügen Sie ihn dort ein:';
|
||||
$locale['step_database_adding_field'] = 'Folgendes Feld wurde hinzugefügt: ';
|
||||
$locale['step_database_modifying_field'] = 'Folgendes Feld wurde geändert: ';
|
||||
|
||||
@@ -83,6 +83,7 @@ $locale['step_database_error_mysql_connect_3'] = 'MySQL is not configured proper
|
||||
$locale['step_database_error_mysql_connect_4'] = 'MySQL server is not running.';
|
||||
$locale['step_database_error_schema'] = 'Error while importing schema:';
|
||||
$locale['step_database_success_schema'] = 'Successfully installed $PREFIX$ tables.';
|
||||
$locale['step_database_success_import_data'] = 'Successfully imported base data for tables.';
|
||||
$locale['step_database_error_file'] = '$FILE$ couldn\'t be opened. Please copy this content and paste there:';
|
||||
$locale['step_database_adding_field'] = 'Adding field';
|
||||
$locale['step_database_modifying_field'] = 'Modifying field';
|
||||
|
||||
@@ -81,7 +81,8 @@ $locale['step_database_error_mysql_connect_2'] = 'Możliwe przyczyny:';
|
||||
$locale['step_database_error_mysql_connect_3'] = 'MySQL nie jest poprawnie skonfigurowane w <i>config.lua</i>.';
|
||||
$locale['step_database_error_mysql_connect_4'] = 'Serwer MySQL nie jest uruchomiony.';
|
||||
$locale['step_database_error_schema'] = 'Błąd podczas importowania struktury bazy danych:';
|
||||
$locale['step_database_success_schema'] = 'Pomyślnie zainstalowano tabele $PREFIX$.';
|
||||
$locale['step_database_success_schema'] = 'Pomyślnie zaimportowano tabele $PREFIX$.';
|
||||
$locale['step_database_success_import_data'] = 'Pomyślnie załadowano bazowe dane dla tabel.';
|
||||
$locale['step_database_error_file'] = '$FILE$ nie mógł zostać otwarty. Proszę skopiować zawartość pola tekstowego i wkleić do tego pliku:';
|
||||
$locale['step_database_adding_field'] = 'Dodawanie pola';
|
||||
$locale['step_database_modifying_field'] = 'Modyfikacja pola';
|
||||
|
||||
@@ -9,6 +9,8 @@
|
||||
*/
|
||||
defined('MYAAC') or die('Direct access not allowed!');
|
||||
|
||||
global $db;
|
||||
|
||||
// database migrations
|
||||
$tmp = '';
|
||||
if(fetchDatabaseConfig('database_version', $tmp)) { // we got version
|
||||
|
||||
@@ -367,7 +367,7 @@ if(!empty($errors))
|
||||
|
||||
if (setting('core.account_country')) {
|
||||
$countries = array();
|
||||
foreach (array('pl', 'se', 'br', 'us', 'gb') as $c)
|
||||
foreach (setting('core.account_countries_most_popular') ?? [] as $c)
|
||||
$countries[$c] = $config['countries'][$c];
|
||||
|
||||
$countries['--'] = '----------';
|
||||
|
||||
@@ -202,35 +202,37 @@ if($player->isLoaded() && !$player->isDeleted())
|
||||
unset($storage);
|
||||
}
|
||||
|
||||
if($db->hasTable('player_items') && $db->hasColumn('player_items', 'pid') && $db->hasColumn('player_items', 'sid') && $db->hasColumn('player_items', 'itemtype')) {
|
||||
if ($db->hasTableAndColumns('player_items', ['pid', 'sid', 'itemtype'])) {
|
||||
$eq_sql = $db->query('SELECT `pid`, `itemtype` FROM player_items WHERE player_id = '.$player->getId().' AND (`pid` >= 1 and `pid` <= 10)');
|
||||
$equipment = array();
|
||||
foreach($eq_sql as $eq)
|
||||
$equipment = [];
|
||||
foreach($eq_sql as $eq) {
|
||||
$equipment[$eq['pid']] = $eq['itemtype'];
|
||||
}
|
||||
|
||||
$empty_slots = array("", "no_helmet", "no_necklace", "no_backpack", "no_armor", "no_handleft", "no_handright", "no_legs", "no_boots", "no_ring", "no_ammo");
|
||||
for($i = 0; $i <= 10; $i++)
|
||||
{
|
||||
$empty_slots = ["", "no_helmet", "no_necklace", "no_backpack", "no_armor", "no_handleft", "no_handright", "no_legs", "no_boots", "no_ring", "no_ammo"];
|
||||
|
||||
for($i = 0; $i <= 10; $i++) {
|
||||
if(!isset($equipment[$i]) || $equipment[$i] == 0)
|
||||
$equipment[$i] = $empty_slots[$i];
|
||||
}
|
||||
|
||||
for($i = 1; $i < 11; $i++)
|
||||
{
|
||||
if(Validator::number($equipment[$i]))
|
||||
for($i = 1; $i < 11; $i++) {
|
||||
if(Validator::number($equipment[$i])) {
|
||||
$equipment[$i] = getItemImage($equipment[$i]);
|
||||
else
|
||||
}
|
||||
else {
|
||||
$equipment[$i] = '<img src="images/items/' . $equipment[$i] . '.gif" width="32" height="32" border="0" alt=" ' . $equipment[$i] . '" />';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$skulls = array(
|
||||
$skulls = [
|
||||
1 => 'yellow_skull',
|
||||
2 => 'green_skull',
|
||||
3 => 'white_skull',
|
||||
4 => 'red_skull',
|
||||
5 => 'black_skull'
|
||||
);
|
||||
}
|
||||
5 => 'black_skull',
|
||||
];
|
||||
|
||||
$dead_add_content = '';
|
||||
$deaths = array();
|
||||
|
||||
@@ -22,7 +22,7 @@ if(!$logged) {
|
||||
}
|
||||
|
||||
$configLuaFreePremium = configLua('freePremium');
|
||||
$freePremium = (isset($configLuaFreePremium) && getBoolean($configLuaFreePremium)) || ($logged && $account_logged->getPremDays() == OTS_Account::GRATIS_PREMIUM_DAYS);
|
||||
$freePremium = (isset($configLuaFreePremium) && getBoolean($configLuaFreePremium));
|
||||
|
||||
$array_of_player_nig = array();
|
||||
if(empty($errors))
|
||||
|
||||
@@ -91,13 +91,18 @@ $guild_owner = $guild->getOwner();
|
||||
if($guild_owner->isLoaded())
|
||||
$guild_owner_name = $guild_owner->getName();
|
||||
|
||||
$deletedColumn = 'deleted';
|
||||
if ($db->hasColumn('players', 'deletion')) {
|
||||
$deletedColumn = 'deletion';
|
||||
}
|
||||
|
||||
$guild_members = array();
|
||||
foreach($rank_list as $rank)
|
||||
{
|
||||
if($db->hasTable(GUILD_MEMBERS_TABLE))
|
||||
$players_with_rank = $db->query('SELECT `players`.`id` as `id`, `' . GUILD_MEMBERS_TABLE . '`.`rank_id` as `rank_id` FROM `players`, `' . GUILD_MEMBERS_TABLE . '` WHERE `' . GUILD_MEMBERS_TABLE . '`.`rank_id` = ' . $rank->getId() . ' AND `players`.`id` = `' . GUILD_MEMBERS_TABLE . '`.`player_id` ORDER BY `name`;');
|
||||
$players_with_rank = $db->query('SELECT `players`.`id` as `id`, `' . GUILD_MEMBERS_TABLE . '`.`rank_id` as `rank_id` FROM `players`, `' . GUILD_MEMBERS_TABLE . '` WHERE `' . GUILD_MEMBERS_TABLE . '`.`rank_id` = ' . $rank->getId() . ' AND `players`.`id` = `' . GUILD_MEMBERS_TABLE . '`.`player_id` AND `' . $deletedColumn . '` = 0 ORDER BY `name`;');
|
||||
else if($db->hasColumn('players', 'rank_id'))
|
||||
$players_with_rank = $db->query('SELECT `id`, `rank_id` FROM `players` WHERE `rank_id` = ' . $rank->getId() . ' AND `deleted` = 0;');
|
||||
$players_with_rank = $db->query('SELECT `id`, `rank_id` FROM `players` WHERE `rank_id` = ' . $rank->getId() . ' AND `' . $deletedColumn . '` = 0;');
|
||||
|
||||
$players_with_rank_number = $players_with_rank->rowCount();
|
||||
if($players_with_rank_number > 0)
|
||||
|
||||
@@ -122,7 +122,7 @@ if(!$news_cached)
|
||||
);
|
||||
}
|
||||
|
||||
$tickers_db = $db->query('SELECT * FROM `' . TABLE_PREFIX . 'news` WHERE `type` = ' . TICKER .($canEdit ? '' : ' AND `hide` != 1') .' ORDER BY `date` DESC LIMIT ' . setting('core.news_ticker_limit'));
|
||||
$tickers_db = $db->query('SELECT * FROM `' . TABLE_PREFIX . 'news` WHERE `type` = ' . TICKER . ' AND `hide` != 1 ORDER BY `date` DESC LIMIT ' . setting('core.news_ticker_limit'));
|
||||
$tickers_content = '';
|
||||
if($tickers_db->rowCount() > 0)
|
||||
{
|
||||
@@ -142,7 +142,8 @@ if(!$news_cached)
|
||||
if($cache->enabled() && !$canEdit)
|
||||
$cache->set('news_' . $template_name . '_' . TICKER, $tickers_content, 60 * 60);
|
||||
|
||||
$featured_article_db =$db->query('SELECT `id`, `title`, `article_text`, `article_image`, `hide` FROM `' . TABLE_PREFIX . 'news` WHERE `type` = ' . ARTICLE . ($canEdit ? '' : ' AND `hide` != 1') .' ORDER BY `date` DESC LIMIT 1');
|
||||
$featured_article_db =$db->query('SELECT `id`, `title`, `article_text`, `article_image`, `hide` FROM `' . TABLE_PREFIX . 'news` WHERE `type` = ' . ARTICLE . ' AND `hide` != 1 ORDER BY `date` DESC LIMIT 1');
|
||||
|
||||
$article = '';
|
||||
if($featured_article_db->rowCount() > 0) {
|
||||
$article = $featured_article_db->fetch();
|
||||
@@ -175,7 +176,7 @@ else {
|
||||
if(!$news_cached)
|
||||
{
|
||||
ob_start();
|
||||
$newses = $db->query('SELECT * FROM ' . $db->tableName(TABLE_PREFIX . 'news') . ' WHERE type = ' . NEWS . ($canEdit ? '' : ' AND hide != 1') . ' ORDER BY date' . ' DESC LIMIT ' . setting('core.news_limit'));
|
||||
$newses = $db->query('SELECT * FROM ' . $db->tableName(TABLE_PREFIX . 'news') . ' WHERE type = ' . NEWS . ' AND hide != 1 ORDER BY date' . ' DESC LIMIT ' . setting('core.news_limit'));
|
||||
if($newses->rowCount() > 0)
|
||||
{
|
||||
foreach($newses as $news)
|
||||
|
||||
@@ -737,6 +737,18 @@ Sent by MyAAC,<br/>
|
||||
'desc' => 'should country of user be automatically recognized by his IP? This makes an external API call to http://ipinfo.io',
|
||||
'default' => true,
|
||||
],
|
||||
'account_countries_most_popular' => [
|
||||
'name' => 'Account Countries Most Popular',
|
||||
'type' => 'text',
|
||||
'desc' => 'Those countries will be display at the top of the list on the create account page. The short codes of countries can be found in file <i>system/countries.conf.php</i>',
|
||||
'default' => 'pl,se,br,us,gb',
|
||||
'callbacks' => [
|
||||
'get' => function ($value) {
|
||||
$tmp = array_map('trim', explode(',', $value));
|
||||
return array_filter($tmp, function ($v) {return !empty($v); });
|
||||
},
|
||||
],
|
||||
],
|
||||
'characters_per_account' => [
|
||||
'name' => 'Characters per Account',
|
||||
'type' => 'number',
|
||||
|
||||
@@ -27,6 +27,9 @@ class PHP
|
||||
{
|
||||
$var = var_export($var, true);
|
||||
|
||||
ensureFolderExists($this->dir);
|
||||
ensureIndexExists($this->dir);
|
||||
|
||||
// Write to temp file first to ensure atomicity
|
||||
$tmp = $this->dir . "tmp_$key." . uniqid('', true) . '.tmp';
|
||||
file_put_contents($tmp, '<?php $var = ' . $var . ';', LOCK_EX);
|
||||
|
||||
33
system/src/Commands/Env.php
Normal file
33
system/src/Commands/Env.php
Normal file
@@ -0,0 +1,33 @@
|
||||
<?php
|
||||
|
||||
namespace MyAAC\Commands;
|
||||
|
||||
use POT;
|
||||
|
||||
trait Env
|
||||
{
|
||||
protected function init(): void
|
||||
{
|
||||
global $config;
|
||||
if (!isset($config['installed']) || !$config['installed']) {
|
||||
throw new \RuntimeException('MyAAC has not been installed yet or there was error during installation. Please install again.');
|
||||
}
|
||||
|
||||
if(empty($config['server_path'])) {
|
||||
throw new \RuntimeException('Server Path has been not set. Go to config.php and set it.');
|
||||
}
|
||||
|
||||
// take care of trailing slash at the end
|
||||
if($config['server_path'][strlen($config['server_path']) - 1] !== '/')
|
||||
$config['server_path'] .= '/';
|
||||
|
||||
$config['lua'] = load_config_lua($config['server_path'] . 'config.lua');
|
||||
|
||||
// POT
|
||||
require_once SYSTEM . 'libs/pot/OTS.php';
|
||||
$ots = POT::getInstance();
|
||||
$eloquentConnection = null;
|
||||
|
||||
require_once SYSTEM . 'database.php';
|
||||
}
|
||||
}
|
||||
@@ -9,6 +9,8 @@ use Symfony\Component\Console\Style\SymfonyStyle;
|
||||
|
||||
class MigrateCommand extends Command
|
||||
{
|
||||
use Env;
|
||||
|
||||
protected function configure(): void
|
||||
{
|
||||
$this->setName('migrate')
|
||||
@@ -17,9 +19,19 @@ class MigrateCommand extends Command
|
||||
|
||||
protected function execute(InputInterface $input, OutputInterface $output): int
|
||||
{
|
||||
require SYSTEM . 'init.php';
|
||||
$this->init();
|
||||
|
||||
$io = new SymfonyStyle($input, $output);
|
||||
|
||||
$tmp = '';
|
||||
if(fetchDatabaseConfig('database_version', $tmp)) { // we got version
|
||||
$tmp = (int)$tmp;
|
||||
if ($tmp >= DATABASE_VERSION) {
|
||||
$io->success('Already on latest version.');
|
||||
return Command::SUCCESS;
|
||||
}
|
||||
}
|
||||
|
||||
require SYSTEM . 'migrate.php';
|
||||
|
||||
$io->success('Migrated to latest version (' . DATABASE_VERSION . ')');
|
||||
|
||||
@@ -10,6 +10,8 @@ use Symfony\Component\Console\Style\SymfonyStyle;
|
||||
|
||||
class MigrateRunCommand extends Command
|
||||
{
|
||||
use Env;
|
||||
|
||||
protected function configure(): void
|
||||
{
|
||||
$this->setName('migrate:run')
|
||||
@@ -23,12 +25,12 @@ class MigrateRunCommand extends Command
|
||||
|
||||
protected function execute(InputInterface $input, OutputInterface $output): int
|
||||
{
|
||||
require SYSTEM . 'init.php';
|
||||
|
||||
$io = new SymfonyStyle($input, $output);
|
||||
|
||||
$ids = $input->getArgument('id');
|
||||
|
||||
$this->init();
|
||||
|
||||
// pre-check
|
||||
// in case one of the migrations doesn't exist - we won't execute any of them
|
||||
foreach ($ids as $id) {
|
||||
|
||||
@@ -11,6 +11,8 @@ use Symfony\Component\Console\Style\SymfonyStyle;
|
||||
|
||||
class MigrateToCommand extends Command
|
||||
{
|
||||
use Env;
|
||||
|
||||
protected function configure(): void
|
||||
{
|
||||
$this->setName('migrate:to')
|
||||
@@ -32,7 +34,7 @@ class MigrateToCommand extends Command
|
||||
return Command::FAILURE;
|
||||
}
|
||||
|
||||
$this->initEnv();
|
||||
$this->init();
|
||||
|
||||
$currentVersion = Config::where('name', 'database_version')->first()->value;
|
||||
if ($currentVersion > $versionDest) {
|
||||
@@ -80,29 +82,4 @@ class MigrateToCommand extends Command
|
||||
|
||||
updateDatabaseConfig('database_version', ($_up ? $id : $id - 1));
|
||||
}
|
||||
|
||||
private function initEnv()
|
||||
{
|
||||
global $config;
|
||||
if (!isset($config['installed']) || !$config['installed']) {
|
||||
throw new \RuntimeException('MyAAC has not been installed yet or there was error during installation. Please install again.');
|
||||
}
|
||||
|
||||
if(empty($config['server_path'])) {
|
||||
throw new \RuntimeException('Server Path has been not set. Go to config.php and set it.');
|
||||
}
|
||||
|
||||
// take care of trailing slash at the end
|
||||
if($config['server_path'][strlen($config['server_path']) - 1] !== '/')
|
||||
$config['server_path'] .= '/';
|
||||
|
||||
$config['lua'] = load_config_lua($config['server_path'] . 'config.lua');
|
||||
|
||||
// POT
|
||||
require_once SYSTEM . 'libs/pot/OTS.php';
|
||||
$ots = POT::getInstance();
|
||||
$eloquentConnection = null;
|
||||
|
||||
require_once SYSTEM . 'database.php';
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,6 +13,7 @@ class PluginDisableCommand extends Command
|
||||
protected function configure(): void
|
||||
{
|
||||
$this->setName('plugin:disable')
|
||||
->setAliases(['plugin:deactivate'])
|
||||
->setDescription('This command disables plugin')
|
||||
->addArgument('plugin-name', InputArgument::REQUIRED, 'Plugin that you want to disable');
|
||||
}
|
||||
|
||||
@@ -13,6 +13,7 @@ class PluginEnableCommand extends Command
|
||||
protected function configure(): void
|
||||
{
|
||||
$this->setName('plugin:enable')
|
||||
->setAliases(['plugin:activate'])
|
||||
->setDescription('This command enables plugin')
|
||||
->addArgument('plugin-name', InputArgument::REQUIRED, 'Plugin that you want to enable');
|
||||
}
|
||||
|
||||
@@ -13,6 +13,7 @@ class PluginUninstallCommand extends Command
|
||||
protected function configure(): void
|
||||
{
|
||||
$this->setName('plugin:uninstall')
|
||||
->setAliases(['plugin:remove', 'plugin:delete'])
|
||||
->setDescription('This command uninstalls plugin')
|
||||
->addArgument('plugin-name', InputArgument::REQUIRED, 'Plugin that you want to uninstall');
|
||||
}
|
||||
|
||||
@@ -76,10 +76,11 @@ class Items
|
||||
|
||||
public static function get($id) {
|
||||
self::load();
|
||||
return isset(self::$items[$id]) ? self::$items[$id] : [];
|
||||
return self::$items[$id] ?? [];
|
||||
}
|
||||
|
||||
public static function getDescription($id, $count = 1) {
|
||||
public static function getDescription($id, $count = 1): string
|
||||
{
|
||||
$item = self::get($id);
|
||||
|
||||
$attr = $item['attributes'];
|
||||
@@ -112,15 +113,15 @@ class Items
|
||||
$s .= 'an item of type ' . $item['id'];
|
||||
|
||||
if(isset($attr['type']) && strtolower($attr['type']) == 'rune') {
|
||||
$item = Spell::where('item_id', $id)->first();
|
||||
if($item) {
|
||||
if($item->level > 0 && $item->maglevel > 0) {
|
||||
$s .= '. ' . ($count > 1 ? "They" : "It") . ' can only be used by ';
|
||||
$spell = Spell::where('item_id', $id)->first();
|
||||
if($spell) {
|
||||
if($spell->level > 0 && $spell->maglevel > 0) {
|
||||
$s .= '. ' . ($count > 1 ? 'They' : 'It') . ' can only be used by ';
|
||||
}
|
||||
|
||||
$configVocations = config('vocations');
|
||||
if(!empty(trim($item->vocations))) {
|
||||
$vocations = json_decode($item->vocations);
|
||||
if(!empty(trim($spell->vocations))) {
|
||||
$vocations = json_decode($spell->vocations);
|
||||
if(count($vocations) > 0) {
|
||||
foreach($vocations as $voc => $show) {
|
||||
$vocations[$configVocations[$voc]] = $show;
|
||||
@@ -133,8 +134,39 @@ class Items
|
||||
|
||||
$s .= ' with';
|
||||
|
||||
if ($spell->level > 0) {
|
||||
$s .= ' level ' . $spell->level;
|
||||
}
|
||||
|
||||
if ($spell->maglevel > 0) {
|
||||
if ($spell->level > 0) {
|
||||
$s .= ' and';
|
||||
}
|
||||
|
||||
$s .= ' magic level ' . $spell->maglevel;
|
||||
}
|
||||
|
||||
$s .= ' or higher';
|
||||
}
|
||||
}
|
||||
|
||||
if (!empty($item['weaponType'])) {
|
||||
if ($item['weaponType'] == 'distance' && isset($item['ammoType'])) {
|
||||
$s .= ' (Range:' . $item['range'];
|
||||
}
|
||||
|
||||
if (isset($item['attack']) && $item['attack'] != 0) {
|
||||
$s .= ', Atk ' . ($item['attack'] > 0 ? '+' . $item['attack'] : '-' . $item['attack']);
|
||||
}
|
||||
|
||||
if (isset($item['hitChance']) && $item['hitChance'] != -1) {
|
||||
$s .= ', Hit% ' . ($item['hitChance'] > 0 ? '+' . $item['hitChance'] : '-' . $item['hitChance']);
|
||||
}
|
||||
elseif ($item['weaponType'] != 'ammo') {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
return $s;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,11 +5,15 @@ namespace MyAAC\Models;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
/**
|
||||
* @property integer $premium_ends_at
|
||||
* @property integer $premend
|
||||
* @property integer $lastday
|
||||
* @property integer $premdays
|
||||
*/
|
||||
class Account extends Model {
|
||||
|
||||
const GRATIS_PREMIUM_DAYS = 65535;
|
||||
|
||||
protected $table = 'accounts';
|
||||
|
||||
public $timestamps = false;
|
||||
@@ -34,9 +38,9 @@ class Account extends Model {
|
||||
public function getPremiumDaysAttribute()
|
||||
{
|
||||
if(isset($this->premium_ends_at) || isset($this->premend) ||
|
||||
(isCanary() && isset($this->data['lastday']))) {
|
||||
$col = (isset($this->premium_ends_at) ? 'premium_ends_at' : (isset($this->data['lastday']) ? 'lastday' : 'premend'));
|
||||
$ret = ceil(($this->{$col}- time()) / (24 * 60 * 60));
|
||||
(isCanary() && isset($this->lastday))) {
|
||||
$col = (isset($this->premium_ends_at) ? 'premium_ends_at' : (isset($this->lastday) ? 'lastday' : 'premend'));
|
||||
$ret = ceil(($this->{$col} - time()) / (24 * 60 * 60));
|
||||
return max($ret, 0);
|
||||
}
|
||||
|
||||
@@ -44,22 +48,24 @@ class Account extends Model {
|
||||
return 0;
|
||||
}
|
||||
|
||||
if($this->premdays == 65535){
|
||||
return 65535;
|
||||
if($this->premdays == self::GRATIS_PREMIUM_DAYS){
|
||||
return self::GRATIS_PREMIUM_DAYS;
|
||||
}
|
||||
|
||||
$ret = ceil($this->premdays - ((int)date("z", time()) + (365 * (date("Y", time()) - date("Y", $this->lastday))) - date("z", $this->lastday)));
|
||||
return max($ret, 0);
|
||||
}
|
||||
|
||||
public function getIsPremiumAttribute()
|
||||
public function getIsPremiumAttribute(): bool
|
||||
{
|
||||
if(isset($this->premium_ends_at)) {
|
||||
return $this->premium_ends_at > time();
|
||||
if(isset($this->premium_ends_at) || isset($this->premend) ||
|
||||
(isCanary() && isset($this->lastday))) {
|
||||
$col = (isset($this->premium_ends_at) ? 'premium_ends_at' : (isset($this->lastday) ? 'lastday' : 'premend'));
|
||||
return $this->{$col} > time();
|
||||
}
|
||||
|
||||
if(isset($this->premend)) {
|
||||
return $this->premend > time();
|
||||
if($this->premdays == self::GRATIS_PREMIUM_DAYS){
|
||||
return true;
|
||||
}
|
||||
|
||||
return ($this->premdays - (date("z", time()) + (365 * (date("Y", time()) - date("Y", $this->lastday))) - date("z", $this->lastday)) > 0);
|
||||
|
||||
@@ -18,7 +18,16 @@ class Changelog extends Model {
|
||||
|
||||
public $timestamps = false;
|
||||
|
||||
protected $fillable = [
|
||||
'body', 'type', 'where',
|
||||
'date', 'player_id', 'hide',
|
||||
];
|
||||
|
||||
public function scopeIsPublic($query) {
|
||||
$query->where('hide', '!=', 1);
|
||||
}
|
||||
|
||||
public function player() {
|
||||
return $this->belongsTo(Player::class);
|
||||
}
|
||||
}
|
||||
|
||||
16
system/src/Models/ForumBoard.php
Normal file
16
system/src/Models/ForumBoard.php
Normal file
@@ -0,0 +1,16 @@
|
||||
<?php
|
||||
|
||||
namespace MyAAC\Models;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
class ForumBoard extends Model {
|
||||
|
||||
protected $table = TABLE_PREFIX . 'forum_boards';
|
||||
|
||||
public $timestamps = false;
|
||||
|
||||
protected $fillable = [
|
||||
'name', 'description', 'ordering',
|
||||
'guild', 'access', 'closed', 'hide',
|
||||
];
|
||||
}
|
||||
@@ -10,4 +10,9 @@ class Gallery extends Model {
|
||||
|
||||
public $timestamps = false;
|
||||
|
||||
protected $fillable = [
|
||||
'comment', 'image', 'thumb',
|
||||
'author', 'ordering', 'hide',
|
||||
];
|
||||
|
||||
}
|
||||
|
||||
15
system/src/Models/NewsCategory.php
Normal file
15
system/src/Models/NewsCategory.php
Normal file
@@ -0,0 +1,15 @@
|
||||
<?php
|
||||
|
||||
namespace MyAAC\Models;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
class NewsCategory extends Model {
|
||||
|
||||
protected $table = TABLE_PREFIX . 'news_categories';
|
||||
|
||||
public $timestamps = false;
|
||||
|
||||
protected $fillable = [
|
||||
'name', 'description', 'icon_id', 'hide'
|
||||
];
|
||||
}
|
||||
@@ -513,6 +513,9 @@ class Plugins {
|
||||
return false;
|
||||
}
|
||||
|
||||
ensureFolderExists($cachePlugins = CACHE . 'plugins');
|
||||
ensureIndexExists($cachePlugins);
|
||||
|
||||
self::$error = 'There was a problem with extracting zip archive.';
|
||||
$file_name = $plugin_temp_dir . $json_file;
|
||||
if(!file_exists($file_name)) {
|
||||
@@ -549,21 +552,21 @@ class Plugins {
|
||||
if(isset($plugin_json['require'])) {
|
||||
$require = $plugin_json['require'];
|
||||
|
||||
$myaac_satified = true;
|
||||
$myaac_satisfied = true;
|
||||
if(isset($require['myaac_'])) {
|
||||
$require_myaac = $require['myaac_'];
|
||||
if(!Semver::satisfies(MYAAC_VERSION, $require_myaac)) {
|
||||
$myaac_satified = false;
|
||||
$myaac_satisfied = false;
|
||||
}
|
||||
}
|
||||
else if(isset($require['myaac'])) {
|
||||
$require_myaac = $require['myaac'];
|
||||
if(version_compare(MYAAC_VERSION, $require_myaac, '<')) {
|
||||
$myaac_satified = false;
|
||||
$myaac_satisfied = false;
|
||||
}
|
||||
}
|
||||
|
||||
if(!$myaac_satified) {
|
||||
if(!$myaac_satisfied) {
|
||||
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;
|
||||
}
|
||||
|
||||
@@ -248,7 +248,7 @@ class Settings implements \ArrayAccess
|
||||
echo '<div class="input-group" id="show-hide-' . $key . '">';
|
||||
}
|
||||
|
||||
echo '<input class="form-control" type="' . $setting['type'] . '" name="settings[' . $key . ']" value="' . ($settingsDb[$key] ?? ($setting['default'] ?? '')) . '" id="' . $key . '"' . $min . $max . $step . '/>';
|
||||
echo '<input class="form-control" type="' . $setting['type'] . '" name="settings[' . $key . ']" value="' . escapeHtml($settingsDb[$key] ?? ($setting['default'] ?? '')) . '" id="' . $key . '"' . $min . $max . $step . '/>';
|
||||
|
||||
if ($setting['type'] === 'password') {
|
||||
echo '<div class="input-group-append input-group-text"><a href=""><i class="fas fa-eye-slash" ></i></a></div></div>';
|
||||
@@ -266,7 +266,7 @@ class Settings implements \ArrayAccess
|
||||
if ($rows < 2) {
|
||||
$rows = 2; // always min 2 rows for textarea
|
||||
}
|
||||
echo '<textarea class="form-control" rows="' . $rows . '" name="settings[' . $key . ']" id="' . $key . '">' . $value . '</textarea>';
|
||||
echo '<textarea class="form-control" rows="' . $rows . '" name="settings[' . $key . ']" id="' . $key . '">' . escapeHtml($value) . '</textarea>';
|
||||
}
|
||||
|
||||
else if ($setting['type'] === 'options') {
|
||||
|
||||
@@ -145,13 +145,7 @@ function updateStatus() {
|
||||
}
|
||||
|
||||
$uptime = $status['uptime'] = $serverStatus->getUptime();
|
||||
$m = date('m', $uptime);
|
||||
$m = $m > 1 ? "$m months, " : ($m == 1 ? 'month, ' : '');
|
||||
$d = date('d', $uptime);
|
||||
$d = $d > 1 ? "$d days, " : ($d == 1 ? 'day, ' : '');
|
||||
$h = date('H', $uptime);
|
||||
$min = date('i', $uptime);
|
||||
$status['uptimeReadable'] = "{$m}{$d}{$h}h {$min}m";
|
||||
$status['uptimeReadable'] = getStatusUptimeReadable($uptime);
|
||||
|
||||
$status['monsters'] = $serverStatus->getMonstersCount();
|
||||
$status['motd'] = $serverStatus->getMOTD();
|
||||
|
||||
@@ -53,6 +53,9 @@
|
||||
exit;
|
||||
}
|
||||
|
||||
ensureFolderExists(SIGNATURES_CACHE);
|
||||
ensureIndexExists(SIGNATURES_CACHE);
|
||||
|
||||
$cached = SIGNATURES_CACHE.$player->getId() . '.png';
|
||||
if(file_exists($cached) && (time() < (filemtime($cached) + (60 * setting('core.signature_cache_time')))))
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user