diff --git a/.htaccess.dist b/.htaccess.dist index 1c837a33..036241dc 100644 --- a/.htaccess.dist +++ b/.htaccess.dist @@ -6,7 +6,7 @@ Options -MultiViews - + Require all denied diff --git a/CHANGELOG.md b/CHANGELOG-1.x.md similarity index 78% rename from CHANGELOG.md rename to CHANGELOG-1.x.md index 6b90ab4f..c6feb09d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG-1.x.md @@ -1,5 +1,66 @@ # Changelog +## [1.4 - 22.04.2025] + +### Added +* feat: admin-pages (can add admin pages through plugins) (https://github.com/slawkens/myaac/commit/ceaa0639e66d31e8177ff90791463470367aa45d) + * just place the page in admin-pages folder in the plugin + * Also, possibility to overwrite default myaac admin pages +* Add db->hasTableAndColumns(table, columns), credits to @opentibiabr Team (https://github.com/slawkens/myaac/commit/82a533d88c8a342076891d132b4b409ed9a1fe72) +* Add noSubmit option to buttons.base (https://github.com/slawkens/myaac/commit/64f6d3abcada3bf9fd7599f50d2fac0a1367f383) + +### Fixed +* Fix: display 404 error instead of 500 when page has been removed from filesystem (https://github.com/slawkens/myaac/commit/c2bf94fb2370d2009a2eb907f818955132cf8611) +* Fix headline.php: change image format to .png cause of black background (https://github.com/slawkens/myaac/commit/b618084d50918539d9a70abd97e764137b966067) +* Clear cache on plugin enable/disable, fixes some issues with plugin pages being cached (https://github.com/slawkens/myaac/commit/1d0c173e7d000aecbd432800941fc3e38a0e50f2) +* Do not autoload sub-folders if autoload pages is disabled (https://github.com/slawkens/myaac/commit/d47195a7878095336f9c9edc6f96244257f67eec) + +### Changed +* SQL Syntax Standardization (by @JoaozinhoBrasil, #298) +* Pages in theme/template folder will now have precedence over normal pages (https://github.com/slawkens/myaac/commit/6d8f4718a1d349fba8f0ebc39cfd3a1a84d104b0) +* Small changes in account.login.html.twig (https://github.com/slawkens/myaac/commit/f40b986b59d4c8fa89ab4745731bf366f8619976) +* Plugin name is required, version is optional (https://github.com/slawkens/myaac/commit/e6f05a2731c61d931be49e121c068e49c0ad5e01) + +## [1.3.3 - 04.04.2025] + +### Fixed +* Fix uninstall plugin when plugin is disabled (https://github.com/slawkens/myaac/commit/6c568fd36a271270684fc412ccd556b230273a6d) + +### Changed +* Display more useful info when error parsing config.lua (https://github.com/slawkens/myaac/commit/fa6b6aa153ffc131e0d1631a4dcd9012a5850c2e) + +### Other +* Small adjustments (https://github.com/slawkens/myaac/commit/35e2483de86e295bdf089cceffa25842eeb2e34c, https://github.com/slawkens/myaac/commit/ae639d65b0bfa491e747e907e2ebc77f83f47981) + +## [1.3.2 - 01.04.2025] + +### Fixed +* Fix debugBar/admin panel menu when using custom base_dir (https://github.com/slawkens/myaac/commit/65696f63e3aac02ff952ea81279e7cb2fa7570fb) + +### Changed +* Settings: Show/hide IP Ban Protection options depending on the value (enabled/disabled) (https://github.com/slawkens/myaac/commit/dbf73d0b61b45601ae95e51b23c051c2704169c5) +* Do not require init.php in cache:clear command (https://github.com/slawkens/myaac/commit/d25c71857f767834239bbffacd00fdc671adb157) + +## [1.3.1 - 19.03.2025] + +### Fixed +* Fixed migrate:run command (https://github.com/slawkens/myaac/commit/1a5771ad51e595fe13368a0721b059c4ecefb17d) + +### Changed +* Small adjustments (https://github.com/slawkens/myaac/commit/6fac883659f581baac1361826d046410156f1e58, https://github.com/slawkens/myaac/commit/4a6896b4469968b9904292734cf6c14ba5eeef14) + +## [1.3 - 10.03.2025] + +### Changed +* Use latest outfit-images host from @gesior (https://github.com/slawkens/myaac/commit/529bdcf016dd0f9dffbc34d81f99a046a9ddb70d) +* Change monster link to $_GET ?name= (https://github.com/slawkens/myaac/commit/4c5cc8b573b2b3e7ec00a22b7ede30a68083a924) + +### Fixed +* Fixed house links (https://github.com/slawkens/myaac/commit/887b5068ad11c4cdab614afd34525caba785ce13) +* Fixed long title on headline.php (https://github.com/slawkens/myaac/commit/3e3f4bb5a514158ec8777684ca6c7f1c2a37bed5) +* Fixed menu colors once again, plus add !important tag (https://github.com/slawkens/myaac/commit/aa52df6e2ec92cafc25b655ae907bf2e1746d9cc) +* Fix: add possibility to remove all menu items in admin panel (https://github.com/slawkens/myaac/commit/00fe1adc15ea7646596d755f6e6e1f7854ffc1d5, https://github.com/slawkens/myaac/commit/9239a4f4198c3ad260802ac3b47e9c41b80b754e) + ## [1.2 - 09.02.2025] ### Added diff --git a/README.md b/README.md index 8fab33a5..767911d1 100644 --- a/README.md +++ b/README.md @@ -10,12 +10,19 @@ Official website: https://my-aac.org [![OpenTibia Discord](https://img.shields.io/discord/288399552581468162)](https://discord.gg/2J39Wus) [![Closed Issues](https://img.shields.io/github/issues-closed-raw/slawkens/myaac)](https://github.com/slawkens/myaac/issues?q=is%3Aissue+is%3Aclosed) -| Version | Status | Branch | Requirements | -|:--------|:-----------------------|:-------|:---------------| -| **1.x** | **Active development** | master | **PHP >= 8.1** | -| 0.9.x | Not developed anymore | 0.9 | PHP >= 7.2.5 | -| 0.8.x | Active support | 0.8 | PHP >= 7.2.5 | -| 0.7.x | End Of Life | 0.7 | PHP >= 5.3.3 | +| Version | Status | Branch | Requirements | +|:--------|:-----------------------|:--------|:---------------| +| 2.x | Experimental features | develop | PHP >= 8.1 | +| **1.x** | **Active development** | main | **PHP >= 8.1** | +| 0.9.x | Not developed anymore | 0.9 | PHP >= 7.2.5 | +| 0.8.x | Active support | 0.8 | PHP >= 7.2.5 | +| 0.7.x | End Of Life | 0.7 | PHP >= 5.3.3 | + +The recommended version to install is 1.x, which can be found at releases page - [https://github.com/slawkens/myaac/releases](https://github.com/slawkens/myaac/releases). + +### Documentation +* [docs.my-aac.org](https://docs.my-aac.org) +* [my-aac.org - FAQ](https://my-aac.org/faqs/) ### Requirements @@ -47,23 +54,23 @@ Official website: https://my-aac.org ### Configuration -Check *config.php* to get more informations. (Notice: MyAAC 1.0+ doesn't use config.php anymore, it has been moved to Admin Panel - Settings page). +Check *config.php* to get more information. (Notice: MyAAC 1.0+ doesn't use config.php anymore, it has been moved to Admin Panel - Settings page). Use *config.local.php* for your local configuration changes. ### Branches This repository follows the Git Flow Workflow. -Cheatsheet: [Git-Flow-Cheetsheet](https://danielkummer.github.io/git-flow-cheatsheet) +Cheatsheet: [Git-Flow-Cheatsheet](https://danielkummer.github.io/git-flow-cheatsheet) That means, we use: -* master branch, for current stable release +* main branch, for current stable release * develop branch, for development version (next release) * feature branches, for features etc. ### Known Problems -- Some compatibility issues with some exotical distibutions. +- Some compatibility issues with some exotic distributions. ### Contributing @@ -77,7 +84,7 @@ Look: [Contributing](https://github.com/otsoft/myaac/wiki/Contributing) in our w ### Other Notes -If you have a great idea or want contribute to the project - visit our website at https://www.my-aac.org +If you have a great idea or want to contribute to the project - visit our website at https://www.my-aac.org ## Project supported by JetBrains diff --git a/admin/includes/debugbar.php b/admin/includes/debugbar.php index 3a9ae893..eb98767a 100644 --- a/admin/includes/debugbar.php +++ b/admin/includes/debugbar.php @@ -7,7 +7,7 @@ $hooks->register('debugbar_admin_head_end', HOOK_ADMIN_HEAD_END, function ($para return; } - $debugBarRenderer = $debugBar->getJavascriptRenderer(); + $debugBarRenderer = $debugBar->getJavascriptRenderer(BASE_URL . 'vendor/maximebf/debugbar/src/DebugBar/Resources/'); echo $debugBarRenderer->renderHead(); }); $hooks->register('debugbar_admin_body_end', HOOK_ADMIN_BODY_END, function ($params) { @@ -17,6 +17,6 @@ $hooks->register('debugbar_admin_body_end', HOOK_ADMIN_BODY_END, function ($para return; } - $debugBarRenderer = $debugBar->getJavascriptRenderer(); + $debugBarRenderer = $debugBar->getJavascriptRenderer(BASE_URL . 'vendor/maximebf/debugbar/src/DebugBar/Resources/'); echo $debugBarRenderer->render(); }); diff --git a/admin/index.php b/admin/index.php index 15ab133c..86ebf3dc 100644 --- a/admin/index.php +++ b/admin/index.php @@ -1,6 +1,8 @@ -

