From 3f6ff3a3326b0475d28d11ffd7fff51f362d799f Mon Sep 17 00:00:00 2001 From: Slawomir Boczek Date: Fri, 22 Nov 2024 15:29:23 +0100 Subject: [PATCH] Feature migrations up/down (#270) * Migrations up down * Add forum model * Syntactic sugar for db structure changes * Refactor migrations with $up & $down * Fix migrations upgrade and downgrade + Add option to disable auto migrate * Add migrate:to command Usage: php aac migrate:to x (x - database version) * Show error when mail is not enabled * Fixes regarding to init.php * Add migrate command to manually upgrade db, incase auto migrate is disabled * Fixed rest of the migrations * Limit max version of database * Don't allow minus number * Option to clear specified plugin settings by name * Version is required * Fix PHPStan errors * Unset $up after migration, to prevent executing same migration twice * Add database version to output * This is not needed * Update 5.php * Set database_auto_migrate on install * Set blank & color only if current db version supports it * Fix duplicate function declaration --- aac | 6 +- install/steps/5-database.php | 1 + system/init.php | 6 +- system/libs/pot/OTS_Base_DB.php | 24 +++ system/migrate.php | 12 ++ system/migrations/1-hooks.sql | 8 + system/migrations/1.php | 28 ++-- system/migrations/10-admin_menu.sql | 10 ++ system/migrations/10.php | 37 +++-- system/migrations/11.php | 35 ++++- system/migrations/12-items.sql | 9 ++ system/migrations/12-weapons.sql | 8 + system/migrations/12.php | 108 +++++++------ system/migrations/13.php | 17 +- system/migrations/14.php | 47 ++++-- system/migrations/15.php | 28 +++- system/migrations/16.php | 13 +- system/migrations/17-menu.sql | 11 ++ system/migrations/17.php | 31 ++-- system/migrations/18.php | 24 ++- system/migrations/2.php | 14 +- system/migrations/20.php | 41 +++-- system/migrations/21.php | 27 ++-- system/migrations/22-z_polls.sql | 10 ++ system/migrations/22-z_polls_answers.sql | 6 + system/migrations/22.php | 58 +++---- system/migrations/23.php | 25 ++- system/migrations/24-items.sql | 9 ++ system/migrations/24.php | 11 +- system/migrations/25.php | 11 +- system/migrations/26.php | 39 +++-- system/migrations/27-commands.html | 22 +++ system/migrations/27-downloads.html | 6 + system/migrations/27.php | 85 +++++----- system/migrations/28-hooks.sql | 10 ++ system/migrations/28.php | 25 ++- system/migrations/29.php | 17 +- system/migrations/3.php | 16 +- system/migrations/30-rules.txt | 25 +++ system/migrations/30.php | 50 +++--- system/migrations/31.php | 148 +++++++++++++----- system/migrations/32.php | 12 +- system/migrations/33.php | 12 +- system/migrations/34.php | 16 +- system/migrations/35.php | 16 +- system/migrations/36-settings.sql | 9 ++ system/migrations/36.php | 28 ++-- system/migrations/37.php | 8 +- system/migrations/38.php | 13 +- system/migrations/39.php | 47 ++++-- system/migrations/4.php | 17 +- system/migrations/40.php | 21 ++- system/migrations/5.php | 18 ++- system/migrations/6.php | 17 +- system/migrations/7.php | 18 ++- system/migrations/8.php | 32 ++-- system/migrations/9.php | 25 ++- system/settings.php | 7 + system/src/Commands/CacheClearCommand.php | 2 + system/src/Commands/Command.php | 4 - system/src/Commands/CronjobCommand.php | 3 +- system/src/Commands/CronjobInstallCommand.php | 2 + system/src/Commands/MailSendCommand.php | 7 + system/src/Commands/MigrateCommand.php | 28 ++++ system/src/Commands/MigrateRunCommand.php | 2 + system/src/Commands/MigrateToCommand.php | 108 +++++++++++++ system/src/Commands/PluginInstallCommand.php | 2 + .../Commands/PluginInstallInstallCommand.php | 2 + system/src/Commands/SettingsResetCommand.php | 28 +++- system/src/Commands/SettingsSetCommand.php | 2 + system/src/Models/Forum.php | 30 ++++ system/src/Plugins.php | 10 +- 72 files changed, 1268 insertions(+), 396 deletions(-) create mode 100644 system/migrations/1-hooks.sql create mode 100644 system/migrations/10-admin_menu.sql create mode 100644 system/migrations/12-items.sql create mode 100644 system/migrations/12-weapons.sql create mode 100644 system/migrations/17-menu.sql create mode 100644 system/migrations/22-z_polls.sql create mode 100644 system/migrations/22-z_polls_answers.sql create mode 100644 system/migrations/24-items.sql create mode 100644 system/migrations/27-commands.html create mode 100644 system/migrations/27-downloads.html create mode 100644 system/migrations/28-hooks.sql create mode 100644 system/migrations/30-rules.txt create mode 100644 system/migrations/36-settings.sql create mode 100644 system/src/Commands/MigrateCommand.php create mode 100644 system/src/Commands/MigrateToCommand.php create mode 100644 system/src/Models/Forum.php diff --git a/aac b/aac index d87042f8..d4ce7b7d 100644 --- a/aac +++ b/aac @@ -9,14 +9,13 @@ if(!IS_CLI) { } require_once SYSTEM . 'functions.php'; -require_once SYSTEM . 'init.php'; define('SELF_NAME', basename(__FILE__)); use MyAAC\Plugins; use Symfony\Component\Console\Application; -$application = new Application(); +$application = new Application('MyAAC', MYAAC_VERSION); $commandsGlob = glob(SYSTEM . 'src/Commands/*.php'); foreach ($commandsGlob as $item) { @@ -34,7 +33,4 @@ foreach ($pluginCommands as $item) { $application->add(require $item); } -$application->setName('MyAAC'); -$application->setVersion(MYAAC_VERSION); - $application->run(); diff --git a/install/steps/5-database.php b/install/steps/5-database.php index 4f87bc49..cb4f14a3 100644 --- a/install/steps/5-database.php +++ b/install/steps/5-database.php @@ -40,6 +40,7 @@ if(!$error) { $configToSave['gzip_output'] = false; $configToSave['cache_engine'] = 'auto'; $configToSave['cache_prefix'] = 'myaac_' . generateRandomString(8, true, false, true); + $configToSave['database_auto_migrate'] = true; if(!$error) { $content = ''; diff --git a/system/init.php b/system/init.php index 1102fb56..68122dba 100644 --- a/system/init.php +++ b/system/init.php @@ -17,6 +17,7 @@ use MyAAC\Settings; defined('MYAAC') or die('Direct access not allowed!'); +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.'); } @@ -142,7 +143,10 @@ if(!defined('MYAAC_INSTALL') && !$db->hasTable('myaac_account_actions')) { } // execute migrations -require SYSTEM . 'migrate.php'; +$configDatabaseAutoMigrate = config('database_auto_migrate'); +if (!isset($configDatabaseAutoMigrate) || $configDatabaseAutoMigrate) { + require SYSTEM . 'migrate.php'; +} // settings $settings = Settings::getInstance(); diff --git a/system/libs/pot/OTS_Base_DB.php b/system/libs/pot/OTS_Base_DB.php index 6ef39bc5..1d7ae287 100644 --- a/system/libs/pot/OTS_Base_DB.php +++ b/system/libs/pot/OTS_Base_DB.php @@ -235,6 +235,30 @@ abstract class OTS_Base_DB extends PDO implements IOTS_DB $this->exec($query); return true; } + + public function addColumn($table, $column, $definition): void { + $this->exec('ALTER TABLE ' . $this->tableName($table) . ' ADD ' . $this->fieldName($column) . ' ' . $definition . ';'); + } + + public function modifyColumn($table, $column, $definition): void { + $this->exec('ALTER TABLE ' . $this->tableName($table) . ' MODIFY ' . $this->fieldName($column) . ' ' . $definition . ';'); + } + + public function changeColumn($table, $from, $to, $definition): void { + $this->exec('ALTER TABLE ' . $this->tableName($table) . ' CHANGE ' . $this->fieldName($from) . ' ' . $this->fieldName($to) . ' ' . $definition . ';'); + } + + public function dropColumn($table, $column): void { + $this->exec('ALTER TABLE ' . $this->tableName($table) . ' DROP COLUMN ' . $this->fieldName($column) . ';'); + } + + public function renameTable($from, $to): void { + $this->exec('RENAME TABLE ' . $this->tableName($from) . ' TO ' . $this->tableName($to) . ';'); + } + + public function dropTable($table, $ifExists = true): void { + $this->exec('DROP TABLE ' . ($ifExists ? 'IF EXISTS' : '') . ' ' . $this->tableName($table) . ';'); + } /** * LIMIT/OFFSET clause for queries. * diff --git a/system/migrate.php b/system/migrate.php index 4eb7bf7a..2199fd73 100644 --- a/system/migrate.php +++ b/system/migrate.php @@ -17,6 +17,12 @@ if(fetchDatabaseConfig('database_version', $tmp)) { // we got version $db->revalidateCache(); for($i = $tmp + 1; $i <= DATABASE_VERSION; $i++) { require SYSTEM . 'migrations/' . $i . '.php'; + + if (isset($up)) { + $up(); + unset($up); + } + updateDatabaseConfig('database_version', $i); } } @@ -26,6 +32,12 @@ else { // register first version $db->revalidateCache(); for($i = 1; $i <= DATABASE_VERSION; $i++) { require SYSTEM . 'migrations/' . $i . '.php'; + + if (isset($up)) { + $up(); + unset($up); + } + updateDatabaseConfig('database_version', $i); } } diff --git a/system/migrations/1-hooks.sql b/system/migrations/1-hooks.sql new file mode 100644 index 00000000..218988ce --- /dev/null +++ b/system/migrations/1-hooks.sql @@ -0,0 +1,8 @@ +CREATE TABLE `myaac_hooks` +( + `id` INT(11) NOT NULL AUTO_INCREMENT, + `name` VARCHAR(30) NOT NULL DEFAULT '', + `type` INT(2) NOT NULL DEFAULT 0, + `file` VARCHAR(100) NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8; diff --git a/system/migrations/1.php b/system/migrations/1.php index 6e4f3252..a3c38f66 100644 --- a/system/migrations/1.php +++ b/system/migrations/1.php @@ -1,16 +1,16 @@ query("ALTER TABLE `" . TABLE_PREFIX . "account_actions` MODIFY `ip` INT(11) NOT NULL DEFAULT 0;"); - $db->query("ALTER TABLE `" . TABLE_PREFIX . "account_actions` MODIFY `date` INT(11) NOT NULL DEFAULT 0;"); - $db->query("ALTER TABLE `" . TABLE_PREFIX . "account_actions` MODIFY `action` VARCHAR(255) NOT NULL DEFAULT '';"); - $db->query(" - CREATE TABLE `myaac_hooks` -( - `id` INT(11) NOT NULL AUTO_INCREMENT, - `name` VARCHAR(30) NOT NULL DEFAULT '', - `type` INT(2) NOT NULL DEFAULT 0, - `file` VARCHAR(100) NOT NULL, - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8; -"); +/** + * @var OTS_DB_MySQL $db + */ -?> +$up = function () use ($db) { + $db->modifyColumn(TABLE_PREFIX . 'account_actions', 'ip', "INT(11) NOT NULL DEFAULT 0"); + $db->modifyColumn(TABLE_PREFIX . 'account_actions', 'date', "INT(11) NOT NULL DEFAULT 0"); + $db->modifyColumn(TABLE_PREFIX . 'account_actions', 'action', "VARCHAR(255) NOT NULL DEFAULT ''"); + + $db->query(file_get_contents(__DIR__ . '/1-hooks.sql')); +}; + +$down = function () use ($db) { + $db->dropTable(TABLE_PREFIX . 'hooks'); +}; diff --git a/system/migrations/10-admin_menu.sql b/system/migrations/10-admin_menu.sql new file mode 100644 index 00000000..72083c35 --- /dev/null +++ b/system/migrations/10-admin_menu.sql @@ -0,0 +1,10 @@ +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, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8; diff --git a/system/migrations/10.php b/system/migrations/10.php index da660ab9..8783dbf0 100644 --- a/system/migrations/10.php +++ b/system/migrations/10.php @@ -1,17 +1,24 @@ hasColumn(TABLE_PREFIX . 'hooks', 'ordering')) - $db->query("ALTER TABLE `" . TABLE_PREFIX . "hooks` ADD `ordering` INT(11) NOT NULL DEFAULT 0 AFTER `file`;"); +/** + * @var OTS_DB_MySQL $db + */ - if(!$db->hasTable(TABLE_PREFIX . 'admin_menu')) - $db->query(" -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, - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8; -"); \ No newline at end of file +$up = function () use ($db) { + if (!$db->hasColumn(TABLE_PREFIX . 'hooks', 'ordering')) { + $db->addColumn(TABLE_PREFIX . 'hooks', 'ordering', "INT(11) NOT NULL DEFAULT 0 AFTER `file`"); + } + + if (!$db->hasTable(TABLE_PREFIX . 'admin_menu')) { + $db->query(file_get_contents(__DIR__ . '/10-admin_menu.sql')); + } +}; + +$down = function () use ($db) { + if ($db->hasColumn(TABLE_PREFIX . 'hooks', 'ordering')) { + $db->dropColumn(TABLE_PREFIX . 'hooks', 'ordering'); + } + + if ($db->hasTable(TABLE_PREFIX . 'admin_menu')) { + $db->dropTable(TABLE_PREFIX . 'admin_menu'); + } +}; diff --git a/system/migrations/11.php b/system/migrations/11.php index 845f9e67..bc26da0e 100644 --- a/system/migrations/11.php +++ b/system/migrations/11.php @@ -1,19 +1,44 @@ query("RENAME TABLE - " . TABLE_PREFIX . "screenshots TO " . TABLE_PREFIX . "gallery, - " . TABLE_PREFIX . "movies TO " . TABLE_PREFIX . "videos;"); + $db->renameTable(TABLE_PREFIX . 'screenshots', TABLE_PREFIX . 'gallery'); + $db->renameTable(TABLE_PREFIX . 'movies', TABLE_PREFIX . 'videos'); // rename images dir - if(file_exists(BASE . 'images/screenshots') && !file_exists(BASE . GALLERY_DIR)) { + if (file_exists(BASE . 'images/screenshots') && !file_exists(BASE . GALLERY_DIR)) { rename(BASE . 'images/screenshots', BASE . GALLERY_DIR); } // convert old database screenshots images to gallery $query = $db->query('SELECT `id`, `image`, `thumb` FROM `' . TABLE_PREFIX . 'gallery`;'); - foreach($query->fetchAll() as $item) { + foreach ($query->fetchAll() as $item) { $db->update(TABLE_PREFIX . 'gallery', array( 'image' => str_replace('/screenshots/', '/gallery/', $item['image']), 'thumb' => str_replace('/screenshots/', '/gallery/', $item['thumb']), ), array('id' => $item['id'])); } +}; + +$down = function () use ($db) { + // rename database tables + $db->renameTable(TABLE_PREFIX . 'gallery', TABLE_PREFIX . 'screenshots'); + $db->renameTable(TABLE_PREFIX . 'videos', TABLE_PREFIX . 'movies'); + + // rename images dir + if (file_exists(BASE . GALLERY_DIR) && !file_exists(BASE . 'images/screenshots')) { + rename(BASE . GALLERY_DIR, BASE . 'images/screenshots'); + } + + // convert new database gallery images to screenshots + $query = $db->query('SELECT `id`, `image`, `thumb` FROM `' . TABLE_PREFIX . 'screenshots`;'); + foreach ($query->fetchAll() as $item) { + $db->update(TABLE_PREFIX . 'screenshots', [ + 'image' => str_replace('/gallery/', '/screenshots/', $item['image']), + 'thumb' => str_replace('/gallery/', '/screenshots/', $item['thumb']), + ], ['id' => $item['id']]); + } +}; diff --git a/system/migrations/12-items.sql b/system/migrations/12-items.sql new file mode 100644 index 00000000..458333e0 --- /dev/null +++ b/system/migrations/12-items.sql @@ -0,0 +1,9 @@ +CREATE TABLE `myaac_items` +( + `id` INT(11) NOT NULL, + `article` VARCHAR(5) NOT NULL DEFAULT '', + `name` VARCHAR(50) NOT NULL DEFAULT '', + `plural` VARCHAR(50) NOT NULL DEFAULT '', + `attributes` VARCHAR(500) NOT NULL DEFAULT '', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8; diff --git a/system/migrations/12-weapons.sql b/system/migrations/12-weapons.sql new file mode 100644 index 00000000..9085732e --- /dev/null +++ b/system/migrations/12-weapons.sql @@ -0,0 +1,8 @@ +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 '', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8; diff --git a/system/migrations/12.php b/system/migrations/12.php index 9730ed8b..00d6d6f0 100644 --- a/system/migrations/12.php +++ b/system/migrations/12.php @@ -1,51 +1,65 @@ hasColumn(TABLE_PREFIX . 'spells', 'item_id')) - $db->query("ALTER TABLE `" . TABLE_PREFIX . "spells` ADD `item_id` INT(11) NOT NULL DEFAULT 0 AFTER `conjure_count`;"); +use MyAAC\Models\Spell; -// change unique index from spell to name -$db->query("ALTER TABLE `" . TABLE_PREFIX . "spells` DROP INDEX `spell`;"); -$db->query("ALTER TABLE `" . TABLE_PREFIX . "spells` ADD UNIQUE INDEX (`name`);"); - -// change comment of spells.type -$db->query("ALTER TABLE `" . TABLE_PREFIX . "spells` MODIFY `type` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '1 - instant, 2 - conjure, 3 - rune';"); - -// new items table -if(!$db->hasTable(TABLE_PREFIX . 'items')) -$db->query(" -CREATE TABLE `" . TABLE_PREFIX . "items` -( - `id` INT(11) NOT NULL, - `article` VARCHAR(5) NOT NULL DEFAULT '', - `name` VARCHAR(50) NOT NULL DEFAULT '', - `plural` VARCHAR(50) NOT NULL DEFAULT '', - `attributes` VARCHAR(500) NOT NULL DEFAULT '', - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8; -"); - -// new weapons table -if(!$db->hasTable(TABLE_PREFIX . 'weapons')) -$db->query(" -CREATE TABLE `" . TABLE_PREFIX . "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 '', - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8; -"); - -// modify vocations to support json data -$db->query("ALTER TABLE `" . TABLE_PREFIX . "spells` MODIFY `vocations` VARCHAR(100) NOT NULL DEFAULT '';"); -$query = $db->query('SELECT `id`, `vocations` FROM `' . TABLE_PREFIX . 'spells`'); -foreach($query->fetchAll() as $spell) { - $tmp = explode(',', $spell['vocations']); - foreach($tmp as &$v) { - $v = (int)$v; +$up = function () use ($db) { + // add new item_id field for runes + if (!$db->hasColumn(TABLE_PREFIX . 'spells', 'item_id')) { + $db->addColumn(TABLE_PREFIX . 'spells', 'item_id', 'INT(11) NOT NULL DEFAULT 0 AFTER `conjure_count`'); } - $db->update(TABLE_PREFIX . 'spells', array('vocations' => json_encode($tmp)), array('id' => $spell['id'])); -} -?> \ No newline at end of file + + // change unique index from spell to name + $db->query("ALTER TABLE `" . TABLE_PREFIX . "spells` DROP INDEX `spell`;"); + $db->query("ALTER TABLE `" . TABLE_PREFIX . "spells` ADD UNIQUE INDEX (`name`);"); + + // change comment of spells.type + $db->modifyColumn(TABLE_PREFIX . 'spells', 'type', "TINYINT(1) NOT NULL DEFAULT 0 COMMENT '1 - instant, 2 - conjure, 3 - rune'"); + + // new items table + if (!$db->hasTable(TABLE_PREFIX . 'items')) { + $db->query(file_get_contents(__DIR__ . '/12-items.sql')); + } + + // new weapons table + if (!$db->hasTable(TABLE_PREFIX . 'weapons')) { + $db->query(file_get_contents(__DIR__ . '/12-weapons.sql')); + } + + // modify vocations to support json data + $db->modifyColumn(TABLE_PREFIX . 'spells', 'vocations', "VARCHAR(100) NOT NULL DEFAULT ''"); + + $spells = Spell::select('id', 'vocations')->get(); + foreach ($spells as $spell) { + $tmp = explode(',', $spell->vocations); + foreach ($tmp as &$v) { + $v = (int)$v; + } + + Spell::where('id', $spell->id)->update(['vocations' => json_encode($tmp)]); + } +}; + +$down = function () use ($db) { + // remove item_id field for runes + if ($db->hasColumn(TABLE_PREFIX . 'spells', 'item_id')) { + $db->dropColumn(TABLE_PREFIX . 'spells', 'item_id'); + } + + // change unique index from spell to name + $db->query("ALTER TABLE `" . TABLE_PREFIX . "spells` DROP INDEX `name`;"); + $db->query("ALTER TABLE `" . TABLE_PREFIX . "spells` ADD INDEX (`spell`);"); + + $db->dropTable(TABLE_PREFIX . 'items'); + $db->dropTable(TABLE_PREFIX . 'weapons'); + + $spells = Spell::select('id', 'vocations')->get(); + // modify vocations to use vocation separated by comma + foreach ($spells as $spell) { + $vocations = empty($spell->vocations) ? [] : json_decode($spell->vocations); + + Spell::where('id', $spell->id)->update(['vocations' => implode(',', $vocations)]); + } +}; diff --git a/system/migrations/13.php b/system/migrations/13.php index 4eee77f3..86da43ad 100644 --- a/system/migrations/13.php +++ b/system/migrations/13.php @@ -1,3 +1,16 @@ hasColumn(TABLE_PREFIX . 'spells', 'spell')) - $db->query("ALTER TABLE `" . TABLE_PREFIX . "spells` DROP COLUMN `spell`;"); \ No newline at end of file +/** + * @var OTS_DB_MySQL $db + */ + +$up = function () use ($db) { + if ($db->hasColumn(TABLE_PREFIX . 'spells', 'spell')) { + $db->dropColumn(TABLE_PREFIX . 'spells', 'spell'); + } +}; + +$down = function () use ($db) { + if (!$db->hasColumn(TABLE_PREFIX . 'spells', 'spell')) { + $db->addColumn(TABLE_PREFIX . 'spells', 'spell', "VARCHAR(255) NOT NULL DEFAULT ''"); + } +}; diff --git a/system/migrations/14.php b/system/migrations/14.php index acd13afb..4c295c67 100644 --- a/system/migrations/14.php +++ b/system/migrations/14.php @@ -1,18 +1,39 @@ hasColumn(TABLE_PREFIX . 'monsters', 'file_path')) { - $db->query("ALTER TABLE `" . TABLE_PREFIX . "monsters` CHANGE `file_path` `loot` VARCHAR(5000);"); -} +$up = function () use ($db) { + // change monsters.file_path field to loot + if ($db->hasColumn(TABLE_PREFIX . 'monsters', 'file_path')) { + $db->changeColumn(TABLE_PREFIX . 'monsters', 'file_path', 'loot', 'VARCHAR(5000)'); + } -// update loot to empty string -$db->query("UPDATE `" . TABLE_PREFIX . "monsters` SET `loot` = '';"); + // update loot to empty string + $db->query("UPDATE `" . TABLE_PREFIX . "monsters` SET `loot` = '';"); -// drop monsters.gfx_name field -$db->query("ALTER TABLE `" . TABLE_PREFIX . "monsters` DROP COLUMN `gfx_name`;"); + // drop monsters.gfx_name field + $db->dropColumn(TABLE_PREFIX . 'monsters', 'gfx_name'); -// rename hide_creature to hidden -if($db->hasColumn(TABLE_PREFIX . 'monsters', 'hide_creature')) { - $db->query("ALTER TABLE `" . TABLE_PREFIX . "monsters` CHANGE `hide_creature` `hidden` TINYINT(1) NOT NULL DEFAULT 0;"); -} -?> \ No newline at end of file + // rename hide_creature to hidden + if ($db->hasColumn(TABLE_PREFIX . 'monsters', 'hide_creature')) { + $db->changeColumn(TABLE_PREFIX . 'monsters', 'hide_creature', 'hidden', "TINYINT(1) NOT NULL DEFAULT 0"); + } +}; + +$down = function () use ($db) { + if ($db->hasColumn(TABLE_PREFIX . 'monsters', 'loot')) { + $db->changeColumn(TABLE_PREFIX . 'monsters', 'loot', 'file_path', 'VARCHAR(5000)'); + } + + // update file_path to empty string + $db->query("UPDATE `" . TABLE_PREFIX . "monsters` SET `file_path` = '';"); + + // add monsters.gfx_name field + $db->addColumn(TABLE_PREFIX . 'monsters', 'gfx_name', 'varchar(255) NOT NULL AFTER `race`'); + + // rename hidden to hide_creature + if ($db->hasColumn(TABLE_PREFIX . 'monsters', 'hidden')) { + $db->changeColumn(TABLE_PREFIX . 'monsters', 'hidden', 'hide_creature', 'TINYINT(1) NOT NULL DEFAULT 0'); + } +}; diff --git a/system/migrations/15.php b/system/migrations/15.php index 971587ec..eff04c42 100644 --- a/system/migrations/15.php +++ b/system/migrations/15.php @@ -1,10 +1,26 @@ hasColumn(TABLE_PREFIX . 'forum_boards', 'guild')) { - $db->query("ALTER TABLE `" . TABLE_PREFIX . "forum_boards` ADD `guild` TINYINT(1) NOT NULL DEFAULT 0 AFTER `closed`;"); -} -if(!$db->hasColumn(TABLE_PREFIX . 'forum_boards', 'access')) { - $db->query("ALTER TABLE `" . TABLE_PREFIX . "forum_boards` ADD `access` TINYINT(1) NOT NULL DEFAULT 0 AFTER `guild`;"); -} +$up = function () use ($db) { + if (!$db->hasColumn(TABLE_PREFIX . 'forum_boards', 'guild')) { + $db->addColumn(TABLE_PREFIX . 'forum_boards', 'guild', 'TINYINT(1) NOT NULL DEFAULT 0 AFTER `closed`'); + } + + if (!$db->hasColumn(TABLE_PREFIX . 'forum_boards', 'access')) { + $db->addColumn(TABLE_PREFIX . 'forum_boards', 'access', 'TINYINT(1) NOT NULL DEFAULT 0 AFTER `guild`'); + } +}; + +$down = function () use ($db) { + if ($db->hasColumn(TABLE_PREFIX . 'forum_boards', 'guild')) { + $db->dropColumn(TABLE_PREFIX . 'forum_boards', 'guild'); + } + + if ($db->hasColumn(TABLE_PREFIX . 'forum_boards', 'access')) { + $db->dropColumn(TABLE_PREFIX . 'forum_boards', 'access'); + } +}; diff --git a/system/migrations/16.php b/system/migrations/16.php index ad0112a2..0be467d4 100644 --- a/system/migrations/16.php +++ b/system/migrations/16.php @@ -1,5 +1,14 @@ query("ALTER TABLE `" . TABLE_PREFIX . "spells` MODIFY `vocations` VARCHAR(300) NOT NULL DEFAULT '';"); -?> \ No newline at end of file + +$up = function () use ($db) { + $db->modifyColumn(TABLE_PREFIX . 'spells', 'vocations', "VARCHAR(300) NOT NULL DEFAULT ''"); +}; + +$down = function () { + // nothing to do here +}; diff --git a/system/migrations/17-menu.sql b/system/migrations/17-menu.sql new file mode 100644 index 00000000..738e722b --- /dev/null +++ b/system/migrations/17-menu.sql @@ -0,0 +1,11 @@ +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, + `category` INT(11) NOT NULL DEFAULT 1, + `ordering` INT(11) NOT NULL DEFAULT 0, + `enabled` INT(1) NOT NULL DEFAULT 1, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8; diff --git a/system/migrations/17.php b/system/migrations/17.php index 73e3828c..497e3e3c 100644 --- a/system/migrations/17.php +++ b/system/migrations/17.php @@ -1,23 +1,20 @@ hasTable('myaac_menu')) { - $db->query(" -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, - `category` INT(11) NOT NULL DEFAULT 1, - `ordering` INT(11) NOT NULL DEFAULT 0, - `enabled` INT(1) NOT NULL DEFAULT 1, - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8; -"); -} +$up = function () use ($db) { + if (!$db->hasTable(TABLE_PREFIX . 'menu')) { + $db->exec(file_get_contents(__DIR__ . '/17-menu.sql')); + } -Plugins::installMenus('kathrine', require TEMPLATES . 'kathrine/menus.php'); -Plugins::installMenus('tibiacom', require TEMPLATES . 'tibiacom/menus.php'); + Plugins::installMenus('kathrine', require TEMPLATES . 'kathrine/menus.php'); + Plugins::installMenus('tibiacom', require TEMPLATES . 'tibiacom/menus.php'); +}; + +$down = function () use ($db) { + $db->dropTable(TABLE_PREFIX . 'menu'); +}; diff --git a/system/migrations/18.php b/system/migrations/18.php index 7ec9675a..7c251e7c 100644 --- a/system/migrations/18.php +++ b/system/migrations/18.php @@ -1,6 +1,24 @@ query("ALTER TABLE `" . TABLE_PREFIX . "news` ADD `article_text` VARCHAR(300) NOT NULL DEFAULT '' AFTER `comments`;"); -$db->query("ALTER TABLE `" . TABLE_PREFIX . "news` ADD `article_image` VARCHAR(100) NOT NULL DEFAULT '' AFTER `article_text`;"); +$up = function () use ($db) { + if (!$db->hasColumn(TABLE_PREFIX . 'news', 'article_text')) { + $db->addColumn(TABLE_PREFIX . 'news', 'article_text', "VARCHAR(300) NOT NULL DEFAULT '' AFTER `comments`"); + } -?> \ No newline at end of file + if (!$db->hasColumn(TABLE_PREFIX . 'news', 'article_image')) { + $db->addColumn(TABLE_PREFIX . 'news', 'article_image', "VARCHAR(100) NOT NULL DEFAULT '' AFTER `article_text`"); + } +}; + +$down = function () use ($db) { + if ($db->hasColumn(TABLE_PREFIX . 'news', 'article_text')) { + $db->dropColumn(TABLE_PREFIX . 'news', 'article_text'); + } + + if ($db->hasColumn(TABLE_PREFIX . 'news', 'article_image')) { + $db->dropColumn(TABLE_PREFIX . 'news', 'article_image'); + } +}; diff --git a/system/migrations/2.php b/system/migrations/2.php index 90d9a610..d65c0586 100644 --- a/system/migrations/2.php +++ b/system/migrations/2.php @@ -1,5 +1,11 @@ query("ALTER TABLE `" . TABLE_PREFIX . "faq` MODIFY `answer` VARCHAR(1020) NOT NULL DEFAULT '';"); - $db->query("ALTER TABLE `" . TABLE_PREFIX . "movies` MODIFY `title` VARCHAR(100) NOT NULL DEFAULT '';"); - $db->query("ALTER TABLE `" . TABLE_PREFIX . "news` MODIFY `title` VARCHAR(100) NOT NULL DEFAULT '';"); - $db->query("ALTER TABLE `" . TABLE_PREFIX . "news` MODIFY `body` TEXT NOT NULL DEFAULT '';"); +/** + * @var OTS_DB_MySQL $db + */ + +$up = function () use ($db) { + $db->modifyColumn(TABLE_PREFIX . 'faq', 'answer', "VARCHAR(1020) NOT NULL DEFAULT ''"); + $db->modifyColumn(TABLE_PREFIX . 'movies', 'title', "VARCHAR(100) NOT NULL DEFAULT ''"); + $db->modifyColumn(TABLE_PREFIX . 'news', 'title', "VARCHAR(100) NOT NULL DEFAULT ''"); + $db->modifyColumn(TABLE_PREFIX . 'news', 'body', "TEXT NOT NULL"); +}; diff --git a/system/migrations/20.php b/system/migrations/20.php index 1255fa14..ccc20a51 100644 --- a/system/migrations/20.php +++ b/system/migrations/20.php @@ -2,20 +2,33 @@ use MyAAC\Settings; -if (!$db->hasTable('players')) { - return; +function updateHighscoresIdsHidden(): void +{ + global $db; + + if (!$db->hasTable('players')) { + return; + } + + $query = $db->query("SELECT `id` FROM `players` WHERE (`name` = " . $db->quote("Rook Sample") . " OR `name` = " . $db->quote("Sorcerer Sample") . " OR `name` = " . $db->quote("Druid Sample") . " OR `name` = " . $db->quote("Paladin Sample") . " OR `name` = " . $db->quote("Knight Sample") . " OR `name` = " . $db->quote("Account Manager") . ") ORDER BY `id`;"); + + $highscores_ignored_ids = array(); + if ($query->rowCount() > 0) { + foreach ($query->fetchAll() as $result) + $highscores_ignored_ids[] = $result['id']; + } else { + $highscores_ignored_ids[] = 0; + } + + $settings = Settings::getInstance(); + $settings->updateInDatabase('core', 'highscores_ids_hidden', implode(', ', $highscores_ignored_ids)); } -$query = $db->query("SELECT `id` FROM `players` WHERE (`name` = " . $db->quote("Rook Sample") . " OR `name` = " . $db->quote("Sorcerer Sample") . " OR `name` = " . $db->quote("Druid Sample") . " OR `name` = " . $db->quote("Paladin Sample") . " OR `name` = " . $db->quote("Knight Sample") . " OR `name` = " . $db->quote("Account Manager") . ") ORDER BY `id`;"); +$up = function () { + updateHighscoresIdsHidden(); +}; -$highscores_ignored_ids = array(); -if($query->rowCount() > 0) { - foreach($query->fetchAll() as $result) - $highscores_ignored_ids[] = $result['id']; -} -else { - $highscores_ignored_ids[] = 0; -} - -$settings = Settings::getInstance(); -$settings->updateInDatabase('core', 'highscores_ids_hidden', implode(', ', $highscores_ignored_ids)); +$down = function () { + $settings = Settings::getInstance(); + $settings->updateInDatabase('core', 'highscores_ids_hidden', '0'); +}; diff --git a/system/migrations/21.php b/system/migrations/21.php index 51bb518a..6282407c 100644 --- a/system/migrations/21.php +++ b/system/migrations/21.php @@ -1,14 +1,23 @@ exec("ALTER TABLE `" . TABLE_PREFIX . "forum` ADD `post_html` TINYINT(1) NOT NULL DEFAULT 0 AFTER `post_smile`;"); +$up = function () use ($db) { + $db->addColumn(TABLE_PREFIX . 'forum', 'post_html', 'TINYINT(1) NOT NULL DEFAULT 0 AFTER `post_smile`'); -$query = $db->query("SELECT `id` FROM `" . TABLE_PREFIX . "forum_boards` WHERE `name` LIKE " . $db->quote('News') . " LIMIT 1;"); -if($query->rowCount() == 0) { - return; // don't make anything -} + $query = $db->query("SELECT `id` FROM `" . TABLE_PREFIX . "forum_boards` WHERE `name` LIKE " . $db->quote('News') . " LIMIT 1;"); + if ($query->rowCount() == 0) { + return; // don't make anything + } -$query = $query->fetch(); -$id = $query['id']; + $query = $query->fetch(); + $id = $query['id']; -// update all forum threads with is_html = 1 -$db->exec("UPDATE `" . TABLE_PREFIX . "forum` SET `post_html` = 1 WHERE `section` = " . $id . " AND `id` = `first_post`;"); \ No newline at end of file + // update all forum threads with is_html = 1 + $db->exec("UPDATE `" . TABLE_PREFIX . "forum` SET `post_html` = 1 WHERE `section` = " . $id . " AND `id` = `first_post`;"); +}; + +$down = function () use ($db) { + $db->dropColumn(TABLE_PREFIX . 'forum', 'post_html'); +}; diff --git a/system/migrations/22-z_polls.sql b/system/migrations/22-z_polls.sql new file mode 100644 index 00000000..7d5d39df --- /dev/null +++ b/system/migrations/22-z_polls.sql @@ -0,0 +1,10 @@ +CREATE TABLE `z_polls` ( + `id` int(11) NOT NULL auto_increment, + `question` varchar(255) NOT NULL, + `description` varchar(255) NOT NULL, + `end` int(11) NOT NULL DEFAULT 0, + `start` int(11) NOT NULL DEFAULT 0, + `answers` int(11) NOT NULL DEFAULT 0, + `votes_all` int(11) NOT NULL DEFAULT 0, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8; diff --git a/system/migrations/22-z_polls_answers.sql b/system/migrations/22-z_polls_answers.sql new file mode 100644 index 00000000..f28940cf --- /dev/null +++ b/system/migrations/22-z_polls_answers.sql @@ -0,0 +1,6 @@ +CREATE TABLE `z_polls_answers` ( + `poll_id` int(11) NOT NULL, + `answer_id` int(11) NOT NULL, + `answer` varchar(255) NOT NULL, + `votes` int(11) NOT NULL DEFAULT 0 +) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8; diff --git a/system/migrations/22.php b/system/migrations/22.php index eca1ddac..c9621032 100644 --- a/system/migrations/22.php +++ b/system/migrations/22.php @@ -1,31 +1,35 @@ hasTable('z_polls')) - $db->query(' -CREATE TABLE `z_polls` ( - `id` int(11) NOT NULL auto_increment, - `question` varchar(255) NOT NULL, - `description` varchar(255) NOT NULL, - `end` int(11) NOT NULL DEFAULT 0, - `start` int(11) NOT NULL DEFAULT 0, - `answers` int(11) NOT NULL DEFAULT 0, - `votes_all` int(11) NOT NULL DEFAULT 0, - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8; -'); +$up = function () use ($db) { + if (!$db->hasTable('z_polls')) { + $db->exec(file_get_contents(__DIR__ . '/22-z_polls.sql')); + } -if(!$db->hasTable('z_polls_answers')) -$db->query(' - CREATE TABLE `z_polls_answers` ( - `poll_id` int(11) NOT NULL, - `answer_id` int(11) NOT NULL, - `answer` varchar(255) NOT NULL, - `votes` int(11) NOT NULL DEFAULT 0 -) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8; -'); + if (!$db->hasTable('z_polls_answers')) { + $db->exec(file_get_contents(__DIR__ . '/22-z_polls_answers.sql')); + } -if(!$db->hasColumn('accounts', 'vote')) - $db->query('ALTER TABLE `accounts` ADD `vote` INT( 11 ) DEFAULT 0 NOT NULL ;'); -else { - $db->query('ALTER TABLE `accounts` MODIFY `vote` INT( 11 ) DEFAULT 0 NOT NULL ;'); -} \ No newline at end of file + if (!$db->hasColumn('accounts', 'vote')) { + $db->addColumn('accounts', 'vote', 'int(11) NOT NULL DEFAULT 0'); + } + else { + $db->modifyColumn('accounts', 'vote', 'int(11) NOT NULL DEFAULT 0'); + } +}; + +$down = function () use ($db) { + if ($db->hasTable('z_polls')) { + $db->dropTable('z_polls;'); + } + + if ($db->hasTable('z_polls_answers')) { + $db->dropTable('z_polls_answers'); + } + + if ($db->hasColumn('accounts', 'vote')) { + $db->dropColumn('accounts', 'vote'); + } +}; diff --git a/system/migrations/23.php b/system/migrations/23.php index ba4bbe0c..6174a086 100644 --- a/system/migrations/23.php +++ b/system/migrations/23.php @@ -1,7 +1,24 @@ hasColumn(TABLE_PREFIX . 'menu', 'blank')) - $db->query("ALTER TABLE `" . TABLE_PREFIX . "menu` ADD `blank` TINYINT(1) NOT NULL DEFAULT 0 AFTER `link`;"); +$up = function () use ($db) { + if (!$db->hasColumn(TABLE_PREFIX . 'menu', 'blank')) { + $db->addColumn(TABLE_PREFIX . 'menu', 'blank', 'TINYINT(1) NOT NULL DEFAULT 0 AFTER `link`'); + } -if(!$db->hasColumn(TABLE_PREFIX . 'menu', 'color')) - $db->query("ALTER TABLE `" . TABLE_PREFIX . "menu` ADD `color` CHAR(6) NOT NULL DEFAULT '' AFTER `blank`;"); \ No newline at end of file + if (!$db->hasColumn(TABLE_PREFIX . 'menu', 'color')) { + $db->addColumn(TABLE_PREFIX . 'menu', 'color', "CHAR(6) NOT NULL DEFAULT '' AFTER `blank`"); + } +}; + +$down = function () use ($db) { + if ($db->hasColumn(TABLE_PREFIX . 'menu', 'blank')) { + $db->dropColumn(TABLE_PREFIX . 'menu', 'blank'); + } + + if ($db->hasColumn(TABLE_PREFIX . 'menu', 'color')) { + $db->dropColumn(TABLE_PREFIX . 'menu', 'color'); + } +}; diff --git a/system/migrations/24-items.sql b/system/migrations/24-items.sql new file mode 100644 index 00000000..458333e0 --- /dev/null +++ b/system/migrations/24-items.sql @@ -0,0 +1,9 @@ +CREATE TABLE `myaac_items` +( + `id` INT(11) NOT NULL, + `article` VARCHAR(5) NOT NULL DEFAULT '', + `name` VARCHAR(50) NOT NULL DEFAULT '', + `plural` VARCHAR(50) NOT NULL DEFAULT '', + `attributes` VARCHAR(500) NOT NULL DEFAULT '', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8; diff --git a/system/migrations/24.php b/system/migrations/24.php index b7e93819..3fa44ae1 100644 --- a/system/migrations/24.php +++ b/system/migrations/24.php @@ -1,3 +1,12 @@ exec('DROP TABLE IF EXISTS `' . TABLE_PREFIX . 'items`;'); \ No newline at end of file +$up = function () use ($db) { + $db->dropTable(TABLE_PREFIX . 'items'); +}; + +$down = function () use ($db) { + $db->exec(file_get_contents(__DIR__ . '/24-items.sql')); +}; diff --git a/system/migrations/25.php b/system/migrations/25.php index 9e87c504..6a4b3ad2 100644 --- a/system/migrations/25.php +++ b/system/migrations/25.php @@ -1,3 +1,12 @@ exec('ALTER TABLE `' . TABLE_PREFIX . 'monsters` MODIFY `loot` text NOT NULL;'); \ No newline at end of file +$up = function () use ($db) { + $db->modifyColumn(TABLE_PREFIX . 'monsters', 'loot', 'text NOT NULL'); +}; + +$down = function () { + // nothing to do +}; diff --git a/system/migrations/26.php b/system/migrations/26.php index 9804b774..ad565754 100644 --- a/system/migrations/26.php +++ b/system/migrations/26.php @@ -1,17 +1,32 @@ hasColumn(TABLE_PREFIX . 'spells', 'spell')) { - $db->exec('ALTER TABLE `' . TABLE_PREFIX . "spells` MODIFY `spell` VARCHAR(255) NOT NULL DEFAULT '';"); -} +$up = function () use ($db) { + if ($db->hasColumn(TABLE_PREFIX . 'spells', 'spell')) { + $db->modifyColumn(TABLE_PREFIX . 'spells', 'spell', "VARCHAR(255) NOT NULL DEFAULT ''"); + } -if($db->hasColumn(TABLE_PREFIX . 'spells', 'words')) { - $db->exec('ALTER TABLE `' . TABLE_PREFIX . "spells` MODIFY `words` VARCHAR(255) NOT NULL DEFAULT '';"); -} + if ($db->hasColumn(TABLE_PREFIX . 'spells', 'words')) { + $db->modifyColumn(TABLE_PREFIX . 'spells', 'words', "VARCHAR(255) NOT NULL DEFAULT ''"); + } -if(!$db->hasColumn(TABLE_PREFIX . 'spells', 'conjure_id')) { - $db->exec('ALTER TABLE `' . TABLE_PREFIX . 'spells` ADD `conjure_id` INT(11) NOT NULL DEFAULT 0 AFTER `soul`;'); -} + if (!$db->hasColumn(TABLE_PREFIX . 'spells', 'conjure_id')) { + $db->addColumn(TABLE_PREFIX . 'spells', 'conjure_id', 'INT(11) NOT NULL DEFAULT 0 AFTER `soul`'); + } -if(!$db->hasColumn(TABLE_PREFIX . 'spells', 'reagent')) { - $db->exec('ALTER TABLE `' . TABLE_PREFIX . 'spells` ADD `reagent` INT(11) NOT NULL DEFAULT 0 AFTER `conjure_count`;'); -} + if (!$db->hasColumn(TABLE_PREFIX . 'spells', 'reagent')) { + $db->addColumn(TABLE_PREFIX . 'spells', 'reagent', 'INT(11) NOT NULL DEFAULT 0 AFTER `conjure_count`'); + } +}; + +$down = function () use ($db) { + if ($db->hasColumn(TABLE_PREFIX . 'spells', 'conjure_id')) { + $db->dropColumn(TABLE_PREFIX . 'spells', 'conjure_id'); + } + + if ($db->hasColumn(TABLE_PREFIX . 'spells', 'reagent')) { + $db->dropColumn(TABLE_PREFIX . 'spells', 'reagent'); + } +}; diff --git a/system/migrations/27-commands.html b/system/migrations/27-commands.html new file mode 100644 index 00000000..accb1c62 --- /dev/null +++ b/system/migrations/27-commands.html @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + +
WordsDescription
!exampleThis is just an example
!buyhouseBuy house you are looking at
!aolBuy AoL
diff --git a/system/migrations/27-downloads.html b/system/migrations/27-downloads.html new file mode 100644 index 00000000..ebf401fc --- /dev/null +++ b/system/migrations/27-downloads.html @@ -0,0 +1,6 @@ +

 

+

 

+
We're using official Tibia Client {{ config.client / 100 }}
+

Download Tibia Client {{ config.client / 100 }} for Windows HERE.

+

IP Changer:

+ HERE
diff --git a/system/migrations/27.php b/system/migrations/27.php index 42040092..81d4fb81 100644 --- a/system/migrations/27.php +++ b/system/migrations/27.php @@ -1,47 +1,48 @@  

-

 

-
We're using official Tibia Client {{ config.client / 100 }}
-

Download Tibia Client {{ config.client / 100 }} for Windows HERE.

-

IP Changer:

-HERE
-HTML; +use MyAAC\Models\Pages; -$query = $db->query("SELECT `id` FROM `" . TABLE_PREFIX . "pages` WHERE `name` LIKE " . $db->quote('downloads') . " LIMIT 1;"); -if($query->rowCount() === 0) { - $db->exec("INSERT INTO `myaac_pages` (`id`, `name`, `title`, `body`, `date`, `player_id`, `php`, `access`, `hide`) VALUES - (null, 'downloads', 'Downloads', {$db->quote($downloadsPage)}, 0, 1, 0, 0, 0);"); -} +$up = function () use ($db) { + $downloadsModel = Pages::where('name', 'downloads')->first(); + if (!$downloadsModel) { + $db->insert(TABLE_PREFIX . 'pages', [ + 'name' => 'downloads', + 'title' => 'Downloads', + 'body' => file_get_contents(__DIR__ . '/27-downloads.html'), + 'date' => time(), + 'player_id' => 1, + 'php' => 0, + 'access' => 0, + 'hidden' => 0, + ]); + } -$commandsPage = << - - -Words -Description - - - - -!example -This is just an example - - -!buyhouse -Buy house you are looking at - - -!aol -Buy AoL - - - -HTML; + $commandsModel = Pages::where('name', 'commands')->first(); + if (!$commandsModel) { + $db->insert(TABLE_PREFIX . 'pages', [ + 'name' => 'commands', + 'title' => 'Commands', + 'body' => file_get_contents(__DIR__ . '/27-commands.html'), + 'date' => time(), + 'player_id' => 1, + 'php' => 0, + 'access' => 0, + 'hidden' => 0, + ]); + } +}; -$query = $db->query("SELECT `id` FROM `" . TABLE_PREFIX . "pages` WHERE `name` LIKE " . $db->quote('commands') . " LIMIT 1;"); -if($query->rowCount() === 0) { - $db->exec("INSERT INTO `myaac_pages` (`id`, `name`, `title`, `body`, `date`, `player_id`, `php`, `access`, `hide`) VALUES -(null, 'commands', 'Commands', {$db->quote($commandsPage)}, 0, 1, 0, 0, 0);"); -} +$down = function () { + $downloadsModel = Pages::where('name', 'downloads')->first(); + if ($downloadsModel) { + $downloadsModel->delete(); + } + + $commandsModel = Pages::where('name', 'commands')->first(); + if ($commandsModel) { + $commandsModel->delete(); + } +}; diff --git a/system/migrations/28-hooks.sql b/system/migrations/28-hooks.sql new file mode 100644 index 00000000..ff1a228d --- /dev/null +++ b/system/migrations/28-hooks.sql @@ -0,0 +1,10 @@ +CREATE TABLE `myaac_hooks` +( + `id` INT(11) NOT NULL AUTO_INCREMENT, + `name` VARCHAR(30) NOT NULL DEFAULT '', + `type` INT(2) NOT NULL DEFAULT 0, + `file` VARCHAR(100) NOT NULL, + `ordering` INT(11) NOT NULL DEFAULT 0, + `enabled` INT(1) NOT NULL DEFAULT 1, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8; diff --git a/system/migrations/28.php b/system/migrations/28.php index d06487c8..9df8dedc 100644 --- a/system/migrations/28.php +++ b/system/migrations/28.php @@ -1,10 +1,25 @@ exec('DROP TABLE IF EXISTS `' . TABLE_PREFIX . 'hooks`;'); +$up = function () use ($db) { + $db->dropTable(TABLE_PREFIX . 'hooks'); + + $cache = Cache::getInstance(); + if($cache->enabled()) { + $cache->delete('hooks'); + } +}; + +$down = function () use ($db) { + $db->exec(file_get_contents(__DIR__ . '/28-hooks.sql')); + + $cache = Cache::getInstance(); + if($cache->enabled()) { + $cache->delete('hooks'); + } +}; -$cache = Cache::getInstance(); -if($cache->enabled()) { - $cache->delete('hooks'); -} diff --git a/system/migrations/29.php b/system/migrations/29.php index 79e3d81d..e9c1ec7f 100644 --- a/system/migrations/29.php +++ b/system/migrations/29.php @@ -1,5 +1,16 @@ hasColumn(TABLE_PREFIX . 'pages', 'enable_tinymce')) { - $db->exec('ALTER TABLE `' . TABLE_PREFIX . 'pages` ADD `enable_tinymce` TINYINT(1) NOT NULL DEFAULT 1 COMMENT \'1 - enabled, 0 - disabled\' AFTER `php`;'); -} +$up = function () use ($db) { + if (!$db->hasColumn(TABLE_PREFIX . 'pages', 'enable_tinymce')) { + $db->addColumn(TABLE_PREFIX . 'pages', 'enable_tinymce', "TINYINT(1) NOT NULL DEFAULT 1 COMMENT '1 - enabled, 0 - disabled' AFTER `php`"); + } +}; + +$down = function () use ($db) { + if ($db->hasColumn(TABLE_PREFIX . 'pages', 'enable_tinymce')) { + $db->dropColumn(TABLE_PREFIX . 'pages', 'enable_tinymce'); + } +}; diff --git a/system/migrations/3.php b/system/migrations/3.php index 76c0acc8..f79dcbe7 100644 --- a/system/migrations/3.php +++ b/system/migrations/3.php @@ -1,3 +1,15 @@ query("ALTER TABLE `" . TABLE_PREFIX . "account_actions` ADD `ipv6` BINARY(16) NOT NULL DEFAULT 0;"); -?> \ No newline at end of file +/** + * @var OTS_DB_MySQL $db + */ + +$up = function () use ($db) { + if (!$db->hasColumn(TABLE_PREFIX . 'account_actions', 'ipv6')) { + $db->addColumn(TABLE_PREFIX . 'account_actions', 'ipv6', "BINARY(16) NOT NULL DEFAULT 0"); + } +}; + +$down = function () { + // we don't want data loss + //$db->dropColumn(TABLE_PREFIX . 'account_actions', 'ipv6'); +}; diff --git a/system/migrations/30-rules.txt b/system/migrations/30-rules.txt new file mode 100644 index 00000000..2b226230 --- /dev/null +++ b/system/migrations/30-rules.txt @@ -0,0 +1,25 @@ +1. Names +a) Names which contain insulting (e.g. "Bastard"), racist (e.g. "Nigger"), extremely right-wing (e.g. "Hitler"), sexist (e.g. "Bitch") or offensive (e.g. "Copkiller") language. +b) Names containing parts of sentences (e.g. "Mike returns"), nonsensical combinations of letters (e.g. "Fgfshdsfg") or invalid formattings (e.g. "Thegreatknight"). +c) Names that obviously do not describe a person (e.g. "Christmastree", "Matrix"), names of real life celebrities (e.g. "Britney Spears"), names that refer to real countries (e.g. "Swedish Druid"), names which were created to fake other players' identities (e.g. "Arieswer" instead of "Arieswar") or official positions (e.g. "System Admin"). + +2. Cheating +a) Exploiting obvious errors of the game ("bugs"), for instance to duplicate items. If you find an error you must report it to CipSoft immediately. +b) Intentional abuse of weaknesses in the gameplay, for example arranging objects or players in a way that other players cannot move them. +c) Using tools to automatically perform or repeat certain actions without any interaction by the player ("macros"). +d) Manipulating the client program or using additional software to play the game. +e) Trying to steal other players\' account data ("hacking"). +f) Playing on more than one account at the same time ("multi-clienting"). +g) Offering account data to other players or accepting other players' account data ("account-trading/sharing"). + +3. Gamemasters +a) Threatening a gamemaster because of his or her actions or position as a gamemaster. +b) Pretending to be a gamemaster or to have influence on the decisions of a gamemaster. +c) Intentionally giving wrong or misleading information to a gamemaster concerning his or her investigations or making false reports about rule violations. + +4. Player Killing +a) Excessive killing of characters who are not marked with a "skull" on worlds which are not PvP-enforced. Please note that killing marked characters is not a reason for a banishment. + +A violation of the Tibia Rules may lead to temporary banishment of characters and accounts. In severe cases removal or modification of character skills, attributes and belongings, as well as the permanent removal of accounts without any compensation may be considered. The sanction is based on the seriousness of the rule violation and the previous record of the player. It is determined by the gamemaster imposing the banishment. + +These rules may be changed at any time. All changes will be announced on the official website. diff --git a/system/migrations/30.php b/system/migrations/30.php index 3d919597..2e38e468 100644 --- a/system/migrations/30.php +++ b/system/migrations/30.php @@ -1,31 +1,27 @@ query("SELECT `id` FROM `" . TABLE_PREFIX . "pages` WHERE `name` LIKE " . $db->quote('rules_on_the_page') . " LIMIT 1;"); -if($query->rowCount() === 0) { - $db->exec("INSERT INTO `myaac_pages` (`id`, `name`, `title`, `body`, `date`, `player_id`, `php`, `enable_tinymce`, `access`, `hide`) VALUES - (null, 'rules_on_the_page', 'Rules', '1. Names -a) Names which contain insulting (e.g. \"Bastard\"), racist (e.g. \"Nigger\"), extremely right-wing (e.g. \"Hitler\"), sexist (e.g. \"Bitch\") or offensive (e.g. \"Copkiller\") language. -b) Names containing parts of sentences (e.g. \"Mike returns\"), nonsensical combinations of letters (e.g. \"Fgfshdsfg\") or invalid formattings (e.g. \"Thegreatknight\"). -c) Names that obviously do not describe a person (e.g. \"Christmastree\", \"Matrix\"), names of real life celebrities (e.g. \"Britney Spears\"), names that refer to real countries (e.g. \"Swedish Druid\"), names which were created to fake other players\' identities (e.g. \"Arieswer\" instead of \"Arieswar\") or official positions (e.g. \"System Admin\"). +use MyAAC\Models\Pages; -2. Cheating -a) Exploiting obvious errors of the game (\"bugs\"), for instance to duplicate items. If you find an error you must report it to CipSoft immediately. -b) Intentional abuse of weaknesses in the gameplay, for example arranging objects or players in a way that other players cannot move them. -c) Using tools to automatically perform or repeat certain actions without any interaction by the player (\"macros\"). -d) Manipulating the client program or using additional software to play the game. -e) Trying to steal other players\' account data (\"hacking\"). -f) Playing on more than one account at the same time (\"multi-clienting\"). -g) Offering account data to other players or accepting other players\' account data (\"account-trading/sharing\"). +$up = function () { + $rulesOnPage = Pages::where('name', 'rules_on_the_page')->first(); + if (!$rulesOnPage) { + Pages::create([ + 'name' => 'rules_on_the_page', + 'title' => 'Rules', + 'body' => file_get_contents(__DIR__ . '/30-rules.txt'), + 'date' => time(), + 'player_id' => 1, + 'php' => 0, + 'enable_tinymce' => 0, + 'access' => 0, + 'hidden' => 0, + ]); + } +}; -3. Gamemasters -a) Threatening a gamemaster because of his or her actions or position as a gamemaster. -b) Pretending to be a gamemaster or to have influence on the decisions of a gamemaster. -c) Intentionally giving wrong or misleading information to a gamemaster concerning his or her investigations or making false reports about rule violations. - -4. Player Killing -a) Excessive killing of characters who are not marked with a \"skull\" on worlds which are not PvP-enforced. Please note that killing marked characters is not a reason for a banishment. - -A violation of the Tibia Rules may lead to temporary banishment of characters and accounts. In severe cases removal or modification of character skills, attributes and belongings, as well as the permanent removal of accounts without any compensation may be considered. The sanction is based on the seriousness of the rule violation and the previous record of the player. It is determined by the gamemaster imposing the banishment. - -These rules may be changed at any time. All changes will be announced on the official website.', 0, 1, 0, 0, 0, 0);"); -} +$down = function () { + $rulesOnPage = Pages::where('name', 'rules_on_the_page')->first(); + if ($rulesOnPage) { + Pages::where('name', 'rules_on_the_page')->delete(); + } +}; diff --git a/system/migrations/31.php b/system/migrations/31.php index 8dadb817..edbf7020 100644 --- a/system/migrations/31.php +++ b/system/migrations/31.php @@ -1,57 +1,121 @@ hasColumn(TABLE_PREFIX . 'monsters', 'elements')) { - $db->exec("ALTER TABLE `" . TABLE_PREFIX . "monsters` ADD `elements` TEXT NOT NULL AFTER `immunities`;"); -} +$up = function () use ($db) { + if(!$db->hasColumn(TABLE_PREFIX . 'monsters', 'elements')) { + $db->addColumn(TABLE_PREFIX . 'monsters', 'elements', "TEXT NOT NULL AFTER `immunities`"); + } -if(!$db->hasColumn(TABLE_PREFIX . 'monsters', 'pushable')) { - $db->exec("ALTER TABLE `" . TABLE_PREFIX . "monsters` ADD `pushable` TINYINT(1) NOT NULL DEFAULT '0' AFTER `convinceable`;"); -} + if(!$db->hasColumn(TABLE_PREFIX . 'monsters', 'pushable')) { + $db->addColumn(TABLE_PREFIX . 'monsters', 'pushable', "TINYINT(1) NOT NULL DEFAULT '0' AFTER `convinceable`"); + } -if(!$db->hasColumn(TABLE_PREFIX . 'monsters', 'canpushitems')) { - $db->exec("ALTER TABLE `" . TABLE_PREFIX . "monsters` ADD `canpushitems` TINYINT(1) NOT NULL DEFAULT '0' AFTER `pushable`;"); -} + if(!$db->hasColumn(TABLE_PREFIX . 'monsters', 'canpushitems')) { + $db->addColumn(TABLE_PREFIX . 'monsters', 'canpushitems', "TINYINT(1) NOT NULL DEFAULT '0' AFTER `pushable`"); + } -if(!$db->hasColumn(TABLE_PREFIX . 'monsters', 'canpushcreatures')) { - $db->exec("ALTER TABLE `" . TABLE_PREFIX . "monsters` ADD `canpushcreatures` TINYINT(1) NOT NULL DEFAULT '0' AFTER `canpushitems`;"); -} + if(!$db->hasColumn(TABLE_PREFIX . 'monsters', 'canpushcreatures')) { + $db->addColumn(TABLE_PREFIX . 'monsters', 'canpushcreatures', "TINYINT(1) NOT NULL DEFAULT '0' AFTER `canpushitems`"); + } -if(!$db->hasColumn(TABLE_PREFIX . 'monsters', 'canwalkonenergy')) { - $db->exec("ALTER TABLE `" . TABLE_PREFIX . "monsters` ADD `canwalkonenergy` TINYINT(1) NOT NULL DEFAULT '0' AFTER `canpushitems`;"); -} + if(!$db->hasColumn(TABLE_PREFIX . 'monsters', 'canwalkonenergy')) { + $db->addColumn(TABLE_PREFIX . 'monsters', 'canwalkonenergy', "TINYINT(1) NOT NULL DEFAULT '0' AFTER `canpushitems`"); + } -if(!$db->hasColumn(TABLE_PREFIX . 'monsters', 'canwalkonpoison')) { - $db->exec("ALTER TABLE `" . TABLE_PREFIX . "monsters` ADD `canwalkonpoison` TINYINT(1) NOT NULL DEFAULT '0' AFTER `canwalkonenergy`;"); -} + if(!$db->hasColumn(TABLE_PREFIX . 'monsters', 'canwalkonpoison')) { + $db->addColumn(TABLE_PREFIX . 'monsters', 'canwalkonpoison', "TINYINT(1) NOT NULL DEFAULT '0' AFTER `canwalkonenergy`"); + } -if(!$db->hasColumn(TABLE_PREFIX . 'monsters', 'canwalkonfire')) { - $db->exec("ALTER TABLE `" . TABLE_PREFIX . "monsters` ADD `canwalkonfire` TINYINT(1) NOT NULL DEFAULT '0' AFTER `canwalkonpoison`;"); -} + if(!$db->hasColumn(TABLE_PREFIX . 'monsters', 'canwalkonfire')) { + $db->addColumn(TABLE_PREFIX . 'monsters', 'canwalkonfire', "TINYINT(1) NOT NULL DEFAULT '0' AFTER `canwalkonpoison`"); + } -if(!$db->hasColumn(TABLE_PREFIX . 'monsters', 'runonhealth')) { - $db->exec("ALTER TABLE `" . TABLE_PREFIX . "monsters` ADD `runonhealth` TINYINT(1) NOT NULL DEFAULT '0' AFTER `canwalkonfire`;"); -} + if(!$db->hasColumn(TABLE_PREFIX . 'monsters', 'runonhealth')) { + $db->addColumn(TABLE_PREFIX . 'monsters', 'runonhealth', "TINYINT(1) NOT NULL DEFAULT '0' AFTER `canwalkonfire`"); + } -if(!$db->hasColumn(TABLE_PREFIX . 'monsters', 'hostile')) { - $db->exec("ALTER TABLE `" . TABLE_PREFIX . "monsters` ADD `hostile` TINYINT(1) NOT NULL DEFAULT '0' AFTER `runonhealth`;"); -} + if(!$db->hasColumn(TABLE_PREFIX . 'monsters', 'hostile')) { + $db->addColumn(TABLE_PREFIX . 'monsters', 'hostile', "TINYINT(1) NOT NULL DEFAULT '0' AFTER `runonhealth`"); + } -if(!$db->hasColumn(TABLE_PREFIX . 'monsters', 'attackable')) { - $db->exec("ALTER TABLE `" . TABLE_PREFIX . "monsters` ADD `attackable` TINYINT(1) NOT NULL DEFAULT '0' AFTER `hostile`;"); -} + if(!$db->hasColumn(TABLE_PREFIX . 'monsters', 'attackable')) { + $db->addColumn(TABLE_PREFIX . 'monsters', 'attackable', "TINYINT(1) NOT NULL DEFAULT '0' AFTER `hostile`"); + } -if(!$db->hasColumn(TABLE_PREFIX . 'monsters', 'rewardboss')) { - $db->exec("ALTER TABLE `" . TABLE_PREFIX . "monsters` ADD `rewardboss` TINYINT(1) NOT NULL DEFAULT '0' AFTER `attackable`;"); -} + if(!$db->hasColumn(TABLE_PREFIX . 'monsters', 'rewardboss')) { + $db->addColumn(TABLE_PREFIX . 'monsters', 'rewardboss', "TINYINT(1) NOT NULL DEFAULT '0' AFTER `attackable`"); + } -if(!$db->hasColumn(TABLE_PREFIX . 'monsters', 'defense')) { - $db->exec("ALTER TABLE `" . TABLE_PREFIX . "monsters` ADD `defense` INT(11) NOT NULL DEFAULT '0' AFTER `rewardboss`;"); -} + if(!$db->hasColumn(TABLE_PREFIX . 'monsters', 'defense')) { + $db->addColumn(TABLE_PREFIX . 'monsters', 'defense', "INT(11) NOT NULL DEFAULT '0' AFTER `rewardboss`"); + } -if(!$db->hasColumn(TABLE_PREFIX . 'monsters', 'armor')) { - $db->exec("ALTER TABLE `" . TABLE_PREFIX . "monsters` ADD `armor` INT(11) NOT NULL DEFAULT '0' AFTER `defense`;"); -} + if(!$db->hasColumn(TABLE_PREFIX . 'monsters', 'armor')) { + $db->addColumn(TABLE_PREFIX . 'monsters', 'armor', "INT(11) NOT NULL DEFAULT '0' AFTER `defense`"); + } + + if(!$db->hasColumn(TABLE_PREFIX . 'monsters', 'summons')) { + $db->addColumn(TABLE_PREFIX . 'monsters', 'summons', "TEXT NOT NULL AFTER `loot`"); + } +}; + +$down = function () use ($db) { + if($db->hasColumn(TABLE_PREFIX . 'monsters', 'elements')) { + $db->dropColumn(TABLE_PREFIX . 'monsters', 'elements'); + } + + if($db->hasColumn(TABLE_PREFIX . 'monsters', 'pushable')) { + $db->dropColumn(TABLE_PREFIX . 'monsters', 'pushable'); + } + + if($db->hasColumn(TABLE_PREFIX . 'monsters', 'canpushitems')) { + $db->dropColumn(TABLE_PREFIX . 'monsters', 'canpushitems'); + } + + if($db->hasColumn(TABLE_PREFIX . 'monsters', 'canpushcreatures')) { + $db->dropColumn(TABLE_PREFIX . 'monsters', 'canpushcreatures'); + } + + if($db->hasColumn(TABLE_PREFIX . 'monsters', 'canwalkonenergy')) { + $db->dropColumn(TABLE_PREFIX . 'monsters', 'canwalkonenergy'); + } + + if($db->hasColumn(TABLE_PREFIX . 'monsters', 'canwalkonpoison')) { + $db->dropColumn(TABLE_PREFIX . 'monsters', 'canwalkonpoison'); + } + + if($db->hasColumn(TABLE_PREFIX . 'monsters', 'canwalkonfire')) { + $db->dropColumn(TABLE_PREFIX . 'monsters', 'canwalkonfire'); + } + + if($db->hasColumn(TABLE_PREFIX . 'monsters', 'runonhealth')) { + $db->dropColumn(TABLE_PREFIX . 'monsters', 'runonhealth'); + } + + if($db->hasColumn(TABLE_PREFIX . 'monsters', 'hostile')) { + $db->dropColumn(TABLE_PREFIX . 'monsters', 'hostile'); + } + + if($db->hasColumn(TABLE_PREFIX . 'monsters', 'attackable')) { + $db->dropColumn(TABLE_PREFIX . 'monsters', 'attackable'); + } + + if($db->hasColumn(TABLE_PREFIX . 'monsters', 'rewardboss')) { + $db->dropColumn(TABLE_PREFIX . 'monsters', 'rewardboss'); + } + + if($db->hasColumn(TABLE_PREFIX . 'monsters', 'defense')) { + $db->dropColumn(TABLE_PREFIX . 'monsters', 'defense'); + } + + if($db->hasColumn(TABLE_PREFIX . 'monsters', 'armor')) { + $db->dropColumn(TABLE_PREFIX . 'monsters', 'armor'); + } + + if($db->hasColumn(TABLE_PREFIX . 'monsters', 'summons')) { + $db->dropColumn(TABLE_PREFIX . 'monsters', 'summons'); + } +}; -if(!$db->hasColumn(TABLE_PREFIX . 'monsters', 'summons')) { - $db->exec("ALTER TABLE `" . TABLE_PREFIX . "monsters` ADD `summons` TEXT NOT NULL AFTER `loot`;"); -} diff --git a/system/migrations/32.php b/system/migrations/32.php index ca1e4859..63f7b757 100644 --- a/system/migrations/32.php +++ b/system/migrations/32.php @@ -1,4 +1,14 @@ exec('ALTER TABLE `' . TABLE_PREFIX . "visitors` MODIFY `page` VARCHAR(2048) NOT NULL;"); +$up = function () use ($db) { + $db->modifyColumn(TABLE_PREFIX . 'visitors', 'page', 'VARCHAR(2048) NOT NULL'); +}; + +$down = function () { + // nothing to be done, as we have just extended the size of a column +}; diff --git a/system/migrations/33.php b/system/migrations/33.php index 12fe4c2c..97c39fcc 100644 --- a/system/migrations/33.php +++ b/system/migrations/33.php @@ -1,6 +1,16 @@ exec('ALTER TABLE `' . TABLE_PREFIX . "visitors` MODIFY `ip` VARCHAR(45) NOT NULL;"); +$up = function () use ($db) { + $db->modifyColumn(TABLE_PREFIX . 'visitors', 'ip', 'VARCHAR(15) NOT NULL'); +}; + +$down = function () { + // nothing to be done, as we have just extended the size of a column +}; diff --git a/system/migrations/34.php b/system/migrations/34.php index 6f4e6b4a..0e51c7c3 100644 --- a/system/migrations/34.php +++ b/system/migrations/34.php @@ -1,4 +1,18 @@ exec('ALTER TABLE `' . TABLE_PREFIX . "visitors` ADD `user_agent` VARCHAR(255) NOT NULL DEFAULT '';"); +$up = function () use ($db) { + if (!$db->hasColumn(TABLE_PREFIX . 'visitors', 'user_agent')) { + $db->addColumn(TABLE_PREFIX . 'visitors', 'user_agent', "VARCHAR(255) NOT NULL DEFAULT ''"); + } +}; + +$down = function () use ($db) { + if ($db->hasColumn(TABLE_PREFIX . 'visitors', 'user_agent')) { + $db->dropColumn(TABLE_PREFIX . 'visitors', 'user_agent'); + } +}; diff --git a/system/migrations/35.php b/system/migrations/35.php index 8016807d..1baf68a7 100644 --- a/system/migrations/35.php +++ b/system/migrations/35.php @@ -1,3 +1,17 @@ exec('ALTER TABLE `' . TABLE_PREFIX . "monsters` ADD `look` VARCHAR(255) NOT NULL DEFAULT '' AFTER `health`;"); \ No newline at end of file +$up = function () use ($db) { + if (!$db->hasColumn(TABLE_PREFIX . 'monsters', 'look')) { + $db->addColumn(TABLE_PREFIX . 'monsters', 'look', "VARCHAR(255) NOT NULL DEFAULT '' AFTER `health`"); + } +}; + +$down = function () use ($db) { + if ($db->hasColumn(TABLE_PREFIX . 'monsters', 'look')) { + $db->dropColumn(TABLE_PREFIX . 'monsters', 'look'); + } +}; diff --git a/system/migrations/36-settings.sql b/system/migrations/36-settings.sql new file mode 100644 index 00000000..eded157b --- /dev/null +++ b/system/migrations/36-settings.sql @@ -0,0 +1,9 @@ +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, + PRIMARY KEY (`id`), + KEY `key` (`key`) +) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8; diff --git a/system/migrations/36.php b/system/migrations/36.php index d88e9d28..1f27c51f 100644 --- a/system/migrations/36.php +++ b/system/migrations/36.php @@ -1,14 +1,18 @@ hasTable(TABLE_PREFIX . 'settings')) { - $db->exec("CREATE TABLE `" . TABLE_PREFIX . "settings` - ( - `id` int(11) 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=utf8;"); -} +$up = function () use ($db) { + // add settings table + if (!$db->hasTable(TABLE_PREFIX . 'settings')) { + $db->exec(file_get_contents(__DIR__ . '/36-settings.sql')); + } +}; + +$down = function () { + // will break the aac + //if ($db->hasTable(TABLE_PREFIX . 'settings')) { + // $db->dropTable(TABLE_PREFIX . 'settings'); + //} +}; diff --git a/system/migrations/37.php b/system/migrations/37.php index dd12f35a..110d15c2 100644 --- a/system/migrations/37.php +++ b/system/migrations/37.php @@ -5,4 +5,10 @@ use MyAAC\Models\Pages; -Pages::query()->where('access', 1)->update(['access' => 0]); +$up = function () { + Pages::query()->where('access', 1)->update(['access' => 0]); +}; + +$down = function () { + Pages::query()->where('access', 0)->update(['access' => 1]); +}; diff --git a/system/migrations/38.php b/system/migrations/38.php index b2d066a7..c8f6326c 100644 --- a/system/migrations/38.php +++ b/system/migrations/38.php @@ -1,5 +1,16 @@ hasColumn('players', 'hide')) { - $db->exec("ALTER TABLE `players` CHANGE `hidden` `hide` TINYINT(1) NOT NULL DEFAULT 0;"); -} +$definition = 'TINYINT(1) NOT NULL DEFAULT 0'; -$db->exec("ALTER TABLE `" . TABLE_PREFIX . "changelog` CHANGE `hidden` `hide` TINYINT(1) NOT NULL DEFAULT 0;"); -$db->exec("ALTER TABLE `" . TABLE_PREFIX . "faq` CHANGE `hidden` `hide` TINYINT(1) NOT NULL DEFAULT 0;"); -$db->exec("ALTER TABLE `" . TABLE_PREFIX . "forum_boards` CHANGE `hidden` `hide` TINYINT(1) NOT NULL DEFAULT 0;"); -$db->exec("ALTER TABLE `" . TABLE_PREFIX . "monsters` CHANGE `hidden` `hide` TINYINT(1) NOT NULL DEFAULT 0;"); -$db->exec("ALTER TABLE `" . TABLE_PREFIX . "news` CHANGE `hidden` `hide` TINYINT(1) NOT NULL DEFAULT 0;"); -$db->exec("ALTER TABLE `" . TABLE_PREFIX . "news_categories` CHANGE `hidden` `hide` TINYINT(1) NOT NULL DEFAULT 0;"); -$db->exec("ALTER TABLE `" . TABLE_PREFIX . "pages` CHANGE `hidden` `hide` TINYINT(1) NOT NULL DEFAULT 0;"); -$db->exec("ALTER TABLE `" . TABLE_PREFIX . "gallery` CHANGE `hidden` `hide` TINYINT(1) NOT NULL DEFAULT 0;"); -$db->exec("ALTER TABLE `" . TABLE_PREFIX . "spells` CHANGE `hidden` `hide` TINYINT(1) NOT NULL DEFAULT 0;"); +$up = function () use ($db, $definition) { + if (!$db->hasColumn('players', 'hide')) { + $db->changeColumn('players', 'hidden', 'hide', $definition); + } + + $db->changeColumn(TABLE_PREFIX . 'changelog', 'hidden', 'hide', $definition); + $db->changeColumn(TABLE_PREFIX . 'faq', 'hidden', 'hide', $definition); + $db->changeColumn(TABLE_PREFIX . 'forum_boards', 'hidden', 'hide', $definition); + $db->changeColumn(TABLE_PREFIX . 'monsters', 'hidden', 'hide', $definition); + $db->changeColumn(TABLE_PREFIX . 'news', 'hidden', 'hide', $definition); + $db->changeColumn(TABLE_PREFIX . 'news_categories', 'hidden', 'hide', $definition); + $db->changeColumn(TABLE_PREFIX . 'pages', 'hidden', 'hide', $definition); + $db->changeColumn(TABLE_PREFIX . 'gallery', 'hidden', 'hide', $definition); + $db->changeColumn(TABLE_PREFIX . 'spells', 'hidden', 'hide', $definition); +}; + +$down = function () use ($db, $definition) { + if (!$db->hasColumn('players', 'hidden')) { + $db->changeColumn('players', 'hide', 'hidden', $definition); + } + + $db->changeColumn(TABLE_PREFIX . 'changelog', 'hide', 'hidden', $definition); + $db->changeColumn(TABLE_PREFIX . 'faq', 'hide', 'hidden', $definition); + $db->changeColumn(TABLE_PREFIX . 'forum_boards', 'hide', 'hidden', $definition); + $db->changeColumn(TABLE_PREFIX . 'monsters', 'hide', 'hidden', $definition); + $db->changeColumn(TABLE_PREFIX . 'news', 'hide', 'hidden', $definition); + $db->changeColumn(TABLE_PREFIX . 'news_categories', 'hide', 'hidden', $definition); + $db->changeColumn(TABLE_PREFIX . 'pages', 'hide', 'hidden', $definition); + $db->changeColumn(TABLE_PREFIX . 'gallery', 'hide', 'hidden', $definition); + $db->changeColumn(TABLE_PREFIX . 'spells', 'hide', 'hidden', $definition); +}; diff --git a/system/migrations/4.php b/system/migrations/4.php index db17feb1..93746eef 100644 --- a/system/migrations/4.php +++ b/system/migrations/4.php @@ -1,3 +1,16 @@ hasColumn(TABLE_PREFIX . 'monsters', 'id')) - $db->query("ALTER TABLE `" . TABLE_PREFIX . "monsters` ADD `id` int(11) NOT NULL AUTO_INCREMENT primary key FIRST;"); \ No newline at end of file +/** + * @var OTS_DB_MySQL $db + */ + +$up = function () use ($db) { + if (!$db->hasColumn(TABLE_PREFIX . 'monsters', 'id')) { + $db->addColumn(TABLE_PREFIX . 'monsters', 'id', "int(11) NOT NULL AUTO_INCREMENT primary key FIRST"); + } +}; + +$down = function () use ($db) { + if ($db->hasColumn(TABLE_PREFIX . 'monsters', 'id')) { + $db->dropColumn(TABLE_PREFIX . 'monsters', 'id'); + } +}; diff --git a/system/migrations/40.php b/system/migrations/40.php index 7a7eb310..ef492a11 100644 --- a/system/migrations/40.php +++ b/system/migrations/40.php @@ -5,8 +5,19 @@ use MyAAC\Models\Menu; -Menu::where('link', 'lastkills')->update(['link' => 'last-kills']); -Menu::where('link', 'serverInfo')->update(['link' => 'server-info']); -Menu::where('link', 'experienceStages')->update(['link' => 'exp-stages']); -Menu::where('link', 'experienceTable')->update(['link' => 'exp-table']); -Menu::where('link', 'creatures')->update(['link' => 'monsters']); +$up = function() { + Menu::where('link', 'lastkills')->update(['link' => 'last-kills']); + Menu::where('link', 'serverInfo')->update(['link' => 'server-info']); + Menu::where('link', 'experienceStages')->update(['link' => 'exp-stages']); + Menu::where('link', 'experienceTable')->update(['link' => 'exp-table']); + Menu::where('link', 'creatures')->update(['link' => 'monsters']); +}; + +$down = function() { + Menu::where('link', 'last-kills')->update(['link' => 'lastkills']); + Menu::where('link', 'server-info')->update(['link' => 'serverInfo']); + Menu::where('link', 'exp-stages')->update(['link' => 'experienceStages']); + Menu::where('link', 'exp-table')->update(['link' => 'experienceTable']); + Menu::where('link', 'monsters')->update(['link' => 'creatures']); +}; + diff --git a/system/migrations/5.php b/system/migrations/5.php index bef48d61..d269a348 100644 --- a/system/migrations/5.php +++ b/system/migrations/5.php @@ -1,4 +1,16 @@ hasColumn(TABLE_PREFIX . 'spells', 'cities')) - $db->query("ALTER TABLE `" . TABLE_PREFIX . "spells` DROP COLUMN cities;"); -?> \ No newline at end of file +/** + * @var OTS_DB_MySQL $db + */ + +$up = function () use ($db) { + if ($db->hasColumn(TABLE_PREFIX . 'spells', 'cities')) { + $db->dropColumn(TABLE_PREFIX . 'spells', 'cities'); + } +}; + +$up = function () use ($db) { + if ($db->hasColumn(TABLE_PREFIX . 'spells', 'cities')) { + $db->addColumn(TABLE_PREFIX . 'spells', 'cities', 'VARCHAR(32) NOT NULL'); + } +}; diff --git a/system/migrations/6.php b/system/migrations/6.php index e287d55a..b99671d3 100644 --- a/system/migrations/6.php +++ b/system/migrations/6.php @@ -1,3 +1,16 @@ hasColumn(TABLE_PREFIX . 'hooks', 'enabled')) - $db->query("ALTER TABLE `" . TABLE_PREFIX . "hooks` ADD `enabled` INT(1) NOT NULL DEFAULT 1;"); \ No newline at end of file +/** + * @var OTS_DB_MySQL $db + */ + +$up = function () use ($db) { + if (!$db->hasColumn(TABLE_PREFIX . 'hooks', 'enabled')) { + $db->addColumn(TABLE_PREFIX . 'hooks', 'enabled', 'INT(1) NOT NULL DEFAULT 1'); + } +}; + +$down = function () use ($db) { + if ($db->hasColumn(TABLE_PREFIX . 'hooks', 'enabled')) { + $db->dropColumn(TABLE_PREFIX . 'hooks', 'enabled'); + } +}; diff --git a/system/migrations/7.php b/system/migrations/7.php index a34f5a22..a96ed7c9 100644 --- a/system/migrations/7.php +++ b/system/migrations/7.php @@ -1,4 +1,16 @@ hasColumn(TABLE_PREFIX . 'screenshots', 'name')) - $db->query("ALTER TABLE `" . TABLE_PREFIX . "screenshots` DROP `name`;"); -?> \ No newline at end of file +/** + * @var OTS_DB_MySQL $db + */ + +$up = function () use ($db) { + if ($db->hasColumn(TABLE_PREFIX . 'screenshots', 'name')) { + $db->dropColumn(TABLE_PREFIX . 'screenshots', 'name'); + } +}; + +$up = function () use ($db) { + if (!$db->hasColumn(TABLE_PREFIX . 'screenshots', 'name')) { + $db->addColumn(TABLE_PREFIX . 'screenshots', 'name', 'VARCHAR(30) NOT NULL'); + } +}; diff --git a/system/migrations/8.php b/system/migrations/8.php index 4785e23b..54e9db9d 100644 --- a/system/migrations/8.php +++ b/system/migrations/8.php @@ -1,17 +1,31 @@ hasTable(TABLE_PREFIX . 'forum_sections')) - $db->query('RENAME TABLE `' . TABLE_PREFIX . 'forum_sections` TO `' . TABLE_PREFIX . 'forum_boards`;'); - +/** + * @var OTS_DB_MySQL $db + */ + +$up = function () use ($db) { + if ($db->hasTable(TABLE_PREFIX . 'forum_sections')) { + $db->renameTable(TABLE_PREFIX . 'forum_sections', TABLE_PREFIX . 'forum_boards'); + } + $query = $db->query('SELECT `id` FROM `' . TABLE_PREFIX . 'forum_boards` WHERE `ordering` > 0;'); - if($query->rowCount() == 0) { - $boards = array( + if ($query->rowCount() == 0) { + $boards = [ 'News', 'Trade', 'Quests', 'Pictures', 'Bug Report' - ); - - foreach($boards as $id => $board) + ]; + + foreach ($boards as $id => $board) { $db->query('UPDATE `' . TABLE_PREFIX . 'forum_boards` SET `ordering` = ' . $id . ' WHERE `name` = ' . $db->quote($board)); - } \ No newline at end of file + } + } +}; + +$down = function () use ($db) { + if ($db->hasTable(TABLE_PREFIX . 'forum_boards')) { + $db->renameTable(TABLE_PREFIX . 'forum_boards', TABLE_PREFIX . 'forum_sections'); + } +}; diff --git a/system/migrations/9.php b/system/migrations/9.php index d4869c10..c0db4971 100644 --- a/system/migrations/9.php +++ b/system/migrations/9.php @@ -1,9 +1,18 @@ query("ALTER TABLE `" . TABLE_PREFIX . "bugtracker` MODIFY `type` INT(11) NOT NULL DEFAULT 0;"); - $db->query("ALTER TABLE `" . TABLE_PREFIX . "bugtracker` MODIFY `status` INT(11) NOT NULL DEFAULT 0;"); - $db->query("ALTER TABLE `" . TABLE_PREFIX . "bugtracker` MODIFY `id` INT(11) NOT NULL DEFAULT 0;"); - $db->query("ALTER TABLE `" . TABLE_PREFIX . "bugtracker` MODIFY `subject` VARCHAR(255) NOT NULL DEFAULT '';"); - $db->query("ALTER TABLE `" . TABLE_PREFIX . "bugtracker` MODIFY `reply` INT(11) NOT NULL DEFAULT 0;"); - $db->query("ALTER TABLE `" . TABLE_PREFIX . "bugtracker` MODIFY `who` INT(11) NOT NULL DEFAULT 0;"); - $db->query("ALTER TABLE `" . TABLE_PREFIX . "bugtracker` MODIFY `tag` INT(11) NOT NULL DEFAULT 0;"); -?> \ No newline at end of file +/** + * @var OTS_DB_MySQL $db + */ + +$up = function () use ($db) { + $db->modifyColumn(TABLE_PREFIX . 'bugtracker', 'type', "INT(11) NOT NULL DEFAULT 0"); + $db->modifyColumn(TABLE_PREFIX . 'bugtracker', 'status', "INT(11) NOT NULL DEFAULT 0"); + $db->modifyColumn(TABLE_PREFIX . 'bugtracker', 'id', "INT(11) NOT NULL DEFAULT 0"); + $db->modifyColumn(TABLE_PREFIX . 'bugtracker', 'subject', "VARCHAR(255) NOT NULL DEFAULT ''"); + $db->modifyColumn(TABLE_PREFIX . 'bugtracker', 'reply', "INT(11) NOT NULL DEFAULT 0"); + $db->modifyColumn(TABLE_PREFIX . 'bugtracker', 'who', "INT(11) NOT NULL DEFAULT 0"); + $db->modifyColumn(TABLE_PREFIX . 'bugtracker', 'tag', "INT(11) NOT NULL DEFAULT 0"); +}; + +$down = function () { + // nothing to do here +}; diff --git a/system/settings.php b/system/settings.php index 3f8fe21b..89028cf7 100644 --- a/system/settings.php +++ b/system/settings.php @@ -392,6 +392,13 @@ return [ 'default' => false, 'is_config' => true, ], + 'database_auto_migrate' => [ + 'name' => 'Database Auto Migrate', + 'desc' => 'Migrate database to latest version in myaac, automatically.', + 'type' => 'boolean', + 'default' => true, + 'is_config' => true, + ], [ 'type' => 'category', 'title' => 'Mailing', diff --git a/system/src/Commands/CacheClearCommand.php b/system/src/Commands/CacheClearCommand.php index bdab1f21..ff4d5d4a 100644 --- a/system/src/Commands/CacheClearCommand.php +++ b/system/src/Commands/CacheClearCommand.php @@ -16,6 +16,8 @@ class CacheClearCommand extends Command protected function execute(InputInterface $input, OutputInterface $output): int { + require SYSTEM . 'init.php'; + $io = new SymfonyStyle($input, $output); if (!clearCache()) { diff --git a/system/src/Commands/Command.php b/system/src/Commands/Command.php index 76f3810e..caa2c0d3 100644 --- a/system/src/Commands/Command.php +++ b/system/src/Commands/Command.php @@ -2,12 +2,8 @@ namespace MyAAC\Commands; -use MyAAC\Hooks; use Symfony\Component\Console\Command\Command as SymfonyCommand; class Command extends SymfonyCommand { - public function __construct() { - parent::__construct(); - } } diff --git a/system/src/Commands/CronjobCommand.php b/system/src/Commands/CronjobCommand.php index f314b73b..b5eb475a 100644 --- a/system/src/Commands/CronjobCommand.php +++ b/system/src/Commands/CronjobCommand.php @@ -16,10 +16,11 @@ class CronjobCommand extends Command protected function execute(InputInterface $input, OutputInterface $output): int { + require SYSTEM . 'init.php'; + // Create a new scheduler $scheduler = new Scheduler(); - global $hooks; $hooks->trigger(HOOK_CRONJOB, ['scheduler' => $scheduler]); // Let the scheduler execute jobs which are due. diff --git a/system/src/Commands/CronjobInstallCommand.php b/system/src/Commands/CronjobInstallCommand.php index adcf8b20..d6b9ee60 100644 --- a/system/src/Commands/CronjobInstallCommand.php +++ b/system/src/Commands/CronjobInstallCommand.php @@ -17,6 +17,8 @@ class CronjobInstallCommand extends Command protected function execute(InputInterface $input, OutputInterface $output): int { + require SYSTEM . 'init.php'; + $io = new SymfonyStyle($input, $output); if (MYAAC_OS !== 'LINUX') { diff --git a/system/src/Commands/MailSendCommand.php b/system/src/Commands/MailSendCommand.php index d0db7b69..ff1450e6 100644 --- a/system/src/Commands/MailSendCommand.php +++ b/system/src/Commands/MailSendCommand.php @@ -21,8 +21,15 @@ class MailSendCommand extends Command protected function execute(InputInterface $input, OutputInterface $output): int { + require SYSTEM . 'init.php'; + $io = new SymfonyStyle($input, $output); + if (!setting('core.mail_enabled')) { + $io->error('Mailing is not enabled on this server'); + return Command::FAILURE; + } + $email_account_name = $input->getArgument('recipient'); $subject = $input->getOption('subject'); if (!$subject) { diff --git a/system/src/Commands/MigrateCommand.php b/system/src/Commands/MigrateCommand.php new file mode 100644 index 00000000..a8a21016 --- /dev/null +++ b/system/src/Commands/MigrateCommand.php @@ -0,0 +1,28 @@ +setName('migrate') + ->setDescription('This command updates the AAC to latest migration'); + } + + protected function execute(InputInterface $input, OutputInterface $output): int + { + require SYSTEM . 'init.php'; + + $io = new SymfonyStyle($input, $output); + require SYSTEM . 'migrate.php'; + + $io->success('Migrated to latest version (' . DATABASE_VERSION . ')'); + return Command::SUCCESS; + } +} diff --git a/system/src/Commands/MigrateRunCommand.php b/system/src/Commands/MigrateRunCommand.php index ee0265b3..edfa108d 100644 --- a/system/src/Commands/MigrateRunCommand.php +++ b/system/src/Commands/MigrateRunCommand.php @@ -21,6 +21,8 @@ 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'); diff --git a/system/src/Commands/MigrateToCommand.php b/system/src/Commands/MigrateToCommand.php new file mode 100644 index 00000000..b82012ed --- /dev/null +++ b/system/src/Commands/MigrateToCommand.php @@ -0,0 +1,108 @@ +setName('migrate:to') + ->setDescription('This command migrates to specific version of database') + ->addArgument('version', + InputArgument::REQUIRED, + 'Version number' + ); + } + + protected function execute(InputInterface $input, OutputInterface $output): int + { + $io = new SymfonyStyle($input, $output); + + $versionDest = $input->getArgument('version'); + + if (!$versionDest || $versionDest > DATABASE_VERSION || $versionDest < 1) { + $io->error('Please enter a valid version number'); + return Command::FAILURE; + } + + $this->initEnv(); + + $currentVersion = Config::where('name', 'database_version')->first()->value; + if ($currentVersion > $versionDest) { + // downgrade + for ($i = $currentVersion; $i > $versionDest; $i--) { + echo $i . ' '; + $this->executeMigration($i, false); + } + } + else if ($currentVersion < $versionDest) { + // upgrade + for ($i = $currentVersion + 1; $i <= $versionDest; $i++) { + echo $i . ' '; + $this->executeMigration($i, true); + } + } + else { + $io->success('Nothing to be done'); + return Command::SUCCESS; + } + + $upgrade = ($currentVersion < $versionDest ? 'Upgrade' : 'Downgrade'); + $io->success("Migration ({$upgrade}) to version {$versionDest} has been completed"); + + return Command::SUCCESS; + } + + private function executeMigration($id, $_up): void + { + global $db; + + $db->revalidateCache(); + + require SYSTEM . 'migrations/' . $id . '.php'; + if ($_up) { + if (isset($up)) { + $up(); + } + } + else { + if (isset($down)) { + $down(); + } + } + + 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'; + } +} diff --git a/system/src/Commands/PluginInstallCommand.php b/system/src/Commands/PluginInstallCommand.php index 6330e08a..a37c0859 100644 --- a/system/src/Commands/PluginInstallCommand.php +++ b/system/src/Commands/PluginInstallCommand.php @@ -19,6 +19,8 @@ class PluginInstallCommand extends Command protected function execute(InputInterface $input, OutputInterface $output): int { + require SYSTEM . 'init.php'; + $io = new SymfonyStyle($input, $output); $pathToFile = $input->getArgument('pathToPluginZip'); diff --git a/system/src/Commands/PluginInstallInstallCommand.php b/system/src/Commands/PluginInstallInstallCommand.php index 5f1a1cd6..fe1b4f14 100644 --- a/system/src/Commands/PluginInstallInstallCommand.php +++ b/system/src/Commands/PluginInstallInstallCommand.php @@ -19,6 +19,8 @@ class PluginInstallInstallCommand extends Command protected function execute(InputInterface $input, OutputInterface $output): int { + require SYSTEM . 'init.php'; + $io = new SymfonyStyle($input, $output); $pluginName = $input->getArgument('plugin'); diff --git a/system/src/Commands/SettingsResetCommand.php b/system/src/Commands/SettingsResetCommand.php index a495edf4..78748b00 100644 --- a/system/src/Commands/SettingsResetCommand.php +++ b/system/src/Commands/SettingsResetCommand.php @@ -14,23 +14,43 @@ class SettingsResetCommand extends Command protected function configure(): void { $this->setName('settings:reset') - ->setDescription('Removes all settings in database'); + ->setDescription('Removes settings in database') + ->addArgument('name', + InputArgument::OPTIONAL, + 'Name of the plugin' + ); } protected function execute(InputInterface $input, OutputInterface $output): int { + require SYSTEM . 'init.php'; + $io = new SymfonyStyle($input, $output); - if (!$io->confirm('Are you sure you want to reset all settings in database?', false)) { + $name = $input->getArgument('name'); + + $all = !$name ? 'all' : $name; + if (!$io->confirm("Are you sure you want to reset {$all} settings in database?", false)) { return Command::FAILURE; } - SettingsModel::truncate(); + if (!$name) { + SettingsModel::truncate(); + } + else { + $settingsModel = SettingsModel::where('name', $name)->first(); + if (!$settingsModel) { + $io->warning('No settings for this plugin saved in database'); + return Command::SUCCESS; + } + + SettingsModel::where('name', $name)->delete(); + } $settings = Settings::getInstance(); $settings->clearCache(); - $io->success('Setting cleared successfully'); + $io->success('Settings cleared successfully'); return Command::SUCCESS; } } diff --git a/system/src/Commands/SettingsSetCommand.php b/system/src/Commands/SettingsSetCommand.php index 1159689a..4ad33227 100644 --- a/system/src/Commands/SettingsSetCommand.php +++ b/system/src/Commands/SettingsSetCommand.php @@ -27,6 +27,8 @@ class SettingsSetCommand extends Command protected function execute(InputInterface $input, OutputInterface $output): int { + require SYSTEM . 'init.php'; + $io = new SymfonyStyle($input, $output); $key = $input->getArgument('key'); diff --git a/system/src/Models/Forum.php b/system/src/Models/Forum.php new file mode 100644 index 00000000..20fe4dcd --- /dev/null +++ b/system/src/Models/Forum.php @@ -0,0 +1,30 @@ + 'integer', + 'last_post' => 'integer', + 'section' => 'integer', + 'replies' => 'integer', + 'views' => 'integer', + 'author_aid' => 'integer', + 'author_guid' => 'integer', + 'post_smile' => 'boolean', + 'post_html' => 'boolean', + 'post_date' => 'integer', + 'last_edit_aid' => 'integer', + 'edit_date' => 'integer', + 'sticked' => 'boolean', + 'closed' => 'boolean' + ]; +} diff --git a/system/src/Plugins.php b/system/src/Plugins.php index 00515139..243ced24 100644 --- a/system/src/Plugins.php +++ b/system/src/Plugins.php @@ -770,6 +770,8 @@ class Plugins { */ public static function installMenus($templateName, $menus, $clearOld = false) { + global $db; + if ($clearOld) { Menu::where('template', $templateName)->delete(); } @@ -804,10 +806,14 @@ class Plugins { 'link' => $link, 'category' => $category, 'ordering' => $i++, - 'blank' => $blank, - 'color' => $color, ]; + // support for color and blank attributes + if($db->hasColumn(TABLE_PREFIX . 'menu', 'blank') && $db->hasColumn(TABLE_PREFIX . 'menu', 'color')) { + $insert_array['blank'] = $blank; + $insert_array['color'] = $color; + } + Menu::create($insert_array); } }