mirror of
https://github.com/slawkens/myaac.git
synced 2026-04-23 02:43:31 +02:00
Merge branch 'develop' into blacktek-toml
This commit is contained in:
@@ -20,7 +20,7 @@ $locale['not_loaded'] = 'Nicht geladen';
|
||||
$locale['loading_spinner'] = 'Bitte warten, installieren...';
|
||||
$locale['importing_spinner'] = 'Bitte warte, Daten werden importiert...';
|
||||
$locale['please_fill_all'] = 'Bitte füllen Sie alle Felder aus!';
|
||||
$locale['already_installed'] = 'MyAAC wurde bereits installiert. Bitte löschen <b>install/</b> Verzeichnis. Wenn Sie MyAAC neu installieren möchten, löschen Sie die Datei <strong>config.local.php</strong> aus dem Hauptverzeichnis und aktualisieren Sie die Seite.';
|
||||
$locale['already_installed'] = 'MyAAC wurde bereits installiert. Wenn Sie MyAAC neu installieren möchten, löschen Sie die Datei <strong>config.local.php</strong> aus dem Hauptverzeichnis und aktualisieren Sie die Seite.';
|
||||
|
||||
// welcome
|
||||
$locale['step_welcome'] = 'Willkommen';
|
||||
|
||||
@@ -20,7 +20,7 @@ $locale['not_loaded'] = 'Not loaded';
|
||||
$locale['loading_spinner'] = 'Please wait, installing...';
|
||||
$locale['importing_spinner'] = 'Please wait, importing data...';
|
||||
$locale['please_fill_all'] = 'Please fill all inputs!';
|
||||
$locale['already_installed'] = 'MyAAC has been already installed. Please delete <b>install/</b> directory. If you want to reinstall MyAAC - please delete <strong>config.local.php</strong> file from the main directory and refresh the page.';
|
||||
$locale['already_installed'] = 'MyAAC has been already installed. If you want to reinstall MyAAC - please delete <strong>config.local.php</strong> file from the main directory and refresh the page.';
|
||||
|
||||
// welcome
|
||||
$locale['step_welcome'] = 'Welcome';
|
||||
|
||||
@@ -20,7 +20,7 @@ $locale['not_loaded'] = 'Nie załadowane';
|
||||
$locale['loading_spinner'] = 'Proszę czekać, trwa instalacja...';
|
||||
$locale['importing_spinner'] = 'Proszę czekać, trwa importowanie danych...';
|
||||
$locale['please_fill_all'] = 'Proszę wypełnić wszystkie pola!';
|
||||
$locale['already_installed'] = 'MyAAC został już zainstalowany. Proszę usunąć katalog <b>install/</b>. Jeśli chcesz zainstalować MyAAC od nowa - proszę usuń plik <strong>config.local.php</strong> z katalogu głównego i odśwież stronę.';
|
||||
$locale['already_installed'] = 'MyAAC został już zainstalowany. Jeśli chcesz zainstalować MyAAC od nowa - proszę usuń plik <strong>config.local.php</strong> z katalogu głównego i odśwież stronę.';
|
||||
|
||||
// welcome
|
||||
$locale['step_welcome'] = 'Witamy';
|
||||
|
||||
@@ -20,7 +20,7 @@ $locale['not_loaded'] = 'Não carregado';
|
||||
$locale['loading_spinner'] = 'Por favor aguarde, instalando...';
|
||||
$locale['importing_spinner'] = 'Por favor, aguarde, importando dados...';
|
||||
$locale['please_fill_all'] = 'Por favor, preencha todas as entradas!';
|
||||
$locale['already_installed'] = 'MyAAC já foi instalado. Por favor, apague o diretório <b> install/ <b/>. Se você quiser reinstalar o MyAAC - exclua o arquivo <strong> config.local.php </strong> do diretório principal e atualize a página.';
|
||||
$locale['already_installed'] = 'MyAAC já foi instalado. Se você quiser reinstalar o MyAAC - exclua o arquivo <strong> config.local.php </strong> do diretório principal e atualize a página.';
|
||||
|
||||
// welcome
|
||||
$locale['step_welcome'] = 'Bem vindo';
|
||||
|
||||
@@ -18,7 +18,7 @@ $locale['loaded'] = 'Laddad';
|
||||
$locale['not_loaded'] = 'Inte Laddad';
|
||||
|
||||
$locale['please_fill_all'] = 'Vänligen fyll i allt!';
|
||||
$locale['already_installed'] = 'MyAAC är redan installerat. Vänligen ta bort <b>install/<b/> mappen. Om du vill installera MyAAC igen - ta bort filen <strong>config.local.php</strong> från huvudkatalogen och uppdatera sidan.';
|
||||
$locale['already_installed'] = 'MyAAC är redan installerat. Om du vill installera MyAAC igen - ta bort filen <strong>config.local.php</strong> från huvudkatalogen och uppdatera sidan.';
|
||||
|
||||
// welcome
|
||||
$locale['step_welcome'] = 'Välkommen';
|
||||
|
||||
10
system/migrations/51.php
Normal file
10
system/migrations/51.php
Normal file
@@ -0,0 +1,10 @@
|
||||
<?php
|
||||
|
||||
$up = function () use ($db) {
|
||||
$db->modifyColumn(TABLE_PREFIX . 'config', 'name', "varchar(255) NOT NULL");
|
||||
$db->modifyColumn(TABLE_PREFIX . 'config', 'value', "varchar(10000) NOT NULL");
|
||||
};
|
||||
|
||||
$down = function () {
|
||||
// nothing to do, to not lose data
|
||||
};
|
||||
13
system/migrations/52.php
Normal file
13
system/migrations/52.php
Normal file
@@ -0,0 +1,13 @@
|
||||
<?php
|
||||
/**
|
||||
* 2026-04-12
|
||||
* Add indexes to myaac_account_actions table
|
||||
*/
|
||||
$up = function () use ($db) {
|
||||
$db->query("CREATE INDEX `myaac_account_actions_account_id` ON `myaac_account_actions` (`account_id`);");
|
||||
$db->query("CREATE INDEX `myaac_account_actions_ip` ON `myaac_account_actions` (`ip`);");
|
||||
};
|
||||
|
||||
$down = function () {
|
||||
// nothing to do, to not lose data
|
||||
};
|
||||
@@ -171,7 +171,7 @@ if($save)
|
||||
}
|
||||
|
||||
if(setting('core.account_create_character_create')) {
|
||||
$character_name = isset($_POST['name']) ? stripslashes(ucwords(strtolower($_POST['name']))) : null;
|
||||
$character_name = isset($_POST['name']) ? trim(stripslashes($_POST['name'])) : null;
|
||||
$character_sex = isset($_POST['sex']) ? (int)$_POST['sex'] : null;
|
||||
$character_vocation = isset($_POST['vocation']) ? (int)$_POST['vocation'] : null;
|
||||
$character_town = isset($_POST['town']) ? (int)$_POST['town'] : null;
|
||||
|
||||
@@ -39,7 +39,7 @@ class GiveAdminCommand extends Command
|
||||
}
|
||||
|
||||
if (!$account->isLoaded()) {
|
||||
$io->error('Cannot find account mit supplied parameter: ' . $accountParam);
|
||||
$io->error('Cannot find account with supplied parameter: ' . $accountParam);
|
||||
return self::FAILURE;
|
||||
}
|
||||
|
||||
|
||||
@@ -14,6 +14,26 @@ class Hooks
|
||||
self::$_hooks[$hook->type()][] = $hook;
|
||||
}
|
||||
|
||||
public function unregister($name, $type, $file): void
|
||||
{
|
||||
if (is_string($type)) {
|
||||
$type = constant($type);
|
||||
}
|
||||
|
||||
if(!isset(self::$_hooks[$type])) {
|
||||
return;
|
||||
}
|
||||
|
||||
foreach(self::$_hooks[$type] as $id => $hook) {
|
||||
if($name == $hook->name()
|
||||
&& $type == $hook->type()
|
||||
&& $file == $hook->file()
|
||||
) {
|
||||
unset(self::$_hooks[$type][$id]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public function trigger($type, $params = []): bool
|
||||
{
|
||||
$ret = true;
|
||||
|
||||
@@ -18,6 +18,15 @@ class Account extends Model {
|
||||
|
||||
public $timestamps = false;
|
||||
|
||||
protected $fillable = [
|
||||
'name', 'number', 'email', 'password',
|
||||
'key', 'created', 'rlname', 'location', 'country',
|
||||
'web_lastlogin', 'web_flags',
|
||||
'email_new', 'email_new_time', 'email_code',
|
||||
'premium_points', 'coins', 'coins_transferable',
|
||||
'premium_ends_at', 'premend', 'lastday', 'premdays',
|
||||
];
|
||||
|
||||
protected $casts = [
|
||||
'lastday' => 'integer',
|
||||
'premdays' => 'integer',
|
||||
|
||||
@@ -1,15 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace MyAAC\Models;
|
||||
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
class BugTracker extends Model {
|
||||
|
||||
protected $table = TABLE_PREFIX . 'bugtracker';
|
||||
|
||||
public $timestamps = false;
|
||||
|
||||
protected $fillable = ['account', 'type', 'status', 'text', 'id', 'subject', 'reply', 'who', 'uid', 'tag'];
|
||||
|
||||
}
|
||||
@@ -7,9 +7,11 @@ use MyAAC\Cache\Cache;
|
||||
use MyAAC\Models\Menu;
|
||||
|
||||
class Plugins {
|
||||
private static $warnings = [];
|
||||
private static $error = null;
|
||||
private static $plugin_json = [];
|
||||
private static array $warnings = [];
|
||||
private static string $error = '';
|
||||
private static array $plugin_json = [];
|
||||
|
||||
const DEFAULT_PRIORITY = 1000;
|
||||
|
||||
public static function getInits()
|
||||
{
|
||||
@@ -20,13 +22,31 @@ class Plugins {
|
||||
continue;
|
||||
}
|
||||
|
||||
$initPriority = self::DEFAULT_PRIORITY;
|
||||
if (isset($plugin['autoload']['init-priority'])) {
|
||||
$initPriority = (int) $plugin['autoload']['init-priority'];
|
||||
}
|
||||
|
||||
$pluginInits = glob(PLUGINS . $plugin['filename'] . '/init.php');
|
||||
foreach ($pluginInits as $path) {
|
||||
$inits[] = $path;
|
||||
$inits[] = [
|
||||
'file' => $path,
|
||||
'priority' => $initPriority
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
return $inits;
|
||||
usort($inits, function ($a, $b)
|
||||
{
|
||||
return $a['priority'] <=> $b['priority'];
|
||||
});
|
||||
|
||||
$ret = [];
|
||||
foreach ($inits as $init) {
|
||||
$ret[] = $init['file'];
|
||||
}
|
||||
|
||||
return $ret;
|
||||
});
|
||||
}
|
||||
|
||||
@@ -39,7 +59,7 @@ class Plugins {
|
||||
continue;
|
||||
}
|
||||
|
||||
$adminPagesDefaultPriority = 1000;
|
||||
$adminPagesDefaultPriority = self::DEFAULT_PRIORITY;
|
||||
if (isset($plugin['admin-pages-default-priority'])) {
|
||||
$adminPagesDefaultPriority = $plugin['admin-pages-default-priority'];
|
||||
}
|
||||
@@ -117,7 +137,7 @@ class Plugins {
|
||||
|
||||
$routes = [];
|
||||
foreach(self::getAllPluginsJson() as $plugin) {
|
||||
$routesDefaultPriority = 1000;
|
||||
$routesDefaultPriority = self::DEFAULT_PRIORITY;
|
||||
if (isset($plugin['routes-default-priority'])) {
|
||||
$routesDefaultPriority = $plugin['routes-default-priority'];
|
||||
}
|
||||
@@ -165,7 +185,7 @@ class Plugins {
|
||||
}
|
||||
}
|
||||
|
||||
$pagesDefaultPriority = 1000;
|
||||
$pagesDefaultPriority = self::DEFAULT_PRIORITY;
|
||||
if (isset($plugin['pages-default-priority'])) {
|
||||
$pagesDefaultPriority = $plugin['pages-default-priority'];
|
||||
}
|
||||
@@ -318,7 +338,7 @@ class Plugins {
|
||||
foreach(self::getAllPluginsJson() as $plugin) {
|
||||
if (isset($plugin['hooks'])) {
|
||||
foreach ($plugin['hooks'] as $_name => $info) {
|
||||
$priority = 1000;
|
||||
$priority = self::DEFAULT_PRIORITY;
|
||||
|
||||
if (str_contains($info['type'], 'HOOK_')) {
|
||||
$info['type'] = str_replace('HOOK_', '', $info['type']);
|
||||
@@ -432,7 +452,7 @@ class Plugins {
|
||||
return $plugins;
|
||||
}
|
||||
|
||||
public static function getPluginSettings($filename)
|
||||
public static function getPluginSettings($filename): mixed
|
||||
{
|
||||
$plugin_json = self::getPluginJson($filename);
|
||||
if (!$plugin_json) {
|
||||
@@ -868,6 +888,11 @@ class Plugins {
|
||||
}
|
||||
}
|
||||
|
||||
global $hooks;
|
||||
foreach($plugin_info['hooks'] ?? [] as $name => $info) {
|
||||
$hooks->unregister($name, $info['type'], $info['file']);
|
||||
}
|
||||
|
||||
clearCache();
|
||||
return true;
|
||||
}
|
||||
@@ -892,15 +917,15 @@ class Plugins {
|
||||
return Semver::satisfies($plugin_info['version'], $version);
|
||||
}
|
||||
|
||||
public static function getWarnings() {
|
||||
public static function getWarnings(): array {
|
||||
return self::$warnings;
|
||||
}
|
||||
|
||||
public static function clearWarnings() {
|
||||
public static function clearWarnings(): void {
|
||||
self::$warnings = [];
|
||||
}
|
||||
|
||||
public static function getError() {
|
||||
public static function getError(): string {
|
||||
return self::$error;
|
||||
}
|
||||
|
||||
@@ -911,7 +936,7 @@ class Plugins {
|
||||
* @param string $templateName
|
||||
* @param array $menus
|
||||
*/
|
||||
public static function installMenus($templateName, $menus, $clearOld = false)
|
||||
public static function installMenus($templateName, $menus, $clearOld = false): void
|
||||
{
|
||||
global $db;
|
||||
|
||||
@@ -962,7 +987,7 @@ class Plugins {
|
||||
}
|
||||
}
|
||||
|
||||
private static function getAutoLoadOption(array $plugin, string $optionName, bool $default = true)
|
||||
private static function getAutoLoadOption(array $plugin, string $optionName, bool $default = true): bool
|
||||
{
|
||||
if (isset($plugin['autoload'])) {
|
||||
$autoload = $plugin['autoload'];
|
||||
@@ -971,7 +996,7 @@ class Plugins {
|
||||
return getBoolean($autoload[$optionName]);
|
||||
}
|
||||
}
|
||||
else if (is_bool($autoload)) {
|
||||
elseif (is_bool($autoload)) {
|
||||
return $autoload;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -367,6 +367,7 @@ class Settings implements \ArrayAccess
|
||||
</div>
|
||||
<div class="box-footer">
|
||||
<button name="save" type="submit" class="btn btn-primary">Save</button>
|
||||
<button form="reset-settings-form" name="reset" type="submit" class="btn btn-warning position-absolute" style="right: 0; bottom: 0" onclick="return confirm('Are you sure? This will clear all settings for this plugin!')">Reset</button>
|
||||
</div>
|
||||
<?php
|
||||
|
||||
|
||||
@@ -183,7 +183,7 @@ class Validator
|
||||
return false;
|
||||
}
|
||||
|
||||
// installer doesn't know config.php yet
|
||||
// installer doesn't know settings yet
|
||||
// that's why we need to ignore the nulls
|
||||
if(defined('MYAAC_INSTALL')) {
|
||||
$minLength = 4;
|
||||
@@ -207,21 +207,15 @@ class Validator
|
||||
return false;
|
||||
}
|
||||
|
||||
if(strspn($name, "qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM- [ ] '") != $length)
|
||||
if(strspn($name, "qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM ") != $length)
|
||||
{
|
||||
self::$lastError = "Invalid name format. Use only A-Z, spaces and '.";
|
||||
self::$lastError = "This name contains invalid letters. Please use only A-Z, a-z and space!";
|
||||
return false;
|
||||
}
|
||||
|
||||
if(preg_match('/ {2,}/', $name))
|
||||
{
|
||||
self::$lastError = 'Invalid character name format. Use only A-Z and no double spaces.';
|
||||
return false;
|
||||
}
|
||||
|
||||
if(!preg_match("/[A-z ']/", $name))
|
||||
{
|
||||
self::$lastError = "Invalid name format. Use only A-Z, spaces and '.";
|
||||
self::$lastError = 'Invalid character name format. Use only A-Z, a-z and no double spaces.';
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -230,17 +224,23 @@ class Validator
|
||||
|
||||
/**
|
||||
* Validate new character name.
|
||||
* Name lenght must be 3-25 chars
|
||||
* Name length must be 3-25 chars
|
||||
*
|
||||
* @param string $name Name to check
|
||||
* @return bool Is name valid?
|
||||
*/
|
||||
public static function newCharacterName($name)
|
||||
{
|
||||
global $db, $config;
|
||||
global $db;
|
||||
|
||||
$name = trim($name);
|
||||
$name_lower = strtolower($name);
|
||||
|
||||
if(strlen($name) < 1) {
|
||||
self::$lastError = 'Please enter a name.';
|
||||
return false;
|
||||
}
|
||||
|
||||
$first_words_blocked = array_merge(["'", '-'], setting('core.create_character_name_blocked_prefix'));
|
||||
foreach($first_words_blocked as $word) {
|
||||
if($word == substr($name_lower, 0, strlen($word))) {
|
||||
@@ -249,11 +249,6 @@ class Validator
|
||||
}
|
||||
}
|
||||
|
||||
if(str_ends_with($name_lower, "'") || str_ends_with($name_lower, "-")) {
|
||||
self::$lastError = 'Your name contains illegal characters.';
|
||||
return false;
|
||||
}
|
||||
|
||||
if(substr($name_lower, 1, 1) == ' ') {
|
||||
self::$lastError = 'Your name contains illegal space.';
|
||||
return false;
|
||||
@@ -265,11 +260,36 @@ class Validator
|
||||
}
|
||||
|
||||
if(preg_match('/ {2,}/', $name)) {
|
||||
self::$lastError = 'Invalid character name format. Use only A-Z and numbers 0-9 and no double spaces.';
|
||||
self::$lastError = 'Invalid character name format. Use only A-Z and no double spaces.';
|
||||
return false;
|
||||
}
|
||||
|
||||
if(strtolower($config['lua']['serverName']) == $name_lower) {
|
||||
if (substr($name[0], 0, 1) !== strtoupper(substr($name[0], 0, 1))) {
|
||||
self::$lastError = 'The first letter of a name has to be a capital letter.';
|
||||
return false;
|
||||
}
|
||||
|
||||
foreach (explode(' ', $name) as $word) {
|
||||
$wordCut = substr($word, 1, strlen($word));
|
||||
$hasUpperCase = preg_match('/[A-Z]/', $wordCut);
|
||||
if ($hasUpperCase) {
|
||||
self::$lastError = 'In names capital letters are only allowed at the beginning of a word.';
|
||||
return false;
|
||||
}
|
||||
|
||||
if (strlen($word) == 1) {
|
||||
self::$lastError = 'This name contains a word with only one letter. Please use more than one letter for each word.';
|
||||
return false;
|
||||
}
|
||||
|
||||
$hasVowel = preg_match('/[aeiouAEIOU]/', $word);
|
||||
if (!$hasVowel) {
|
||||
self::$lastError = 'This name contains a word without vowels. Please choose another name.';
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if(strtolower(configLua('serverName')) == $name_lower) {
|
||||
self::$lastError = 'Your name cannot be same as server name.';
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -9,7 +9,10 @@
|
||||
<div class="box">
|
||||
<div class="box-body">
|
||||
<button name="save" type="submit" class="btn btn-primary">Save</button>
|
||||
|
||||
<button form="reset-settings-form" name="reset" type="submit" class="btn btn-warning position-absolute" style="right: 0; top: 0" onclick="return confirm('Are you sure? This will clear all settings for this plugin!')">Reset</button>
|
||||
</div>
|
||||
|
||||
<br/>
|
||||
{{ settingsParsed|raw }}
|
||||
</div>
|
||||
@@ -18,6 +21,12 @@
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<form id="reset-settings-form" method="post" action="{{ constant('ADMIN_URL') }}?p=settings&plugin={{ pluginName }}">
|
||||
{{ csrf() }}
|
||||
<input type="hidden" name="reset" value="1">
|
||||
</form>
|
||||
|
||||
<style>
|
||||
.setting-default {
|
||||
white-space: pre-wrap;
|
||||
@@ -95,12 +104,12 @@
|
||||
.on('change input', function(){
|
||||
const disable = $(this).serialize() === $(this).data('serialized');
|
||||
$(this)
|
||||
.find('input:submit, button:submit')
|
||||
.find('button[name="save"]')
|
||||
.prop('disabled', disable)
|
||||
.prop('title', disable ? noChangesText : '')
|
||||
;
|
||||
})
|
||||
.find('input:submit, button:submit')
|
||||
.find('button[name="save"]')
|
||||
.prop('disabled', true)
|
||||
.prop('title', noChangesText)
|
||||
;
|
||||
@@ -123,7 +132,7 @@
|
||||
let $settings = $('#settings');
|
||||
$settings.data('serialized', $settings.serialize());
|
||||
$settings
|
||||
.find('input:submit, button:submit')
|
||||
.find('button[name="save"]')
|
||||
.prop('disabled', true)
|
||||
.prop('title', noChangesText);
|
||||
},
|
||||
|
||||
Reference in New Issue
Block a user