mirror of
https://github.com/slawkens/myaac.git
synced 2025-10-18 03:33:26 +02:00
Merge branch 'develop' into feature/twig-hooks-filters
This commit is contained in:
@@ -105,4 +105,8 @@ $config['clients'] = [
|
||||
1316,
|
||||
1320,
|
||||
1321,
|
||||
1322,
|
||||
1330,
|
||||
1332,
|
||||
1340,
|
||||
];
|
||||
|
@@ -36,3 +36,5 @@ class Guild extends OTS_Guild {
|
||||
}
|
||||
class GuildRank extends OTS_GuildRank {}
|
||||
class House extends OTS_House {}
|
||||
|
||||
class Cache extends \MyAAC\Cache\Cache {}
|
||||
|
@@ -106,6 +106,7 @@ try {
|
||||
'persistent' => @$config['database_persistent']
|
||||
));
|
||||
|
||||
global $db;
|
||||
$db = POT::getInstance()->getDBHandle();
|
||||
$capsule = new Capsule;
|
||||
$capsule->addConnection([
|
||||
|
@@ -9,16 +9,16 @@
|
||||
*/
|
||||
|
||||
use MyAAC\Exceptions\SensitiveException;
|
||||
use Whoops\Handler\PlainTextHandler;
|
||||
use Whoops\Handler\PrettyPageHandler;
|
||||
use Whoops\Run;
|
||||
|
||||
if (class_exists(\Whoops\Run::class)) {
|
||||
$whoops = new \Whoops\Run;
|
||||
if(IS_CLI) {
|
||||
$whoops->pushHandler(new \Whoops\Handler\PlainTextHandler);
|
||||
}
|
||||
else {
|
||||
$whoops->pushHandler(new \Whoops\Handler\PrettyPageHandler);
|
||||
}
|
||||
if (class_exists(Run::class)) {
|
||||
$whoops = new Run;
|
||||
|
||||
$whoopsHandler = IS_CLI ? (new PlainTextHandler()) : (new PrettyPageHandler());
|
||||
|
||||
$whoops->pushHandler($whoopsHandler);
|
||||
$whoops->register();
|
||||
return;
|
||||
}
|
||||
|
@@ -89,13 +89,18 @@ function getForumBoardLink($board_id, $page = NULL): string {
|
||||
|
||||
function getPlayerLink($name, $generate = true, bool $colored = false): string
|
||||
{
|
||||
$player = new OTS_Player();
|
||||
|
||||
if(is_numeric($name)) {
|
||||
$player->load((int)$name);
|
||||
if (is_object($name) and $name instanceof OTS_Player) {
|
||||
$player = $name;
|
||||
}
|
||||
else {
|
||||
$player->find($name);
|
||||
$player = new OTS_Player();
|
||||
|
||||
if(is_numeric($name)) {
|
||||
$player->load((int)$name);
|
||||
}
|
||||
else {
|
||||
$player->find($name);
|
||||
}
|
||||
}
|
||||
|
||||
if (!$player->isLoaded()) {
|
||||
@@ -590,24 +595,12 @@ function template_form()
|
||||
{
|
||||
global $template_name;
|
||||
|
||||
$cache = Cache::getInstance();
|
||||
if($cache->enabled())
|
||||
{
|
||||
$tmp = '';
|
||||
if($cache->fetch('templates', $tmp)) {
|
||||
$templates = unserialize($tmp);
|
||||
}
|
||||
else
|
||||
{
|
||||
$templates = get_templates();
|
||||
$cache->set('templates', serialize($templates), 30);
|
||||
}
|
||||
}
|
||||
else
|
||||
$templates = get_templates();
|
||||
$templates = Cache::remember('templates', 5 * 60, function() {
|
||||
return get_templates();
|
||||
});
|
||||
|
||||
$options = '';
|
||||
foreach($templates as $key => $value)
|
||||
foreach($templates as $value)
|
||||
$options .= '<option ' . ($template_name == $value ? 'SELECTED' : '') . '>' . $value . '</option>';
|
||||
|
||||
global $twig;
|
||||
@@ -1047,7 +1040,7 @@ function load_config_lua($filename)
|
||||
return $result;
|
||||
}
|
||||
|
||||
function str_replace_first($search, $replace, $subject) {
|
||||
function str_replace_first($search,$replace, $subject) {
|
||||
$pos = strpos($subject, $search);
|
||||
if ($pos !== false) {
|
||||
return substr_replace($subject, $replace, $pos, strlen($search));
|
||||
@@ -1685,6 +1678,18 @@ function isRequestMethod(string $method): bool {
|
||||
return strtolower($_SERVER['REQUEST_METHOD']) == strtolower($method);
|
||||
}
|
||||
|
||||
function getAccountIdentityColumn(): string
|
||||
{
|
||||
if (USE_ACCOUNT_NAME) {
|
||||
return 'name';
|
||||
}
|
||||
elseif (USE_ACCOUNT_NUMBER) {
|
||||
return 'number';
|
||||
}
|
||||
|
||||
return 'id';
|
||||
}
|
||||
|
||||
// validator functions
|
||||
require_once SYSTEM . 'compat/base.php';
|
||||
|
||||
|
@@ -12,11 +12,12 @@ use DebugBar\StandardDebugBar;
|
||||
use MyAAC\Cache\Cache;
|
||||
use MyAAC\CsrfToken;
|
||||
use MyAAC\Hooks;
|
||||
use MyAAC\Models\Town;
|
||||
use MyAAC\Settings;
|
||||
use MyAAC\Towns;
|
||||
|
||||
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.');
|
||||
}
|
||||
@@ -38,13 +39,15 @@ if($config['server_path'][strlen($config['server_path']) - 1] !== '/')
|
||||
$config['server_path'] .= '/';
|
||||
|
||||
// enable gzip compression if supported by the browser
|
||||
if(isset($config['gzip_output']) && $config['gzip_output'] && isset($_SERVER['HTTP_ACCEPT_ENCODING']) && strpos($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip') !== false && function_exists('ob_gzhandler'))
|
||||
if(isset($config['gzip_output']) && $config['gzip_output'] && isset($_SERVER['HTTP_ACCEPT_ENCODING']) && str_contains($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip') && function_exists('ob_gzhandler'))
|
||||
ob_start('ob_gzhandler');
|
||||
|
||||
// cache
|
||||
global $cache;
|
||||
$cache = Cache::getInstance();
|
||||
|
||||
// event system
|
||||
global $hooks;
|
||||
$hooks = new Hooks();
|
||||
$hooks->load();
|
||||
|
||||
@@ -140,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();
|
||||
@@ -155,6 +161,9 @@ if (!isset($token) || !$token) {
|
||||
// deprecated config values
|
||||
require_once SYSTEM . 'compat/config.php';
|
||||
|
||||
// deprecated classes
|
||||
require_once SYSTEM . 'compat/classes.php';
|
||||
|
||||
date_default_timezone_set(setting('core.date_timezone'));
|
||||
|
||||
setting(
|
||||
@@ -173,4 +182,17 @@ define('USE_ACCOUNT_NAME', $db->hasColumn('accounts', 'name'));
|
||||
define('USE_ACCOUNT_NUMBER', $db->hasColumn('accounts', 'number'));
|
||||
define('USE_ACCOUNT_SALT', $db->hasColumn('accounts', 'salt'));
|
||||
|
||||
Towns::load();
|
||||
$towns = Cache::remember('towns', 10 * 60, function () use ($db) {
|
||||
if ($db->hasTable('towns') && Town::count() > 0) {
|
||||
return Town::orderBy('id', 'ASC')->pluck('name', 'id')->toArray();
|
||||
}
|
||||
|
||||
return [];
|
||||
});
|
||||
|
||||
if (count($towns) <= 0) {
|
||||
$towns = setting('core.towns');
|
||||
}
|
||||
|
||||
config(['towns', $towns]);
|
||||
unset($towns);
|
||||
|
@@ -184,8 +184,14 @@ abstract class OTS_Base_DB extends PDO implements IOTS_DB
|
||||
$query = 'UPDATE '.$this->tableName($table).' SET ';
|
||||
|
||||
$count = count($fields);
|
||||
for ($i = 0; $i < $count; $i++)
|
||||
$query.= $this->fieldName($fields[$i]).' = '.$this->quote($values[$i]).', ';
|
||||
for ($i = 0; $i < $count; $i++) {
|
||||
$value = 'NULL';
|
||||
if ($values[$i] !== null) {
|
||||
$value = $this->quote($values[$i]);
|
||||
}
|
||||
|
||||
$query.= $this->fieldName($fields[$i]).' = '.$value.', ';
|
||||
}
|
||||
|
||||
$query = substr($query, 0, -2);
|
||||
$query.=' WHERE (';
|
||||
@@ -229,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.
|
||||
*
|
||||
|
@@ -53,49 +53,49 @@ class OTS_DB_MySQL extends OTS_Base_DB
|
||||
* @param array $params Connection parameters.
|
||||
* @throws PDOException On PDO operation error.
|
||||
*/
|
||||
public function __construct($params)
|
||||
{
|
||||
$user = null;
|
||||
$password = null;
|
||||
$dns = array();
|
||||
public function __construct($params)
|
||||
{
|
||||
$user = null;
|
||||
$password = null;
|
||||
$dns = array();
|
||||
|
||||
// host:port support
|
||||
if( strpos(':', $params['host']) !== false)
|
||||
{
|
||||
$host = explode(':', $params['host'], 2);
|
||||
// host:port support
|
||||
if( strpos(':', $params['host']) !== false)
|
||||
{
|
||||
$host = explode(':', $params['host'], 2);
|
||||
|
||||
$params['host'] = $host[0];
|
||||
$params['port'] = $host[1];
|
||||
}
|
||||
$params['host'] = $host[0];
|
||||
$params['port'] = $host[1];
|
||||
}
|
||||
|
||||
if( isset($params['database']) )
|
||||
{
|
||||
$dns[] = 'dbname=' . $params['database'];
|
||||
}
|
||||
if( isset($params['database']) )
|
||||
{
|
||||
$dns[] = 'dbname=' . $params['database'];
|
||||
}
|
||||
|
||||
if( isset($params['user']) )
|
||||
{
|
||||
$user = $params['user'];
|
||||
}
|
||||
if( isset($params['user']) )
|
||||
{
|
||||
$user = $params['user'];
|
||||
}
|
||||
|
||||
if( isset($params['password']) )
|
||||
{
|
||||
$password = $params['password'];
|
||||
}
|
||||
if( isset($params['password']) )
|
||||
{
|
||||
$password = $params['password'];
|
||||
}
|
||||
|
||||
if( isset($params['prefix']) )
|
||||
{
|
||||
$this->prefix = $params['prefix'];
|
||||
}
|
||||
if( isset($params['prefix']) )
|
||||
{
|
||||
$this->prefix = $params['prefix'];
|
||||
}
|
||||
|
||||
if( isset($params['log']) && $params['log'] )
|
||||
{
|
||||
$this->logged = true;
|
||||
}
|
||||
if( isset($params['log']) && $params['log'] )
|
||||
{
|
||||
$this->logged = true;
|
||||
}
|
||||
|
||||
if( !isset($params['persistent']) ) {
|
||||
$params['persistent'] = false;
|
||||
}
|
||||
if( !isset($params['persistent']) ) {
|
||||
$params['persistent'] = false;
|
||||
}
|
||||
|
||||
global $config;
|
||||
$cache = Cache::getInstance();
|
||||
@@ -144,10 +144,10 @@ class OTS_DB_MySQL extends OTS_Base_DB
|
||||
}
|
||||
|
||||
parent::__construct('mysql:' . implode(';', $dns), $user, $password, $driverAttributes);
|
||||
}
|
||||
}
|
||||
|
||||
public function __destruct()
|
||||
{
|
||||
{
|
||||
global $config;
|
||||
|
||||
$cache = Cache::getInstance();
|
||||
@@ -165,7 +165,8 @@ class OTS_DB_MySQL extends OTS_Base_DB
|
||||
}
|
||||
|
||||
if($this->logged) {
|
||||
log_append('database.log', $_SERVER['REQUEST_URI'] . PHP_EOL . $this->getLog());
|
||||
$currentScript = $_SERVER['REQUEST_URI'] ?? $_SERVER['SCRIPT_FILENAME'];
|
||||
log_append('database.log', $currentScript . PHP_EOL . $this->getLog());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -175,10 +176,10 @@ class OTS_DB_MySQL extends OTS_Base_DB
|
||||
* @param string $name Field name.
|
||||
* @return string Quoted name.
|
||||
*/
|
||||
public function fieldName($name)
|
||||
{
|
||||
return '`' . $name . '`';
|
||||
}
|
||||
public function fieldName($name)
|
||||
{
|
||||
return '`' . $name . '`';
|
||||
}
|
||||
|
||||
/**
|
||||
* LIMIT/OFFSET clause for queries.
|
||||
@@ -187,26 +188,26 @@ class OTS_DB_MySQL extends OTS_Base_DB
|
||||
* @param int|bool $offset Number of rows to be skipped before applying query effects (false if no offset).
|
||||
* @return string LIMIT/OFFSET SQL clause for query.
|
||||
*/
|
||||
public function limit($limit = false, $offset = false)
|
||||
{
|
||||
// by default this is empty part
|
||||
$sql = '';
|
||||
public function limit($limit = false, $offset = false)
|
||||
{
|
||||
// by default this is empty part
|
||||
$sql = '';
|
||||
|
||||
if($limit !== false)
|
||||
{
|
||||
$sql = ' LIMIT ';
|
||||
if($limit !== false)
|
||||
{
|
||||
$sql = ' LIMIT ';
|
||||
|
||||
// OFFSET has no effect if there is no LIMIT
|
||||
if($offset !== false)
|
||||
{
|
||||
$sql .= $offset . ', ';
|
||||
}
|
||||
// OFFSET has no effect if there is no LIMIT
|
||||
if($offset !== false)
|
||||
{
|
||||
$sql .= $offset . ', ';
|
||||
}
|
||||
|
||||
$sql .= $limit;
|
||||
}
|
||||
$sql .= $limit;
|
||||
}
|
||||
|
||||
return $sql;
|
||||
}
|
||||
return $sql;
|
||||
}
|
||||
|
||||
public function hasTable($name) {
|
||||
if(isset($this->has_table_cache[$name])) {
|
||||
|
@@ -60,12 +60,7 @@ class OTS_House extends OTS_Row_DAO
|
||||
private $tiles = array();
|
||||
|
||||
public function load($id) {
|
||||
$this->data = $this->db->query('SELECT * FROM `houses` WHERE `id` = ' . $id )->fetch();
|
||||
foreach($this->data as $key => $value) {
|
||||
if(is_numeric($key)) {
|
||||
unset($this->data[$key]);
|
||||
}
|
||||
}
|
||||
$this->data = $this->db->query('SELECT * FROM `houses` WHERE `id` = ' . $id )->fetch(PDO::FETCH_ASSOC);
|
||||
}
|
||||
|
||||
public function find($name)
|
||||
|
@@ -1752,11 +1752,6 @@ class OTS_Player extends OTS_Row_DAO
|
||||
*/
|
||||
public function getConditions()
|
||||
{
|
||||
if( !isset($this->data['conditions']) )
|
||||
{
|
||||
throw new E_OTS_NotLoaded();
|
||||
}
|
||||
|
||||
return $this->data['conditions'];
|
||||
}
|
||||
|
||||
|
@@ -94,7 +94,7 @@ $locale['step_database_loaded_npcs'] = 'NPCs has been loaded...';
|
||||
$locale['step_database_error_npcs'] = 'There were some problems loading your NPCs';
|
||||
$locale['step_database_loaded_spells'] = 'Spells has been loaded...';
|
||||
$locale['step_database_loaded_towns'] = 'Towns has been loaded...';
|
||||
$locale['step_database_error_towns'] = 'There were some problems loading your towns. You will need to configure them manually in config.';
|
||||
$locale['step_database_error_towns'] = 'There were some problems loading your towns. You will need to configure them manually in Settings.';
|
||||
$locale['step_database_created_account'] = 'Created admin account...';
|
||||
$locale['step_database_created_news'] = 'Newses has been created...';
|
||||
|
||||
|
@@ -93,7 +93,7 @@ $locale['step_database_loaded_npcs'] = 'Załadowano NPCs...';
|
||||
$locale['step_database_error_npcs'] = 'Wystąpił problem podczas ładowania NPCs';
|
||||
$locale['step_database_loaded_spells'] = 'Załadowano czary (spells)...';
|
||||
$locale['step_database_loaded_towns'] = 'Załadowano miasta (towns)...';
|
||||
$locale['step_database_error_towns'] = 'Wystąpił problem podczas ładowania miast. Trzeba będzie je skonfigurować manualnie.';
|
||||
$locale['step_database_error_towns'] = 'Wystąpił problem podczas ładowania miast. Trzeba będzie je skonfigurować manualnie w ustawieniach.';
|
||||
$locale['step_database_created_account'] = 'Utworzono konto admina...';
|
||||
$locale['step_database_created_news'] = 'Utworzono newsy...';
|
||||
|
||||
|
@@ -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);
|
||||
}
|
||||
}
|
||||
|
8
system/migrations/1-hooks.sql
Normal file
8
system/migrations/1-hooks.sql
Normal file
@@ -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;
|
@@ -1,16 +1,16 @@
|
||||
<?php
|
||||
$db->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');
|
||||
};
|
||||
|
10
system/migrations/10-admin_menu.sql
Normal file
10
system/migrations/10-admin_menu.sql
Normal file
@@ -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;
|
@@ -1,17 +1,24 @@
|
||||
<?php
|
||||
if(!$db->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;
|
||||
");
|
||||
$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');
|
||||
}
|
||||
};
|
||||
|
@@ -1,19 +1,44 @@
|
||||
<?php
|
||||
/**
|
||||
* @var OTS_DB_MySQL $db
|
||||
*/
|
||||
|
||||
$up = function () use ($db) {
|
||||
// rename database tables
|
||||
$db->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']]);
|
||||
}
|
||||
};
|
||||
|
9
system/migrations/12-items.sql
Normal file
9
system/migrations/12-items.sql
Normal file
@@ -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;
|
8
system/migrations/12-weapons.sql
Normal file
8
system/migrations/12-weapons.sql
Normal file
@@ -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;
|
@@ -1,51 +1,65 @@
|
||||
<?php
|
||||
/**
|
||||
* @var OTS_DB_MySQL $db
|
||||
*/
|
||||
|
||||
// add new item_id field for runes
|
||||
if(!$db->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']));
|
||||
}
|
||||
?>
|
||||
|
||||
// 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)]);
|
||||
}
|
||||
};
|
||||
|
@@ -1,3 +1,16 @@
|
||||
<?php
|
||||
if($db->hasColumn(TABLE_PREFIX . 'spells', 'spell'))
|
||||
$db->query("ALTER TABLE `" . TABLE_PREFIX . "spells` DROP COLUMN `spell`;");
|
||||
/**
|
||||
* @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 ''");
|
||||
}
|
||||
};
|
||||
|
@@ -1,18 +1,39 @@
|
||||
<?php
|
||||
/**
|
||||
* @var OTS_DB_MySQL $db
|
||||
*/
|
||||
|
||||
// change monsters.file_path field to loot
|
||||
if($db->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;");
|
||||
}
|
||||
?>
|
||||
// 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');
|
||||
}
|
||||
};
|
||||
|
@@ -1,10 +1,26 @@
|
||||
<?php
|
||||
/**
|
||||
* @var OTS_DB_MySQL $db
|
||||
*/
|
||||
|
||||
// add new forum.guild and forum.access fields
|
||||
if(!$db->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');
|
||||
}
|
||||
};
|
||||
|
@@ -1,5 +1,14 @@
|
||||
<?php
|
||||
/**
|
||||
* @var OTS_DB_MySQL $db
|
||||
*/
|
||||
|
||||
// change size of spells.vocations
|
||||
$db->query("ALTER TABLE `" . TABLE_PREFIX . "spells` MODIFY `vocations` VARCHAR(300) NOT NULL DEFAULT '';");
|
||||
?>
|
||||
|
||||
$up = function () use ($db) {
|
||||
$db->modifyColumn(TABLE_PREFIX . 'spells', 'vocations', "VARCHAR(300) NOT NULL DEFAULT ''");
|
||||
};
|
||||
|
||||
$down = function () {
|
||||
// nothing to do here
|
||||
};
|
||||
|
11
system/migrations/17-menu.sql
Normal file
11
system/migrations/17-menu.sql
Normal file
@@ -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;
|
@@ -1,23 +1,20 @@
|
||||
<?php
|
||||
/**
|
||||
* @var OTS_DB_MySQL $db
|
||||
*/
|
||||
|
||||
use MyAAC\Plugins;
|
||||
|
||||
if(!$db->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');
|
||||
};
|
||||
|
||||
|
@@ -1,6 +1,24 @@
|
||||
<?php
|
||||
/**
|
||||
* @var OTS_DB_MySQL $db
|
||||
*/
|
||||
|
||||
$db->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`");
|
||||
}
|
||||
|
||||
?>
|
||||
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');
|
||||
}
|
||||
};
|
||||
|
@@ -1,5 +1,11 @@
|
||||
<?php
|
||||
$db->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");
|
||||
};
|
||||
|
@@ -2,16 +2,33 @@
|
||||
|
||||
use MyAAC\Settings;
|
||||
|
||||
$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`;");
|
||||
function updateHighscoresIdsHidden(): void
|
||||
{
|
||||
global $db;
|
||||
|
||||
$highscores_ignored_ids = array();
|
||||
if($query->rowCount() > 0) {
|
||||
foreach($query->fetchAll() as $result)
|
||||
$highscores_ignored_ids[] = $result['id'];
|
||||
}
|
||||
else {
|
||||
$highscores_ignored_ids[] = 0;
|
||||
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));
|
||||
}
|
||||
|
||||
$settings = Settings::getInstance();
|
||||
$settings->updateInDatabase('core', 'highscores_ids_hidden', implode(', ', $highscores_ignored_ids));
|
||||
$up = function () {
|
||||
updateHighscoresIdsHidden();
|
||||
};
|
||||
|
||||
$down = function () {
|
||||
$settings = Settings::getInstance();
|
||||
$settings->updateInDatabase('core', 'highscores_ids_hidden', '0');
|
||||
};
|
||||
|
@@ -1,14 +1,23 @@
|
||||
<?php
|
||||
/**
|
||||
* @var OTS_DB_MySQL $db
|
||||
*/
|
||||
|
||||
$db->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`;");
|
||||
// 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');
|
||||
};
|
||||
|
10
system/migrations/22-z_polls.sql
Normal file
10
system/migrations/22-z_polls.sql
Normal file
@@ -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;
|
6
system/migrations/22-z_polls_answers.sql
Normal file
6
system/migrations/22-z_polls_answers.sql
Normal file
@@ -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;
|
@@ -1,31 +1,35 @@
|
||||
<?php
|
||||
/**
|
||||
* @var OTS_DB_MySQL $db
|
||||
*/
|
||||
|
||||
if(!$db->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 ;');
|
||||
}
|
||||
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');
|
||||
}
|
||||
};
|
||||
|
@@ -1,7 +1,24 @@
|
||||
<?php
|
||||
/**
|
||||
* @var OTS_DB_MySQL $db
|
||||
*/
|
||||
|
||||
if(!$db->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`;");
|
||||
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');
|
||||
}
|
||||
};
|
||||
|
9
system/migrations/24-items.sql
Normal file
9
system/migrations/24-items.sql
Normal file
@@ -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;
|
@@ -1,3 +1,12 @@
|
||||
<?php
|
||||
/**
|
||||
* @var OTS_DB_MySQL $db
|
||||
*/
|
||||
|
||||
$db->exec('DROP TABLE IF EXISTS `' . TABLE_PREFIX . 'items`;');
|
||||
$up = function () use ($db) {
|
||||
$db->dropTable(TABLE_PREFIX . 'items');
|
||||
};
|
||||
|
||||
$down = function () use ($db) {
|
||||
$db->exec(file_get_contents(__DIR__ . '/24-items.sql'));
|
||||
};
|
||||
|
@@ -1,3 +1,12 @@
|
||||
<?php
|
||||
/**
|
||||
* @var OTS_DB_MySQL $db
|
||||
*/
|
||||
|
||||
$db->exec('ALTER TABLE `' . TABLE_PREFIX . 'monsters` MODIFY `loot` text NOT NULL;');
|
||||
$up = function () use ($db) {
|
||||
$db->modifyColumn(TABLE_PREFIX . 'monsters', 'loot', 'text NOT NULL');
|
||||
};
|
||||
|
||||
$down = function () {
|
||||
// nothing to do
|
||||
};
|
||||
|
@@ -1,17 +1,32 @@
|
||||
<?php
|
||||
/**
|
||||
* @var OTS_DB_MySQL $db
|
||||
*/
|
||||
|
||||
if($db->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');
|
||||
}
|
||||
};
|
||||
|
22
system/migrations/27-commands.html
Normal file
22
system/migrations/27-commands.html
Normal file
@@ -0,0 +1,22 @@
|
||||
<table class="myaac-table" style="border-collapse: collapse; width: 100%; height: 72px; border-width: 1px;" border="1"><colgroup><col style="width: 50%;"><col style="width: 50%;"></colgroup>
|
||||
<thead>
|
||||
<tr style="height: 18px;">
|
||||
<td style="height: 18px; border-width: 1px; text-align: center;"><span style="color: #ffffff;"><strong>Words</strong></span></td>
|
||||
<td style="height: 18px; border-width: 1px; text-align: center;"><strong>Description</strong></td>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr style="height: 18px;">
|
||||
<td style="height: 18px; border-width: 1px;">!example</td>
|
||||
<td style="height: 18px; border-width: 1px;">This is just an example</td>
|
||||
</tr>
|
||||
<tr style="height: 18px;">
|
||||
<td style="height: 18px; border-width: 1px;">!buyhouse</td>
|
||||
<td style="height: 18px; border-width: 1px;">Buy house you are looking at</td>
|
||||
</tr>
|
||||
<tr style="height: 18px;">
|
||||
<td style="height: 18px; border-width: 1px;"><em>!aol</em></td>
|
||||
<td style="height: 18px; border-width: 1px;">Buy AoL</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
6
system/migrations/27-downloads.html
Normal file
6
system/migrations/27-downloads.html
Normal file
@@ -0,0 +1,6 @@
|
||||
<p> </p>
|
||||
<p> </p>
|
||||
<div style="text-align: center;">We're using official Tibia Client <strong>{{ config.client / 100 }}</strong><br>
|
||||
<p>Download Tibia Client <strong>{{ config.client / 100 }}</strong> for Windows <a href="https://drive.google.com/drive/folders/0B2-sMQkWYzhGSFhGVlY2WGk5czQ" target="_blank" rel="noopener">HERE</a>.</p>
|
||||
<h2>IP Changer:</h2>
|
||||
<a href="https://static.otland.net/ipchanger.exe" target="_blank" rel="noopener">HERE</a></div>
|
@@ -1,47 +1,48 @@
|
||||
<?php
|
||||
/**
|
||||
* @var OTS_DB_MySQL $db
|
||||
*/
|
||||
|
||||
$downloadsPage = <<<HTML
|
||||
<p> </p>
|
||||
<p> </p>
|
||||
<div style="text-align: center;">We're using official Tibia Client <strong>{{ config.client / 100 }}</strong><br>
|
||||
<p>Download Tibia Client <strong>{{ config.client / 100 }}</strong> for Windows <a href="https://drive.google.com/drive/folders/0B2-sMQkWYzhGSFhGVlY2WGk5czQ" target="_blank" rel="noopener">HERE</a>.</p>
|
||||
<h2>IP Changer:</h2>
|
||||
<a href="https://static.otland.net/ipchanger.exe" target="_blank" rel="noopener">HERE</a></div>
|
||||
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,
|
||||
($db->hasColumn(TABLE_PREFIX . 'pages', 'hide') ? 'hide' : 'hidden') => 0,
|
||||
]);
|
||||
}
|
||||
|
||||
$commandsPage = <<<HTML
|
||||
<table class="myaac-table" style="border-collapse: collapse; width: 100%; height: 72px; border-width: 1px;" border="1"><colgroup><col style="width: 50%;"><col style="width: 50%;"></colgroup>
|
||||
<thead>
|
||||
<tr style="height: 18px;">
|
||||
<td style="height: 18px; border-width: 1px; text-align: center;"><span style="color: #ffffff;"><strong>Words</strong></span></td>
|
||||
<td style="height: 18px; border-width: 1px; text-align: center;"><strong>Description</strong></td>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr style="height: 18px;">
|
||||
<td style="height: 18px; border-width: 1px;">!example</td>
|
||||
<td style="height: 18px; border-width: 1px;">This is just an example</td>
|
||||
</tr>
|
||||
<tr style="height: 18px;">
|
||||
<td style="height: 18px; border-width: 1px;">!buyhouse</td>
|
||||
<td style="height: 18px; border-width: 1px;">Buy house you are looking at</td>
|
||||
</tr>
|
||||
<tr style="height: 18px;">
|
||||
<td style="height: 18px; border-width: 1px;"><em>!aol</em></td>
|
||||
<td style="height: 18px; border-width: 1px;">Buy AoL</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
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,
|
||||
($db->hasColumn(TABLE_PREFIX . 'pages', 'hide') ? 'hide' : '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();
|
||||
}
|
||||
};
|
||||
|
10
system/migrations/28-hooks.sql
Normal file
10
system/migrations/28-hooks.sql
Normal file
@@ -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;
|
@@ -1,10 +1,25 @@
|
||||
<?php
|
||||
/**
|
||||
* @var OTS_DB_MySQL $db
|
||||
*/
|
||||
|
||||
use MyAAC\Cache\Cache;
|
||||
|
||||
$db->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');
|
||||
}
|
||||
|
@@ -1,5 +1,16 @@
|
||||
<?php
|
||||
/**
|
||||
* @var OTS_DB_MySQL $db
|
||||
*/
|
||||
|
||||
if(!$db->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');
|
||||
}
|
||||
};
|
||||
|
@@ -1,3 +1,15 @@
|
||||
<?php
|
||||
$db->query("ALTER TABLE `" . TABLE_PREFIX . "account_actions` ADD `ipv6` BINARY(16) NOT NULL DEFAULT 0;");
|
||||
?>
|
||||
/**
|
||||
* @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');
|
||||
};
|
||||
|
25
system/migrations/30-rules.txt
Normal file
25
system/migrations/30-rules.txt
Normal file
@@ -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.
|
@@ -1,31 +1,27 @@
|
||||
<?php
|
||||
|
||||
$query = $db->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();
|
||||
}
|
||||
};
|
||||
|
@@ -1,57 +1,121 @@
|
||||
<?php
|
||||
/**
|
||||
* @var OTS_DB_MySQL $db
|
||||
*/
|
||||
|
||||
if(!$db->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`;");
|
||||
}
|
||||
|
@@ -1,4 +1,14 @@
|
||||
<?php
|
||||
/**
|
||||
* @var OTS_DB_MySQL $db
|
||||
*/
|
||||
|
||||
// Increase size of page in myaac_visitors table
|
||||
|
||||
$db->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
|
||||
};
|
||||
|
@@ -1,6 +1,16 @@
|
||||
<?php
|
||||
/**
|
||||
* @var OTS_DB_MySQL $db
|
||||
*/
|
||||
|
||||
// Increase size of ip in myaac_visitors table
|
||||
// according to this answer: https://stackoverflow.com/questions/166132/maximum-length-of-the-textual-representation-of-an-ipv6-address
|
||||
// the size of ipv6 can be maximal 45 chars
|
||||
|
||||
$db->exec('ALTER TABLE `' . TABLE_PREFIX . "visitors` MODIFY `ip` VARCHAR(45) NOT NULL;");
|
||||
$up = function () use ($db) {
|
||||
$db->modifyColumn(TABLE_PREFIX . 'visitors', 'ip', 'VARCHAR(45) NOT NULL');
|
||||
};
|
||||
|
||||
$down = function () {
|
||||
// nothing to be done, as we have just extended the size of a column
|
||||
};
|
||||
|
@@ -1,4 +1,18 @@
|
||||
<?php
|
||||
/**
|
||||
* @var OTS_DB_MySQL $db
|
||||
*/
|
||||
|
||||
// add user_agent column into visitors
|
||||
|
||||
$db->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');
|
||||
}
|
||||
};
|
||||
|
@@ -1,3 +1,17 @@
|
||||
<?php
|
||||
/**
|
||||
* @var OTS_DB_MySQL $db
|
||||
*/
|
||||
|
||||
// add look column
|
||||
$db->exec('ALTER TABLE `' . TABLE_PREFIX . "monsters` ADD `look` VARCHAR(255) NOT NULL DEFAULT '' AFTER `health`;");
|
||||
$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');
|
||||
}
|
||||
};
|
||||
|
9
system/migrations/36-settings.sql
Normal file
9
system/migrations/36-settings.sql
Normal file
@@ -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;
|
@@ -1,14 +1,18 @@
|
||||
<?php
|
||||
/**
|
||||
* @var OTS_DB_MySQL $db
|
||||
*/
|
||||
|
||||
// add settings table
|
||||
if(!$db->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');
|
||||
//}
|
||||
};
|
||||
|
@@ -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]);
|
||||
};
|
||||
|
@@ -1,5 +1,16 @@
|
||||
<?php
|
||||
/**
|
||||
* @var OTS_DB_MySQL $db
|
||||
*/
|
||||
|
||||
// 2023-11-11
|
||||
// execute highscores_ids_hidden once again, cause of settings
|
||||
require __DIR__ . '/20.php';
|
||||
$up = function () {
|
||||
require_once __DIR__ . '/20.php';
|
||||
updateHighscoresIdsHidden();
|
||||
};
|
||||
|
||||
$down = function () {
|
||||
// there is no downgrade for this
|
||||
};
|
||||
|
||||
|
@@ -1,18 +1,41 @@
|
||||
<?php
|
||||
/**
|
||||
* @var OTS_DB_MySQL $db
|
||||
*/
|
||||
|
||||
// 2024-01-27
|
||||
// change hidden to hide (Eloquent model reserved keyword)
|
||||
|
||||
if (!$db->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);
|
||||
};
|
||||
|
@@ -1,3 +1,16 @@
|
||||
<?php
|
||||
if(!$db->hasColumn(TABLE_PREFIX . 'monsters', 'id'))
|
||||
$db->query("ALTER TABLE `" . TABLE_PREFIX . "monsters` ADD `id` int(11) NOT NULL AUTO_INCREMENT primary key FIRST;");
|
||||
/**
|
||||
* @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');
|
||||
}
|
||||
};
|
||||
|
@@ -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']);
|
||||
};
|
||||
|
||||
|
35
system/migrations/41.php
Normal file
35
system/migrations/41.php
Normal file
@@ -0,0 +1,35 @@
|
||||
<?php
|
||||
/**
|
||||
* Change database tables character set to utf8mb4
|
||||
* Previously it was utf8 (utf8mb3)
|
||||
* utf8 will become utf8mb4 in future releases of mysql
|
||||
*/
|
||||
$tables = [
|
||||
'account_actions', 'admin_menu',
|
||||
'changelog', 'config',
|
||||
'faq', 'forum_boards', 'forum',
|
||||
'gallery',
|
||||
'menu', 'monsters',
|
||||
'news', 'news_categories', 'notepad',
|
||||
'pages',
|
||||
'settings', 'spells',
|
||||
'visitors', 'weapons',
|
||||
];
|
||||
|
||||
$up = function () use ($db, $tables)
|
||||
{
|
||||
foreach ($tables as $table) {
|
||||
if ($db->hasTable(TABLE_PREFIX . $table)) {
|
||||
$db->exec('ALTER TABLE ' . TABLE_PREFIX . $table . ' CONVERT TO CHARACTER SET utf8mb4');
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
$down = function () use ($db, $tables)
|
||||
{
|
||||
foreach ($tables as $table) {
|
||||
if ($db->hasTable(TABLE_PREFIX . $table)) {
|
||||
$db->exec('ALTER TABLE ' . TABLE_PREFIX . $table . ' CONVERT TO CHARACTER SET utf8');
|
||||
}
|
||||
}
|
||||
};
|
15
system/migrations/42.php
Normal file
15
system/migrations/42.php
Normal file
@@ -0,0 +1,15 @@
|
||||
<?php
|
||||
/**
|
||||
* @var OTS_DB_MySQL $db
|
||||
*/
|
||||
|
||||
// 2025-09-01
|
||||
// resize forum.post_ip to support ipv6
|
||||
$up = function () use ($db) {
|
||||
$db->modifyColumn(TABLE_PREFIX . 'forum', 'post_ip', "varchar(45) NOT NULL default '0.0.0.0'");
|
||||
};
|
||||
|
||||
$down = function () {
|
||||
// there is no downgrade for this
|
||||
};
|
||||
|
@@ -1,4 +1,16 @@
|
||||
<?php
|
||||
if($db->hasColumn(TABLE_PREFIX . 'spells', 'cities'))
|
||||
$db->query("ALTER TABLE `" . TABLE_PREFIX . "spells` DROP COLUMN cities;");
|
||||
?>
|
||||
/**
|
||||
* @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');
|
||||
}
|
||||
};
|
||||
|
@@ -1,3 +1,16 @@
|
||||
<?php
|
||||
if(!$db->hasColumn(TABLE_PREFIX . 'hooks', 'enabled'))
|
||||
$db->query("ALTER TABLE `" . TABLE_PREFIX . "hooks` ADD `enabled` INT(1) NOT NULL DEFAULT 1;");
|
||||
/**
|
||||
* @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');
|
||||
}
|
||||
};
|
||||
|
@@ -1,4 +1,16 @@
|
||||
<?php
|
||||
if($db->hasColumn(TABLE_PREFIX . 'screenshots', 'name'))
|
||||
$db->query("ALTER TABLE `" . TABLE_PREFIX . "screenshots` DROP `name`;");
|
||||
?>
|
||||
/**
|
||||
* @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');
|
||||
}
|
||||
};
|
||||
|
@@ -1,17 +1,31 @@
|
||||
<?php
|
||||
if($db->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));
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
$down = function () use ($db) {
|
||||
if ($db->hasTable(TABLE_PREFIX . 'forum_boards')) {
|
||||
$db->renameTable(TABLE_PREFIX . 'forum_boards', TABLE_PREFIX . 'forum_sections');
|
||||
}
|
||||
};
|
||||
|
@@ -1,9 +1,18 @@
|
||||
<?php
|
||||
$db->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;");
|
||||
?>
|
||||
/**
|
||||
* @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
|
||||
};
|
||||
|
@@ -40,8 +40,13 @@ else
|
||||
|
||||
if(empty($errors))
|
||||
{
|
||||
if(!admin() && !Validator::newCharacterName($name))
|
||||
if(!Validator::characterName($name)) {
|
||||
$errors[] = Validator::getLastError();
|
||||
}
|
||||
|
||||
if(!admin() && !Validator::newCharacterName($name)) {
|
||||
$errors[] = Validator::getLastError();
|
||||
}
|
||||
}
|
||||
|
||||
if(empty($errors)) {
|
||||
|
@@ -66,7 +66,7 @@ else
|
||||
$new_sex_str = $config['genders'][$new_sex];
|
||||
|
||||
$player->save();
|
||||
$account_logged->setCustomField(setting('core.donate_column'), $points - setting('core.account_change_character_name_price'));
|
||||
$account_logged->setCustomField(setting('core.donate_column'), $points - setting('core.account_change_character_sex_price'));
|
||||
$account_logged->logAction('Changed sex on character <b>' . $player->getName() . '</b> from <b>' . $old_sex_str . '</b> to <b>' . $new_sex_str . '</b>.');
|
||||
$twig->display('success.html.twig', array(
|
||||
'title' => 'Character Sex Changed',
|
||||
|
@@ -148,6 +148,10 @@ if($save)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* two hooks for compatibility
|
||||
*/
|
||||
$hooks->trigger(HOOK_ACCOUNT_CREATE_AFTER_SUBMIT, $params);
|
||||
if (!$hooks->trigger(HOOK_ACCOUNT_CREATE_POST, $params)) {
|
||||
return;
|
||||
}
|
||||
@@ -187,6 +191,8 @@ if($save)
|
||||
$new_account->setEMail($email);
|
||||
$new_account->save();
|
||||
|
||||
$hooks->trigger(HOOK_ACCOUNT_CREATE_AFTER_SAVED, ['account' => $new_account]);
|
||||
|
||||
if(USE_ACCOUNT_SALT)
|
||||
$new_account->setCustomField('salt', $salt);
|
||||
|
||||
@@ -325,7 +331,9 @@ if(setting('core.account_country_recognize')) {
|
||||
$country_recognized = $country_session;
|
||||
}
|
||||
else {
|
||||
$info = json_decode(@file_get_contents('http://ipinfo.io/' . $_SERVER['REMOTE_ADDR'] . '/geo'), true);
|
||||
ini_set('default_socket_timeout', 5);
|
||||
|
||||
$info = json_decode(@file_get_contents('https://ipinfo.io/' . get_browser_real_ip() . '/geo'), true);
|
||||
if(isset($info['country'])) {
|
||||
$country_recognized = strtolower($info['country']);
|
||||
setSession('country', $country_recognized);
|
||||
|
@@ -8,6 +8,9 @@
|
||||
* @copyright 2023 MyAAC
|
||||
* @link https://my-aac.org
|
||||
*/
|
||||
|
||||
use MyAAC\RateLimit;
|
||||
|
||||
defined('MYAAC') or die('Direct access not allowed!');
|
||||
|
||||
// new login with data from form
|
||||
@@ -18,30 +21,13 @@ if($logged || !isset($_POST['account_login']) || !isset($_POST['password_login']
|
||||
$login_account = $_POST['account_login'];
|
||||
$login_password = $_POST['password_login'];
|
||||
$remember_me = isset($_POST['remember_me']);
|
||||
$ip = get_browser_real_ip();
|
||||
if(!empty($login_account) && !empty($login_password))
|
||||
{
|
||||
if($cache->enabled())
|
||||
{
|
||||
$tmp = '';
|
||||
if($cache->fetch('failed_logins', $tmp))
|
||||
{
|
||||
$tmp = unserialize($tmp);
|
||||
$to_remove = array();
|
||||
foreach($tmp as $ip => $t)
|
||||
{
|
||||
if(time() - $t['last'] >= 5 * 60)
|
||||
$to_remove[] = $ip;
|
||||
}
|
||||
|
||||
foreach($to_remove as $ip)
|
||||
unset($tmp[$ip]);
|
||||
}
|
||||
else
|
||||
$tmp = array();
|
||||
|
||||
$ip = $_SERVER['REMOTE_ADDR'];
|
||||
$t = $tmp[$ip] ?? null;
|
||||
}
|
||||
$limiter = new RateLimit('failed_logins', setting('core.account_login_attempts_limit'), setting('core.account_login_ban_time'));
|
||||
$limiter->enabled = setting('core.account_login_ipban_protection');
|
||||
$limiter->load();
|
||||
|
||||
$account_logged = new OTS_Account();
|
||||
if (config('account_login_by_email')) {
|
||||
@@ -56,14 +42,12 @@ if(!empty($login_account) && !empty($login_password))
|
||||
}
|
||||
}
|
||||
|
||||
if($account_logged->isLoaded() && encrypt((USE_ACCOUNT_SALT ? $account_logged->getCustomField('salt') : '') . $login_password) == $account_logged->getPassword()
|
||||
&& (!isset($t) || $t['attempts'] < 5)
|
||||
if($account_logged->isLoaded() && encrypt((USE_ACCOUNT_SALT ? $account_logged->getCustomField('salt') : '') . $login_password) == $account_logged->getPassword() && (!$limiter->enabled || !$limiter->exceeded($ip))
|
||||
)
|
||||
{
|
||||
if (setting('core.account_mail_verify') && (int)$account_logged->getCustomField('email_verified') !== 1) {
|
||||
$errors[] = 'Your account is not verified. Please verify your email address. If the message is not coming check the SPAM folder in your E-Mail client.';
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
session_regenerate_id();
|
||||
setSession('account', $account_logged->getId());
|
||||
setSession('password', encrypt((USE_ACCOUNT_SALT ? $account_logged->getCustomField('salt') : '') . $login_password));
|
||||
@@ -87,38 +71,21 @@ if(!empty($login_account) && !empty($login_password))
|
||||
|
||||
$hooks->trigger(HOOK_LOGIN, array('account' => $account_logged, 'password' => $login_password, 'remember_me' => $remember_me));
|
||||
}
|
||||
|
||||
$limiter->reset($ip);
|
||||
}
|
||||
else
|
||||
{
|
||||
$hooks->trigger(HOOK_LOGIN_ATTEMPT, array('account' => $login_account, 'password' => $login_password, 'remember_me' => $remember_me));
|
||||
|
||||
$errorMessage = getAccountLoginByLabel() . ' or password is not correct.';
|
||||
|
||||
// temporary solution for blocking failed login attempts
|
||||
if($cache->enabled())
|
||||
{
|
||||
if(isset($t))
|
||||
{
|
||||
$t['attempts']++;
|
||||
$t['last'] = time();
|
||||
|
||||
if($t['attempts'] >= 5)
|
||||
$errors[] = 'A wrong password has been entered 5 times in a row. You are unable to log into your account for the next 5 minutes. Please wait.';
|
||||
else
|
||||
$errors[] = $errorMessage;
|
||||
}
|
||||
else
|
||||
{
|
||||
$t = array('attempts' => 1, 'last' => time());
|
||||
$errors[] = $errorMessage;
|
||||
}
|
||||
|
||||
$tmp[$ip] = $t;
|
||||
$cache->set('failed_logins', serialize($tmp), 60 * 60); // save for 1 hour
|
||||
}
|
||||
else {
|
||||
$errors[] = $errorMessage;
|
||||
$limiter->increment($ip);
|
||||
if ($limiter->exceeded($ip)) {
|
||||
$errorMessage = 'A wrong password has been entered ' . $limiter->max_attempts . ' times in a row. You are unable to log into your account for the next ' . $limiter->ttl . ' minutes. Please wait.';
|
||||
}
|
||||
|
||||
$errors[] = $errorMessage;
|
||||
|
||||
}
|
||||
}
|
||||
else {
|
||||
|
@@ -35,7 +35,7 @@ if(Forum::canPost($account_logged))
|
||||
$thread = $db->query("SELECT `author_guid`, `author_aid`, `first_post`, `post_topic`, `post_date`, `post_text`, `post_smile`, `post_html`, `id`, `section` FROM `" . FORUM_TABLE_PREFIX . "forum` WHERE `id` = ".$post_id." LIMIT 1")->fetch();
|
||||
if(isset($thread['id'])) {
|
||||
$first_post = $db->query("SELECT `" . FORUM_TABLE_PREFIX . "forum`.`author_guid`, `" . FORUM_TABLE_PREFIX . "forum`.`author_aid`, `" . FORUM_TABLE_PREFIX . "forum`.`first_post`, `" . FORUM_TABLE_PREFIX . "forum`.`post_topic`, `" . FORUM_TABLE_PREFIX . "forum`.`post_text`, `" . FORUM_TABLE_PREFIX . "forum`.`post_smile`, `" . FORUM_TABLE_PREFIX . "forum`.`id`, `" . FORUM_TABLE_PREFIX . "forum`.`section` FROM `" . FORUM_TABLE_PREFIX . "forum` WHERE `" . FORUM_TABLE_PREFIX . "forum`.`id` = ".(int) $thread['first_post']." LIMIT 1")->fetch();
|
||||
echo '<a href="' . getLink('forum') . '">Boards</a> >> <a href="' . getForumBoardLink($thread['section']) . '">'.$sections[$thread['section']]['name'].'</a> >> <a href="' . getForumThreadLink($thread['first_post']) . '">'.$first_post['post_topic'].'</a> >> <b>Edit post</b>';
|
||||
echo '<a href="' . getLink('forum') . '">Boards</a> >> <a href="' . getForumBoardLink($thread['section']) . '">'.$sections[$thread['section']]['name'].'</a> >> <a href="' . getForumThreadLink($thread['first_post']) . '">'.htmlspecialchars($first_post['post_topic']).'</a> >> <b>Edit post</b>';
|
||||
|
||||
if(Forum::hasAccess($thread['section'] && ($account_logged->getId() == $thread['author_aid'] || Forum::isModerator()))) {
|
||||
$char_id = $post_topic = $text = $smile = $html = null;
|
||||
|
@@ -25,6 +25,7 @@ if(!$logged) {
|
||||
|
||||
if(!Forum::isModerator()) {
|
||||
echo 'You are not logged in or you are not moderator.';
|
||||
return;
|
||||
}
|
||||
|
||||
$save = isset($_REQUEST['save']) && (int)$_REQUEST['save'] == 1;
|
||||
|
@@ -40,7 +40,7 @@ if(Forum::canPost($account_logged)) {
|
||||
$thread = $db->query("SELECT `" . FORUM_TABLE_PREFIX . "forum`.`post_topic`, `" . FORUM_TABLE_PREFIX . "forum`.`id`, `" . FORUM_TABLE_PREFIX . "forum`.`section` FROM `" . FORUM_TABLE_PREFIX . "forum` WHERE `" . FORUM_TABLE_PREFIX . "forum`.`id` = ".(int) $thread_id." AND `" . FORUM_TABLE_PREFIX . "forum`.`first_post` = ".$thread_id." LIMIT 1")->fetch();
|
||||
|
||||
if(isset($thread['id']) && Forum::hasAccess($thread['section'])) {
|
||||
echo '<a href="' . getLink('forum') . '">Boards</a> >> <a href="' . getForumBoardLink($thread['section']) . '">'.$sections[$thread['section']]['name'].'</a> >> <a href="' . getForumThreadLink($thread_id) . '">'.$thread['post_topic'].'</a> >> <b>Post new reply</b><br /><h3>'.$thread['post_topic'].'</h3>';
|
||||
echo '<a href="' . getLink('forum') . '">Boards</a> >> <a href="' . getForumBoardLink($thread['section']) . '">'.$sections[$thread['section']]['name'].'</a> >> <a href="' . getForumThreadLink($thread_id) . '">'.htmlspecialchars($thread['post_topic']).'</a> >> <b>Post new reply</b><br /><h3>'.htmlspecialchars($thread['post_topic']).'</h3>';
|
||||
|
||||
$quote = isset($_REQUEST['quote']) ? (int) $_REQUEST['quote'] : NULL;
|
||||
$text = isset($_REQUEST['text']) ? stripslashes(trim($_REQUEST['text'])) : NULL;
|
||||
|
@@ -95,7 +95,23 @@ if(Forum::canPost($account_logged)) {
|
||||
if (count($errors) == 0) {
|
||||
$saved = true;
|
||||
|
||||
$db->query("INSERT INTO `" . FORUM_TABLE_PREFIX . "forum` (`first_post` ,`last_post` ,`section` ,`replies` ,`views` ,`author_aid` ,`author_guid` ,`post_text` ,`post_topic` ,`post_smile`, `post_html` ,`post_date` ,`last_edit_aid` ,`edit_date`, `post_ip`) VALUES ('0', '" . time() . "', '" . (int)$section_id . "', '0', '0', '" . $account_logged->getId() . "', '" . $char_id . "', " . $db->quote($text) . ", " . $db->quote($post_topic) . ", '" . $smile . "', '" . $html . "', '" . time() . "', '0', '0', '" . $_SERVER['REMOTE_ADDR'] . "')");
|
||||
$db->insert(FORUM_TABLE_PREFIX . 'forum', [
|
||||
'first_post' => 0,
|
||||
'last_post' => time(),
|
||||
'section' => $section_id,
|
||||
'replies' => 0,
|
||||
'views' => 0,
|
||||
'author_aid' => $account_logged->getId(),
|
||||
'author_guid' => $char_id,
|
||||
'post_text' => $text,
|
||||
'post_topic' => $post_topic,
|
||||
'post_smile' => $smile,
|
||||
'post_html' => $html,
|
||||
'post_date' => time(),
|
||||
'last_edit_aid' => 0,
|
||||
'edit_date' => 0,
|
||||
'post_ip' => get_browser_real_ip(),
|
||||
]);
|
||||
|
||||
$thread_id = $db->lastInsertId();
|
||||
|
||||
|
@@ -44,7 +44,7 @@ for($i = 0; $i < $threads_count['threads_count'] / setting('core.forum_threads_p
|
||||
|
||||
echo '<a href="' . getLink('forum') . '">Boards</a> >> <b>'.$sections[$section_id]['name'].'</b>';
|
||||
|
||||
if(!$sections[$section_id]['closed'] || Forum::isModerator()) {
|
||||
if($logged && (!$sections[$section_id]['closed'] || Forum::isModerator())) {
|
||||
echo '<br /><br />
|
||||
<a href="' . getLink('forum') . '?action=new_thread§ion_id='.$section_id.'"><img src="images/forum/topic.gif" border="0" /></a>';
|
||||
}
|
||||
@@ -68,7 +68,7 @@ if(isset($last_threads[0])) {
|
||||
echo '<tr bgcolor="' . getStyle($number_of_rows++) . '"><td>';
|
||||
if(Forum::isModerator()) {
|
||||
echo '<a href="' . getLink('forum') . '?action=move_thread&id='.$thread['id'].'"\')"><span style="color:darkgreen">[MOVE]</span></a>';
|
||||
echo '<a href="' . getLink('forum') . '?action=remove_post&id='.$thread['id'].'" onclick="return confirm(\'Are you sure you want remove thread > '.$thread['post_topic'].' <?\')"><span style="color: red">[REMOVE]</span></a> ';
|
||||
echo '<a href="' . getLink('forum') . '?action=remove_post&id='.$thread['id'].'" onclick="return confirm(\'Are you sure you want remove thread > '.htmlspecialchars($thread['post_topic']).' <?\')"><span style="color: red">[REMOVE]</span></a> ';
|
||||
}
|
||||
|
||||
$player->load($thread['player_id']);
|
||||
@@ -79,7 +79,7 @@ if(isset($last_threads[0])) {
|
||||
$player_account = $player->getAccount();
|
||||
$canEditForum = $player_account->hasFlag(FLAG_CONTENT_FORUM) || $player_account->isAdmin();
|
||||
|
||||
echo '<a href="' . getForumThreadLink($thread['id']) . '">'.($canEditForum ? $thread['post_topic'] : htmlspecialchars($thread['post_topic'])) . '</a><br /><small>'.($canEditForum ? substr(strip_tags($thread['post_text']), 0, 50) : htmlspecialchars(substr($thread['post_text'], 0, 50))).'...</small></td><td>' . getPlayerLink($thread['name']) . '</td><td>'.(int) $thread['replies'].'</td><td>'.(int) $thread['views'].'</td><td>';
|
||||
echo '<a href="' . getForumThreadLink($thread['id']) . '">'.htmlspecialchars($thread['post_topic']). '</a><br /><small>'.($canEditForum ? substr(strip_tags($thread['post_text']), 0, 50) : htmlspecialchars(substr($thread['post_text'], 0, 50))).'...</small></td><td>' . getPlayerLink($thread['name']) . '</td><td>'.(int) $thread['replies'].'</td><td>'.(int) $thread['views'].'</td><td>';
|
||||
if($thread['last_post'] > 0) {
|
||||
$last_post = $db->query("SELECT `players`.`name`, `" . FORUM_TABLE_PREFIX . "forum`.`post_date` FROM `players`, `" . FORUM_TABLE_PREFIX . "forum` WHERE `" . FORUM_TABLE_PREFIX . "forum`.`first_post` = ".(int) $thread['id']." AND `players`.`id` = `" . FORUM_TABLE_PREFIX . "forum`.`author_guid` ORDER BY `post_date` DESC LIMIT 1")->fetch();
|
||||
if(isset($last_post['name']))
|
||||
@@ -94,7 +94,7 @@ if(isset($last_threads[0])) {
|
||||
}
|
||||
|
||||
echo '</table>';
|
||||
if(!$sections[$section_id]['closed'] || Forum::isModerator()) {
|
||||
if($logged && (!$sections[$section_id]['closed'] || Forum::isModerator())) {
|
||||
echo '<br /><a href="' . getLink('forum') . '?action=new_thread§ion_id=' . $section_id . '"><img src="images/forum/topic.gif" border="0" /></a>';
|
||||
}
|
||||
}
|
||||
|
@@ -31,20 +31,22 @@ if(!is_numeric($page) || $page < 1 || $page > PHP_INT_MAX) {
|
||||
|
||||
$query = Player::query();
|
||||
|
||||
$settingHighscoresVocationBox = setting('core.highscores_vocation_box');
|
||||
$configVocations = config('vocations');
|
||||
$configVocationsAmount = config('vocations_amount');
|
||||
|
||||
if($settingHighscoresVocationBox && $vocation !== 'all')
|
||||
{
|
||||
$vocationId = null;
|
||||
if($vocation !== 'all') {
|
||||
foreach($configVocations as $id => $name) {
|
||||
if(strtolower($name) == $vocation) {
|
||||
$add_vocs = array($id);
|
||||
$vocationId = $id;
|
||||
$add_vocs = [$id];
|
||||
|
||||
$i = $id + $configVocationsAmount;
|
||||
while(isset($configVocations[$i])) {
|
||||
$add_vocs[] = $i;
|
||||
$i += $configVocationsAmount;
|
||||
if ($id !== 0) {
|
||||
$i = $id + $configVocationsAmount;
|
||||
while (isset($configVocations[$i])) {
|
||||
$add_vocs[] = $i;
|
||||
$i += $configVocationsAmount;
|
||||
}
|
||||
}
|
||||
|
||||
$query->whereIn('players.vocation', $add_vocs);
|
||||
@@ -175,12 +177,12 @@ if (empty($highscores)) {
|
||||
$query
|
||||
->join('player_skills', 'player_skills.player_id', '=', 'players.id')
|
||||
->where('skillid', $skill)
|
||||
->addSelect('player_skills.skillid as value');
|
||||
->addSelect('player_skills.value as value');
|
||||
}
|
||||
} else if ($skill == SKILL_FRAGS) // frags
|
||||
{
|
||||
if ($db->hasTable('player_killers')) {
|
||||
$query->addSelect(['value' => PlayerKillers::where('player_killers.player_id', 'players.id')->selectRaw('COUNT(*)')]);
|
||||
$query->addSelect(['value' => PlayerKillers::whereColumn('player_killers.player_id', 'players.id')->selectRaw('COUNT(*)')]);
|
||||
} else {
|
||||
$query->addSelect(['value' => PlayerDeath::unjustified()->whereColumn('player_deaths.killed_by', 'players.name')->selectRaw('COUNT(*)')]);
|
||||
}
|
||||
@@ -287,6 +289,7 @@ $twig->display('highscores.html.twig', [
|
||||
'skillName' => ($skill == SKILL_FRAGS ? 'Frags' : ($skill == SKILL_BALANCE ? 'Balance' : getSkillName($skill))),
|
||||
'levelName' => ($skill != SKILL_FRAGS && $skill != SKILL_BALANCE ? 'Level' : ($skill == SKILL_BALANCE ? 'Balance' : 'Frags')),
|
||||
'vocation' => $vocation !== 'all' ? $vocation : null,
|
||||
'vocationId' => $vocationId,
|
||||
'types' => $types,
|
||||
'linkPreviousPage' => $linkPreviousPage,
|
||||
'linkNextPage' => $linkNextPage,
|
||||
|
@@ -62,7 +62,9 @@ if ($monsterModel && isset($monsterModel->name)) {
|
||||
$elements = json_decode($monster['elements'], true);
|
||||
$immunities = json_decode($monster['immunities'], true);
|
||||
$loot = json_decode($monster['loot'], true);
|
||||
usort($loot, 'sort_by_chance');
|
||||
if (!empty($loot)) {
|
||||
usort($loot, 'sort_by_chance');
|
||||
}
|
||||
|
||||
foreach ($loot as &$item) {
|
||||
$item['name'] = getItemNameById($item['id']);
|
||||
|
@@ -50,8 +50,8 @@ if (setting('core.online_outfit')) {
|
||||
}
|
||||
}
|
||||
|
||||
$vocs = [];
|
||||
if (setting('core.online_vocations')) {
|
||||
$vocs = array();
|
||||
foreach($config['vocations'] as $id => $name) {
|
||||
$vocs[$id] = 0;
|
||||
}
|
||||
@@ -100,7 +100,7 @@ foreach($playersOnline as $player) {
|
||||
}
|
||||
|
||||
$record = '';
|
||||
if($players > 0) {
|
||||
if(count($players_data) > 0) {
|
||||
if( setting('core.online_record')) {
|
||||
$result = null;
|
||||
$timestamp = false;
|
||||
@@ -114,7 +114,7 @@ if($players > 0) {
|
||||
}
|
||||
}
|
||||
|
||||
if($record) {
|
||||
if($result) {
|
||||
$record = 'The maximum on this game world was ' . $result['record'] . ' players' . ($timestamp ? ' on ' . date("M d Y, H:i:s", $result['timestamp']) . '.' : '.');
|
||||
}
|
||||
}
|
||||
@@ -122,7 +122,8 @@ if($players > 0) {
|
||||
|
||||
$twig->display('online.html.twig', array(
|
||||
'players' => $players_data,
|
||||
'record' => $record
|
||||
'record' => $record,
|
||||
'vocs' => $vocs,
|
||||
));
|
||||
|
||||
//search bar
|
||||
|
@@ -279,7 +279,7 @@ else {
|
||||
$uri = str_replace_first('/', '', $uri);
|
||||
}
|
||||
|
||||
$page = $uri;
|
||||
$page = str_replace('index.php/', '', $uri);
|
||||
if (empty($page)) {
|
||||
$page = 'news';
|
||||
}
|
||||
|
@@ -11,12 +11,17 @@
|
||||
* - for number: min, max, step
|
||||
*/
|
||||
|
||||
use MyAAC\Cache;
|
||||
use MyAAC\Settings;
|
||||
|
||||
$templates = Cache::remember('templates', 5 * 60, function () {
|
||||
return get_templates();
|
||||
});
|
||||
$defaultTemplate = in_array('kathrine', $templates) ? 'kathrine' : $templates[0];
|
||||
|
||||
return [
|
||||
'name' => 'MyAAC',
|
||||
'settings' =>
|
||||
[
|
||||
'settings' => [
|
||||
[
|
||||
'type' => 'category',
|
||||
'title' => 'General'
|
||||
@@ -89,7 +94,7 @@ return [
|
||||
'type' => 'options',
|
||||
'options' => '$templates',
|
||||
'desc' => 'Name of the template used by website',
|
||||
'default' => 'kathrine',
|
||||
'default' => $defaultTemplate,
|
||||
],
|
||||
'template_allow_change' => [
|
||||
'name' => 'Template Allow Change',
|
||||
@@ -233,15 +238,14 @@ return [
|
||||
'name' => 'Client Version',
|
||||
'type' => 'options',
|
||||
'options' => '$clients',
|
||||
'desc' => 'what client version are you using on this OT?<br/>used for the Downloads page and some templates aswell',
|
||||
'desc' => 'what client version are you using on this OT?<br/>used for the Downloads page and some templates as well',
|
||||
'default' => 710
|
||||
],
|
||||
'towns' => [
|
||||
'name' => 'Towns',
|
||||
'type' => 'textarea',
|
||||
'desc' => "if you use TFS 1.3 with support for 'towns' table in database, then you can ignore this - it will be configured automatically (from MySQL database - Table - towns)<br/>" .
|
||||
"otherwise it will try to load from your .OTBM map file<br/>" .
|
||||
"if you don't see towns on website, then you need to fill this out",
|
||||
'desc' => "If you use TFS 1.3+ with support for 'towns' table in database, then you can ignore this - it will be automatically configured from there.<br/>" .
|
||||
"If you don't see towns on website, then you need to fill this out",
|
||||
'default' => "0=No Town\n1=Sample Town",
|
||||
'callbacks' => [
|
||||
'get' => function ($value) {
|
||||
@@ -394,6 +398,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',
|
||||
@@ -1374,7 +1385,7 @@ Sent by MyAAC,<br/>
|
||||
'name' => 'Item Images URL',
|
||||
'type' => 'text',
|
||||
'desc' => 'Set to <strong>images/items</strong> if you host your own items in images folder',
|
||||
'default' => 'http://item-images.ots.me/1092/',
|
||||
'default' => 'https://item-images.ots.me/1092/',
|
||||
],
|
||||
'item_images_extension' => [
|
||||
'name' => 'Item Images File Extension',
|
||||
@@ -1390,7 +1401,7 @@ Sent by MyAAC,<br/>
|
||||
'name' => 'Outfit Images URL',
|
||||
'type' => 'text',
|
||||
'desc' => 'Set to animoutfit.php for animated outfit',
|
||||
'default' => 'http://outfit-images.ots.me/outfit.php',
|
||||
'default' => 'https://outfit-images.ots.me/outfit.php',
|
||||
],
|
||||
'outfit_images_wrong_looktypes' => [
|
||||
'name' => 'Outfit Images Wrong Looktypes',
|
||||
@@ -1590,6 +1601,34 @@ Sent by MyAAC,<br/>
|
||||
'account_change_character_sex', '=', 'true',
|
||||
],
|
||||
],
|
||||
[
|
||||
'type' => 'category',
|
||||
'title' => 'Security',
|
||||
],
|
||||
[
|
||||
'type' => 'section',
|
||||
'title' => 'IP Ban Protection',
|
||||
],
|
||||
'account_login_ipban_protection' => [
|
||||
'name' => 'IP Ban Protection',
|
||||
'type' => 'boolean',
|
||||
'desc' => 'Activate IP ban protection after exceeding incorrect login attempts',
|
||||
'default' => true,
|
||||
],
|
||||
|
||||
'account_login_attempts_limit' => [
|
||||
'name' => 'Login Attempts Limit',
|
||||
'type' => 'number',
|
||||
'desc' => 'Number of incorrect login attempts before banning the IP',
|
||||
'default' => 5, // Ajuste conforme necessário
|
||||
],
|
||||
|
||||
'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
|
||||
],
|
||||
],
|
||||
'callbacks' => [
|
||||
'beforeSave' => function(&$settings, &$values) {
|
||||
@@ -1658,6 +1697,6 @@ Sent by MyAAC,<br/>
|
||||
|
||||
return $success;
|
||||
},
|
||||
],
|
||||
]
|
||||
];
|
||||
|
||||
|
5
system/src/Cache.php
Normal file
5
system/src/Cache.php
Normal file
@@ -0,0 +1,5 @@
|
||||
<?php
|
||||
|
||||
namespace MyAAC;
|
||||
|
||||
class Cache extends Cache\Cache {}
|
@@ -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()) {
|
||||
|
@@ -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();
|
||||
}
|
||||
}
|
||||
|
@@ -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.
|
||||
|
@@ -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') {
|
||||
|
@@ -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) {
|
||||
|
28
system/src/Commands/MigrateCommand.php
Normal file
28
system/src/Commands/MigrateCommand.php
Normal file
@@ -0,0 +1,28 @@
|
||||
<?php
|
||||
|
||||
namespace MyAAC\Commands;
|
||||
|
||||
use Symfony\Component\Console\Input\InputArgument;
|
||||
use Symfony\Component\Console\Input\InputInterface;
|
||||
use Symfony\Component\Console\Output\OutputInterface;
|
||||
use Symfony\Component\Console\Style\SymfonyStyle;
|
||||
|
||||
class MigrateCommand extends Command
|
||||
{
|
||||
protected function configure(): void
|
||||
{
|
||||
$this->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;
|
||||
}
|
||||
}
|
@@ -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');
|
||||
|
108
system/src/Commands/MigrateToCommand.php
Normal file
108
system/src/Commands/MigrateToCommand.php
Normal file
@@ -0,0 +1,108 @@
|
||||
<?php
|
||||
|
||||
namespace MyAAC\Commands;
|
||||
|
||||
use MyAAC\Models\Config;
|
||||
use POT;
|
||||
use Symfony\Component\Console\Input\InputArgument;
|
||||
use Symfony\Component\Console\Input\InputInterface;
|
||||
use Symfony\Component\Console\Output\OutputInterface;
|
||||
use Symfony\Component\Console\Style\SymfonyStyle;
|
||||
|
||||
class MigrateToCommand extends Command
|
||||
{
|
||||
protected function configure(): void
|
||||
{
|
||||
$this->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';
|
||||
}
|
||||
}
|
@@ -14,14 +14,16 @@ class PluginInstallCommand extends Command
|
||||
{
|
||||
$this->setName('plugin:install')
|
||||
->setDescription('This command installs plugin')
|
||||
->addArgument('plugin', InputArgument::REQUIRED, 'Path to zip file (plugin) that you want to install');
|
||||
->addArgument('pathToPluginZip', InputArgument::REQUIRED, 'Path to zip file (plugin) that you want to install');
|
||||
}
|
||||
|
||||
protected function execute(InputInterface $input, OutputInterface $output): int
|
||||
{
|
||||
require SYSTEM . 'init.php';
|
||||
|
||||
$io = new SymfonyStyle($input, $output);
|
||||
|
||||
$pathToFile = $input->getArgument('plugin');
|
||||
$pathToFile = $input->getArgument('pathToPluginZip');
|
||||
|
||||
$ext = strtolower(pathinfo($pathToFile, PATHINFO_EXTENSION));
|
||||
if($ext !== 'zip') {// check if it is zipped/compressed file
|
||||
|
@@ -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');
|
||||
|
@@ -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;
|
||||
}
|
||||
}
|
||||
|
@@ -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');
|
||||
|
@@ -23,32 +23,8 @@ class CreateCharacter
|
||||
*/
|
||||
public function checkName($name, &$errors)
|
||||
{
|
||||
$minLength = setting('core.create_character_name_min_length');
|
||||
$maxLength = setting('core.create_character_name_max_length');
|
||||
|
||||
if(empty($name)) {
|
||||
$errors['name'] = 'Please enter a name for your character!';
|
||||
return false;
|
||||
}
|
||||
|
||||
if(strlen($name) > $maxLength) {
|
||||
$errors['name'] = 'Name is too long. Max. length <b>' . $maxLength . '</b> letters.';
|
||||
return false;
|
||||
}
|
||||
|
||||
if(strlen($name) < $minLength) {
|
||||
$errors['name'] = 'Name is too short. Min. length <b>' . $minLength . '</b> letters.';
|
||||
return false;
|
||||
}
|
||||
|
||||
$name_length = strlen($name);
|
||||
if(strspn($name, "qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM- '") != $name_length) {
|
||||
$errors['name'] = 'This name contains invalid letters, words or format. Please use only a-Z, - , \' and space.';
|
||||
return false;
|
||||
}
|
||||
|
||||
if(!preg_match("/[A-z ']/", $name)) {
|
||||
$errors['name'] = 'Your name contains illegal characters.';
|
||||
if (!\Validator::characterName($name)) {
|
||||
$errors['name'] = \Validator::getLastError();
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -267,7 +243,7 @@ class CreateCharacter
|
||||
[
|
||||
'account' => $account,
|
||||
'player' => $player,
|
||||
'samplePlayer' => $playerSample,
|
||||
'playerSample' => $playerSample,
|
||||
'name' => $name,
|
||||
'sex' => $sex,
|
||||
'vocation' => $vocation,
|
||||
|
@@ -25,6 +25,9 @@
|
||||
|
||||
namespace MyAAC;
|
||||
|
||||
use MyAAC\Cache\Cache;
|
||||
use MyAAC\Models\Town;
|
||||
|
||||
class DataLoader
|
||||
{
|
||||
private static $locale;
|
||||
@@ -78,7 +81,13 @@ class DataLoader
|
||||
|
||||
self::$startTime = microtime(true);
|
||||
|
||||
if (Towns::save()) {
|
||||
$cache = Cache::getInstance();
|
||||
if ($cache->enabled()) {
|
||||
$cache->delete('towns'); // will be reloaded after next page load
|
||||
}
|
||||
|
||||
global $db;
|
||||
if ($db->hasTable('towns') && Town::count() > 0) {
|
||||
success(self::$locale['step_database_loaded_towns'] . self::getLoadedTime());
|
||||
}
|
||||
else {
|
||||
|
@@ -72,7 +72,7 @@ class Forum
|
||||
'post_smile' => 0, 'post_html' => 1,
|
||||
'post_date' => time(),
|
||||
'last_edit_aid' => 0, 'edit_date' => 0,
|
||||
'post_ip' => $_SERVER['REMOTE_ADDR']
|
||||
'post_ip' => get_browser_real_ip()
|
||||
))) {
|
||||
$thread_id = $db->lastInsertId();
|
||||
$db->query("UPDATE `" . FORUM_TABLE_PREFIX . "forum` SET `first_post`=".(int) $thread_id." WHERE `id` = ".(int) $thread_id);
|
||||
@@ -94,7 +94,7 @@ class Forum
|
||||
'post_smile' => $smile,
|
||||
'post_html' => $html,
|
||||
'post_date' => time(),
|
||||
'post_ip' => $_SERVER['REMOTE_ADDR']
|
||||
'post_ip' => get_browser_real_ip()
|
||||
));
|
||||
}
|
||||
public static function add_board($name, $description, $access, $guild, &$errors)
|
||||
|
30
system/src/Models/Forum.php
Normal file
30
system/src/Models/Forum.php
Normal file
@@ -0,0 +1,30 @@
|
||||
<?php
|
||||
|
||||
namespace MyAAC\Models;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
class Forum extends Model
|
||||
{
|
||||
protected $table = TABLE_PREFIX . 'forum';
|
||||
|
||||
public $timestamps = false;
|
||||
|
||||
protected $fillable = ['first_post', 'last_post', 'section', 'replies', 'views', 'author_aid', 'author_guid', 'post_text', 'post_topic', 'post_smile', 'post_html', 'post_date', 'last_edit_aid', 'edit_date', 'post_ip', 'sticked', 'closed'];
|
||||
|
||||
protected $casts = [
|
||||
'first_post' => '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'
|
||||
];
|
||||
}
|
@@ -5,7 +5,7 @@ use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
class PlayerKillers extends Model {
|
||||
|
||||
protected $table = 'players_killers';
|
||||
protected $table = 'player_killers';
|
||||
|
||||
public $timestamps = false;
|
||||
|
||||
|
@@ -37,17 +37,29 @@ class News
|
||||
if(!self::verify($title, $body, $article_text, $article_image, $errors))
|
||||
return false;
|
||||
|
||||
ModelsNews::create([
|
||||
'title' => $title,
|
||||
'body' => $body,
|
||||
'type' => $type,
|
||||
'date' => time(),
|
||||
'category' => $category,
|
||||
'player_id' => isset($player_id) ? $player_id : 0,
|
||||
$currentTime = time();
|
||||
|
||||
$params = [
|
||||
'title' => $title, 'body' => $body,
|
||||
'type' => $type, 'category' => $category,
|
||||
'date' => $currentTime,
|
||||
'player_id' => $player_id ?? 0,
|
||||
'comments' => $comments,
|
||||
'article_text' => ($type == 3 ? $article_text : ''),
|
||||
'article_image' => ($type == 3 ? $article_image : '')
|
||||
]);
|
||||
];
|
||||
|
||||
global $hooks;
|
||||
if (!$hooks->trigger(HOOK_ADMIN_NEWS_ADD_PRE, $params)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$newsModel = ModelsNews::create($params);
|
||||
|
||||
$hooks->trigger(HOOK_ADMIN_NEWS_ADD,
|
||||
$params + ['id' => $newsModel->id],
|
||||
);
|
||||
|
||||
self::clearCache();
|
||||
return true;
|
||||
}
|
||||
@@ -58,30 +70,55 @@ class News
|
||||
|
||||
static public function update($id, $title, $body, $type, $category, $player_id, $comments, $article_text, $article_image, &$errors)
|
||||
{
|
||||
if(!self::verify($title, $body, $article_text, $article_image, $errors))
|
||||
if(!self::verify($title, $body, $article_text, $article_image, $errors)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
ModelsNews::where('id', $id)->update([
|
||||
'title' => $title,
|
||||
'body' => $body,
|
||||
'type' => $type,
|
||||
'category' => $category,
|
||||
'last_modified_by' => isset($player_id) ? $player_id : 0,
|
||||
'last_modified_date' => time(),
|
||||
$currentTime = time();
|
||||
|
||||
$params = [
|
||||
'id' => $id,
|
||||
'title' => $title, 'body' => $body,
|
||||
'type' => $type, 'category' => $category,
|
||||
'last_modified_by' => $player_id ?? 0, 'last_modified_date' => $currentTime,
|
||||
'comments' => $comments,
|
||||
'article_text' => $article_text,
|
||||
'article_image' => $article_image
|
||||
]);
|
||||
'article_text' => ($type == 3 ? $article_text : ''),
|
||||
'article_image' => ($type == 3 ? $article_image : ''),
|
||||
];
|
||||
|
||||
global $hooks;
|
||||
if (!$hooks->trigger(HOOK_ADMIN_NEWS_UPDATE_PRE, $params)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
unset($params['id']);
|
||||
|
||||
ModelsNews::where('id', $id)->update($params);
|
||||
|
||||
$hooks->trigger(HOOK_ADMIN_NEWS_UPDATE,
|
||||
$params + ['id' => $id]
|
||||
);
|
||||
|
||||
self::clearCache();
|
||||
return true;
|
||||
}
|
||||
|
||||
static public function delete($id, &$errors)
|
||||
{
|
||||
global $hooks;
|
||||
|
||||
if(isset($id)) {
|
||||
$row = ModelsNews::find($id);
|
||||
if($row) {
|
||||
if (!$row->delete()) {
|
||||
$params = ['id' => $id];
|
||||
|
||||
if (!$hooks->trigger(HOOK_ADMIN_NEWS_DELETE_PRE, $params)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if ($row->delete()) {
|
||||
$hooks->trigger(HOOK_ADMIN_NEWS_DELETE, $params);
|
||||
} else {
|
||||
$errors[] = 'Fail during delete News.';
|
||||
}
|
||||
}
|
||||
@@ -103,22 +140,35 @@ class News
|
||||
|
||||
static public function toggleHide($id, &$errors, &$status)
|
||||
{
|
||||
if(isset($id))
|
||||
{
|
||||
global $hooks;
|
||||
|
||||
if(isset($id)) {
|
||||
$row = ModelsNews::find($id);
|
||||
if($row)
|
||||
{
|
||||
$row->hide = $row->hide == 1 ? 0 : 1;
|
||||
if (!$row->save()) {
|
||||
if($row) {
|
||||
$row->hide = ($row->hide == 1 ? 0 : 1);
|
||||
|
||||
$params = ['hide' => $row->hide];
|
||||
|
||||
if (!$hooks->trigger(HOOK_ADMIN_NEWS_TOGGLE_HIDE_PRE, $params)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if ($row->save()) {
|
||||
$hooks->trigger(HOOK_ADMIN_NEWS_TOGGLE_HIDE, $params);
|
||||
}
|
||||
else {
|
||||
$errors[] = 'Fail during toggle hide News.';
|
||||
}
|
||||
|
||||
$status = $row->hide;
|
||||
}
|
||||
else
|
||||
else {
|
||||
$errors[] = 'News with id ' . $id . ' does not exists.';
|
||||
}
|
||||
}
|
||||
else
|
||||
else {
|
||||
$errors[] = 'News id not set.';
|
||||
}
|
||||
|
||||
if(count($errors)) {
|
||||
return false;
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user