+

$cat): ?>
@@ -168,7 +168,7 @@ if (isset($_POST['template'])) {
- + Cancel'; ?> diff --git a/admin/pages/plugins.php b/admin/pages/plugins.php index 8e87f75e..db886635 100644 --- a/admin/pages/plugins.php +++ b/admin/pages/plugins.php @@ -17,7 +17,7 @@ csrfProtect(); $use_datatable = true; -if (!getBoolean(setting('core.admin_plugins_manage_enable'))) { +if (!setting('core.admin_plugins_manage_enable')) { warning('Plugin installation and management is disabled in Settings.
If you wish to enable, go to Settings and enable Enable Plugins Manage.'); } else { diff --git a/common.php b/common.php index 99593401..66f3135b 100644 --- a/common.php +++ b/common.php @@ -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.2'; +const MYAAC_VERSION = '2.0-dev'; const DATABASE_VERSION = 44; const TABLE_PREFIX = 'myaac_'; define('START_TIME', microtime(true)); diff --git a/index.php b/index.php index 0a42deed..4526e892 100644 --- a/index.php +++ b/index.php @@ -31,11 +31,11 @@ require_once 'common.php'; require_once SYSTEM . 'functions.php'; $uri = $_SERVER['REQUEST_URI']; -if(false !== strpos($uri, 'index.php')) { +if(str_contains($uri, 'index.php')) { $uri = str_replace_first('/index.php', '', $uri); } -if(0 === strpos($uri, '/')) { +if(str_starts_with($uri, '/')) { $uri = str_replace_first('/', '', $uri); } diff --git a/install/includes/config.php b/install/includes/config.php index 5d9ae07a..bc6759b3 100644 --- a/install/includes/config.php +++ b/install/includes/config.php @@ -26,6 +26,9 @@ if(!isset($error) || !$error) { $config['database_type'] = $config['lua']['database_type']; else if(isset($config['lua']['sql_type'])) // otserv $config['database_type'] = $config['lua']['sql_type']; + else { + $config['database_type'] = ''; + } $config['database_type'] = strtolower($config['database_type']); if(empty($config['database_type'])) { diff --git a/install/includes/schema.sql b/install/includes/schema.sql index 8b557324..00a50f50 100644 --- a/install/includes/schema.sql +++ b/install/includes/schema.sql @@ -2,34 +2,34 @@ SET @myaac_database_version = 43; CREATE TABLE `myaac_account_actions` ( - `id` INT(11) NOT NULL AUTO_INCREMENT, - `account_id` INT(11) NOT NULL, - `ip` VARCHAR(45) NOT NULL DEFAULT '', - `date` INT(11) NOT NULL DEFAULT 0, - `action` VARCHAR(255) NOT NULL DEFAULT '', + `id` int NOT NULL AUTO_INCREMENT, + `account_id` int NOT NULL, + `ip` varchar(45) NOT NULL DEFAULT '', + `date` int NOT NULL DEFAULT 0, + `action` varchar(255) NOT NULL DEFAULT '', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8mb4; CREATE TABLE `myaac_admin_menu` ( - `id` INT(11) NOT NULL AUTO_INCREMENT, - `name` VARCHAR(255) NOT NULL DEFAULT '', - `page` VARCHAR(255) NOT NULL DEFAULT '', - `ordering` INT(11) NOT NULL DEFAULT 0, - `flags` INT(11) NOT NULL DEFAULT 0, - `enabled` INT(1) NOT NULL DEFAULT 1, + `id` int NOT NULL AUTO_INCREMENT, + `name` varchar(255) NOT NULL DEFAULT '', + `page` varchar(255) NOT NULL DEFAULT '', + `ordering` int NOT NULL DEFAULT 0, + `flags` int NOT NULL DEFAULT 0, + `enabled` int NOT NULL DEFAULT 1, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8mb4; CREATE TABLE `myaac_changelog` ( - `id` INT(11) NOT NULL AUTO_INCREMENT, - `body` VARCHAR(500) NOT NULL DEFAULT '', - `type` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '1 - added, 2 - removed, 3 - changed, 4 - fixed', - `where` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '1 - server, 2 - site', - `date` INT(11) NOT NULL DEFAULT 0, - `player_id` INT(11) NOT NULL DEFAULT 0, - `hide` TINYINT(1) NOT NULL DEFAULT 0, + `id` int NOT NULL AUTO_INCREMENT, + `body` varchar(500) NOT NULL DEFAULT '', + `type` tinyint NOT NULL DEFAULT 0 COMMENT '1 - added, 2 - removed, 3 - changed, 4 - fixed', + `where` tinyint NOT NULL DEFAULT 0 COMMENT '1 - server, 2 - site', + `date` int NOT NULL DEFAULT 0, + `player_id` int NOT NULL DEFAULT 0, + `hide` tinyint NOT NULL DEFAULT 0, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8mb4; @@ -37,9 +37,9 @@ INSERT INTO `myaac_changelog` (`id`, `type`, `where`, `date`, `body`, `hide`) VA CREATE TABLE `myaac_config` ( - `id` INT(11) NOT NULL AUTO_INCREMENT, - `name` VARCHAR(30) NOT NULL, - `value` VARCHAR(1000) NOT NULL, + `id` int NOT NULL AUTO_INCREMENT, + `name` varchar(30) NOT NULL, + `value` varchar(1000) NOT NULL, PRIMARY KEY (`id`), UNIQUE (`name`) ) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8mb4; @@ -48,24 +48,24 @@ INSERT INTO `myaac_config` (`name`, `value`) VALUES ('database_version', @myaac_ CREATE TABLE `myaac_faq` ( - `id` INT(11) NOT NULL AUTO_INCREMENT, - `question` VARCHAR(255) NOT NULL DEFAULT '', - `answer` VARCHAR(1020) NOT NULL DEFAULT '', - `ordering` INT(11) NOT NULL DEFAULT 0, - `hide` TINYINT(1) NOT NULL DEFAULT 0, + `id` int NOT NULL AUTO_INCREMENT, + `question` varchar(255) NOT NULL DEFAULT '', + `answer` varchar(1020) NOT NULL DEFAULT '', + `ordering` int NOT NULL DEFAULT 0, + `hide` tinyint NOT NULL DEFAULT 0, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8mb4; CREATE TABLE `myaac_forum_boards` ( - `id` INT(11) NOT NULL AUTO_INCREMENT, - `name` VARCHAR(32) NOT NULL, - `description` VARCHAR(255) NOT NULL DEFAULT '', - `ordering` INT(11) NOT NULL DEFAULT 0, - `guild` INT(11) NOT NULL DEFAULT 0, - `access` INT(11) NOT NULL DEFAULT 0, - `closed` TINYINT(1) NOT NULL DEFAULT 0, - `hide` TINYINT(1) NOT NULL DEFAULT 0, + `id` int NOT NULL AUTO_INCREMENT, + `name` varchar(32) NOT NULL, + `description` varchar(255) NOT NULL DEFAULT '', + `ordering` int NOT NULL DEFAULT 0, + `guild` int NOT NULL DEFAULT 0, + `access` int NOT NULL DEFAULT 0, + `closed` tinyint NOT NULL DEFAULT 0, + `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); @@ -76,100 +76,100 @@ INSERT INTO `myaac_forum_boards` (`id`, `name`, `description`, `ordering`) VALUE CREATE TABLE `myaac_forum` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `first_post` int(11) NOT NULL default '0', - `last_post` int(11) NOT NULL default '0', - `section` int(3) NOT NULL default '0', - `replies` int(20) NOT NULL default '0', - `views` int(20) NOT NULL default '0', - `author_aid` int(20) NOT NULL default '0', - `author_guid` int(20) NOT NULL default '0', + `id` int NOT NULL AUTO_INCREMENT, + `first_post` int NOT NULL DEFAULT 0, + `last_post` int NOT NULL DEFAULT 0, + `section` int NOT NULL DEFAULT 0, + `replies` int NOT NULL DEFAULT 0, + `views` int NOT NULL DEFAULT 0, + `author_aid` int NOT NULL DEFAULT 0, + `author_guid` int NOT NULL DEFAULT 0, `post_text` text NOT NULL, `post_topic` varchar(255) NOT NULL DEFAULT '', - `post_smile` tinyint(1) NOT NULL default '0', - `post_html` tinyint(1) NOT NULL default '0', - `post_date` int(20) NOT NULL default '0', - `last_edit_aid` int(20) NOT NULL default '0', - `edit_date` int(20) NOT NULL default '0', - `post_ip` varchar(45) NOT NULL default '0.0.0.0', - `sticked` tinyint(1) NOT NULL DEFAULT '0', - `closed` tinyint(1) NOT NULL DEFAULT '0', + `post_smile` tinyint NOT NULL DEFAULT 0, + `post_html` tinyint NOT NULL DEFAULT 0, + `post_date` int NOT NULL DEFAULT 0, + `last_edit_aid` int NOT NULL DEFAULT 0, + `edit_date` int NOT NULL DEFAULT 0, + `post_ip` varchar(45) NOT NULL DEFAULT '0.0.0.0', + `sticked` tinyint NOT NULL DEFAULT 0, + `closed` tinyint NOT NULL DEFAULT 0, PRIMARY KEY (`id`), KEY `section` (`section`) ) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8mb4; CREATE TABLE `myaac_menu` ( - `id` INT(11) NOT NULL AUTO_INCREMENT, - `template` VARCHAR(255) NOT NULL, - `name` VARCHAR(255) NOT NULL, - `link` VARCHAR(255) NOT NULL, - `blank` TINYINT(1) NOT NULL DEFAULT 0, - `color` VARCHAR(6) NOT NULL DEFAULT '', - `category` INT(11) NOT NULL DEFAULT 1, - `ordering` INT(11) NOT NULL DEFAULT 0, - `enabled` INT(1) NOT NULL DEFAULT 1, + `id` int NOT NULL AUTO_INCREMENT, + `template` varchar(255) NOT NULL, + `name` varchar(255) NOT NULL, + `link` varchar(255) NOT NULL, + `blank` tinyint NOT NULL DEFAULT 0, + `color` varchar(6) NOT NULL DEFAULT '', + `category` int NOT NULL DEFAULT 1, + `ordering` int NOT NULL DEFAULT 0, + `enabled` int NOT NULL DEFAULT 1, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8mb4; CREATE TABLE `myaac_monsters` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `hide` tinyint(1) NOT NULL default 0, + `id` int NOT NULL AUTO_INCREMENT, + `hide` tinyint NOT NULL DEFAULT 0, `name` varchar(255) NOT NULL, - `mana` int(11) NOT NULL DEFAULT 0, - `exp` int(11) NOT NULL, - `health` int(11) NOT NULL, - `look` VARCHAR(255) NOT NULL DEFAULT '', - `speed_lvl` int(11) NOT NULL default 1, - `use_haste` tinyint(1) NOT NULL, + `mana` int NOT NULL DEFAULT 0, + `exp` int NOT NULL, + `health` int NOT NULL, + `look` varchar(255) NOT NULL DEFAULT '', + `speed_lvl` int NOT NULL DEFAULT 1, + `use_haste` tinyint NOT NULL, `voices` text NOT NULL, `immunities` varchar(255) NOT NULL, - `elements` TEXT NOT NULL, - `summonable` tinyint(1) NOT NULL, - `convinceable` tinyint(1) NOT NULL, - `pushable` TINYINT(1) NOT NULL DEFAULT '0', - `canpushitems` TINYINT(1) NOT NULL DEFAULT '0', - `canwalkonenergy` TINYINT(1) NOT NULL DEFAULT '0', - `canwalkonpoison` TINYINT(1) NOT NULL DEFAULT '0', - `canwalkonfire` TINYINT(1) NOT NULL DEFAULT '0', - `runonhealth` TINYINT(1) NOT NULL DEFAULT '0', - `hostile` TINYINT(1) NOT NULL DEFAULT '0', - `attackable` TINYINT(1) NOT NULL DEFAULT '0', - `rewardboss` TINYINT(1) NOT NULL DEFAULT '0', - `defense` INT(11) NOT NULL DEFAULT '0', - `armor` INT(11) NOT NULL DEFAULT '0', - `canpushcreatures` TINYINT(1) NOT NULL DEFAULT '0', + `elements` text NOT NULL, + `summonable` tinyint NOT NULL, + `convinceable` tinyint NOT NULL, + `pushable` tinyint NOT NULL DEFAULT 0, + `canpushitems` tinyint NOT NULL DEFAULT 0, + `canwalkonenergy` tinyint NOT NULL DEFAULT 0, + `canwalkonpoison` tinyint NOT NULL DEFAULT 0, + `canwalkonfire` tinyint NOT NULL DEFAULT 0, + `runonhealth` tinyint NOT NULL DEFAULT 0, + `hostile` tinyint NOT NULL DEFAULT 0, + `attackable` tinyint NOT NULL DEFAULT 0, + `rewardboss` tinyint NOT NULL DEFAULT 0, + `defense` int NOT NULL DEFAULT 0, + `armor` int NOT NULL DEFAULT 0, + `canpushcreatures` tinyint NOT NULL DEFAULT 0, `race` varchar(255) NOT NULL, `loot` text NOT NULL, - `summons` TEXT NOT NULL, + `summons` text NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8mb4; CREATE TABLE `myaac_news` ( - `id` INT(11) NOT NULL AUTO_INCREMENT, - `title` VARCHAR(100) NOT NULL, - `body` TEXT NOT NULL, - `type` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '1 - news, 2 - ticker, 3 - article', - `date` INT(11) NOT NULL DEFAULT 0, - `category` TINYINT(1) NOT NULL DEFAULT 0, - `player_id` INT(11) NOT NULL DEFAULT 0, - `last_modified_by` INT(11) NOT NULL DEFAULT 0, - `last_modified_date` INT(11) NOT NULL DEFAULT 0, - `comments` VARCHAR(50) NOT NULL DEFAULT '', - `article_text` VARCHAR(300) NOT NULL DEFAULT '', - `article_image` VARCHAR(100) NOT NULL DEFAULT '', - `hide` TINYINT(1) NOT NULL DEFAULT 0, + `id` int NOT NULL AUTO_INCREMENT, + `title` varchar(100) NOT NULL, + `body` text NOT NULL, + `type` tinyint NOT NULL DEFAULT 0 COMMENT '1 - news, 2 - ticker, 3 - article', + `date` int NOT NULL DEFAULT 0, + `category` tinyint NOT NULL DEFAULT 0, + `player_id` int NOT NULL DEFAULT 0, + `last_modified_by` int NOT NULL DEFAULT 0, + `last_modified_date` int NOT NULL DEFAULT 0, + `comments` varchar(50) NOT NULL DEFAULT '', + `article_text` varchar(300) NOT NULL DEFAULT '', + `article_image` varchar(100) NOT NULL DEFAULT '', + `hide` tinyint NOT NULL DEFAULT 0, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8mb4; CREATE TABLE `myaac_news_categories` ( - `id` INT(11) NOT NULL AUTO_INCREMENT, - `name` VARCHAR(50) NOT NULL DEFAULT "", - `description` VARCHAR(50) NOT NULL DEFAULT "", - `icon_id` INT(2) NOT NULL DEFAULT 0, - `hide` TINYINT(1) NOT NULL DEFAULT 0, + `id` int NOT NULL AUTO_INCREMENT, + `name` varchar(50) NOT NULL DEFAULT "", + `description` varchar(50) NOT NULL DEFAULT "", + `icon_id` int NOT NULL DEFAULT 0, + `hide` tinyint NOT NULL DEFAULT 0, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8mb4; @@ -181,39 +181,39 @@ INSERT INTO `myaac_news_categories` (`id`, `icon_id`) VALUES (NULL, 4); CREATE TABLE `myaac_notepad` ( - `id` INT(11) NOT NULL AUTO_INCREMENT, - `account_id` INT(11) NOT NULL, - /*`name` VARCHAR(30) NOT NULL,*/ - `content` TEXT NOT NULL, - /*`public` TINYINT(1) NOT NULL DEFAULT 0*/ + `id` int NOT NULL AUTO_INCREMENT, + `account_id` int NOT NULL, + /*`name` varchar(30) NOT NULL,*/ + `content` text NOT NULL, + /*`public` tinyint NOT NULL DEFAULT 0*/ PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8mb4; CREATE TABLE `myaac_pages` ( `id` INT NOT NULL AUTO_INCREMENT, - `name` VARCHAR(30) NOT NULL, - `title` VARCHAR(30) NOT NULL, - `body` TEXT NOT NULL, - `date` INT(11) NOT NULL DEFAULT 0, - `player_id` INT(11) NOT NULL DEFAULT 0, - `php` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '0 - plain html, 1 - php', - `enable_tinymce` TINYINT(1) NOT NULL DEFAULT 1 COMMENT '1 - enabled, 0 - disabled', - `access` TINYINT(2) NOT NULL DEFAULT 0, - `hide` TINYINT(1) NOT NULL DEFAULT 0, + `name` varchar(30) NOT NULL, + `title` varchar(30) NOT NULL, + `body` text NOT NULL, + `date` int NOT NULL DEFAULT 0, + `player_id` int NOT NULL DEFAULT 0, + `php` tinyint NOT NULL DEFAULT 0 COMMENT '0 - plain html, 1 - php', + `enable_tinymce` tinyint NOT NULL DEFAULT 1 COMMENT '1 - enabled, 0 - disabled', + `access` tinyint NOT NULL DEFAULT 0, + `hide` tinyint NOT NULL DEFAULT 0, PRIMARY KEY (`id`), UNIQUE (`name`) ) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8mb4; CREATE TABLE `myaac_gallery` ( - `id` INT(11) NOT NULL AUTO_INCREMENT, - `comment` VARCHAR(255) NOT NULL DEFAULT '', - `image` VARCHAR(255) NOT NULL, - `thumb` VARCHAR(255) NOT NULL, - `author` VARCHAR(50) NOT NULL DEFAULT '', - `ordering` INT(11) NOT NULL DEFAULT 0, - `hide` TINYINT(1) NOT NULL DEFAULT 0, + `id` int NOT NULL AUTO_INCREMENT, + `comment` varchar(255) NOT NULL DEFAULT '', + `image` varchar(255) NOT NULL, + `thumb` varchar(255) NOT NULL, + `author` varchar(50) NOT NULL DEFAULT '', + `ordering` int NOT NULL DEFAULT 0, + `hide` tinyint NOT NULL DEFAULT 0, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8mb4; @@ -221,51 +221,51 @@ INSERT INTO `myaac_gallery` (`id`, `ordering`, `comment`, `image`, `thumb`, `aut CREATE TABLE `myaac_settings` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `name` VARCHAR(255) NOT NULL DEFAULT '', - `key` VARCHAR(255) NOT NULL DEFAULT '', - `value` TEXT NOT NULL, + `id` int NOT NULL AUTO_INCREMENT, + `name` varchar(255) NOT NULL DEFAULT '', + `key` varchar(255) NOT NULL DEFAULT '', + `value` text NOT NULL, PRIMARY KEY (`id`), KEY `key` (`key`) ) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8mb4; CREATE TABLE `myaac_spells` ( - `id` INT(11) NOT NULL AUTO_INCREMENT, - `spell` VARCHAR(255) NOT NULL DEFAULT '', - `name` VARCHAR(255) NOT NULL, - `words` VARCHAR(255) NOT NULL DEFAULT '', - `category` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '1 - attack, 2 - healing, 3 - summon, 4 - supply, 5 - support', - `type` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '1 - instant, 2 - conjure, 3 - rune', - `level` INT(11) NOT NULL DEFAULT 0, - `maglevel` INT(11) NOT NULL DEFAULT 0, - `mana` INT(11) NOT NULL DEFAULT 0, - `soul` TINYINT(3) NOT NULL DEFAULT 0, - `conjure_id` INT(11) NOT NULL DEFAULT 0, - `conjure_count` TINYINT(3) NOT NULL DEFAULT 0, - `reagent` INT(11) NOT NULL DEFAULT 0, - `item_id` INT(11) NOT NULL DEFAULT 0, - `premium` TINYINT(1) NOT NULL DEFAULT 0, - `vocations` VARCHAR(100) NOT NULL DEFAULT '', - `hide` TINYINT(1) NOT NULL DEFAULT 0, + `id` int NOT NULL AUTO_INCREMENT, + `spell` varchar(255) NOT NULL DEFAULT '', + `name` varchar(255) NOT NULL, + `words` varchar(255) NOT NULL DEFAULT '', + `category` tinyint NOT NULL DEFAULT 0 COMMENT '1 - attack, 2 - healing, 3 - summon, 4 - supply, 5 - support', + `type` tinyint NOT NULL DEFAULT 0 COMMENT '1 - instant, 2 - conjure, 3 - rune', + `level` int NOT NULL DEFAULT 0, + `maglevel` int NOT NULL DEFAULT 0, + `mana` int NOT NULL DEFAULT 0, + `soul` tinyint NOT NULL DEFAULT 0, + `conjure_id` int NOT NULL DEFAULT 0, + `conjure_count` tinyint NOT NULL DEFAULT 0, + `reagent` int NOT NULL DEFAULT 0, + `item_id` int NOT NULL DEFAULT 0, + `premium` tinyint NOT NULL DEFAULT 0, + `vocations` varchar(100) NOT NULL DEFAULT '', + `hide` tinyint NOT NULL DEFAULT 0, PRIMARY KEY (`id`), UNIQUE (`name`) ) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8mb4; CREATE TABLE `myaac_visitors` ( - `ip` VARCHAR(45) NOT NULL, - `lastvisit` INT(11) NOT NULL DEFAULT 0, - `page` VARCHAR(2048) NOT NULL, - `user_agent` VARCHAR(255) NOT NULL DEFAULT '', + `ip` varchar(45) NOT NULL, + `lastvisit` int NOT NULL DEFAULT 0, + `page` varchar(2048) NOT NULL, + `user_agent` varchar(255) NOT NULL DEFAULT '', UNIQUE (`ip`) ) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8mb4; CREATE TABLE `myaac_weapons` ( - `id` INT(11) NOT NULL, - `level` INT(11) NOT NULL DEFAULT 0, - `maglevel` INT(11) NOT NULL DEFAULT 0, - `vocations` VARCHAR(100) NOT NULL DEFAULT '', + `id` int NOT NULL, + `level` int NOT NULL DEFAULT 0, + `maglevel` int NOT NULL DEFAULT 0, + `vocations` varchar(100) NOT NULL DEFAULT '', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8mb4; diff --git a/login.php b/login.php index 75aeed4d..d51ae57b 100644 --- a/login.php +++ b/login.php @@ -86,7 +86,7 @@ switch ($action) { die(json_encode(['eventlist' => $eventlist, 'lastupdatetimestamp' => time()])); case 'boostedcreature': - $boostedCreature = BoostedCreature::latest(); + $boostedCreature = BoostedCreature::first(); die(json_encode([ 'boostedcreature' => true, 'raceid' => $boostedCreature->raceid @@ -143,7 +143,7 @@ switch ($action) { if ($limiter->exceeded($ip)) { sendError($ban_msg); } - + sendError(($inputEmail != false ? 'Email' : 'Account name') . ' or password is not correct.'); } diff --git a/nginx-sample.conf b/nginx-sample.conf index d3cf8b6c..c0cfa367 100644 --- a/nginx-sample.conf +++ b/nginx-sample.conf @@ -1,6 +1,6 @@ server { listen 80; - root /home/otserv/www/public; + root /var/www/html; index index.php; server_name your-domain.com; @@ -14,7 +14,7 @@ server { # block .htaccess, CHANGELOG.md, composer.json etc. # this is to prevent finding software versions - location ~\.(ht|md|json|dist)$ { + location ~\.(ht|md|json|dist|sql)$ { deny all; } diff --git a/plugins/example.json b/plugins/example.json index 68805cb9..395db41d 100644 --- a/plugins/example.json +++ b/plugins/example.json @@ -46,8 +46,10 @@ "settings": "plugins/your-plugin-folder/settings.php", "autoload": { "pages": true, - "pagesSubFolders": false, + "pages-sub-folders": false, "commands": true, - "themes": true + "themes": true, + "admin-pages": true, + "admin-pages-sub-folders": true, } } diff --git a/system/functions.php b/system/functions.php index 5076b054..b0dbc82e 100644 --- a/system/functions.php +++ b/system/functions.php @@ -1018,12 +1018,19 @@ function load_config_lua($filename) } else { - foreach($result as $tmp_key => $tmp_value) // load values defined by other keys, like: dailyFragsToBlackSkull = dailyFragsToRedSkull + foreach($result as $tmp_key => $tmp_value) { // load values defined by other keys, like: dailyFragsToBlackSkull = dailyFragsToRedSkull $value = str_replace($tmp_key, $tmp_value, $value); - $ret = @eval("return $value;"); - if((string) $ret == '' && trim($value) !== '""') // = parser error - { - throw new RuntimeException('ERROR: Loading config.lua file. Line ' . ($ln + 1) . ' of LUA config file is not valid [key: ' . $key . ']'); + } + + try { + $ret = eval("return $value;"); + } + catch (Throwable $e) { + throw new RuntimeException('ERROR: Loading config.lua file. Line: ' . ($ln + 1) . ' - Unable to parse value "' . $value . '" - ' . $e->getMessage()); + } + + if((string) $ret == '' && trim($value) !== '""') { + throw new RuntimeException('ERROR: Loading config.lua file. Line ' . ($ln + 1) . ' is not valid [key: ' . $key . ']'); } $result[$key] = $ret; } diff --git a/system/libs/pot/OTS_Account.php b/system/libs/pot/OTS_Account.php index 0de49ccc..231230af 100644 --- a/system/libs/pot/OTS_Account.php +++ b/system/libs/pot/OTS_Account.php @@ -445,19 +445,19 @@ class OTS_Account extends OTS_Row_DAO implements IteratorAggregate, Countable throw new E_OTS_NotLoaded(); } + $configFreePremium = configLua('freePremium'); + if(isset($configFreePremium) && getBoolean($configFreePremium)) {return -1;} + if(isset($this->data['premium_ends_at']) || isset($this->data['premend'])) { $col = isset($this->data['premium_ends_at']) ? 'premium_ends_at' : 'premend'; $ret = ceil(($this->data[$col] - time()) / (24 * 60 * 60)); - return $ret > 0 ? $ret : 0; + return max($ret, 0); } if($this->data['premdays'] == 0) { return 0; } - global $config; - if(isset($config['lua']['freePremium']) && getBoolean($config['lua']['freePremium'])) return -1; - if($this->data['premdays'] == self::GRATIS_PREMIUM_DAYS){ return self::GRATIS_PREMIUM_DAYS; } diff --git a/system/libs/pot/OTS_DB_MySQL.php b/system/libs/pot/OTS_DB_MySQL.php index 89e8dd0d..baa38c76 100644 --- a/system/libs/pot/OTS_DB_MySQL.php +++ b/system/libs/pot/OTS_DB_MySQL.php @@ -234,6 +234,19 @@ class OTS_DB_MySQL extends OTS_Base_DB return $this->hasTable($table) && ($this->has_column_cache[$table . '.' . $column] = count($this->query('SHOW COLUMNS FROM `' . $table . "` LIKE '" . $column . "'")->fetchAll()) > 0); } + public function hasTableAndColumns(string $table, array $columns = []): bool + { + if (!$this->hasTable($table)) return false; + + foreach ($columns as $column) { + if (!$this->hasColumn($table, $column)) { + return false; + } + } + + return true; + } + public function revalidateCache() { foreach($this->has_table_cache as $key => $value) { $this->hasTableInternal($key); diff --git a/system/pages/polls.php b/system/pages/polls.php index 37372f25..1d334053 100644 --- a/system/pages/polls.php +++ b/system/pages/polls.php @@ -100,7 +100,7 @@ function getColorByPercent($percent) if(!$logged) { - echo 'You are not logged in. Log in to vote in polls.

'; + echo 'You are not logged in. Log in to vote in polls.

'; return; } diff --git a/system/router.php b/system/router.php index 5b103a90..e0bcc04f 100644 --- a/system/router.php +++ b/system/router.php @@ -89,8 +89,6 @@ if($logged && $account_logged && $account_logged->isLoaded()) { * Routes loading */ $dispatcher = FastRoute\cachedDispatcher(function (FastRoute\RouteCollector $r) { - $routes = require SYSTEM . 'routes.php'; - $routesFinal = []; foreach(getDatabasePages() as $page) { $routesFinal[] = ['*', $page, '__database__/' . $page, 100]; @@ -106,8 +104,13 @@ $dispatcher = FastRoute\cachedDispatcher(function (FastRoute\RouteCollector $r) */ } + $routes = require SYSTEM . 'routes.php'; foreach ($routes as $route) { if (!str_contains($route[2], '__redirect__') && !str_contains($route[2], '__database__')) { + if (!is_file(BASE . 'system/pages/' . $route[2])) { + continue; + } + $routesFinal[] = [$route[0], $route[1], 'system/pages/' . $route[2], $route[3] ?? 10000]; } else { @@ -343,16 +346,16 @@ function getDatabasePages($withHidden = false): array function loadPageFromFileSystem($page, &$found): string { - $file = SYSTEM . 'pages/' . $page . '.php'; + // feature: load pages from templates/ dir + global $template_path; + $file = $template_path . '/pages/' . $page . '.php'; if (!is_file($file)) { - // feature: convert camelCase to snake_case - // so instead of forum/move_thread - // we can write: forum/moveThread - $file = SYSTEM . 'pages/' . camelCaseToUnderscore($page) . '.php'; + $file = SYSTEM . 'pages/' . $page . '.php'; if (!is_file($file)) { - // feature: load pages from templates/ dir - global $template_path; - $file = $template_path . '/pages/' . $page . '.php'; + // feature: convert camelCase to snake_case + // so instead of forum/move_thread + // we can write: forum/moveThread + $file = SYSTEM . 'pages/' . camelCaseToUnderscore($page) . '.php'; if (!is_file($file)) { $found = false; } diff --git a/system/settings.php b/system/settings.php index dcd32ebc..d2c2745b 100644 --- a/system/settings.php +++ b/system/settings.php @@ -1622,14 +1622,20 @@ Sent by MyAAC,
'name' => 'Login Attempts Limit', 'type' => 'number', 'desc' => 'Number of incorrect login attempts before banning the IP', - 'default' => 5, // Ajuste conforme necessário + 'default' => 5, + 'show_if' => [ + 'account_login_ipban_protection', '=', 'true' + ] ], 'account_login_ban_time' => [ 'name' => 'Ban Time (Minutes)', 'type' => 'number', 'desc' => 'Time in minutes the IP will be banned after exceeding login attempts', - 'default' => 30, // Ajuste conforme necessário + 'default' => 30, + 'show_if' => [ + 'account_login_ipban_protection', '=', 'true' + ] ], ], 'callbacks' => [ diff --git a/system/src/Commands/CacheClearCommand.php b/system/src/Commands/CacheClearCommand.php index ff4d5d4a..3b052995 100644 --- a/system/src/Commands/CacheClearCommand.php +++ b/system/src/Commands/CacheClearCommand.php @@ -2,6 +2,7 @@ namespace MyAAC\Commands; +use MyAAC\Hooks; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; use Symfony\Component\Console\Style\SymfonyStyle; @@ -16,7 +17,10 @@ class CacheClearCommand extends Command protected function execute(InputInterface $input, OutputInterface $output): int { - require SYSTEM . 'init.php'; + global $hooks; + $hooks = new Hooks(); + $hooks->load(); + $hooks->trigger(HOOK_INIT); $io = new SymfonyStyle($input, $output); diff --git a/system/src/Commands/MigrateRunCommand.php b/system/src/Commands/MigrateRunCommand.php index edfa108d..3bdb1452 100644 --- a/system/src/Commands/MigrateRunCommand.php +++ b/system/src/Commands/MigrateRunCommand.php @@ -4,6 +4,7 @@ namespace MyAAC\Commands; use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Input\InputInterface; +use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; use Symfony\Component\Console\Style\SymfonyStyle; @@ -16,7 +17,8 @@ class MigrateRunCommand extends Command ->addArgument('id', InputArgument::IS_ARRAY | InputArgument::REQUIRED, 'Id or ids of migration(s)' - ); + ) + ->addOption('down', 'd', InputOption::VALUE_NONE, 'Down');; } protected function execute(InputInterface $input, OutputInterface $output): int @@ -41,8 +43,10 @@ class MigrateRunCommand extends Command } } + $down = $input->getOption('down') ?? false; + foreach ($ids as $id) { - $this->executeMigration($id, $io); + $this->executeMigration($id, $io, !$down); } return Command::SUCCESS; @@ -52,13 +56,24 @@ class MigrateRunCommand extends Command return file_exists(SYSTEM . 'migrations/' . $id . '.php'); } - private function executeMigration($id, $io): void + private function executeMigration($id, $io, $_up = true): void { global $db; $db->revalidateCache(); require SYSTEM . 'migrations/' . $id . '.php'; - $io->success('Migration ' . $id . ' successfully executed'); + if ($_up) { + if (isset($up)) { + $up(); + } + } + else { + if (isset($down)) { + $down(); + } + } + + $io->success('Migration ' . $id . ' successfully executed' . ($_up ? '' : ' (downgrade)')); } } diff --git a/system/src/Plugins.php b/system/src/Plugins.php index 243ced24..f9d4d5ce 100644 --- a/system/src/Plugins.php +++ b/system/src/Plugins.php @@ -11,6 +11,81 @@ class Plugins { private static $error = null; private static $plugin_json = []; + public static function getAdminPages() + { + return Cache::remember('plugins_admin_pages', 10 * 60, function () { + $adminPages = []; + foreach(self::getAllPluginsJson() as $plugin) { + if (!self::getAutoLoadOption($plugin, 'admin-pages', true)) { + continue; + } + + $adminPagesDefaultPriority = 1000; + if (isset($plugin['admin-pages-default-priority'])) { + $adminPagesDefaultPriority = $plugin['admin-pages-default-priority']; + } + + // + // Get all plugins/*/admin-pages/*.php pages + // + $pluginAdminPages = glob(PLUGINS . $plugin['filename'] . '/admin-pages/*.php'); + foreach ($pluginAdminPages as $file) { + $file = str_replace(PLUGINS, 'plugins/', $file); + $name = pathinfo($file, PATHINFO_FILENAME); + + $adminPages[] = ['name' => $name, 'file' => $file, 'priority' => $adminPagesDefaultPriority]; + } + + if (self::getAutoLoadOption($plugin, 'admin-pages-sub-folders', true)) { + // + // Get all plugins/*/admin-pages/subFolder/*.php pages + // + $pluginAdminPagesSubFolders = glob(PLUGINS . $plugin['filename'] . '/admin-pages/*', GLOB_ONLYDIR); + foreach ($pluginAdminPagesSubFolders as $folder) { + $folderName = pathinfo($folder, PATHINFO_FILENAME); + + $subFiles = glob(PLUGINS . $plugin['filename'] . '/admin-pages/' . $folderName . '/*.php'); + foreach ($subFiles as $file) { + $file = str_replace(PLUGINS, 'plugins/', $file); + $name = $folderName . '/' . pathinfo($file, PATHINFO_FILENAME); + + $adminPages[] = ['name' => $name, 'file' => $file, 'priority' => $adminPagesDefaultPriority]; + } + + $subFolders = glob(PLUGINS . $plugin['filename'] . '/admin-pages/' . $folderName . '/*', GLOB_ONLYDIR); + foreach ($subFolders as $subFolder) { + $subFolderName = pathinfo($subFolder, PATHINFO_FILENAME); + $subSubFiles = glob(PLUGINS . $plugin['filename'] . '/admin-pages/' . $folderName . '/' . $subFolderName . '/*.php'); + + foreach ($subSubFiles as $subSubFile) { + $subSubFile = str_replace(PLUGINS, 'plugins/', $subSubFile); + $name = $folderName . '/' . $subFolderName . '/' . pathinfo($subSubFile, PATHINFO_FILENAME); + + $adminPages[] = ['name' => $name, 'file' => $subSubFile, 'priority' => $adminPagesDefaultPriority];; + } + } + } + } + } + + usort($adminPages, function ($a, $b) + { + if ($a['priority'] == $b['priority']) { + return 0; + } + + return ($a['priority'] > $b['priority']) ? -1 : 1; + }); + + $ret = []; + foreach ($adminPages as $value) { + $ret[$value['name']] = $value['file']; + } + + return $ret; + }); + } + public static function getRoutes() { $cache = Cache::getInstance(); @@ -76,7 +151,8 @@ class Plugins { $pagesDefaultPriority = $plugin['pages-default-priority']; } - if (self::getAutoLoadOption($plugin, 'pages', true)) { + $autoLoadPages = self::getAutoLoadOption($plugin, 'pages', true); + if ($autoLoadPages) { // // Get all plugins/*/pages/*.php pages // @@ -89,7 +165,8 @@ class Plugins { } } - if (self::getAutoLoadOption($plugin, 'pagesSubFolders', true)) { + if ($autoLoadPages && self::getAutoLoadOption($plugin, 'pagesSubFolders', true) && + self::getAutoLoadOption($plugin, 'pages-sub-folders', true)) { // // Get all plugins/*/pages/subFolder/*.php pages // @@ -411,20 +488,13 @@ class Plugins { $continue = true; if(!isset($plugin_json['name']) || empty(trim($plugin_json['name']))) { - self::$warnings[] = 'Plugin "name" tag is not set.'; - } - if(!isset($plugin_json['description']) || empty(trim($plugin_json['description']))) { - self::$warnings[] = 'Plugin "description" tag is not set.'; + 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['author']) || empty(trim($plugin_json['author']))) { - self::$warnings[] = 'Plugin "author" tag is not set.'; - } - if(!isset($plugin_json['contact']) || empty(trim($plugin_json['contact']))) { - self::$warnings[] = 'Plugin "contact" tag is not set.'; - } if(isset($plugin_json['require'])) { $require = $plugin_json['require']; @@ -631,6 +701,7 @@ class Plugins { return false; } + clearCache(); return true; } @@ -675,26 +746,41 @@ class Plugins { public static function uninstall($plugin_name): bool { + $isDisabled = self::existDisabled($plugin_name); + if($isDisabled) { + self::enable($plugin_name); + } + + $revertEnable = function() use ($isDisabled, $plugin_name) { + if($isDisabled) { + self::disable($plugin_name); + } + }; + $filename = BASE . 'plugins/' . $plugin_name . '.json'; if(!file_exists($filename)) { self::$error = 'Plugin ' . $plugin_name . ' does not exist.'; + $revertEnable(); return false; } + $string = file_get_contents($filename); $plugin_info = json_decode($string, true); if(!$plugin_info) { self::$error = 'Cannot load plugin info ' . $plugin_name . '.json'; + $revertEnable(); return false; } if(!isset($plugin_info['uninstall'])) { self::$error = "Plugin doesn't have uninstall options defined. Skipping..."; + $revertEnable(); return false; } $success = true; foreach($plugin_info['uninstall'] as $file) { - if(strpos($file, '/') === 0) { + if(str_starts_with($file, '/')) { $success = false; self::$error = "You cannot use absolute paths (starting with slash - '/'): " . $file; break; @@ -709,24 +795,19 @@ class Plugins { } } - if($success) { - foreach($plugin_info['uninstall'] as $file) { - if(!deleteDirectory(BASE . $file)) { - self::$warnings[] = 'Cannot delete: ' . $file; - } - } - - $cache = Cache::getInstance(); - if($cache->enabled()) { - $cache->delete('templates'); - $cache->delete('hooks'); - $cache->delete('template_menus'); - } - - return true; + if(!$success) { + $revertEnable(); + return false; } - return false; + foreach($plugin_info['uninstall'] as $file) { + if(!deleteDirectory(BASE . $file)) { + self::$warnings[] = 'Cannot delete: ' . $file; + } + } + + clearCache(); + return true; } public static function is_installed($plugin_name, $version): bool diff --git a/system/templates/admin.menus.js.html.twig b/system/templates/admin.menus.js.html.twig index dcb4fd33..9f7ea45e 100644 --- a/system/templates/admin.menus.js.html.twig +++ b/system/templates/admin.menus.js.html.twig @@ -4,7 +4,9 @@ let colors = []; {% for cat, menu in menus %} - last_id[{{ cat }}] = {{ last_id[cat] }}; + {% if config('menu_categories')[cat] is not empty %} + last_id[{{ cat }}] = {{ last_id[cat] }}; + {% endif %} {% endfor %} {% set menuDefaultLinksColor = config('menu_default_links_color') %} diff --git a/system/templates/buttons.base.html.twig b/system/templates/buttons.base.html.twig index d44bce10..075af1e1 100644 --- a/system/templates/buttons.base.html.twig +++ b/system/templates/buttons.base.html.twig @@ -1 +1 @@ - \ No newline at end of file + diff --git a/system/templates/guilds.list.html.twig b/system/templates/guilds.list.html.twig index 80f170a0..7a4a7c86 100644 --- a/system/templates/guilds.list.html.twig +++ b/system/templates/guilds.list.html.twig @@ -114,7 +114,7 @@ {% else %} Before you can create a guild you must login.
-
+ {{ csrf() }} {% include('buttons.login.html.twig') %}
diff --git a/system/templates/guilds.view.html.twig b/system/templates/guilds.view.html.twig index 695d7464..a25d9570 100644 --- a/system/templates/guilds.view.html.twig +++ b/system/templates/guilds.view.html.twig @@ -215,7 +215,7 @@ {% if not logged %} -
+ {{ csrf() }} {{ include('buttons.login.html.twig') }} diff --git a/templates/tibiacom/account.login.html.twig b/templates/tibiacom/account.login.html.twig index 9e9b65c2..8aeba805 100644 --- a/templates/tibiacom/account.login.html.twig +++ b/templates/tibiacom/account.login.html.twig @@ -4,24 +4,25 @@ {% endif %}
- -
-
- - - - -
Account Login
- - - - -
+
+
+ + + + +
Account Login
+ + + +
+
+
+ +
@@ -30,20 +31,21 @@
+ + +
- +
{{ hook('HOOK_ACCOUNT_LOGIN_BEFORE_ACCOUNT') }} - + {{ hook('HOOK_ACCOUNT_LOGIN_AFTER_ACCOUNT') }} - + {{ hook('HOOK_ACCOUNT_LOGIN_AFTER_PASSWORD') }} @@ -53,17 +55,19 @@ {{ hook('HOOK_ACCOUNT_LOGIN_AFTER_REMEMBER_ME') }}
{{ account_login_by }}:
Password:
-
- +
+
{{ include('buttons.login.html.twig') }} -
-
- {{ include('buttons.account_lost.html.twig') }} -
-
+ + {% set noSubmit = true %} + {{ include('buttons.account_lost.html.twig') }} + +
@@ -75,35 +79,40 @@
+
+

New to {{ config.lua.serverName }}?

- -
-
- - - - -
New Player
- - - - -
+
+
+ + + + +
New Player
+ + + +
+
+
+ +
+ +
@@ -112,6 +121,7 @@
+ + +
@@ -129,9 +139,12 @@

... where hardcore gaming meets fantasy.

... where friendships last a lifetime.

-

... unites adventurers since 2017!

+

... unites adventurers since 1997!

+
@@ -143,10 +156,12 @@
{{ hook('HOOK_ACCOUNT_LOGIN_AFTER_PAGE') }} diff --git a/templates/tibiacom/basic.css b/templates/tibiacom/basic.css index 3d260a97..4633c5ed 100644 --- a/templates/tibiacom/basic.css +++ b/templates/tibiacom/basic.css @@ -36,6 +36,12 @@ img { width: expression(document.body.clientWidth > 1200? "1200px": "100%" ); } +#LoginFormButtonCell { + width: 145px; + vertical-align: top; + padding-right: 10px; +} + #ContentRow { position: relative; top: 155px; diff --git a/templates/tibiacom/buttons.base.html.twig b/templates/tibiacom/buttons.base.html.twig index a4ab47d5..713321aa 100644 --- a/templates/tibiacom/buttons.base.html.twig +++ b/templates/tibiacom/buttons.base.html.twig @@ -13,7 +13,7 @@
- +
{% endapply %} diff --git a/templates/tibiacom/buttons.logout.html.twig b/templates/tibiacom/buttons.logout.html.twig index fccaf69d..6926617c 100644 --- a/templates/tibiacom/buttons.logout.html.twig +++ b/templates/tibiacom/buttons.logout.html.twig @@ -1,3 +1,3 @@ {% set button_name = 'Logout' %} -{% set button_image = '_sbutton_logout' %} +{% set button_color = 'red' %} {% include('buttons.base.html.twig') %} \ No newline at end of file diff --git a/templates/tibiacom/config.php b/templates/tibiacom/config.php index 7ed168d9..a49f6f76 100644 --- a/templates/tibiacom/config.php +++ b/templates/tibiacom/config.php @@ -1,13 +1,13 @@ array('id' => 'news', 'name' => 'Latest News'), - MENU_CATEGORY_ACCOUNT => array('id' => 'account', 'name' => 'Account'), - MENU_CATEGORY_COMMUNITY => array('id' => 'community', 'name' => 'Community'), - MENU_CATEGORY_FORUM => array('id' => 'forum', 'name' => 'Forum'), - MENU_CATEGORY_LIBRARY => array('id' => 'library', 'name' => 'Library'), - MENU_CATEGORY_SHOP => array('id' => 'shops', 'name' => 'Shop') -); +$config['menu_categories'] = [ + MENU_CATEGORY_NEWS => ['id' => 'news', 'name' => 'Latest News'], + MENU_CATEGORY_ACCOUNT => ['id' => 'account', 'name' => 'Account'], + MENU_CATEGORY_COMMUNITY => ['id' => 'community', 'name' => 'Community'], + MENU_CATEGORY_FORUM => ['id' => 'forum', 'name' => 'Forum'], + MENU_CATEGORY_LIBRARY => ['id' => 'library', 'name' => 'Library'], + MENU_CATEGORY_SHOP => ['id' => 'shops', 'name' => 'Shop'], +]; $config['menus'] = require __DIR__ . '/menus.php'; diff --git a/templates/tibiacom/headline.php b/templates/tibiacom/headline.php index 4bf3f273..dd85d826 100644 --- a/templates/tibiacom/headline.php +++ b/templates/tibiacom/headline.php @@ -17,7 +17,7 @@ $font = getenv('GDFONTPATH') . DIRECTORY_SEPARATOR . 'martel.ttf'; imagettftext($image, 18, 0, 4, 20, imagecolorallocate($image, 240, 209, 164), $font, $text); // header mime type -header('Content-type: image/gif'); +header('Content-type: image/png'); // output image to browser -imagegif($image); +imagepng($image);