mirror of
https://github.com/slawkens/myaac.git
synced 2025-09-14 12:33:35 +02:00
Compare commits
1 Commits
feature/re
...
feature/el
Author | SHA1 | Date | |
---|---|---|---|
![]() |
998e15cabd |
98
.github/workflows/cypress.yml
vendored
98
.github/workflows/cypress.yml
vendored
@@ -22,9 +22,8 @@ jobs:
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
php-versions: [ '8.1', '8.2', '8.3' ]
|
||||
ots: ['tfs-1.4', 'canary-3.1.2'] # TODO: add 'tfs-master' (actually doesn't work cause AAC doesn't support reading .env configuration)
|
||||
name: Cypress (PHP ${{ matrix.php-versions }}, ${{ matrix.ots }})
|
||||
php-versions: [ '7.4', '8.0', '8.1' ]
|
||||
name: MyAAC on PHP ${{ matrix.php-versions }}
|
||||
steps:
|
||||
- name: 📌 MySQL Start & init & show db
|
||||
run: |
|
||||
@@ -33,81 +32,47 @@ jobs:
|
||||
mysql -e "SHOW DATABASES" -uroot -proot
|
||||
|
||||
- name: Checkout MyAAC
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v3
|
||||
with:
|
||||
ref: develop
|
||||
|
||||
- uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: 18
|
||||
- run: npm ci
|
||||
ref: 0.9
|
||||
|
||||
- name: Checkout TFS
|
||||
uses: actions/checkout@v4
|
||||
if: matrix.ots == 'tfs-1.4'
|
||||
uses: actions/checkout@v3
|
||||
with:
|
||||
repository: otland/forgottenserver
|
||||
ref: 1.4
|
||||
path: ots
|
||||
path: tfs
|
||||
|
||||
- name: Checkout TFS
|
||||
uses: actions/checkout@v4
|
||||
if: matrix.ots == 'tfs-master'
|
||||
with:
|
||||
repository: otland/forgottenserver
|
||||
ref: master
|
||||
path: ots
|
||||
|
||||
- name: Checkout Canary
|
||||
uses: actions/checkout@v4
|
||||
if: matrix.ots == 'canary-3.1.2'
|
||||
with:
|
||||
repository: opentibiabr/canary
|
||||
ref: v3.1.2
|
||||
path: ots
|
||||
|
||||
- name: Import OTS Schema
|
||||
- name: Import TFS Schema
|
||||
run: |
|
||||
mysql -uroot -proot myaac < ots/schema.sql
|
||||
mysql -uroot -proot myaac < tfs/schema.sql
|
||||
|
||||
- name: Rename config.lua
|
||||
run: mv ots/config.lua.dist ots/config.lua
|
||||
run: mv tfs/config.lua.dist tfs/config.lua
|
||||
|
||||
- name: Replace mysqlUser (TFS 1.4)
|
||||
uses: jacobtomlinson/gha-find-replace@v3
|
||||
if: matrix.ots == 'tfs-1.4'
|
||||
- name: Replace mysqlUser
|
||||
uses: jacobtomlinson/gha-find-replace@v2
|
||||
with:
|
||||
find: 'mysqlUser = "forgottenserver"'
|
||||
replace: 'mysqlUser = "root"'
|
||||
regex: false
|
||||
include: 'ots/config.lua'
|
||||
include: 'tfs/config.lua'
|
||||
|
||||
- name: Replace mysqlPass (TFS 1.4)
|
||||
uses: jacobtomlinson/gha-find-replace@v3
|
||||
if: matrix.ots == 'tfs-1.4'
|
||||
- name: Replace mysqlPass
|
||||
uses: jacobtomlinson/gha-find-replace@v2
|
||||
with:
|
||||
find: 'mysqlPass = ""'
|
||||
replace: 'mysqlPass = "root"'
|
||||
regex: false
|
||||
include: 'ots/config.lua'
|
||||
include: 'tfs/config.lua'
|
||||
|
||||
- name: Replace mysqlDatabase (TFS 1.4)
|
||||
uses: jacobtomlinson/gha-find-replace@v3
|
||||
if: matrix.ots == 'tfs-1.4'
|
||||
- name: Replace mysqlDatabase
|
||||
uses: jacobtomlinson/gha-find-replace@v2
|
||||
with:
|
||||
find: 'mysqlDatabase = "forgottenserver"'
|
||||
replace: 'mysqlDatabase = "myaac"'
|
||||
regex: false
|
||||
include: 'ots/config.lua'
|
||||
|
||||
- name: Replace mysqlDatabase (Canary)
|
||||
uses: jacobtomlinson/gha-find-replace@v3
|
||||
if: matrix.ots == 'canary-3.1.2'
|
||||
with:
|
||||
find: 'mysqlDatabase = "otservbr-global"'
|
||||
replace: 'mysqlDatabase = "myaac"'
|
||||
regex: false
|
||||
include: 'ots/config.lua'
|
||||
include: 'tfs/config.lua'
|
||||
|
||||
- name: Setup PHP
|
||||
uses: shivammathur/setup-php@v2
|
||||
@@ -120,13 +85,13 @@ jobs:
|
||||
run: echo "dir=$(composer config cache-files-dir)" >> $GITHUB_OUTPUT
|
||||
|
||||
- name: Cache composer dependencies
|
||||
uses: actions/cache@v4
|
||||
uses: actions/cache@v3
|
||||
with:
|
||||
path: ${{ steps.composer-cache.outputs.dir }}
|
||||
# Use composer.json for key, if composer.lock is not committed.
|
||||
key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }}
|
||||
#key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}
|
||||
restore-keys: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }}
|
||||
# key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }}
|
||||
key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}
|
||||
restore-keys: ${{ runner.os }}-composer-
|
||||
|
||||
- name: Install Composer dependencies
|
||||
run: composer install --no-progress --prefer-dist --optimize-autoloader
|
||||
@@ -135,28 +100,21 @@ jobs:
|
||||
run: nohup php -S localhost:8080 > php.log 2>&1 &
|
||||
|
||||
- name: Cypress Run
|
||||
uses: cypress-io/github-action@v6
|
||||
uses: cypress-io/github-action@v5
|
||||
env:
|
||||
CYPRESS_URL: http://localhost:8080
|
||||
CYPRESS_SERVER_PATH: /home/runner/work/myaac/myaac/ots
|
||||
CYPRESS_SERVER_PATH: /home/runner/work/myaac/myaac/tfs
|
||||
|
||||
- name: Save screenshots
|
||||
uses: actions/upload-artifact@v4
|
||||
uses: actions/upload-artifact@v3
|
||||
if: always()
|
||||
with:
|
||||
name: cypress-screenshots-${{ matrix.php-versions }}-${{ matrix.ots }}
|
||||
name: cypress-screenshots
|
||||
path: cypress/screenshots
|
||||
|
||||
- name: Upload Cypress Videos
|
||||
uses: actions/upload-artifact@v4
|
||||
uses: actions/upload-artifact@v3
|
||||
if: always()
|
||||
with:
|
||||
name: cypress-videos-${{ matrix.php-versions }}-${{ matrix.ots }}
|
||||
name: cypress-videos
|
||||
path: cypress/videos
|
||||
|
||||
- name: Upload PHP Logs
|
||||
uses: actions/upload-artifact@v4
|
||||
if: always()
|
||||
with:
|
||||
name: php-log-${{ matrix.php-versions }}-${{ matrix.ots }}
|
||||
path: php.log
|
||||
|
46
.github/workflows/phpstan.yml
vendored
46
.github/workflows/phpstan.yml
vendored
@@ -1,46 +0,0 @@
|
||||
name: "PHPStan"
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
branches: [develop]
|
||||
push:
|
||||
branches: [develop]
|
||||
|
||||
jobs:
|
||||
tests:
|
||||
name: PhpStan on PHP ${{ matrix.php-versions }}
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
php-versions: [ '8.1', '8.2', '8.3' ]
|
||||
steps:
|
||||
- name: "Checkout"
|
||||
uses: "actions/checkout@v4"
|
||||
|
||||
- name: "Install PHP"
|
||||
uses: "shivammathur/setup-php@v2"
|
||||
with:
|
||||
coverage: "none"
|
||||
extensions: "intl, zip"
|
||||
ini-values: "memory_limit=-1"
|
||||
php-version: "${{ matrix.php-version }}"
|
||||
|
||||
- name: Get composer cache directory
|
||||
id: composer-cache
|
||||
run: echo "dir=$(composer config cache-files-dir)" >> $GITHUB_OUTPUT
|
||||
|
||||
- name: Cache composer dependencies
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: ${{ steps.composer-cache.outputs.dir }}
|
||||
# Use composer.json for key, if composer.lock is not committed.
|
||||
key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}
|
||||
restore-keys: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}
|
||||
|
||||
- name: "Install composer dependencies"
|
||||
run: "composer install"
|
||||
|
||||
- name: "Run PHPStan"
|
||||
run: "/usr/bin/php vendor/bin/phpstan analyse"
|
4
.gitignore
vendored
4
.gitignore
vendored
@@ -6,17 +6,15 @@ Thumbs.db
|
||||
/.htaccess
|
||||
|
||||
# composer
|
||||
composer.phar
|
||||
composer.lock
|
||||
vendor
|
||||
|
||||
# npm
|
||||
node_modules
|
||||
tools/ext
|
||||
|
||||
# cypress
|
||||
cypress.env.json
|
||||
cypress/e2e/2-advanced-examples
|
||||
cypress/screenshots
|
||||
|
||||
# created by release.sh
|
||||
releases
|
||||
|
56
CHANGELOG.md
56
CHANGELOG.md
@@ -1,38 +1,8 @@
|
||||
# Changelog
|
||||
|
||||
## [1.0-RC -23.07.2024]
|
||||
## [0.9.0-alpha - 02.06.2023]
|
||||
|
||||
Changes since 1.0-beta:
|
||||
|
||||
### Added
|
||||
* Feat: Hooks priority (https://github.com/slawkens/myaac/commit/dc17b701da053e04bfa64e21be9247a4f07505e1)
|
||||
* Make autoload of pages, commands and themes configurable (https://github.com/slawkens/myaac/commit/c1d4b4f80cd6bb85507ee9471e47013955a26a91)
|
||||
* Fraggers in characters page for TFS 1.x and canary (https://github.com/slawkens/myaac/commit/42f99c3edc8de39cccc5632cb42e88b24579c5a6)
|
||||
* New hooks: HOOK_INSTALL_FINISH, HOOK_ACCOUNT_CREATE_CHARACTER_* (https://github.com/slawkens/myaac/commit/08ac8ebade106521a5c7396faa5ce7006e629f7c, https://github.com/slawkens/myaac/commit/45dda5e834ff2059faea6ef9be2efa76f1723cbd)
|
||||
|
||||
### Changed
|
||||
* Allow account_create_character_create even if account_mail_verify is activated (https://github.com/slawkens/myaac/commit/203e411b626fe62401a4b74a48420769e512aa39)
|
||||
* Create guild_rank entries, in case MySQL trigger not loaded (https://github.com/slawkens/myaac/commit/d9c1b2507c81f306970642b35e4bf5f7cc04a6f2, https://github.com/slawkens/myaac/commit/47a19e85dd84e9f3b39a1b29cfc2c04b004832b9)
|
||||
* Set Admin Account verified by default (https://github.com/slawkens/myaac/commit/cd49dfc79942f3301ce9c0b8d899b9f39bda9a41)
|
||||
* Refactor account routes into sub folders (https://github.com/slawkens/myaac/commit/bdc0c43d3fd3a51030c3e916bdb9f008468f5ecd)
|
||||
* Order towns by id (https://github.com/slawkens/myaac/commit/9ea2a5067fc4b75de395f381577b18914132ad84)
|
||||
* Do not create news about myaac, if any news already exist (on installation (https://github.com/slawkens/myaac/commit/504242fb846b73b56b87bc1e39d070687ad7f5b4)
|
||||
|
||||
### Fixed
|
||||
* Not working google recaptcha plugin (https://github.com/slawkens/myaac/commit/a1bcb217ecf4e21fd58da4ba491da1852029898a)
|
||||
* Not working account create if account_country is disabled (https://github.com/slawkens/myaac/commit/933b681a9fcdbb6283e0469b3806d2ded492d232)
|
||||
* Account verify - do not allow login without verified email (Thanks @anyeor, https://github.com/slawkens/myaac/commit/fcb13f3c0fb8ceafda0bd614a229a26a269432bd)
|
||||
* Detect tools/ext exists on install to prevent broken installs (https://github.com/slawkens/myaac/commit/10a739773c4f2911876bc802a0ee0537c3e00a92)
|
||||
* Cache reloading each time page refreshes (https://github.com/slawkens/myaac/commit/ec96985872057340112f65073efc0c4bf86dddb0)
|
||||
* Highscores frags for TFS 1.x and canary (https://github.com/slawkens/myaac/commit/a04d186c22912915f0a7873dfe677ef3b5a23c79)
|
||||
* Monsters page: monster not found exception (https://github.com/slawkens/myaac/commit/ef79b99b8acc179f14b8475547347d9daca27512)
|
||||
* Fixed bug if \<flags\> are not present in monster.xml (https://github.com/slawkens/myaac/commit/57b47ab7983f625c7c0ef4f5303a4d07ef172786)
|
||||
* fastRoute duplicate errors (https://github.com/slawkens/myaac/commit/4c0739d3e93812dff0c33849ea3f38e4e49113ac)
|
||||
* useGuildNick displaying (https://github.com/slawkens/myaac/commit/0db0ec1aa47e044c26bc403ff5078a2115d086f8)
|
||||
|
||||
## [1.0-beta - 18.05.2024]
|
||||
|
||||
Minimum PHP version for this release is 8.1.
|
||||
Minimum PHP version for this release is 7.2.5.
|
||||
|
||||
### Added
|
||||
* reworked Admin Panel (@Leesneaks, @gpedro, @slawkens)
|
||||
@@ -41,26 +11,17 @@ Minimum PHP version for this release is 8.1.
|
||||
* new Dashboard: statistics, server status
|
||||
* new Admin Bar showed on top when admin logged in
|
||||
* new page: Server Data, to reload server data
|
||||
* Towns, NPCs & Items are stored in permanent cache
|
||||
* new pages: mass account & teleport tools
|
||||
* changelogs editor
|
||||
* revised Accounts & Players editors
|
||||
* option to add/modify admin menus with plugins
|
||||
* option to add/modify menus with plugins
|
||||
* option to enable/disable plugins
|
||||
* better, updated TinyMCE editor (v6.x)
|
||||
* with option to upload images
|
||||
* list of open source libraries used in project page
|
||||
* auto-loading of themes, commands & pages from plugins/ folder. You need just to place them in correct folder and they will be loaded automatically - this allows better customization, without interfering with core AAC folders. This will allow in the future automatic updates for plugins as well the AAC as whole.
|
||||
* config.php moved to Admin Panel -> Settings page
|
||||
* new console script: aac - using symfony/console
|
||||
* usage: `php aac` (will list all commands by default)
|
||||
* example: `php aac cache:clear`
|
||||
* example: `php aac plugin:install theme-example.zip`
|
||||
* replace POT Query Builder to Eloquent ORM. Not 100% yet - in some places there is still old $db approach used (@gpedro) (https://github.com/slawkens/myaac/pull/230)
|
||||
* list of open source libraries used in project
|
||||
* brand new charming installation page (by @fernandomatos)
|
||||
* using Bootstrap
|
||||
* new pages router: nikic/fast-route, allowing for better customisation
|
||||
* Plugin cronjobs: central control of the cronjobs
|
||||
* Guild Wars support (available as plugin)
|
||||
* support for login and create account only by email (configurable)
|
||||
* with no need for account name
|
||||
@@ -70,13 +31,10 @@ Minimum PHP version for this release is 8.1.
|
||||
* suggest account number option
|
||||
* many new functions, hooks and configurables
|
||||
* better Exception Handler (Whoops - https://github.com/filp/whoops)
|
||||
* automated website tests (using Cypress)
|
||||
* csrf protection (https://github.com/slawkens/myaac/pull/235)
|
||||
* option to restrict Page view to specified group of users (Not-Logged in, logged-in players, tutors, gamemasters etc.)
|
||||
* phpdebug bar (http://phpdebugbar.com/). Activated if env == 'dev', can be also activated in production by enabling "enable_debugbar" in local config
|
||||
* add Cypress testing
|
||||
|
||||
### Changed
|
||||
* Composer and NPM is now used for external libraries like: Twig, PHPMailer, fast-route, jQuery, Bootstrap etc.
|
||||
* Composer is now used for external libraries like: Twig, PHPMailer, fast-route etc.
|
||||
* mail support is disabled on fresh install, can be manually enabled by user
|
||||
* disable add php pages in admin panel for security. Option to disable plugins upload
|
||||
* visitors counter shows now user browser, and also if its bot
|
||||
@@ -87,7 +45,7 @@ Minimum PHP version for this release is 8.1.
|
||||
* Highscores
|
||||
* frags works for TFS 1.x
|
||||
* cached
|
||||
* Monsters
|
||||
* creatures
|
||||
* moved pages to Twig:
|
||||
* experience stages
|
||||
* update player_deaths entries on name change
|
||||
|
@@ -8,11 +8,7 @@ Fernando Matos <fernando@pixele.com.br>
|
||||
Lee <42119604+Leesneaks@users.noreply.github.com>
|
||||
caio <caio.zucoli@gmail.com>
|
||||
slawkens <slawkens@gmail.com>
|
||||
tobi132 <tobi132@gmx.net>
|
||||
tobi132 <52947952+tobi132@users.noreply.github.com>
|
||||
vankk <nwtr.otland@hotmail.com>
|
||||
whiteblXK <krzys16001@gmail.com>
|
||||
xitobuh <jonas.hockert92@gmail.com>
|
||||
Danilo Pucci <dnlps@hotmail.com>
|
||||
gpedro <gpedro831@gmail.com>
|
||||
Matheus Collier <matheuscollier@gmail.com>
|
||||
SRNT-GG <95472530+SRNT-GG@users.noreply.github.com>
|
||||
|
18
README.md
18
README.md
@@ -11,19 +11,20 @@ Official website: https://my-aac.org
|
||||
[](https://github.com/slawkens/myaac/issues?q=is%3Aissue+is%3Aclosed)
|
||||
|
||||
| Version | Status | Branch | Requirements |
|
||||
|:--------|:-----------------------|:--------|:---------------|
|
||||
| **1.x** | **Active development** | develop | **PHP >= 8.1** |
|
||||
| 0.9.x | Not developed anymore | 0.9 | PHP >= 7.2.5 |
|
||||
|:-----------|:------------------------------------------|:--------|:---------------|
|
||||
| **0.10.x** | **Active development** | develop | **PHP >= 8.0** |
|
||||
| 0.9.x | Active support | 0.9 | PHP >= 7.2.5 |
|
||||
| 0.8.x | Active support | master | PHP >= 7.2.5 |
|
||||
| 0.7.x | End Of Life | 0.7 | PHP >= 5.3.3 |
|
||||
|
||||
### Requirements
|
||||
|
||||
- PHP 8.0 or later
|
||||
- MySQL database
|
||||
- PHP Extensions: pdo, xml, json
|
||||
- (optional) apache2 mod_rewrite (to use friendly_urls)
|
||||
- (optional) zip PHP Extension (to install plugins)
|
||||
- (optional) gd PHP Extension (for generating signature images)
|
||||
- PDO PHP Extension
|
||||
- XML PHP Extension
|
||||
- (optional) ZIP PHP Extension
|
||||
- (optional) mod_rewrite to use friendly_urls
|
||||
|
||||
### Installation
|
||||
|
||||
@@ -47,8 +48,7 @@ Official website: https://my-aac.org
|
||||
|
||||
### Configuration
|
||||
|
||||
Check *config.php* to get more informations. (Notice: MyAAC 1.0+ doesn't use config.php anymore, it has been moved to Admin Panel - Settings page).
|
||||
|
||||
Check *config.php* to get more informations.
|
||||
Use *config.local.php* for your local configuration changes.
|
||||
|
||||
### Branches
|
||||
|
40
aac
40
aac
@@ -1,40 +0,0 @@
|
||||
#!/usr/bin/env php
|
||||
<?php
|
||||
|
||||
require_once __DIR__ . '/common.php';
|
||||
|
||||
if(!IS_CLI) {
|
||||
echo 'This script can be run only in command line mode.';
|
||||
exit(1);
|
||||
}
|
||||
|
||||
require_once SYSTEM . 'functions.php';
|
||||
require_once SYSTEM . 'init.php';
|
||||
|
||||
define('SELF_NAME', basename(__FILE__));
|
||||
|
||||
use MyAAC\Plugins;
|
||||
use Symfony\Component\Console\Application;
|
||||
|
||||
$application = new Application();
|
||||
|
||||
$commandsGlob = glob(SYSTEM . 'src/Commands/*.php');
|
||||
foreach ($commandsGlob as $item) {
|
||||
$name = pathinfo($item, PATHINFO_FILENAME);
|
||||
if ($name == 'Command') { // ignore base Command class
|
||||
continue;
|
||||
}
|
||||
|
||||
$commandPre = '\\MyAAC\Commands\\';
|
||||
$application->add(new ($commandPre . $name));
|
||||
}
|
||||
|
||||
$pluginCommands = Plugins::getCommands();
|
||||
foreach ($pluginCommands as $item) {
|
||||
$application->add(require $item);
|
||||
}
|
||||
|
||||
$application->setName('MyAAC');
|
||||
$application->setVersion(MYAAC_VERSION);
|
||||
|
||||
$application->run();
|
@@ -1,7 +1,5 @@
|
||||
<?php
|
||||
|
||||
use MyAAC\Plugins;
|
||||
|
||||
$order = 10;
|
||||
|
||||
$settingsMenu = [];
|
||||
|
@@ -25,6 +25,11 @@ define('PAGE', $page);
|
||||
require SYSTEM . 'functions.php';
|
||||
require SYSTEM . 'init.php';
|
||||
|
||||
// verify myaac tables exists in database
|
||||
if(!$db->hasTable('myaac_account_actions')) {
|
||||
throw new RuntimeException('Seems that the table <strong>myaac_account_actions</strong> of MyAAC doesn\'t exist in the database. This is a fatal error. You can try to reinstall MyAAC by visiting <a href="' . BASE_URL . 'install">this</a> url.');
|
||||
}
|
||||
|
||||
require __DIR__ . '/includes/debugbar.php';
|
||||
require SYSTEM . 'status.php';
|
||||
require SYSTEM . 'login.php';
|
||||
@@ -45,7 +50,7 @@ if(!$logged || !admin()) {
|
||||
// include our page
|
||||
$file = __DIR__ . '/pages/' . $page . '.php';
|
||||
if(!@file_exists($file)) {
|
||||
if (str_contains($page, 'plugins/')) {
|
||||
if (strpos($page, 'plugins/') !== false) {
|
||||
$file = BASE . $page;
|
||||
}
|
||||
else {
|
||||
|
@@ -8,7 +8,6 @@
|
||||
* @link https://my-aac.org
|
||||
*/
|
||||
|
||||
use MyAAC\Models\Account as AccountModel;
|
||||
use MyAAC\Models\Player;
|
||||
|
||||
defined('MYAAC') or die('Direct access not allowed!');
|
||||
@@ -52,51 +51,36 @@ $acc_type = setting('core.account_types');
|
||||
|
||||
<?php
|
||||
$id = 0;
|
||||
$search_account = $search_account_email = '';
|
||||
$search_account = '';
|
||||
if (isset($_REQUEST['id']))
|
||||
$id = (int)$_REQUEST['id'];
|
||||
else if (isset($_REQUEST['search_email'])) {
|
||||
$search_account_email = $_REQUEST['search_email'];
|
||||
$accountModel = AccountModel::where('email', $search_account_email)->limit(11)->get(['email', 'id']);
|
||||
if (count($accountModel) == 0) {
|
||||
echo_error('No entries found.');
|
||||
} else if (count($accountModel) == 1) {
|
||||
$id = $accountModel->first()->getKey();
|
||||
} else if (count($accountModel) > 10) {
|
||||
echo_error('Specified e-mail resulted with too many accounts.');
|
||||
}
|
||||
}
|
||||
else if (isset($_REQUEST['search'])) {
|
||||
$search_account = $_REQUEST['search'];
|
||||
$min_size = 3;
|
||||
if ($nameOrNumberColumn == 'number') {
|
||||
$min_size = 1;
|
||||
}
|
||||
|
||||
if (strlen($search_account) < $min_size && !Validator::number($search_account)) {
|
||||
echo_error('Account ' . $nameOrNumberColumn . ' is too short.');
|
||||
if (strlen($search_account) < 3 && !Validator::number($search_account)) {
|
||||
echo_error('Player name is too short.');
|
||||
} else {
|
||||
$query = AccountModel::where($nameOrNumberColumn, '=', $search_account)->limit(11)->get(['id', $nameOrNumberColumn]);
|
||||
if (count($query) == 0) {
|
||||
echo_error('No entries found.');
|
||||
} else if (count($query) == 1) {
|
||||
$id = $query->first()->getKey();
|
||||
} else if (count($query) > 10) {
|
||||
echo_error('Specified name resulted with too many accounts.');
|
||||
$query = $db->query('SELECT `id` FROM `accounts` WHERE `' . $nameOrNumberColumn . '` = ' . $db->quote($search_account));
|
||||
if ($query->rowCount() == 1) {
|
||||
$query = $query->fetch();
|
||||
$id = (int)$query['id'];
|
||||
} else {
|
||||
$query = $db->query('SELECT `id`, `' . $nameOrNumberColumn . '` FROM `accounts` WHERE `' . $nameOrNumberColumn . '` LIKE ' . $db->quote('%' . $search_account . '%'));
|
||||
if ($query->rowCount() > 0 && $query->rowCount() <= 10) {
|
||||
$str_construct = 'Do you mean?<ul class="mb-0">';
|
||||
foreach ($query as $row) {
|
||||
$str_construct .= '<li><a href="' . $admin_base . '&id=' . $row->getKey() . '">' . $row->attributes[$nameOrNumberColumn] . '</a></li>';
|
||||
}
|
||||
foreach ($query as $row)
|
||||
$str_construct .= '<li><a href="' . $admin_base . '&id=' . $row['id'] . '">' . $row[$nameOrNumberColumn] . '</a></li>';
|
||||
$str_construct .= '</ul>';
|
||||
echo_error($str_construct);
|
||||
} else if ($query->rowCount() > 10)
|
||||
echo_error('Specified name resulted with too many accounts.');
|
||||
else
|
||||
echo_error('No entries found.');
|
||||
}
|
||||
}
|
||||
}
|
||||
?>
|
||||
<div class="row">
|
||||
<?php
|
||||
$groups = new OTS_Groups_List();
|
||||
if ($id > 0) {
|
||||
$account = new OTS_Account();
|
||||
$account->load($id);
|
||||
@@ -159,9 +143,7 @@ else if (isset($_REQUEST['search'])) {
|
||||
$rl_loca = $_POST['rl_loca'];
|
||||
|
||||
//country
|
||||
if(setting('core.account_country')) {
|
||||
$rl_country = $_POST['rl_country'];
|
||||
}
|
||||
|
||||
$web_flags = $_POST['web_flags'];
|
||||
verify_number($web_flags, 'Web Flags', 1);
|
||||
@@ -208,11 +190,7 @@ else if (isset($_REQUEST['search'])) {
|
||||
}
|
||||
$account->setRLName($rl_name);
|
||||
$account->setLocation($rl_loca);
|
||||
|
||||
if(setting('core.account_country')) {
|
||||
$account->setCountry($rl_country);
|
||||
}
|
||||
|
||||
$account->setCustomField('created', $created);
|
||||
$account->setWebFlags($web_flags);
|
||||
$account->setCustomField('web_lastlogin', $web_lastlogin);
|
||||
@@ -236,7 +214,7 @@ else if (isset($_REQUEST['search'])) {
|
||||
}
|
||||
}
|
||||
} else if ($id == 0) {
|
||||
$accounts_db = $db->query('SELECT `id`, `' . $nameOrNumberColumn . '`' . ($hasTypeColumn ? ',type' : ($hasGroupColumn ? ',group_id' : '')) . ', email FROM `accounts` ORDER BY `id` ASC');
|
||||
$accounts_db = $db->query('SELECT `id`, `' . $nameOrNumberColumn . '`' . ($hasTypeColumn ? ',type' : ($hasGroupColumn ? ',group_id' : '')) . ' FROM `accounts` ORDER BY `id` ASC');
|
||||
?>
|
||||
<div class="col-12 col-sm-12 col-lg-10">
|
||||
<div class="card card-info card-outline">
|
||||
@@ -250,7 +228,6 @@ else if (isset($_REQUEST['search'])) {
|
||||
<th>ID</th>
|
||||
<th><?= ($nameOrNumberColumn == 'number' ? 'Number' : 'Name'); ?></th>
|
||||
<?php if($hasTypeColumn || $hasGroupColumn): ?>
|
||||
<th>E-Mail</th>
|
||||
<th>Position</th>
|
||||
<?php endif; ?>
|
||||
<th style="width: 40px">Edit</th>
|
||||
@@ -261,7 +238,6 @@ else if (isset($_REQUEST['search'])) {
|
||||
<tr>
|
||||
<th><?php echo $account_lst['id']; ?></th>
|
||||
<td><?php echo $account_lst[$nameOrNumberColumn]; ?></a></td>
|
||||
<td><?php echo $account_lst['email']; ?></td>
|
||||
<?php if($hasTypeColumn || $hasGroupColumn): ?>
|
||||
<td>
|
||||
<?php if ($hasTypeColumn) {
|
||||
@@ -315,7 +291,7 @@ else if (isset($_REQUEST['search'])) {
|
||||
<div class="card-body">
|
||||
<div class="tab-content" id="accounts-tabContent">
|
||||
<div class="tab-pane fade active show" id="accounts-acc">
|
||||
<form action="<?php echo $admin_base . ($id > 0 ? '&id=' . $id : ''); ?>" method="post">
|
||||
<form action="<?php echo $admin_base . ((isset($id) && $id > 0) ? '&id=' . $id : ''); ?>" method="post">
|
||||
<?php csrf(); ?>
|
||||
<div class="form-group row">
|
||||
<?php if (USE_ACCOUNT_NAME): ?>
|
||||
@@ -428,7 +404,6 @@ else if (isset($_REQUEST['search'])) {
|
||||
autocomplete="off" maxlength="20"
|
||||
value="<?php echo $account->getLocation(); ?>"/>
|
||||
</div>
|
||||
<?php if(setting('core.account_country')): ?>
|
||||
<div class="col-12 col-sm-12 col-lg-4">
|
||||
<label for="rl_country">Country:</label>
|
||||
<select name="rl_country" id="rl_country" class="form-control">
|
||||
@@ -437,7 +412,6 @@ else if (isset($_REQUEST['search'])) {
|
||||
<?php endforeach; ?>
|
||||
</select>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
<div class="form-group row">
|
||||
<div class="col-12 col-sm-12 col-lg-6">
|
||||
@@ -609,16 +583,6 @@ else if (isset($_REQUEST['search'])) {
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div class="row">
|
||||
<div class="col-6 col-lg-12">
|
||||
<form action="<?php echo $admin_base; ?>" method="post">
|
||||
<?php csrf(); ?>
|
||||
<label for="search">Account E-Mail:</label>
|
||||
<div class="input-group input-group-sm">
|
||||
<input type="email" class="form-control" id="search_email" name="search_email" value="<?= escapeHtml($search_account_email); ?>" maxlength="255" size="255">
|
||||
<span class="input-group-append"><button type="submit" class="btn btn-info btn-flat">Search</button></span>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
<div class="col-6 col-lg-12">
|
||||
<form action="<?php echo $admin_base; ?>" method="post">
|
||||
<?php csrf(); ?>
|
||||
|
@@ -9,7 +9,6 @@
|
||||
* @link https://my-aac.org
|
||||
*/
|
||||
|
||||
use MyAAC\Changelog;
|
||||
use MyAAC\Models\Changelog as ModelsChangelog;
|
||||
|
||||
defined('MYAAC') or die('Direct access not allowed!');
|
||||
@@ -27,8 +26,9 @@ $use_datatable = true;
|
||||
const CL_LIMIT = 600; // maximum changelog body length
|
||||
|
||||
$id = $_GET['id'] ?? 0;
|
||||
require_once LIBS . 'changelog.php';
|
||||
|
||||
if(!empty($action) && isRequestMethod('post'))
|
||||
if(!empty($action))
|
||||
{
|
||||
$id = $_POST['id'] ?? null;
|
||||
$body = isset($_POST['body']) ? stripslashes($_POST['body']) : null;
|
||||
@@ -73,7 +73,7 @@ if(!empty($action) && isRequestMethod('post'))
|
||||
}
|
||||
}
|
||||
else if($action == 'hide') {
|
||||
if (Changelog::toggleHide($id, $errors, $status)) {
|
||||
if (Changelog::toggleHidden($id, $errors, $status)) {
|
||||
success(($status == 1 ? 'Hide' : 'Show') . ' successful.');
|
||||
}
|
||||
}
|
||||
|
@@ -7,9 +7,6 @@
|
||||
* @copyright 2019 MyAAC
|
||||
* @link https://my-aac.org
|
||||
*/
|
||||
|
||||
use MyAAC\Models\Account;
|
||||
|
||||
defined('MYAAC') or die('Direct access not allowed!');
|
||||
$title = 'Mailer';
|
||||
|
||||
@@ -64,15 +61,15 @@ if (!empty($mail_content) && !empty($mail_subject) && empty($mail_to)) {
|
||||
$add = ' AND `email_verified` = 1';
|
||||
}
|
||||
|
||||
$query = Account::where('email', '!=', '')->get(['email']);
|
||||
$query = $db->query('SELECT `email` FROM `accounts` WHERE `email` != ""' . $add);
|
||||
foreach ($query as $email) {
|
||||
if (_mail($email->email, $mail_subject, $mail_content)) {
|
||||
if (_mail($email['email'], $mail_subject, $mail_content)) {
|
||||
$success++;
|
||||
}
|
||||
else {
|
||||
$failed++;
|
||||
echo '<br />';
|
||||
error('An error occorred while sending email to <b>' . $email->email . '</b>. For Admin: More info can be found in system/logs/mailer-error.log');
|
||||
error('An error occorred while sending email to <b>' . $email['email'] . '</b>. For Admin: More info can be found in system/logs/mailer-error.log');
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -24,13 +24,20 @@ $freePremium = $config['lua']['freePremium'];
|
||||
|
||||
function admin_give_points($points)
|
||||
{
|
||||
global $hasPointsColumn;
|
||||
global $db, $hasPointsColumn;
|
||||
|
||||
if (!$hasPointsColumn) {
|
||||
displayMessage('Points not supported.');
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
$statement = $db->prepare('UPDATE `accounts` SET `premium_points` = `premium_points` + :points');
|
||||
if (!$statement) {
|
||||
displayMessage('Failed to prepare query statement.');
|
||||
return;
|
||||
}
|
||||
|
||||
if (!Account::query()->increment('premium_points', $points)) {
|
||||
displayMessage('Failed to add points.');
|
||||
return;
|
||||
@@ -40,7 +47,7 @@ function admin_give_points($points)
|
||||
|
||||
function admin_give_coins($coins)
|
||||
{
|
||||
global $hasCoinsColumn;
|
||||
global $db, $hasCoinsColumn;
|
||||
|
||||
if (!$hasCoinsColumn) {
|
||||
displayMessage('Coins not supported.');
|
||||
@@ -55,6 +62,24 @@ function admin_give_coins($coins)
|
||||
displayMessage($coins . ' coins added to all accounts.', true);
|
||||
}
|
||||
|
||||
function query_add_premium($column, $value_query, $condition_query = '1=1', $params = [])
|
||||
{
|
||||
global $db;
|
||||
|
||||
$statement = $db->prepare("UPDATE `accounts` SET `{$column}` = $value_query WHERE $condition_query");
|
||||
if (!$statement) {
|
||||
displayMessage('Failed to prepare query statement.');
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!$statement->execute($params)) {
|
||||
displayMessage('Failed to add premium days.');
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
function admin_give_premdays($days)
|
||||
{
|
||||
global $db, $freePremium;
|
||||
@@ -69,9 +94,9 @@ function admin_give_premdays($days)
|
||||
// othire
|
||||
if ($db->hasColumn('accounts', 'premend')) {
|
||||
// append premend
|
||||
if (Account::where('premend', '>', $now)->increment('premend', $value)) {
|
||||
if (query_add_premium('premend', '`premend` + :value', '`premend` > :now', ['value' => $value, 'now' => $now])) {
|
||||
// set premend
|
||||
if (Account::where('premend', '<=', $now)->update(['premend' => $now + $value])) {
|
||||
if (query_add_premium('premend', ':value', '`premend` <= :now', ['value' => $now + $value, 'now' => $now])) {
|
||||
displayMessage($days . ' premium days added to all accounts.', true);
|
||||
return;
|
||||
} else {
|
||||
@@ -89,11 +114,11 @@ function admin_give_premdays($days)
|
||||
// tfs 0.x
|
||||
if ($db->hasColumn('accounts', 'premdays')) {
|
||||
// append premdays
|
||||
if (Account::query()->update(['premdays' => $days])) {
|
||||
if (query_add_premium('premdays', '`premdays` + :value', '1=1', ['value' => $days])) {
|
||||
// append lastday
|
||||
if (Account::where('lastday', '>', $now)->increment('lastday', $value)) {
|
||||
if (query_add_premium('lastday', '`lastday` + :value', '`lastday` > :now', ['value' => $value, 'now' => $now])) {
|
||||
// set lastday
|
||||
if (Account::where('lastday', '<=', $now)->update(['lastday' => $now + $value])) {
|
||||
if (query_add_premium('lastday', ':value', '`lastday` <= :now', ['value' => $now + $value, 'now' => $now])) {
|
||||
displayMessage($days . ' premium days added to all accounts.', true);
|
||||
return;
|
||||
} else {
|
||||
@@ -117,9 +142,9 @@ function admin_give_premdays($days)
|
||||
// tfs 1.x
|
||||
if ($db->hasColumn('accounts', 'premium_ends_at')) {
|
||||
// append premium_ends_at
|
||||
if (Account::where('premium_ends_at', '>', $now)->increment('premium_ends_at', $value)) {
|
||||
if (query_add_premium('premium_ends_at', '`premium_ends_at` + :value', '`premium_ends_at` > :now', ['value' => $value, 'now' => $now])) {
|
||||
// set premium_ends_at
|
||||
if (Account::where('premium_ends_at', '<=', $now)->update(['premium_ends_at' => $now + $value])) {
|
||||
if (query_add_premium('premium_ends_at', ':value', '`premium_ends_at` <= :now', ['value' => $now + $value, 'now' => $now])) {
|
||||
displayMessage($days . ' premium days added to all accounts.', true);
|
||||
return;
|
||||
} else {
|
||||
@@ -137,9 +162,9 @@ function admin_give_premdays($days)
|
||||
displayMessage('Premium Days not supported.');
|
||||
}
|
||||
|
||||
if (!empty(ACTION) && isRequestMethod('post')) {
|
||||
if (isset($_POST['action']) && $_POST['action']) {
|
||||
|
||||
$action = ACTION;
|
||||
$action = $_POST['action'];
|
||||
|
||||
if (preg_match("/[^A-z0-9_\-]/", $action)) {
|
||||
displayMessage('Invalid action.');
|
||||
|
@@ -40,9 +40,9 @@ function admin_teleport_town($town_id) {
|
||||
displayMessage('Player\'s town updated.', true);
|
||||
}
|
||||
|
||||
if (!empty(ACTION) && isRequestMethod('post')) {
|
||||
if (isset($_POST['action']) && $_POST['action']) {
|
||||
|
||||
$action = ACTION;
|
||||
$action = $_POST['action'];
|
||||
|
||||
if (preg_match("/[^A-z0-9_\-]/", $action)) {
|
||||
displayMessage('Invalid action.');
|
||||
|
@@ -8,7 +8,6 @@
|
||||
* @link https://my-aac.org
|
||||
*/
|
||||
|
||||
use MyAAC\Cache\Cache;
|
||||
use MyAAC\Models\Menu;
|
||||
|
||||
defined('MYAAC') or die('Direct access not allowed!');
|
||||
|
@@ -7,10 +7,6 @@
|
||||
* @copyright 2019 MyAAC
|
||||
* @link https://my-aac.org
|
||||
*/
|
||||
|
||||
use MyAAC\Forum;
|
||||
use MyAAC\News;
|
||||
|
||||
defined('MYAAC') or die('Direct access not allowed!');
|
||||
|
||||
$title = 'News Panel';
|
||||
@@ -19,6 +15,9 @@ csrfProtect();
|
||||
|
||||
$use_datatable = true;
|
||||
|
||||
require_once LIBS . 'forum.php';
|
||||
require_once LIBS . 'news.php';
|
||||
|
||||
if (!hasFlag(FLAG_CONTENT_PAGES) && !superAdmin()) {
|
||||
echo 'Access denied.';
|
||||
return;
|
||||
@@ -47,24 +46,26 @@ if(!empty($action))
|
||||
$forum_section = $_POST['forum_section'] ?? null;
|
||||
$errors = [];
|
||||
|
||||
if (isRequestMethod('post')) {
|
||||
if ($action == 'new') {
|
||||
if (isset($forum_section) && $forum_section != '-1') {
|
||||
if($action == 'new') {
|
||||
if(isset($forum_section) && $forum_section != '-1') {
|
||||
$forum_add = Forum::add_thread($p_title, $body, $forum_section, $player_id, $account_logged->getId(), $errors);
|
||||
}
|
||||
|
||||
if (isset($p_title) && News::add($p_title, $body, $type, $category, $player_id, isset($forum_add) && $forum_add != 0 ? $forum_add : 0, $article_text, $article_image, $errors)) {
|
||||
if(isset($p_title) && News::add($p_title, $body, $type, $category, $player_id, isset($forum_add) && $forum_add != 0 ? $forum_add : 0, $article_text, $article_image, $errors)) {
|
||||
$p_title = $body = $comments = $article_text = $article_image = '';
|
||||
$type = $category = $player_id = 0;
|
||||
|
||||
success('Added successful.');
|
||||
}
|
||||
} else if ($action == 'delete') {
|
||||
}
|
||||
else if($action == 'delete') {
|
||||
if (News::delete($id, $errors)) {
|
||||
success('Deleted successful.');
|
||||
}
|
||||
} else if ($action == 'edit') {
|
||||
if (isset($id) && !isset($p_title)) {
|
||||
}
|
||||
else if($action == 'edit')
|
||||
{
|
||||
if(isset($id) && !isset($p_title)) {
|
||||
$news = News::get($id);
|
||||
$p_title = $news['title'];
|
||||
$body = $news['body'];
|
||||
@@ -74,11 +75,12 @@ if(!empty($action))
|
||||
$player_id = $news['player_id'];
|
||||
$article_text = $news['article_text'];
|
||||
$article_image = $news['article_image'];
|
||||
} else {
|
||||
if (News::update($id, $p_title, $body, $type, $category, $player_id, $forum_section, $article_text, $article_image, $errors)) {
|
||||
}
|
||||
else {
|
||||
if(News::update($id, $p_title, $body, $type, $category, $player_id, $forum_section, $article_text, $article_image, $errors)) {
|
||||
// update forum thread if exists
|
||||
if (isset($forum_section) && Validator::number($forum_section)) {
|
||||
$db->query("UPDATE `" . TABLE_PREFIX . "forum` SET `author_guid` = " . (int)$player_id . ", `post_text` = " . $db->quote($body) . ", `post_topic` = " . $db->quote($p_title) . ", `edit_date` = " . time() . " WHERE `id` = " . $db->quote($forum_section));
|
||||
if(isset($forum_section) && Validator::number($forum_section)) {
|
||||
$db->query("UPDATE `" . TABLE_PREFIX . "forum` SET `author_guid` = ".(int) $player_id.", `post_text` = ".$db->quote($body).", `post_topic` = ".$db->quote($p_title).", `edit_date` = " . time() . " WHERE `id` = " . $db->quote($forum_section));
|
||||
}
|
||||
|
||||
$action = $p_title = $body = $comments = $article_text = $article_image = '';
|
||||
@@ -87,10 +89,10 @@ if(!empty($action))
|
||||
success('Updated successful.');
|
||||
}
|
||||
}
|
||||
} else if ($action == 'hide') {
|
||||
if (News::toggleHide($id, $errors, $status)) {
|
||||
success(($status == 1 ? 'Hide' : 'Show') . ' successful.');
|
||||
}
|
||||
else if($action == 'hide') {
|
||||
if (News::toggleHidden($id, $errors, $status)) {
|
||||
success(($status == 1 ? 'Hide' : 'Show') . ' successful.');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -99,7 +101,7 @@ if(!empty($action))
|
||||
}
|
||||
|
||||
$categories = array();
|
||||
foreach($db->query('SELECT `id`, `name`, `icon_id` FROM `' . TABLE_PREFIX . 'news_categories` WHERE `hide` != 1') as $cat)
|
||||
foreach($db->query('SELECT `id`, `name`, `icon_id` FROM `' . TABLE_PREFIX . 'news_categories` WHERE `hidden` != 1') as $cat)
|
||||
{
|
||||
$categories[$cat['id']] = array(
|
||||
'name' => $cat['name'],
|
||||
@@ -142,12 +144,12 @@ foreach ($query as $_news) {
|
||||
|
||||
$newses[$_news['type']][] = array(
|
||||
'id' => $_news['id'],
|
||||
'hide' => $_news['hide'],
|
||||
'hidden' => $_news['hidden'],
|
||||
'archive_link' => getLink('news') . '/archive/' . $_news['id'],
|
||||
'title' => $_news['title'],
|
||||
'date' => $_news['date'],
|
||||
'player_name' => $_player->isLoaded() ? $_player->getName() : '',
|
||||
'player_link' => $_player->isLoaded() ? getPlayerLink($_player->getName(), false) : '',
|
||||
'player_name' => isset($_player) && $_player->isLoaded() ? $_player->getName() : '',
|
||||
'player_link' => isset($_player) && $_player->isLoaded() ? getPlayerLink($_player->getName(), false) : '',
|
||||
);
|
||||
}
|
||||
|
||||
|
@@ -16,7 +16,7 @@ $title = 'Notepad';
|
||||
csrfProtect();
|
||||
|
||||
/**
|
||||
* @var OTS_Account $account_logged
|
||||
* @var $account_logged OTS_Account
|
||||
*/
|
||||
$_content = '';
|
||||
$notepad = ModelsNotepad::where('account_id', $account_logged->getId())->first();
|
||||
|
@@ -36,7 +36,7 @@ const PAGE_TITLE_LIMIT = 30;
|
||||
const PAGE_NAME_LIMIT = 30;
|
||||
const PAGE_BODY_LIMIT = 65535; // maximum page body length
|
||||
|
||||
if (!empty($action) && isRequestMethod('post')) {
|
||||
if (!empty($action)) {
|
||||
if ($action == 'delete' || $action == 'edit' || $action == 'hide') {
|
||||
$id = $_POST['id'];
|
||||
}
|
||||
@@ -97,7 +97,7 @@ if (!empty($action) && isRequestMethod('post')) {
|
||||
}
|
||||
}
|
||||
} else if ($action == 'hide') {
|
||||
if (Pages::toggleHide($id, $errors, $status)) {
|
||||
if (Pages::toggleHidden($id, $errors, $status)) {
|
||||
success(($status == 0 ? 'Show' : 'Hide') . ' successful.');
|
||||
}
|
||||
}
|
||||
@@ -112,7 +112,7 @@ $pages = ModelsPages::all()->map(function ($e) {
|
||||
'title' => substr($e->title, 0, 20),
|
||||
'php' => $e->php == '1',
|
||||
'id' => $e->id,
|
||||
'hide' => $e->hide
|
||||
'hidden' => $e->hidden
|
||||
];
|
||||
})->toArray();
|
||||
|
||||
|
@@ -8,7 +8,6 @@
|
||||
* @link https://my-aac.org
|
||||
*/
|
||||
|
||||
use MyAAC\Forum;
|
||||
use MyAAC\Models\Player;
|
||||
|
||||
defined('MYAAC') or die('Direct access not allowed!');
|
||||
@@ -20,6 +19,7 @@ csrfProtect();
|
||||
$player_base = ADMIN_URL . '?p=players';
|
||||
|
||||
$use_datatable = true;
|
||||
require_once LIBS . 'forum.php';
|
||||
|
||||
$skills = array(
|
||||
POT::SKILL_FIST => array('Fist fighting', 'fist'),
|
||||
@@ -51,20 +51,22 @@ else if (isset($_REQUEST['search'])) {
|
||||
if (strlen($search_player) < 3 && !Validator::number($search_player)) {
|
||||
echo_error('Player name is too short.');
|
||||
} else {
|
||||
$query = Player::where('name', 'like', '%' . $search_player . '%')->orderBy('name')->limit(11)->get(['id', 'name']);
|
||||
if (count($query) == 0) {
|
||||
echo_error('No entries found.');
|
||||
} else if (count($query) == 1) {
|
||||
$id = $query->first()->getKey();
|
||||
} else if (count($query) > 10) {
|
||||
echo_error('Specified name resulted with too many players.');
|
||||
$query = $db->query('SELECT `id` FROM `players` WHERE `name` = ' . $db->quote($search_player));
|
||||
if ($query->rowCount() == 1) {
|
||||
$query = $query->fetch();
|
||||
$id = (int)$query['id'];
|
||||
} else {
|
||||
$query = $db->query('SELECT `id`, `name` FROM `players` WHERE `name` LIKE ' . $db->quote('%' . $search_player . '%'));
|
||||
if ($query->rowCount() > 0 && $query->rowCount() <= 10) {
|
||||
$str_construct = 'Do you mean?<ul>';
|
||||
foreach ($query as $row) {
|
||||
$str_construct .= '<li><a href="' . $player_base . '&id=' . $row->getKey() . '">' . $row->name . '</a></li>';
|
||||
}
|
||||
foreach ($query as $row)
|
||||
$str_construct .= '<li><a href="' . $player_base . '&id=' . $row['id'] . '">' . $row['name'] . '</a></li>';
|
||||
$str_construct .= '</ul>';
|
||||
echo_error($str_construct);
|
||||
} else if ($query->rowCount() > 10)
|
||||
echo_error('Specified name resulted with too many players.');
|
||||
else
|
||||
echo_error('No entries found.');
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -200,7 +202,7 @@ else if (isset($_REQUEST['search'])) {
|
||||
|
||||
if ($hasBlessingsColumn) {
|
||||
$blessings = $_POST['blessings'];
|
||||
verify_number($blessings, 'Blessings', 3);
|
||||
verify_number($blessings, 'Blessings', 2);
|
||||
}
|
||||
|
||||
$balance = $_POST['balance'];
|
||||
@@ -211,7 +213,7 @@ else if (isset($_REQUEST['search'])) {
|
||||
}
|
||||
|
||||
$deleted = (isset($_POST['deleted']) && $_POST['deleted'] == 'true');
|
||||
$hide = (isset($_POST['hide']) && $_POST['hide'] == 'true');
|
||||
$hidden = (isset($_POST['hidden']) && $_POST['hidden'] == 'true');
|
||||
|
||||
$created = strtotime($_POST['created']);
|
||||
verify_number($created, 'Created', 11);
|
||||
@@ -272,7 +274,7 @@ else if (isset($_REQUEST['search'])) {
|
||||
$player->setLossContainers($loss_containers);
|
||||
$player->setLossItems($loss_items);
|
||||
}
|
||||
if ($hasBlessingsColumn)
|
||||
if ($db->hasColumn('players', 'blessings'))
|
||||
$player->setBlessings($blessings);
|
||||
|
||||
if ($hasBlessingColumn) {
|
||||
@@ -288,7 +290,7 @@ else if (isset($_REQUEST['search'])) {
|
||||
$player->setCustomField('deletion', $deleted ? '1' : '0');
|
||||
else
|
||||
$player->setCustomField('deleted', $deleted ? '1' : '0');
|
||||
$player->setCustomField('hide', $hide ? '1' : '0');
|
||||
$player->setCustomField('hidden', $hidden ? '1' : '0');
|
||||
$player->setCustomField('created', $created);
|
||||
if (isset($comment))
|
||||
$player->setCustomField('comment', $comment);
|
||||
@@ -305,7 +307,7 @@ else if (isset($_REQUEST['search'])) {
|
||||
}
|
||||
}
|
||||
} else if ($id == 0) {
|
||||
$players_db = Player::orderBy('id')->get(['id','name', 'level']);
|
||||
$players_db = $db->query('SELECT `id`, `name`, `level` FROM `players` ORDER BY `id` asc');
|
||||
?>
|
||||
<div class="col-12 col-sm-12 col-lg-10">
|
||||
<div class="card card-info card-outline">
|
||||
@@ -325,11 +327,11 @@ else if (isset($_REQUEST['search'])) {
|
||||
<tbody>
|
||||
<?php foreach ($players_db as $player_db): ?>
|
||||
<tr>
|
||||
<th><?php echo $player_db->id; ?></th>
|
||||
<td><?php echo $player_db->name; ?></a></td>
|
||||
<td><?php echo $player_db->level; ?></a></td>
|
||||
<th><?php echo $player_db['id']; ?></th>
|
||||
<td><?php echo $player_db['name']; ?></a></td>
|
||||
<td><?php echo $player_db['level']; ?></a></td>
|
||||
|
||||
<td><a href="?p=players&id=<?php echo $player_db->id; ?>" class="btn btn-success btn-sm" title="Edit">
|
||||
<td><a href="?p=players&id=<?php echo $player_db['id']; ?>" class="btn btn-success btn-sm" title="Edit">
|
||||
<i class="fas fa-pencil-alt"></i>
|
||||
</a>
|
||||
</td>
|
||||
@@ -373,7 +375,7 @@ else if (isset($_REQUEST['search'])) {
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<form action="<?php echo $player_base . ($id > 0 ? '&id=' . $id : ''); ?>" method="post">
|
||||
<form action="<?php echo $player_base . ((isset($id) && $id > 0) ? '&id=' . $id : ''); ?>" method="post">
|
||||
<?php csrf(); ?>
|
||||
<div class="card-body">
|
||||
<div class="tab-content" id="tabs-tabContent">
|
||||
@@ -483,8 +485,8 @@ else if (isset($_REQUEST['search'])) {
|
||||
</div>
|
||||
<div class="col-12 col-sm-12 col-lg-6">
|
||||
<div class="custom-control custom-switch custom-switch-on-success">
|
||||
<input type="checkbox" class="custom-control-input" name="hide" id="hide" value="true" <?php echo($player->isHidden() ? ' checked' : ''); ?>>
|
||||
<label class="custom-control-label" for="hide">Hidden</label>
|
||||
<input type="checkbox" class="custom-control-input" name="hidden" id="hidden" value="true" <?php echo($player->isHidden() ? ' checked' : ''); ?>>
|
||||
<label class="custom-control-label" for="hidden">Hidden</label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
@@ -7,9 +7,6 @@
|
||||
* @copyright 2019 MyAAC
|
||||
* @link https://my-aac.org
|
||||
*/
|
||||
|
||||
use MyAAC\Plugins;
|
||||
|
||||
defined('MYAAC') or die('Direct access not allowed!');
|
||||
$title = 'Plugin manager';
|
||||
|
||||
@@ -17,6 +14,8 @@ csrfProtect();
|
||||
|
||||
$use_datatable = true;
|
||||
|
||||
require_once LIBS . 'plugins.php';
|
||||
|
||||
if (!getBoolean(setting('core.admin_plugins_manage_enable'))) {
|
||||
warning('Plugin installation and management is disabled in Settings.<br/>If you wish to enable, go to Settings and enable <strong>Enable Plugins Manage</strong>.');
|
||||
}
|
||||
|
@@ -7,10 +7,6 @@
|
||||
* @copyright 2019 MyAAC
|
||||
* @link https://my-aac.org
|
||||
*/
|
||||
|
||||
use MyAAC\Plugins;
|
||||
use MyAAC\Settings;
|
||||
|
||||
defined('MYAAC') or die('Direct access not allowed!');
|
||||
$title = 'Settings';
|
||||
|
||||
@@ -48,7 +44,7 @@ if (!is_array($settingsFile)) {
|
||||
|
||||
$settingsKeyName = ($plugin == 'core' ? $plugin : $settingsFile['key']);
|
||||
|
||||
$title = ($plugin == 'core' ? 'Settings' : 'Plugin Settings - ' . $settingsFile['name']);
|
||||
$title = ($plugin == 'core' ? 'Settings' : 'Plugin Settings - ' . $plugin);
|
||||
|
||||
$settingsParsed = Settings::display($settingsKeyName, $settingsFile['settings']);
|
||||
|
||||
|
@@ -12,7 +12,6 @@ defined('MYAAC') or die('Direct access not allowed!');
|
||||
use DeviceDetector\DeviceDetector;
|
||||
use DeviceDetector\Parser\Client\Browser;
|
||||
use DeviceDetector\Parser\OperatingSystem;
|
||||
use MyAAC\Visitors;
|
||||
|
||||
$title = 'Visitors';
|
||||
$use_datatable = true;
|
||||
@@ -25,6 +24,7 @@ if (!setting('core.visitors_counter')): ?>
|
||||
return;
|
||||
endif;
|
||||
|
||||
require SYSTEM . 'libs/visitors.php';
|
||||
$visitors = new Visitors(setting('core.visitors_counter_ttl'));
|
||||
|
||||
function compare($a, $b): int {
|
||||
|
@@ -1,6 +1,6 @@
|
||||
<?php
|
||||
|
||||
$menus = [
|
||||
return [
|
||||
['name' => 'Dashboard', 'icon' => 'tachometer-alt', 'order' => 10, 'link' => 'dashboard'],
|
||||
['name' => 'Settings', 'icon' => 'edit', 'order' => 19, 'link' =>
|
||||
require ADMIN . 'includes/settings_menus.php'
|
||||
|
@@ -8,8 +8,3 @@
|
||||
.sidebar-mini.sidebar-collapse .menu-text {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.myaac-table tbody tr:nth-child(even) {background: #FFF} /* light border */
|
||||
.myaac-table tbody tr:nth-child(odd) {background: #CCC} /* dark border */
|
||||
.myaac-table thead td {background: #000000; color: #ffffff !important;} /* vdark border */
|
||||
.myaac-table tfoot td {background: #000000; color: #ffffff !important;} /* vdark border */
|
||||
|
@@ -191,8 +191,8 @@ if ($logged && admin()) {
|
||||
]);
|
||||
}
|
||||
?>
|
||||
<script src="<?php echo BASE_URL; ?>tools/ext/bootstrap/js/bootstrap.min.js"></script>
|
||||
<script src="<?php echo BASE_URL; ?>tools/ext/jquery-ui/jquery-ui.min.js"></script>
|
||||
<script src="<?php echo BASE_URL; ?>tools/js/bootstrap.min.js"></script>
|
||||
<script src="<?php echo BASE_URL; ?>tools/js/jquery-ui.min.js"></script>
|
||||
<?php if (isset($use_datatable)) { ?>
|
||||
<script src="<?php echo BASE_URL; ?>tools/js/datatables.min.js"></script>
|
||||
<script src="<?php echo BASE_URL; ?>tools/js/datatables.bs.min.js"></script>
|
||||
|
@@ -22,10 +22,7 @@
|
||||
* @copyright 2020 MyAAC
|
||||
* @link https://my-aac.org
|
||||
*/
|
||||
|
||||
use MyAAC\DataLoader;
|
||||
|
||||
const MYAAC_ADMIN = true;
|
||||
define('MYAAC_ADMIN', true);
|
||||
|
||||
require '../../common.php';
|
||||
require SYSTEM . 'functions.php';
|
||||
@@ -37,9 +34,11 @@ if (!admin())
|
||||
|
||||
ini_set('max_execution_time', 300);
|
||||
ob_implicit_flush();
|
||||
@ob_end_flush();
|
||||
ob_end_flush();
|
||||
header('X-Accel-Buffering: no');
|
||||
|
||||
require LIBS . 'DataLoader.php';
|
||||
|
||||
require LOCALE . 'en/main.php';
|
||||
require LOCALE . 'en/install.php';
|
||||
|
||||
|
@@ -1,8 +1,4 @@
|
||||
<?php
|
||||
|
||||
use MyAAC\Hooks;
|
||||
use MyAAC\Settings;
|
||||
|
||||
const MYAAC_ADMIN = true;
|
||||
|
||||
require '../../common.php';
|
||||
@@ -10,6 +6,11 @@ require SYSTEM . 'functions.php';
|
||||
require SYSTEM . 'init.php';
|
||||
require SYSTEM . 'login.php';
|
||||
|
||||
// event system
|
||||
require_once SYSTEM . 'hooks.php';
|
||||
$hooks = new Hooks();
|
||||
$hooks->load();
|
||||
|
||||
if(!admin()) {
|
||||
http_response_code(500);
|
||||
die('Access denied.');
|
||||
|
10
common.php
10
common.php
@@ -20,14 +20,14 @@
|
||||
*
|
||||
* @package MyAAC
|
||||
* @author Slawkens <slawkens@gmail.com>
|
||||
* @copyright 2024 MyAAC
|
||||
* @copyright 2019 MyAAC
|
||||
* @link https://my-aac.org
|
||||
*/
|
||||
if (version_compare(phpversion(), '8.1', '<')) die('PHP version 8.1 or higher is required.');
|
||||
if (version_compare(phpversion(), '8.0', '<')) die('PHP version 8.0 or higher is required.');
|
||||
|
||||
const MYAAC = true;
|
||||
const MYAAC_VERSION = '1.0-RC';
|
||||
const DATABASE_VERSION = 40;
|
||||
const MYAAC_VERSION = '1.0-dev';
|
||||
const DATABASE_VERSION = 38;
|
||||
const TABLE_PREFIX = 'myaac_';
|
||||
define('START_TIME', microtime(true));
|
||||
define('MYAAC_OS', stripos(PHP_OS, 'WIN') === 0 ? 'WINDOWS' : (strtoupper(PHP_OS) === 'DARWIN' ? 'MAC' : 'LINUX'));
|
||||
@@ -156,7 +156,7 @@ if (file_exists(BASE . 'config.local.php')) {
|
||||
|
||||
/** @var array $config */
|
||||
ini_set('log_errors', 1);
|
||||
if(@$config['env'] === 'dev' || defined('MYAAC_INSTALL')) {
|
||||
if(@$config['env'] === 'dev') {
|
||||
ini_set('display_errors', 1);
|
||||
ini_set('display_startup_errors', 1);
|
||||
error_reporting(E_ALL);
|
||||
|
@@ -13,20 +13,17 @@
|
||||
"nikic/fast-route": "^1.3",
|
||||
"matomo/device-detector": "^6.0",
|
||||
"illuminate/database": "^10.18",
|
||||
"illuminate/filesystem": "^10.18",
|
||||
"peppeocchi/php-cron-scheduler": "4.*",
|
||||
"symfony/console": "^6.4",
|
||||
"symfony/string": "^6.4",
|
||||
"symfony/var-dumper": "^6.4",
|
||||
"filp/whoops": "^2.15",
|
||||
"maximebf/debugbar": "dev-master"
|
||||
"symfony/process": "^6.3"
|
||||
},
|
||||
"require-dev": {
|
||||
"phpstan/phpstan": "^1.10"
|
||||
"filp/whoops": "^2.15",
|
||||
"maximebf/debugbar": "dev-master"
|
||||
},
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"MyAAC\\": "system/src"
|
||||
},
|
||||
"files": ["system/src/global.php"]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
2922
composer.lock
generated
2922
composer.lock
generated
File diff suppressed because it is too large
Load Diff
@@ -38,6 +38,7 @@ describe('Install MyAAC', () => {
|
||||
cy.contains('Basic configuration');
|
||||
|
||||
cy.get('#vars_server_path').click().clear().type(Cypress.env('SERVER_PATH'))
|
||||
cy.get('#vars_mail_admin').click().clear().type('noone@example.net')
|
||||
|
||||
cy.get('[type="checkbox"]').uncheck() // usage statistics uncheck
|
||||
|
||||
@@ -67,9 +68,7 @@ describe('Install MyAAC', () => {
|
||||
|
||||
cy.get('form').submit()
|
||||
|
||||
cy.contains('[class="alert alert-success"]', 'Congratulations', { timeout: 60000 }).should('be.visible')
|
||||
|
||||
cy.wait(2000);
|
||||
cy.contains('[class="alert alert-success"]', 'Congratulations', { timeout: 30000 }).should('be.visible')
|
||||
|
||||
cy.screenshot('install-finish')
|
||||
})
|
||||
|
@@ -82,7 +82,7 @@ describe('Check Public Pages', () => {
|
||||
|
||||
it('Go to last kills page', () => {
|
||||
cy.visit({
|
||||
url: Cypress.env('URL') + '/last-kills',
|
||||
url: Cypress.env('URL') + '/lastkills',
|
||||
method: 'GET',
|
||||
})
|
||||
})
|
||||
@@ -132,7 +132,7 @@ describe('Check Public Pages', () => {
|
||||
|
||||
it('Go to server info page', () => {
|
||||
cy.visit({
|
||||
url: Cypress.env('URL') + '/server-info',
|
||||
url: Cypress.env('URL') + '/serverInfo',
|
||||
method: 'GET',
|
||||
})
|
||||
})
|
||||
@@ -160,7 +160,7 @@ describe('Check Public Pages', () => {
|
||||
|
||||
it('Go to experience table page', () => {
|
||||
cy.visit({
|
||||
url: Cypress.env('URL') + '/exp-table',
|
||||
url: Cypress.env('URL') + '/experienceTable',
|
||||
method: 'GET',
|
||||
})
|
||||
})
|
||||
|
102
index.php
102
index.php
@@ -24,9 +24,6 @@
|
||||
* @link https://my-aac.org
|
||||
*/
|
||||
|
||||
use MyAAC\UsageStatistics;
|
||||
use MyAAC\Visitors;
|
||||
|
||||
require_once 'common.php';
|
||||
require_once SYSTEM . 'functions.php';
|
||||
|
||||
@@ -62,13 +59,18 @@ if(preg_match("/^(.*)\.(gif|jpg|png|jpeg|tiff|bmp|css|js|less|map|html|zip|rar|g
|
||||
if((!isset($config['installed']) || !$config['installed']) && file_exists(BASE . 'install'))
|
||||
{
|
||||
header('Location: ' . BASE_URL . 'install/');
|
||||
exit();
|
||||
throw new RuntimeException('Setup detected that <b>install/</b> directory exists. Please visit <a href="' . BASE_URL . 'install">this</a> url to start MyAAC Installation.<br/>Delete <b>install/</b> directory if you already installed MyAAC.<br/>Remember to REFRESH this page when you\'re done!');
|
||||
}
|
||||
|
||||
$template_place_holders = array();
|
||||
|
||||
require_once SYSTEM . 'init.php';
|
||||
|
||||
// verify myaac tables exists in database
|
||||
if(!$db->hasTable('myaac_account_actions')) {
|
||||
throw new RuntimeException('Seems that the table <strong>myaac_account_actions</strong> of MyAAC doesn\'t exist in the database. This is a fatal error. You can try to reinstall MyAAC by visiting <a href="' . BASE_URL . 'install">this</a> url.');
|
||||
}
|
||||
|
||||
require_once SYSTEM . 'template.php';
|
||||
require_once SYSTEM . 'login.php';
|
||||
require_once SYSTEM . 'status.php';
|
||||
@@ -76,6 +78,53 @@ require_once SYSTEM . 'status.php';
|
||||
$twig->addGlobal('config', $config);
|
||||
$twig->addGlobal('status', $status);
|
||||
|
||||
require_once SYSTEM . 'router.php';
|
||||
|
||||
$hooks->trigger(HOOK_STARTUP);
|
||||
|
||||
// anonymous usage statistics
|
||||
// sent only when user agrees
|
||||
if(setting('core.anonymous_usage_statistics')) {
|
||||
$report_time = 30 * 24 * 60 * 60; // report one time per 30 days
|
||||
$should_report = true;
|
||||
|
||||
$value = '';
|
||||
if($cache->enabled() && $cache->fetch('last_usage_report', $value)) {
|
||||
$should_report = time() > (int)$value + $report_time;
|
||||
}
|
||||
else {
|
||||
$value = '';
|
||||
if(fetchDatabaseConfig('last_usage_report', $value)) {
|
||||
$should_report = time() > (int)$value + $report_time;
|
||||
if($cache->enabled()) {
|
||||
$cache->set('last_usage_report', $value);
|
||||
}
|
||||
}
|
||||
else {
|
||||
registerDatabaseConfig('last_usage_report', time() - ($report_time - (7 * 24 * 60 * 60))); // first report after a week
|
||||
$should_report = false;
|
||||
}
|
||||
}
|
||||
|
||||
if($should_report) {
|
||||
require_once LIBS . 'usage_statistics.php';
|
||||
Usage_Statistics::report();
|
||||
|
||||
updateDatabaseConfig('last_usage_report', time());
|
||||
if($cache->enabled()) {
|
||||
$cache->set('last_usage_report', time());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(setting('core.views_counter'))
|
||||
require_once SYSTEM . 'counter.php';
|
||||
|
||||
if(setting('core.visitors_counter')) {
|
||||
require_once SYSTEM . 'libs/visitors.php';
|
||||
$visitors = new Visitors(setting('core.visitors_counter_ttl'));
|
||||
}
|
||||
|
||||
// backward support for gesior
|
||||
if(setting('core.backward_support')) {
|
||||
define('INITIALIZED', true);
|
||||
@@ -115,51 +164,6 @@ if(setting('core.backward_support')) {
|
||||
$config['status']['serverStatus_' . $key] = $value;
|
||||
}
|
||||
|
||||
require_once SYSTEM . 'router.php';
|
||||
|
||||
$hooks->trigger(HOOK_STARTUP);
|
||||
|
||||
// anonymous usage statistics
|
||||
// sent only when user agrees
|
||||
if(setting('core.anonymous_usage_statistics')) {
|
||||
$report_time = 30 * 24 * 60 * 60; // report one time per 30 days
|
||||
$should_report = true;
|
||||
|
||||
$value = '';
|
||||
if($cache->enabled() && $cache->fetch('last_usage_report', $value)) {
|
||||
$should_report = time() > (int)$value + $report_time;
|
||||
}
|
||||
else {
|
||||
$value = '';
|
||||
if(fetchDatabaseConfig('last_usage_report', $value)) {
|
||||
$should_report = time() > (int)$value + $report_time;
|
||||
if($cache->enabled()) {
|
||||
$cache->set('last_usage_report', $value);
|
||||
}
|
||||
}
|
||||
else {
|
||||
registerDatabaseConfig('last_usage_report', time() - ($report_time - (7 * 24 * 60 * 60))); // first report after a week
|
||||
$should_report = false;
|
||||
}
|
||||
}
|
||||
|
||||
if($should_report) {
|
||||
UsageStatistics::report();
|
||||
|
||||
updateDatabaseConfig('last_usage_report', time());
|
||||
if($cache->enabled()) {
|
||||
$cache->set('last_usage_report', time());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(setting('core.views_counter'))
|
||||
require_once SYSTEM . 'counter.php';
|
||||
|
||||
if(setting('core.visitors_counter')) {
|
||||
$visitors = new Visitors(setting('core.visitors_counter_ttl'));
|
||||
}
|
||||
|
||||
/**
|
||||
* @var OTS_Account $account_logged
|
||||
*/
|
||||
|
@@ -17,7 +17,7 @@ function query($query)
|
||||
|
||||
// define php version id if its not already
|
||||
if(!defined('PHP_VERSION_ID')) {
|
||||
$version = array_map('intval', explode('.', PHP_VERSION));
|
||||
$version = explode('.', PHP_VERSION);
|
||||
|
||||
define('PHP_VERSION_ID', ($version[0] * 10000 + $version[1] * 100 + $version[2]));
|
||||
}
|
||||
|
@@ -1,4 +1,4 @@
|
||||
SET @myaac_database_version = 40;
|
||||
SET @myaac_database_version = 36;
|
||||
|
||||
CREATE TABLE `myaac_account_actions`
|
||||
(
|
||||
@@ -44,11 +44,11 @@ CREATE TABLE `myaac_changelog`
|
||||
`where` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '1 - server, 2 - site',
|
||||
`date` INT(11) NOT NULL DEFAULT 0,
|
||||
`player_id` INT(11) NOT NULL DEFAULT 0,
|
||||
`hide` TINYINT(1) NOT NULL DEFAULT 0,
|
||||
`hidden` TINYINT(1) NOT NULL DEFAULT 0,
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8;
|
||||
|
||||
INSERT INTO `myaac_changelog` (`id`, `type`, `where`, `date`, `body`, `hide`) VALUES (1, 3, 2, UNIX_TIMESTAMP(), 'MyAAC installed. (:', 0);
|
||||
INSERT INTO `myaac_changelog` (`id`, `type`, `where`, `date`, `body`, `hidden`) VALUES (1, 3, 2, UNIX_TIMESTAMP(), 'MyAAC installed. (:', 0);
|
||||
|
||||
CREATE TABLE `myaac_config`
|
||||
(
|
||||
@@ -67,7 +67,7 @@ CREATE TABLE `myaac_faq`
|
||||
`question` VARCHAR(255) NOT NULL DEFAULT '',
|
||||
`answer` VARCHAR(1020) NOT NULL DEFAULT '',
|
||||
`ordering` INT(11) NOT NULL DEFAULT 0,
|
||||
`hide` TINYINT(1) NOT NULL DEFAULT 0,
|
||||
`hidden` TINYINT(1) NOT NULL DEFAULT 0,
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8;
|
||||
|
||||
@@ -80,7 +80,7 @@ CREATE TABLE `myaac_forum_boards`
|
||||
`guild` INT(11) NOT NULL DEFAULT 0,
|
||||
`access` INT(11) NOT NULL DEFAULT 0,
|
||||
`closed` TINYINT(1) NOT NULL DEFAULT 0,
|
||||
`hide` TINYINT(1) NOT NULL DEFAULT 0,
|
||||
`hidden` TINYINT(1) NOT NULL DEFAULT 0,
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8;
|
||||
INSERT INTO `myaac_forum_boards` (`id`, `name`, `description`, `ordering`, `closed`) VALUES (NULL, 'News', 'News commenting', 0, 1);
|
||||
@@ -129,7 +129,7 @@ CREATE TABLE `myaac_menu`
|
||||
|
||||
CREATE TABLE `myaac_monsters` (
|
||||
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`hide` tinyint(1) NOT NULL default 0,
|
||||
`hidden` tinyint(1) NOT NULL default 0,
|
||||
`name` varchar(255) NOT NULL,
|
||||
`mana` int(11) NOT NULL DEFAULT 0,
|
||||
`exp` int(11) NOT NULL,
|
||||
@@ -174,7 +174,7 @@ CREATE TABLE `myaac_news`
|
||||
`comments` VARCHAR(50) NOT NULL DEFAULT '',
|
||||
`article_text` VARCHAR(300) NOT NULL DEFAULT '',
|
||||
`article_image` VARCHAR(100) NOT NULL DEFAULT '',
|
||||
`hide` TINYINT(1) NOT NULL DEFAULT 0,
|
||||
`hidden` TINYINT(1) NOT NULL DEFAULT 0,
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8;
|
||||
|
||||
@@ -184,7 +184,7 @@ CREATE TABLE `myaac_news_categories`
|
||||
`name` VARCHAR(50) NOT NULL DEFAULT "",
|
||||
`description` VARCHAR(50) NOT NULL DEFAULT "",
|
||||
`icon_id` INT(2) NOT NULL DEFAULT 0,
|
||||
`hide` TINYINT(1) NOT NULL DEFAULT 0,
|
||||
`hidden` TINYINT(1) NOT NULL DEFAULT 0,
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8;
|
||||
|
||||
@@ -215,7 +215,7 @@ CREATE TABLE `myaac_pages`
|
||||
`php` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '0 - plain html, 1 - php',
|
||||
`enable_tinymce` TINYINT(1) NOT NULL DEFAULT 1 COMMENT '1 - enabled, 0 - disabled',
|
||||
`access` TINYINT(2) NOT NULL DEFAULT 0,
|
||||
`hide` TINYINT(1) NOT NULL DEFAULT 0,
|
||||
`hidden` TINYINT(1) NOT NULL DEFAULT 0,
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE (`name`)
|
||||
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8;
|
||||
@@ -228,7 +228,7 @@ CREATE TABLE `myaac_gallery`
|
||||
`thumb` VARCHAR(255) NOT NULL,
|
||||
`author` VARCHAR(50) NOT NULL DEFAULT '',
|
||||
`ordering` INT(11) NOT NULL DEFAULT 0,
|
||||
`hide` TINYINT(1) NOT NULL DEFAULT 0,
|
||||
`hidden` TINYINT(1) NOT NULL DEFAULT 0,
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8;
|
||||
|
||||
@@ -262,7 +262,7 @@ CREATE TABLE `myaac_spells`
|
||||
`item_id` INT(11) NOT NULL DEFAULT 0,
|
||||
`premium` TINYINT(1) NOT NULL DEFAULT 0,
|
||||
`vocations` VARCHAR(100) NOT NULL DEFAULT '',
|
||||
`hide` TINYINT(1) NOT NULL DEFAULT 0,
|
||||
`hidden` TINYINT(1) NOT NULL DEFAULT 0,
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE (`name`)
|
||||
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8;
|
||||
|
@@ -3,15 +3,16 @@
|
||||
use Twig\Environment as Twig_Environment;
|
||||
use Twig\Loader\FilesystemLoader as Twig_FilesystemLoader;
|
||||
|
||||
const MYAAC_INSTALL = true;
|
||||
|
||||
require '../common.php';
|
||||
|
||||
define('MYAAC_INSTALL', true);
|
||||
|
||||
// includes
|
||||
require SYSTEM . 'functions.php';
|
||||
require BASE . 'install/includes/functions.php';
|
||||
require BASE . 'install/includes/locale.php';
|
||||
require SYSTEM . 'clients.conf.php';
|
||||
require LIBS . 'Settings.php';
|
||||
|
||||
// ignore undefined index from Twig autoloader
|
||||
$config['env'] = 'prod';
|
||||
@@ -114,7 +115,7 @@ else if($step == 'finish') {
|
||||
$email = $_SESSION['var_email'];
|
||||
$password = $_SESSION['var_password'];
|
||||
$password_confirm = $_SESSION['var_password_confirm'];
|
||||
$player_name = $_SESSION['var_player_name'] ?? null;
|
||||
$player_name = $_SESSION['var_player_name'];
|
||||
|
||||
// email check
|
||||
if(empty($email)) {
|
||||
@@ -159,13 +160,12 @@ else if($step == 'finish') {
|
||||
$errors[] = $locale['step_admin_password_confirm_error_not_same'];
|
||||
}
|
||||
|
||||
if (isset($player_name)) {
|
||||
// player name check
|
||||
if (empty($player_name)) {
|
||||
if(empty($player_name)) {
|
||||
$errors[] = $locale['step_admin_player_name_error_empty'];
|
||||
} else if (!Validator::characterName($player_name)) {
|
||||
$errors[] = $locale['step_admin_player_name_error_format'];
|
||||
}
|
||||
else if(!Validator::characterName($player_name)) {
|
||||
$errors[] = $locale['step_admin_player_name_error_format'];
|
||||
}
|
||||
|
||||
if(!empty($errors)) {
|
||||
|
@@ -2,15 +2,10 @@
|
||||
defined('MYAAC') or die('Direct access not allowed!');
|
||||
|
||||
// configuration
|
||||
$dirs_required_writable = [
|
||||
$dirs_required = [
|
||||
'system/logs',
|
||||
'system/cache',
|
||||
];
|
||||
|
||||
$dirs_required = [
|
||||
'tools/ext' => $locale['step_requirements_folder_not_exists_tools_ext'],
|
||||
];
|
||||
|
||||
$dirs_optional = [
|
||||
GUILD_IMAGES_DIR => $locale['step_requirements_warning_images_guilds'],
|
||||
GALLERY_DIR => $locale['step_requirements_warning_images_gallery'],
|
||||
@@ -23,7 +18,6 @@ $extensions_optional = [
|
||||
'gd' => $locale['step_requirements_warning_player_signatures'],
|
||||
'zip' => $locale['step_requirements_warning_install_plugins'],
|
||||
];
|
||||
|
||||
/*
|
||||
*
|
||||
* @param string $name
|
||||
@@ -47,7 +41,7 @@ $failed = false;
|
||||
// start validating
|
||||
version_check($locale['step_requirements_php_version'], (PHP_VERSION_ID >= 50500), PHP_VERSION);
|
||||
|
||||
foreach ($dirs_required_writable as $value)
|
||||
foreach ($dirs_required as $value)
|
||||
{
|
||||
$is_writable = is_writable(BASE . $value) && (MYAAC_OS != 'WINDOWS' || win_is_writable(BASE . $value));
|
||||
version_check($locale['step_requirements_write_perms'] . ': ' . $value, $is_writable);
|
||||
@@ -58,12 +52,6 @@ foreach ($dirs_optional as $dir => $errorMsg) {
|
||||
version_check($locale['step_requirements_write_perms'] . ': ' . $dir, $is_writable, $is_writable ? '' : $errorMsg, true);
|
||||
}
|
||||
|
||||
foreach ($dirs_required as $dir => $errorMsg)
|
||||
{
|
||||
$exists = is_dir(BASE . $dir);
|
||||
version_check($locale['step_requirements_folder_exists'] . ': ' . $dir, $exists, $exists ? '' : $errorMsg);
|
||||
}
|
||||
|
||||
$ini_register_globals = ini_get_bool('register_globals');
|
||||
version_check('register_long_arrays', !$ini_register_globals, $ini_register_globals ? $locale['on'] : $locale['off']);
|
||||
|
||||
@@ -90,3 +78,4 @@ if($failed) {
|
||||
}
|
||||
|
||||
echo '</div>';
|
||||
?>
|
||||
|
@@ -1,7 +1,4 @@
|
||||
<?php
|
||||
|
||||
use MyAAC\Settings;
|
||||
|
||||
defined('MYAAC') or die('Direct access not allowed!');
|
||||
|
||||
//ini_set('display_errors', false);
|
||||
@@ -41,38 +38,49 @@ if(!$error) {
|
||||
$configToSave['cache_engine'] = 'auto';
|
||||
$configToSave['cache_prefix'] = 'myaac_' . generateRandomString(8, true, false, true);
|
||||
|
||||
if(!$error) {
|
||||
$content = '';
|
||||
$saved = Settings::saveConfig($configToSave, BASE . 'config.local.php', $content);
|
||||
if ($saved) {
|
||||
success($locale['step_database_config_saved']);
|
||||
$_SESSION['saved'] = true;
|
||||
|
||||
require BASE . 'config.local.php';
|
||||
require BASE . 'install/includes/config.php';
|
||||
|
||||
if (!$error) {
|
||||
if(!$error) {
|
||||
require BASE . 'install/includes/database.php';
|
||||
|
||||
if (isset($database_error)) { // we failed connect to the database
|
||||
$locale['step_database_importing'] = str_replace('$DATABASE_NAME$', config('database_name'), $locale['step_database_importing']);
|
||||
success($locale['step_database_importing']);
|
||||
|
||||
if(isset($database_error)) { // we failed connect to the database
|
||||
error($database_error);
|
||||
}
|
||||
else {
|
||||
if (!$db->hasTable('accounts')) {
|
||||
if(!$db->hasTable('accounts')) {
|
||||
$tmp = str_replace('$TABLE$', 'accounts', $locale['step_database_error_table']);
|
||||
error($tmp);
|
||||
$error = true;
|
||||
}
|
||||
|
||||
if (!$error) {
|
||||
if(!$db->hasTable('players')) {
|
||||
$tmp = str_replace('$TABLE$', 'players', $locale['step_database_error_table']);
|
||||
error($tmp);
|
||||
$error = true;
|
||||
}
|
||||
|
||||
if(!$db->hasTable('guilds')) {
|
||||
$tmp = str_replace('$TABLE$', 'guilds', $locale['step_database_error_table']);
|
||||
error($tmp);
|
||||
$error = true;
|
||||
}
|
||||
|
||||
if(!$error) {
|
||||
$twig->display('install.installer.html.twig', array(
|
||||
'url' => 'tools/5-database.php',
|
||||
'message' => $locale['loading_spinner']
|
||||
));
|
||||
|
||||
$content = '';
|
||||
$saved = Settings::saveConfig($configToSave, BASE . 'config.local.php', $content);
|
||||
if($saved) {
|
||||
success($locale['step_database_config_saved']);
|
||||
$_SESSION['saved'] = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
else {
|
||||
$_SESSION['config_content'] = $content;
|
||||
unset($_SESSION['saved']);
|
||||
|
||||
@@ -81,6 +89,8 @@ if(!$error) {
|
||||
<textarea cols="70" rows="10">' . $content . '</textarea>');
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
?>
|
||||
|
||||
|
@@ -18,7 +18,6 @@ if(!$error) {
|
||||
'locale' => $locale,
|
||||
'session' => $_SESSION,
|
||||
'account' => $account,
|
||||
'hasTablePlayers' => $db->hasTable('players'),
|
||||
'errors' => isset($errors) ? $errors : null,
|
||||
'buttons' => next_buttons(true, $error ? false : true)
|
||||
));
|
||||
|
@@ -1,48 +1,32 @@
|
||||
<?php
|
||||
|
||||
use MyAAC\Cache\Cache;
|
||||
use MyAAC\Models\News;
|
||||
use MyAAC\Settings;
|
||||
|
||||
defined('MYAAC') or die('Direct access not allowed!');
|
||||
|
||||
ini_set('max_execution_time', 300);
|
||||
if(isset($config['installed']) && $config['installed'] && !isset($_SESSION['saved'])) {
|
||||
warning($locale['already_installed']);
|
||||
return;
|
||||
}
|
||||
else {
|
||||
require SYSTEM . 'init.php';
|
||||
if(!$error) {
|
||||
if(USE_ACCOUNT_NAME || USE_ACCOUNT_NUMBER)
|
||||
$account = isset($_SESSION['var_account']) ? $_SESSION['var_account'] : null;
|
||||
else
|
||||
$account_id = isset($_SESSION['var_account_id']) ? $_SESSION['var_account_id'] : null;
|
||||
|
||||
$cache = Cache::getInstance();
|
||||
if ($cache->enabled()) {
|
||||
// clear plugin_hooks to have fresh hooks
|
||||
$cache->delete('plugins_hooks');
|
||||
}
|
||||
$password = $_SESSION['var_password'];
|
||||
|
||||
require SYSTEM . 'init.php';
|
||||
if($error) {
|
||||
return;
|
||||
}
|
||||
|
||||
if(USE_ACCOUNT_NAME || USE_ACCOUNT_NUMBER)
|
||||
$account = $_SESSION['var_account'] ?? null;
|
||||
else
|
||||
$account_id = $_SESSION['var_account_id'] ?? null;
|
||||
|
||||
$password = $_SESSION['var_password'];
|
||||
|
||||
if(USE_ACCOUNT_SALT)
|
||||
{
|
||||
if(USE_ACCOUNT_SALT)
|
||||
{
|
||||
$salt = generateRandomString(10, false, true, true);
|
||||
$password = $salt . $password;
|
||||
}
|
||||
}
|
||||
|
||||
$account_db = new OTS_Account();
|
||||
if(isset($account))
|
||||
$account_db = new OTS_Account();
|
||||
if(isset($account))
|
||||
$account_db->find($account);
|
||||
else
|
||||
else
|
||||
$account_db->load($account_id);
|
||||
|
||||
if ($db->hasTable('players')) {
|
||||
$player_name = $_SESSION['var_player_name'];
|
||||
$player_db = new OTS_Player();
|
||||
$player_db->find($player_name);
|
||||
@@ -60,17 +44,16 @@ if ($db->hasTable('players')) {
|
||||
|
||||
$groups = new OTS_Groups_List();
|
||||
$player_used->setGroupId($groups->getHighestId());
|
||||
}
|
||||
|
||||
$email = $_SESSION['var_email'];
|
||||
if($account_db->isLoaded()) {
|
||||
$email = $_SESSION['var_email'];
|
||||
if($account_db->isLoaded()) {
|
||||
$account_db->setPassword(encrypt($password));
|
||||
$account_db->setEMail($email);
|
||||
$account_db->save();
|
||||
|
||||
$account_used = &$account_db;
|
||||
}
|
||||
else {
|
||||
}
|
||||
else {
|
||||
$new_account = new OTS_Account();
|
||||
if(USE_ACCOUNT_NAME) {
|
||||
$new_account->create($account);
|
||||
@@ -88,74 +71,53 @@ else {
|
||||
$new_account->logAction('Account created.');
|
||||
|
||||
$account_used = &$new_account;
|
||||
}
|
||||
}
|
||||
|
||||
if(USE_ACCOUNT_SALT)
|
||||
if(USE_ACCOUNT_SALT)
|
||||
$account_used->setCustomField('salt', $salt);
|
||||
|
||||
$account_used->setCustomField('web_flags', FLAG_ADMIN + FLAG_SUPER_ADMIN);
|
||||
$account_used->setCustomField('country', 'us');
|
||||
$account_used->setCustomField('email_verified', 1);
|
||||
|
||||
if($db->hasColumn('accounts', 'group_id'))
|
||||
$account_used->setCustomField('web_flags', FLAG_ADMIN + FLAG_SUPER_ADMIN);
|
||||
$account_used->setCustomField('country', 'us');
|
||||
if($db->hasColumn('accounts', 'group_id'))
|
||||
$account_used->setCustomField('group_id', $groups->getHighestId());
|
||||
if($db->hasColumn('accounts', 'type'))
|
||||
if($db->hasColumn('accounts', 'type'))
|
||||
$account_used->setCustomField('type', 6);
|
||||
|
||||
if ($db->hasTable('players')) {
|
||||
if(!$player_db->isLoaded()) {
|
||||
if(!$player_db->isLoaded())
|
||||
$player->setAccountId($account_used->getId());
|
||||
$player->save();
|
||||
}
|
||||
else {
|
||||
else
|
||||
$player_db->setAccountId($account_used->getId());
|
||||
|
||||
success($locale['step_database_created_account']);
|
||||
|
||||
setSession('account', $account_used->getId());
|
||||
setSession('password', encrypt($password));
|
||||
setSession('remember_me', true);
|
||||
|
||||
if($player_db->isLoaded()) {
|
||||
$player_db->save();
|
||||
}
|
||||
}
|
||||
else {
|
||||
$player->save();
|
||||
}
|
||||
|
||||
success($locale['step_database_created_account']);
|
||||
|
||||
setSession('account', $account_used->getId());
|
||||
setSession('password', encrypt($password));
|
||||
setSession('remember_me', true);
|
||||
|
||||
if(!News::all()->count()) {
|
||||
$player_id = 0;
|
||||
|
||||
if ($db->hasTable('players')) {
|
||||
$tmpNewsPlayer = \MyAAC\Models\Player::where('name', $player_name)->first();
|
||||
if($tmpNewsPlayer) {
|
||||
$player_id = $tmpNewsPlayer->id;
|
||||
}
|
||||
$query = $db->query("SELECT `id` FROM `players` WHERE `name` = " . $db->quote($player_name) . ";");
|
||||
if($query->rowCount() == 1) {
|
||||
$query = $query->fetch();
|
||||
$player_id = $query['id'];
|
||||
}
|
||||
|
||||
News::create([
|
||||
'type' => 1,
|
||||
'date' => time(),
|
||||
'category' => 2,
|
||||
'title' => 'Hello!',
|
||||
'body' => 'MyAAC is just READY to use!',
|
||||
'player_id' => $player_id,
|
||||
'comments' => 'https://my-aac.org',
|
||||
'hide' => 0,
|
||||
]);
|
||||
|
||||
News::create([
|
||||
'type' => 2,
|
||||
'date' => time(),
|
||||
'category' => 4,
|
||||
'title' => 'Hello tickers!',
|
||||
'body' => 'https://my-aac.org',
|
||||
'player_id' => $player_id,
|
||||
'comments' => '',
|
||||
'hide' => 0,
|
||||
]);
|
||||
|
||||
$query = $db->query("SELECT `id` FROM `" . TABLE_PREFIX ."news` WHERE `title` LIKE 'Hello!';");
|
||||
if($query->rowCount() == 0) {
|
||||
if(query("INSERT INTO `" . TABLE_PREFIX ."news` (`id`, `type`, `date`, `category`, `title`, `body`, `player_id`, `comments`, `hidden`) VALUES (NULL, '1', UNIX_TIMESTAMP(), '2', 'Hello!', 'MyAAC is just READY to use!', " . $player_id . ", 'https://my-aac.org', '0');
|
||||
INSERT INTO `myaac_news` (`id`, `type`, `date`, `category`, `title`, `body`, `player_id`, `comments`, `hidden`) VALUES (NULL, '2', UNIX_TIMESTAMP(), '4', 'Hello tickets!', 'https://my-aac.org', " . $player_id . ", '', '0');")) {
|
||||
success($locale['step_database_created_news']);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$settings = Settings::getInstance();
|
||||
foreach($_SESSION as $key => $value) {
|
||||
$settings = Settings::getInstance();
|
||||
foreach($_SESSION as $key => $value) {
|
||||
if (in_array($key, ['var_usage', 'var_date_timezone', 'var_client'])) {
|
||||
if ($key == 'var_usage') {
|
||||
$key = 'anonymous_usage_statistics';
|
||||
@@ -168,15 +130,15 @@ foreach($_SESSION as $key => $value) {
|
||||
|
||||
$settings->updateInDatabase('core', $key, $value);
|
||||
}
|
||||
}
|
||||
success('Settings saved.');
|
||||
}
|
||||
success('Settings saved.');
|
||||
|
||||
$twig->display('install.installer.html.twig', array(
|
||||
$twig->display('install.installer.html.twig', array(
|
||||
'url' => 'tools/7-finish.php',
|
||||
'message' => $locale['importing_spinner']
|
||||
));
|
||||
));
|
||||
|
||||
if(!isset($_SESSION['installed'])) {
|
||||
if(!isset($_SESSION['installed'])) {
|
||||
if (!array_key_exists('CI', getenv())) {
|
||||
$report_url = 'https://my-aac.org/report_install.php?v=' . MYAAC_VERSION . '&b=' . urlencode(BASE_URL);
|
||||
if (function_exists('curl_version'))
|
||||
@@ -193,15 +155,15 @@ if(!isset($_SESSION['installed'])) {
|
||||
}
|
||||
|
||||
$_SESSION['installed'] = true;
|
||||
}
|
||||
}
|
||||
|
||||
foreach($_SESSION as $key => $value) {
|
||||
foreach($_SESSION as $key => $value) {
|
||||
if(strpos($key, 'var_') !== false)
|
||||
unset($_SESSION[$key]);
|
||||
}
|
||||
unset($_SESSION['saved']);
|
||||
if(file_exists(CACHE . 'install.txt')) {
|
||||
}
|
||||
unset($_SESSION['saved']);
|
||||
if(file_exists(CACHE . 'install.txt')) {
|
||||
unlink(CACHE . 'install.txt');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$hooks->trigger(HOOK_INSTALL_FINISH_END);
|
||||
|
@@ -6,7 +6,7 @@
|
||||
<title>MyAAC - <?php echo $locale['installation']; ?></title>
|
||||
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-rbsA2VBKQhggwzxH7pPCaAqO46MgnOM80zW1RWuH61DGLwZJEdK2Kadq2F9CUG65" crossorigin="anonymous">
|
||||
<link rel="stylesheet" type="text/css" href="template/style.css" />
|
||||
<script type="text/javascript" src="<?php echo BASE_URL; ?>tools/ext/jquery/jquery.min.js"></script>
|
||||
<script type="text/javascript" src="<?php echo BASE_URL; ?>tools/js/jquery.min.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
|
@@ -11,10 +11,8 @@ $error = false;
|
||||
require BASE . 'install/includes/config.php';
|
||||
|
||||
ini_set('max_execution_time', 300);
|
||||
|
||||
@ob_end_flush();
|
||||
ob_implicit_flush();
|
||||
|
||||
ob_end_flush();
|
||||
header('X-Accel-Buffering: no');
|
||||
|
||||
if(!$error) {
|
||||
@@ -32,9 +30,6 @@ if($db->hasTable(TABLE_PREFIX . 'account_actions')) {
|
||||
else {
|
||||
// import schema
|
||||
try {
|
||||
$locale['step_database_importing'] = str_replace('$DATABASE_NAME$', config('database_name'), $locale['step_database_importing']);
|
||||
success($locale['step_database_importing']);
|
||||
|
||||
$db->query(file_get_contents(BASE . 'install/includes/schema.sql'));
|
||||
|
||||
$locale['step_database_success_schema'] = str_replace('$PREFIX$', TABLE_PREFIX, $locale['step_database_success_schema']);
|
||||
@@ -141,76 +136,75 @@ if(!$db->hasColumn('accounts', 'premium_points')) {
|
||||
success($locale['step_database_adding_field'] . ' accounts.premium_points...');
|
||||
}
|
||||
|
||||
if ($db->hasTable('guilds')) {
|
||||
if ($db->hasColumn('guilds', 'checkdata')) {
|
||||
if (query("ALTER TABLE `guilds` MODIFY `checkdata` INT NOT NULL DEFAULT 0;"))
|
||||
if($db->hasColumn('guilds', 'checkdata')) {
|
||||
if(query("ALTER TABLE `guilds` MODIFY `checkdata` INT NOT NULL DEFAULT 0;"))
|
||||
success($locale['step_database_modifying_field'] . ' guilds.checkdata...');
|
||||
}
|
||||
}
|
||||
|
||||
if (!$db->hasColumn('guilds', 'motd')) {
|
||||
if (query("ALTER TABLE `guilds` ADD `motd` VARCHAR(255) NOT NULL DEFAULT '';"))
|
||||
if(!$db->hasColumn('guilds', 'motd')) {
|
||||
if(query("ALTER TABLE `guilds` ADD `motd` VARCHAR(255) NOT NULL DEFAULT '';"))
|
||||
success($locale['step_database_adding_field'] . ' guilds.motd...');
|
||||
} else {
|
||||
if (query("ALTER TABLE `guilds` MODIFY `motd` VARCHAR(255) NOT NULL DEFAULT '';"))
|
||||
}
|
||||
else {
|
||||
if(query("ALTER TABLE `guilds` MODIFY `motd` VARCHAR(255) NOT NULL DEFAULT '';"))
|
||||
success($locale['step_database_modifying_field'] . ' guilds.motd...');
|
||||
}
|
||||
}
|
||||
|
||||
if (!$db->hasColumn('guilds', 'description')) {
|
||||
if (query("ALTER TABLE `guilds` ADD `description` TEXT NOT NULL;"))
|
||||
if(!$db->hasColumn('guilds', 'description')) {
|
||||
if(query("ALTER TABLE `guilds` ADD `description` TEXT NOT NULL;"))
|
||||
success($locale['step_database_adding_field'] . ' guilds.description...');
|
||||
}
|
||||
}
|
||||
|
||||
if ($db->hasColumn('guilds', 'logo_gfx_name')) {
|
||||
if (query("ALTER TABLE `guilds` CHANGE `logo_gfx_name` `logo_name` VARCHAR( 255 ) NOT NULL DEFAULT 'default.gif';")) {
|
||||
if($db->hasColumn('guilds', 'logo_gfx_name')) {
|
||||
if(query("ALTER TABLE `guilds` CHANGE `logo_gfx_name` `logo_name` VARCHAR( 255 ) NOT NULL DEFAULT 'default.gif';")) {
|
||||
$tmp = str_replace('$FIELD$', 'guilds.logo_gfx_name', $locale['step_database_changing_field']);
|
||||
$tmp = str_replace('$FIELD_NEW$', 'guilds.logo_name', $tmp);
|
||||
success($tmp);
|
||||
}
|
||||
} else if (!$db->hasColumn('guilds', 'logo_name')) {
|
||||
if (query("ALTER TABLE `guilds` ADD `logo_name` VARCHAR( 255 ) NOT NULL DEFAULT 'default.gif';"))
|
||||
}
|
||||
else if(!$db->hasColumn('guilds', 'logo_name')) {
|
||||
if(query("ALTER TABLE `guilds` ADD `logo_name` VARCHAR( 255 ) NOT NULL DEFAULT 'default.gif';"))
|
||||
success($locale['step_database_adding_field'] . ' guilds.logo_name...');
|
||||
}
|
||||
}
|
||||
|
||||
if ($db->hasTable('players')) {
|
||||
if (!$db->hasColumn('players', 'created')) {
|
||||
if (query("ALTER TABLE `players` ADD `created` INT(11) NOT NULL DEFAULT 0;"))
|
||||
if(!$db->hasColumn('players', 'created')) {
|
||||
if(query("ALTER TABLE `players` ADD `created` INT(11) NOT NULL DEFAULT 0;"))
|
||||
success($locale['step_database_adding_field'] . ' players.created...');
|
||||
}
|
||||
}
|
||||
|
||||
if (!$db->hasColumn('players', 'deleted') && !$db->hasColumn('players', 'deletion')) {
|
||||
if (query("ALTER TABLE `players` ADD `deleted` TINYINT(1) NOT NULL DEFAULT 0;"))
|
||||
if(!$db->hasColumn('players', 'deleted') && !$db->hasColumn('players', 'deletion')) {
|
||||
if(query("ALTER TABLE `players` ADD `deleted` TINYINT(1) NOT NULL DEFAULT 0;"))
|
||||
success($locale['step_database_adding_field'] . ' players.deleted...');
|
||||
}
|
||||
}
|
||||
|
||||
if ($db->hasColumn('players', 'hide_char')) {
|
||||
if (!$db->hasColumn('players', 'hide')) {
|
||||
if (query("ALTER TABLE `players` CHANGE `hide_char` `hide` TINYINT(1) NOT NULL DEFAULT 0;")) {
|
||||
if($db->hasColumn('players', 'hide_char')) {
|
||||
if(!$db->hasColumn('players', 'hidden')) {
|
||||
if(query("ALTER TABLE `players` CHANGE `hide_char` `hidden` TINYINT(1) NOT NULL DEFAULT 0;")) {
|
||||
$tmp = str_replace('$FIELD$', 'players.hide_char', $locale['step_database_changing_field']);
|
||||
$tmp = str_replace('$FIELD_NEW$', 'players.hide', $tmp);
|
||||
$tmp = str_replace('$FIELD_NEW$', 'players.hidden', $tmp);
|
||||
success($tmp);
|
||||
}
|
||||
}
|
||||
} else if (!$db->hasColumn('players', 'hide')) {
|
||||
if (query("ALTER TABLE `players` ADD `hide` TINYINT(1) NOT NULL DEFAULT 0;"))
|
||||
success($locale['step_database_adding_field'] . ' players.hide...');
|
||||
}
|
||||
}
|
||||
else if(!$db->hasColumn('players', 'hidden')) {
|
||||
if(query("ALTER TABLE `players` ADD `hidden` TINYINT(1) NOT NULL DEFAULT 0;"))
|
||||
success($locale['step_database_adding_field'] . ' players.hidden...');
|
||||
}
|
||||
|
||||
if (!$db->hasColumn('players', 'comment')) {
|
||||
if (query("ALTER TABLE `players` ADD `comment` TEXT NOT NULL;"))
|
||||
if(!$db->hasColumn('players', 'comment')) {
|
||||
if(query("ALTER TABLE `players` ADD `comment` TEXT NOT NULL;"))
|
||||
success($locale['step_database_adding_field'] . ' players.comment...');
|
||||
}
|
||||
}
|
||||
|
||||
if ($db->hasColumn('players', 'rank_id')) {
|
||||
if (query("ALTER TABLE players MODIFY `rank_id` INT(11) NOT NULL DEFAULT 0;"))
|
||||
if($db->hasColumn('players', 'rank_id')) {
|
||||
if(query("ALTER TABLE players MODIFY `rank_id` INT(11) NOT NULL DEFAULT 0;"))
|
||||
success($locale['step_database_modifying_field'] . ' players.rank_id...');
|
||||
|
||||
if ($db->hasColumn('players', 'guildnick')) {
|
||||
if (query("ALTER TABLE players MODIFY `guildnick` VARCHAR(255) NOT NULL DEFAULT '';")) {
|
||||
if($db->hasColumn('players', 'guildnick')) {
|
||||
if(query("ALTER TABLE players MODIFY `guildnick` VARCHAR(255) NOT NULL DEFAULT '';")) {
|
||||
success($locale['step_database_modifying_field'] . ' players.guildnick...');
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if($db->hasTable('z_forum')) {
|
||||
|
@@ -1,10 +1,6 @@
|
||||
<?php
|
||||
define('MYAAC_INSTALL', true);
|
||||
|
||||
use MyAAC\DataLoader;
|
||||
use MyAAC\Models\FAQ as ModelsFAQ;
|
||||
use MyAAC\Plugins;
|
||||
|
||||
require_once '../../common.php';
|
||||
|
||||
require SYSTEM . 'functions.php';
|
||||
@@ -12,10 +8,8 @@ require BASE . 'install/includes/functions.php';
|
||||
require BASE . 'install/includes/locale.php';
|
||||
|
||||
ini_set('max_execution_time', 300);
|
||||
|
||||
@ob_end_flush();
|
||||
ob_implicit_flush();
|
||||
|
||||
ob_end_flush();
|
||||
header('X-Accel-Buffering: no');
|
||||
/*
|
||||
if(isset($config['installed']) && $config['installed'] && !isset($_SESSION['saved'])) {
|
||||
@@ -25,38 +19,37 @@ if(isset($config['installed']) && $config['installed'] && !isset($_SESSION['save
|
||||
|
||||
require SYSTEM . 'init.php';
|
||||
|
||||
if ($db->hasTable('players')) {
|
||||
$deleted = 'deleted';
|
||||
if ($db->hasColumn('players', 'deletion'))
|
||||
$deleted = 'deleted';
|
||||
if($db->hasColumn('players', 'deletion'))
|
||||
$deleted = 'deletion';
|
||||
|
||||
$time = time();
|
||||
function insert_sample_if_not_exist($p)
|
||||
{
|
||||
$time = time();
|
||||
function insert_sample_if_not_exist($p) {
|
||||
global $db, $success, $deleted, $time;
|
||||
|
||||
$query = $db->query('SELECT `id` FROM `players` WHERE `name` = ' . $db->quote($p['name']));
|
||||
if ($query->rowCount() == 0) {
|
||||
if (!query("INSERT INTO `players` (`id`, `name`, `group_id`, `account_id`, `level`, `vocation`, `health`, `healthmax`, `experience`, `lookbody`, `lookfeet`, `lookhead`, `looklegs`, `looktype`, `maglevel`, `mana`, `manamax`, `manaspent`, `soul`, `town_id`, `posx`, `posy`, `posz`, `conditions`, `cap`, `sex`, `lastlogin`, `lastip`, `save`, `lastlogout`, `balance`, `$deleted`, `created`, `hide`, `comment`) VALUES (null, " . $db->quote($p['name']) . ", 1, " . getSession('account') . ", " . $p['level'] . ", " . $p['vocation_id'] . ", " . $p['health'] . ", " . $p['healthmax'] . ", " . $p['experience'] . ", 118, 114, 38, 57, " . $p['looktype'] . ", 0, " . $p['mana'] . ", " . $p['manamax'] . ", 0, " . $p['soul'] . ", 1, 1000, 1000, 7, '', " . $p['cap'] . ", 1, " . $time . ", 2130706433, 1, " . $time . ", 0, 0, " . $time . ", 1, '');"))
|
||||
if($query->rowCount() == 0) {
|
||||
if(!query("INSERT INTO `players` (`id`, `name`, `group_id`, `account_id`, `level`, `vocation`, `health`, `healthmax`, `experience`, `lookbody`, `lookfeet`, `lookhead`, `looklegs`, `looktype`, `maglevel`, `mana`, `manamax`, `manaspent`, `soul`, `town_id`, `posx`, `posy`, `posz`, `conditions`, `cap`, `sex`, `lastlogin`, `lastip`, `save`, `lastlogout`, `balance`, `$deleted`, `created`, `hidden`, `comment`) VALUES (null, " . $db->quote($p['name']) . ", 1, " . getSession('account') . ", " . $p['level'] . ", " . $p['vocation_id'] . ", " . $p['health'] . ", " . $p['healthmax'] . ", " . $p['experience'] . ", 118, 114, 38, 57, " . $p['looktype'] . ", 0, " . $p['mana'] . ", " . $p['manamax'] . ", 0, " . $p['soul'] . ", 1, 1000, 1000, 7, '', " . $p['cap'] . ", 1, " . $time . ", 2130706433, 1, " . $time . ", 0, 0, " . $time . ", 1, '');"))
|
||||
$success = false;
|
||||
}
|
||||
}
|
||||
|
||||
$success = true;
|
||||
insert_sample_if_not_exist(array('name' => 'Rook Sample', 'level' => 1, 'vocation_id' => 0, 'health' => 150, 'healthmax' => 150, 'experience' => 0, 'looktype' => 130, 'mana' => 0, 'manamax' => 0, 'soul' => 100, 'cap' => 400));
|
||||
insert_sample_if_not_exist(array('name' => 'Sorcerer Sample', 'level' => 8, 'vocation_id' => 1, 'health' => 185, 'healthmax' => 185, 'experience' => 4200, 'looktype' => 130, 'mana' => 90, 'manamax' => 90, 'soul' => 100, 'cap' => 470));
|
||||
insert_sample_if_not_exist(array('name' => 'Druid Sample', 'level' => 8, 'vocation_id' => 2, 'health' => 185, 'healthmax' => 185, 'experience' => 4200, 'looktype' => 130, 'mana' => 90, 'manamax' => 90, 'soul' => 100, 'cap' => 470));
|
||||
insert_sample_if_not_exist(array('name' => 'Paladin Sample', 'level' => 8, 'vocation_id' => 3, 'health' => 185, 'healthmax' => 185, 'experience' => 4200, 'looktype' => 129, 'mana' => 90, 'manamax' => 90, 'soul' => 100, 'cap' => 470));
|
||||
insert_sample_if_not_exist(array('name' => 'Knight Sample', 'level' => 8, 'vocation_id' => 4, 'health' => 185, 'healthmax' => 185, 'experience' => 4200, 'looktype' => 131, 'mana' => 90, 'manamax' => 90, 'soul' => 100, 'cap' => 470));
|
||||
|
||||
if ($success) {
|
||||
success($locale['step_database_imported_players']);
|
||||
}
|
||||
}
|
||||
|
||||
$success = true;
|
||||
insert_sample_if_not_exist(array('name' => 'Rook Sample', 'level' => 1, 'vocation_id' => 0, 'health' => 150, 'healthmax' => 150, 'experience' => 0, 'looktype' => 130, 'mana' => 0, 'manamax' => 0, 'soul' => 100, 'cap' => 400));
|
||||
insert_sample_if_not_exist(array('name' => 'Sorcerer Sample', 'level' => 8, 'vocation_id' => 1, 'health' => 185, 'healthmax' => 185, 'experience' => 4200, 'looktype' => 130, 'mana' => 90, 'manamax' => 90, 'soul' => 100, 'cap' => 470));
|
||||
insert_sample_if_not_exist(array('name' => 'Druid Sample', 'level' => 8, 'vocation_id' => 2, 'health' => 185, 'healthmax' => 185, 'experience' => 4200, 'looktype' => 130, 'mana' => 90, 'manamax' => 90, 'soul' => 100, 'cap' => 470));
|
||||
insert_sample_if_not_exist(array('name' => 'Paladin Sample', 'level' => 8, 'vocation_id' => 3, 'health' => 185, 'healthmax' => 185, 'experience' => 4200, 'looktype' => 129, 'mana' => 90, 'manamax' => 90, 'soul' => 100, 'cap' => 470));
|
||||
insert_sample_if_not_exist(array('name' => 'Knight Sample', 'level' => 8, 'vocation_id' => 4, 'health' => 185, 'healthmax' => 185, 'experience' => 4200, 'looktype' => 131, 'mana' => 90, 'manamax' => 90, 'soul' => 100, 'cap' => 470));
|
||||
|
||||
if($success) {
|
||||
success($locale['step_database_imported_players']);
|
||||
}
|
||||
|
||||
require_once LIBS . 'plugins.php';
|
||||
Plugins::installMenus('kathrine', require TEMPLATES . 'kathrine/menus.php');
|
||||
Plugins::installMenus('tibiacom', require TEMPLATES . 'tibiacom/menus.php');
|
||||
|
||||
require LIBS . 'DataLoader.php';
|
||||
DataLoader::setLocale($locale);
|
||||
DataLoader::load();
|
||||
|
||||
@@ -70,9 +63,7 @@ require_once SYSTEM . 'migrations/22.php';
|
||||
require_once SYSTEM . 'migrations/27.php';
|
||||
require_once SYSTEM . 'migrations/30.php';
|
||||
|
||||
// new monster columns
|
||||
require_once SYSTEM . 'migrations/31.php';
|
||||
|
||||
use MyAAC\Models\FAQ as ModelsFAQ;
|
||||
if(ModelsFAQ::count() == 0) {
|
||||
ModelsFAQ::create([
|
||||
'question' => 'What is this?',
|
||||
@@ -80,10 +71,6 @@ if(ModelsFAQ::count() == 0) {
|
||||
]);
|
||||
}
|
||||
|
||||
$hooks->trigger(HOOK_INSTALL_FINISH);
|
||||
|
||||
$db->setClearCacheAfter(true);
|
||||
|
||||
$locale['step_finish_desc'] = str_replace('$ADMIN_PANEL$', generateLink(str_replace('tools/', '',ADMIN_URL), $locale['step_finish_admin_panel'], true), $locale['step_finish_desc']);
|
||||
$locale['step_finish_desc'] = str_replace('$HOMEPAGE$', generateLink(str_replace('tools/', '', BASE_URL), $locale['step_finish_homepage'], true), $locale['step_finish_desc']);
|
||||
$locale['step_finish_desc'] = str_replace('$LINK$', generateLink('https://my-aac.org', 'https://my-aac.org', true), $locale['step_finish_desc']);
|
||||
|
32
login.php
32
login.php
@@ -4,7 +4,6 @@ use MyAAC\Models\BoostedCreature;
|
||||
use MyAAC\Models\PlayerOnline;
|
||||
use MyAAC\Models\Account;
|
||||
use MyAAC\Models\Player;
|
||||
use MyAAC\RateLimit;
|
||||
|
||||
require_once 'common.php';
|
||||
require_once SYSTEM . 'functions.php';
|
||||
@@ -131,29 +130,12 @@ switch ($action) {
|
||||
}
|
||||
|
||||
$account = $account->first();
|
||||
|
||||
$ip = get_browser_real_ip();
|
||||
$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();
|
||||
|
||||
$ban_msg = 'A wrong account, password or secret has been entered ' . setting('core.account_login_attempts_limit') . ' times in a row. You are unable to log into your account for the next ' . setting('core.account_login_ban_time') . ' minutes. Please wait.';
|
||||
if (!$account) {
|
||||
$limiter->increment($ip);
|
||||
if ($limiter->exceeded($ip)) {
|
||||
sendError($ban_msg);
|
||||
}
|
||||
|
||||
sendError(($inputEmail != false ? 'Email' : 'Account name') . ' or password is not correct.');
|
||||
}
|
||||
|
||||
$current_password = encrypt((USE_ACCOUNT_SALT ? $account->salt : '') . $request->password);
|
||||
if (!$account || $account->password != $current_password) {
|
||||
$limiter->increment($ip);
|
||||
if ($limiter->exceeded($ip)) {
|
||||
sendError($ban_msg);
|
||||
}
|
||||
|
||||
sendError(($inputEmail != false ? 'Email' : 'Account name') . ' or password is not correct.');
|
||||
}
|
||||
|
||||
@@ -163,30 +145,16 @@ switch ($action) {
|
||||
if ($accountSecret != null && $accountSecret != '') {
|
||||
$accountHasSecret = true;
|
||||
if ($inputToken === false) {
|
||||
$limiter->increment($ip);
|
||||
if ($limiter->exceeded($ip)) {
|
||||
sendError($ban_msg);
|
||||
}
|
||||
sendError('Submit a valid two-factor authentication token.', 6);
|
||||
} else {
|
||||
require_once LIBS . 'rfc6238.php';
|
||||
if (TokenAuth6238::verify($accountSecret, $inputToken) !== true) {
|
||||
$limiter->increment($ip);
|
||||
if ($limiter->exceeded($ip)) {
|
||||
sendError($ban_msg);
|
||||
}
|
||||
|
||||
sendError('Two-factor authentication failed, token is wrong.', 6);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$limiter->reset($ip);
|
||||
if (setting('core.account_mail_verify') && $account->email_verified !== 1) {
|
||||
sendError('You need to verify your account, enter in our site and resend verify e-mail!');
|
||||
}
|
||||
|
||||
// common columns
|
||||
$columns = 'id, name, level, sex, vocation, looktype, lookhead, lookbody, looklegs, lookfeet, lookaddons';
|
||||
|
||||
|
@@ -10,25 +10,22 @@ server {
|
||||
# this is very important, be sure its in your nginx conf - it prevents access to logs etc.
|
||||
location ~ /system {
|
||||
deny all;
|
||||
return 404;
|
||||
}
|
||||
|
||||
location /vendor {
|
||||
deny all;
|
||||
}
|
||||
|
||||
# block .htaccess, CHANGELOG.md, composer.json etc.
|
||||
# this is to prevent finding software versions
|
||||
location ~\.(ht|md|json|dist)$ {
|
||||
# block .htaccess
|
||||
location ~ /\.ht {
|
||||
deny all;
|
||||
}
|
||||
|
||||
# block git files and folders
|
||||
location ~ /\.git {
|
||||
return 404;
|
||||
deny all;
|
||||
}
|
||||
|
||||
location / {
|
||||
try_files $uri $uri/ /index.php?$query_string;;
|
||||
try_files $uri $uri/ /index.php;
|
||||
}
|
||||
|
||||
location ~ \.php$ {
|
||||
|
@@ -1,16 +0,0 @@
|
||||
const fse = require('fs-extra');
|
||||
const path = require('path');
|
||||
|
||||
const nodeModulesDir = path.join(__dirname, 'node_modules');
|
||||
const publicDir = path.join(__dirname, 'tools/ext');
|
||||
|
||||
fse.emptyDirSync(path.join(publicDir, 'jquery'));
|
||||
fse.emptyDirSync(path.join(publicDir, 'jquery-ui'));
|
||||
fse.emptyDirSync(path.join(publicDir, 'bootstrap'));
|
||||
fse.emptyDirSync(path.join(publicDir, 'tinymce'));
|
||||
fse.emptyDirSync(path.join(publicDir, 'tinymce-jquery'));
|
||||
fse.copySync(path.join(nodeModulesDir, 'jquery', 'dist'), path.join(publicDir, 'jquery'), { overwrite: true });
|
||||
fse.copySync(path.join(nodeModulesDir, 'jquery-ui', 'dist'), path.join(publicDir, 'jquery-ui'), { overwrite: true });
|
||||
fse.copySync(path.join(nodeModulesDir, 'bootstrap', 'dist'), path.join(publicDir, 'bootstrap'), { overwrite: true });
|
||||
fse.copySync(path.join(nodeModulesDir, 'tinymce'), path.join(publicDir, 'tinymce'), { overwrite: true });
|
||||
fse.copySync(path.join(nodeModulesDir, '@tinymce', 'tinymce-jquery', 'dist'), path.join(publicDir, 'tinymce-jquery'), { overwrite: true });
|
433
package-lock.json
generated
433
package-lock.json
generated
@@ -4,15 +4,6 @@
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"hasInstallScript": true,
|
||||
"dependencies": {
|
||||
"@tinymce/tinymce-jquery": "^2.1.0",
|
||||
"bootstrap": "^4.6.2",
|
||||
"fs-extra": "^11.2.0",
|
||||
"jquery": "^3.7.1",
|
||||
"jquery-ui": "^1.13.2",
|
||||
"tinymce": "^6.8.3"
|
||||
},
|
||||
"devDependencies": {
|
||||
"cypress": "^12.12.0"
|
||||
}
|
||||
@@ -28,9 +19,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@cypress/request": {
|
||||
"version": "2.88.12",
|
||||
"resolved": "https://registry.npmjs.org/@cypress/request/-/request-2.88.12.tgz",
|
||||
"integrity": "sha512-tOn+0mDZxASFM+cuAP9szGUGPI1HwWVSvdzm7V4cCsPdFTx6qMj29CwaQmRAMIEhORIUBFBsYROYJcveK4uOjA==",
|
||||
"version": "2.88.11",
|
||||
"resolved": "https://registry.npmjs.org/@cypress/request/-/request-2.88.11.tgz",
|
||||
"integrity": "sha512-M83/wfQ1EkspjkE2lNWNV5ui2Cv7UCv1swW1DqljahbzLVWltcsexQh8jYtuS/vzFXP+HySntGM83ZXA9fn17w==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"aws-sign2": "~0.7.0",
|
||||
@@ -48,7 +39,7 @@
|
||||
"performance-now": "^2.1.0",
|
||||
"qs": "~6.10.3",
|
||||
"safe-buffer": "^5.1.2",
|
||||
"tough-cookie": "^4.1.3",
|
||||
"tough-cookie": "~2.5.0",
|
||||
"tunnel-agent": "^0.6.0",
|
||||
"uuid": "^8.3.2"
|
||||
},
|
||||
@@ -75,15 +66,10 @@
|
||||
"ms": "^2.1.1"
|
||||
}
|
||||
},
|
||||
"node_modules/@tinymce/tinymce-jquery": {
|
||||
"version": "2.1.0",
|
||||
"resolved": "https://registry.npmjs.org/@tinymce/tinymce-jquery/-/tinymce-jquery-2.1.0.tgz",
|
||||
"integrity": "sha512-ynfgfL/n5/Us7h3AnJL3mAwsShuE/USvAJFOdilJDkZuVCypWSwVVo3E3wIqSzDGvqyU+293ok1+sD+jxraT8w=="
|
||||
},
|
||||
"node_modules/@types/node": {
|
||||
"version": "16.18.82",
|
||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.82.tgz",
|
||||
"integrity": "sha512-pcDZtkx9z8XYV+ius2P3Ot2VVrcYOfXffBQUBuiszrlUzKSmoDYqo+mV+IoL8iIiIjjtOMvNSmH1hwJ+Q+f96Q==",
|
||||
"version": "14.18.47",
|
||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.47.tgz",
|
||||
"integrity": "sha512-OuJi8bIng4wYHHA3YpKauL58dZrPxro3d0tabPHyiNF8rKfGKuVfr83oFlPLmKri1cX+Z3cJP39GXmnqkP11Gw==",
|
||||
"dev": true
|
||||
},
|
||||
"node_modules/@types/sinonjs__fake-timers": {
|
||||
@@ -93,15 +79,15 @@
|
||||
"dev": true
|
||||
},
|
||||
"node_modules/@types/sizzle": {
|
||||
"version": "2.3.8",
|
||||
"resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.8.tgz",
|
||||
"integrity": "sha512-0vWLNK2D5MT9dg0iOo8GlKguPAU02QjmZitPEsXRuJXU/OGIOt9vT9Fc26wtYuavLxtO45v9PGleoL9Z0k1LHg==",
|
||||
"version": "2.3.3",
|
||||
"resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.3.tgz",
|
||||
"integrity": "sha512-JYM8x9EGF163bEyhdJBpR2QX1R5naCJHC8ucJylJ3w9/CVBaskdQ8WqBf8MmQrd1kRvp/a4TS8HJ+bxzR7ZJYQ==",
|
||||
"dev": true
|
||||
},
|
||||
"node_modules/@types/yauzl": {
|
||||
"version": "2.10.3",
|
||||
"resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz",
|
||||
"integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==",
|
||||
"version": "2.10.0",
|
||||
"resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.0.tgz",
|
||||
"integrity": "sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==",
|
||||
"dev": true,
|
||||
"optional": true,
|
||||
"dependencies": {
|
||||
@@ -217,9 +203,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/async": {
|
||||
"version": "3.2.5",
|
||||
"resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz",
|
||||
"integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==",
|
||||
"version": "3.2.4",
|
||||
"resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz",
|
||||
"integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==",
|
||||
"dev": true
|
||||
},
|
||||
"node_modules/asynckit": {
|
||||
@@ -299,25 +285,6 @@
|
||||
"integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==",
|
||||
"dev": true
|
||||
},
|
||||
"node_modules/bootstrap": {
|
||||
"version": "4.6.2",
|
||||
"resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.6.2.tgz",
|
||||
"integrity": "sha512-51Bbp/Uxr9aTuy6ca/8FbFloBUJZLHwnhTcnjIeRn2suQWsWzcuJhGjKDB5eppVte/8oCdOL3VuwxvZDUggwGQ==",
|
||||
"funding": [
|
||||
{
|
||||
"type": "github",
|
||||
"url": "https://github.com/sponsors/twbs"
|
||||
},
|
||||
{
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/bootstrap"
|
||||
}
|
||||
],
|
||||
"peerDependencies": {
|
||||
"jquery": "1.9.1 - 3",
|
||||
"popper.js": "^1.16.1"
|
||||
}
|
||||
},
|
||||
"node_modules/brace-expansion": {
|
||||
"version": "1.1.11",
|
||||
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
|
||||
@@ -362,28 +329,22 @@
|
||||
}
|
||||
},
|
||||
"node_modules/cachedir": {
|
||||
"version": "2.4.0",
|
||||
"resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.4.0.tgz",
|
||||
"integrity": "sha512-9EtFOZR8g22CL7BWjJ9BUx1+A/djkofnyW3aOXZORNW2kxoUpx2h+uN2cOqwPmFhnpVmxg+KW2OjOSgChTEvsQ==",
|
||||
"version": "2.3.0",
|
||||
"resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.3.0.tgz",
|
||||
"integrity": "sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw==",
|
||||
"dev": true,
|
||||
"engines": {
|
||||
"node": ">=6"
|
||||
}
|
||||
},
|
||||
"node_modules/call-bind": {
|
||||
"version": "1.0.7",
|
||||
"resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz",
|
||||
"integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==",
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
|
||||
"integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"es-define-property": "^1.0.0",
|
||||
"es-errors": "^1.3.0",
|
||||
"function-bind": "^1.1.2",
|
||||
"get-intrinsic": "^1.2.4",
|
||||
"set-function-length": "^1.2.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 0.4"
|
||||
"function-bind": "^1.1.1",
|
||||
"get-intrinsic": "^1.0.2"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/ljharb"
|
||||
@@ -433,9 +394,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/ci-info": {
|
||||
"version": "3.9.0",
|
||||
"resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz",
|
||||
"integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==",
|
||||
"version": "3.8.0",
|
||||
"resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz",
|
||||
"integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==",
|
||||
"dev": true,
|
||||
"funding": [
|
||||
{
|
||||
@@ -580,15 +541,15 @@
|
||||
}
|
||||
},
|
||||
"node_modules/cypress": {
|
||||
"version": "12.17.4",
|
||||
"resolved": "https://registry.npmjs.org/cypress/-/cypress-12.17.4.tgz",
|
||||
"integrity": "sha512-gAN8Pmns9MA5eCDFSDJXWKUpaL3IDd89N9TtIupjYnzLSmlpVr+ZR+vb4U/qaMp+lB6tBvAmt7504c3Z4RU5KQ==",
|
||||
"version": "12.12.0",
|
||||
"resolved": "https://registry.npmjs.org/cypress/-/cypress-12.12.0.tgz",
|
||||
"integrity": "sha512-UU5wFQ7SMVCR/hyKok/KmzG6fpZgBHHfrXcHzDmPHWrT+UUetxFzQgt7cxCszlwfozckzwkd22dxMwl/vNkWRw==",
|
||||
"dev": true,
|
||||
"hasInstallScript": true,
|
||||
"dependencies": {
|
||||
"@cypress/request": "2.88.12",
|
||||
"@cypress/request": "^2.88.10",
|
||||
"@cypress/xvfb": "^1.2.4",
|
||||
"@types/node": "^16.18.39",
|
||||
"@types/node": "^14.14.31",
|
||||
"@types/sinonjs__fake-timers": "8.1.1",
|
||||
"@types/sizzle": "^2.3.2",
|
||||
"arch": "^2.2.0",
|
||||
@@ -621,10 +582,9 @@
|
||||
"minimist": "^1.2.8",
|
||||
"ospath": "^1.2.2",
|
||||
"pretty-bytes": "^5.6.0",
|
||||
"process": "^0.11.10",
|
||||
"proxy-from-env": "1.0.0",
|
||||
"request-progress": "^3.0.0",
|
||||
"semver": "^7.5.3",
|
||||
"semver": "^7.3.2",
|
||||
"supports-color": "^8.1.1",
|
||||
"tmp": "~0.2.1",
|
||||
"untildify": "^4.0.0",
|
||||
@@ -637,21 +597,6 @@
|
||||
"node": "^14.0.0 || ^16.0.0 || >=18.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/cypress/node_modules/fs-extra": {
|
||||
"version": "9.1.0",
|
||||
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
|
||||
"integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"at-least-node": "^1.0.0",
|
||||
"graceful-fs": "^4.2.0",
|
||||
"jsonfile": "^6.0.1",
|
||||
"universalify": "^2.0.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=10"
|
||||
}
|
||||
},
|
||||
"node_modules/dashdash": {
|
||||
"version": "1.14.1",
|
||||
"resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
|
||||
@@ -665,9 +610,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/dayjs": {
|
||||
"version": "1.11.10",
|
||||
"resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.10.tgz",
|
||||
"integrity": "sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==",
|
||||
"version": "1.11.7",
|
||||
"resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.7.tgz",
|
||||
"integrity": "sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ==",
|
||||
"dev": true
|
||||
},
|
||||
"node_modules/debug": {
|
||||
@@ -687,23 +632,6 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/define-data-property": {
|
||||
"version": "1.1.4",
|
||||
"resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz",
|
||||
"integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"es-define-property": "^1.0.0",
|
||||
"es-errors": "^1.3.0",
|
||||
"gopd": "^1.0.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 0.4"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/ljharb"
|
||||
}
|
||||
},
|
||||
"node_modules/delayed-stream": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
|
||||
@@ -739,39 +667,17 @@
|
||||
}
|
||||
},
|
||||
"node_modules/enquirer": {
|
||||
"version": "2.4.1",
|
||||
"resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz",
|
||||
"integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==",
|
||||
"version": "2.3.6",
|
||||
"resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz",
|
||||
"integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"ansi-colors": "^4.1.1",
|
||||
"strip-ansi": "^6.0.1"
|
||||
"ansi-colors": "^4.1.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=8.6"
|
||||
}
|
||||
},
|
||||
"node_modules/es-define-property": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz",
|
||||
"integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"get-intrinsic": "^1.2.4"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 0.4"
|
||||
}
|
||||
},
|
||||
"node_modules/es-errors": {
|
||||
"version": "1.3.0",
|
||||
"resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
|
||||
"integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
|
||||
"dev": true,
|
||||
"engines": {
|
||||
"node": ">= 0.4"
|
||||
}
|
||||
},
|
||||
"node_modules/escape-string-regexp": {
|
||||
"version": "1.0.5",
|
||||
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
|
||||
@@ -905,16 +811,18 @@
|
||||
}
|
||||
},
|
||||
"node_modules/fs-extra": {
|
||||
"version": "11.2.0",
|
||||
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz",
|
||||
"integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==",
|
||||
"version": "9.1.0",
|
||||
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
|
||||
"integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"at-least-node": "^1.0.0",
|
||||
"graceful-fs": "^4.2.0",
|
||||
"jsonfile": "^6.0.1",
|
||||
"universalify": "^2.0.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=14.14"
|
||||
"node": ">=10"
|
||||
}
|
||||
},
|
||||
"node_modules/fs.realpath": {
|
||||
@@ -924,28 +832,21 @@
|
||||
"dev": true
|
||||
},
|
||||
"node_modules/function-bind": {
|
||||
"version": "1.1.2",
|
||||
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
|
||||
"integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
|
||||
"dev": true,
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/ljharb"
|
||||
}
|
||||
"version": "1.1.1",
|
||||
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
|
||||
"integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
|
||||
"dev": true
|
||||
},
|
||||
"node_modules/get-intrinsic": {
|
||||
"version": "1.2.4",
|
||||
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz",
|
||||
"integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==",
|
||||
"version": "1.2.1",
|
||||
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz",
|
||||
"integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"es-errors": "^1.3.0",
|
||||
"function-bind": "^1.1.2",
|
||||
"function-bind": "^1.1.1",
|
||||
"has": "^1.0.3",
|
||||
"has-proto": "^1.0.1",
|
||||
"has-symbols": "^1.0.3",
|
||||
"hasown": "^2.0.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 0.4"
|
||||
"has-symbols": "^1.0.3"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/ljharb"
|
||||
@@ -1019,22 +920,23 @@
|
||||
"url": "https://github.com/sponsors/sindresorhus"
|
||||
}
|
||||
},
|
||||
"node_modules/gopd": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
|
||||
"integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"get-intrinsic": "^1.1.3"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/ljharb"
|
||||
}
|
||||
},
|
||||
"node_modules/graceful-fs": {
|
||||
"version": "4.2.11",
|
||||
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
|
||||
"integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="
|
||||
"integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
|
||||
"dev": true
|
||||
},
|
||||
"node_modules/has": {
|
||||
"version": "1.0.3",
|
||||
"resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
|
||||
"integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"function-bind": "^1.1.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 0.4.0"
|
||||
}
|
||||
},
|
||||
"node_modules/has-flag": {
|
||||
"version": "4.0.0",
|
||||
@@ -1045,18 +947,6 @@
|
||||
"node": ">=8"
|
||||
}
|
||||
},
|
||||
"node_modules/has-property-descriptors": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
|
||||
"integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"es-define-property": "^1.0.0"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/ljharb"
|
||||
}
|
||||
},
|
||||
"node_modules/has-proto": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz",
|
||||
@@ -1081,18 +971,6 @@
|
||||
"url": "https://github.com/sponsors/ljharb"
|
||||
}
|
||||
},
|
||||
"node_modules/hasown": {
|
||||
"version": "2.0.1",
|
||||
"resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.1.tgz",
|
||||
"integrity": "sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"function-bind": "^1.1.2"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 0.4"
|
||||
}
|
||||
},
|
||||
"node_modules/http-signature": {
|
||||
"version": "1.3.6",
|
||||
"resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.3.6.tgz",
|
||||
@@ -1258,19 +1136,6 @@
|
||||
"integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==",
|
||||
"dev": true
|
||||
},
|
||||
"node_modules/jquery": {
|
||||
"version": "3.7.1",
|
||||
"resolved": "https://registry.npmjs.org/jquery/-/jquery-3.7.1.tgz",
|
||||
"integrity": "sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg=="
|
||||
},
|
||||
"node_modules/jquery-ui": {
|
||||
"version": "1.13.2",
|
||||
"resolved": "https://registry.npmjs.org/jquery-ui/-/jquery-ui-1.13.2.tgz",
|
||||
"integrity": "sha512-wBZPnqWs5GaYJmo1Jj0k/mrSkzdQzKDwhXNtHKcBdAcKVxMM3KNYFq+iJ2i1rwiG53Z8M4mTn3Qxrm17uH1D4Q==",
|
||||
"dependencies": {
|
||||
"jquery": ">=1.8.0 <4.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/jsbn": {
|
||||
"version": "0.1.1",
|
||||
"resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
|
||||
@@ -1293,6 +1158,7 @@
|
||||
"version": "6.1.0",
|
||||
"resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
|
||||
"integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"universalify": "^2.0.0"
|
||||
},
|
||||
@@ -1516,9 +1382,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/object-inspect": {
|
||||
"version": "1.13.1",
|
||||
"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz",
|
||||
"integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==",
|
||||
"version": "1.12.3",
|
||||
"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz",
|
||||
"integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==",
|
||||
"dev": true,
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/ljharb"
|
||||
@@ -1608,17 +1474,6 @@
|
||||
"node": ">=0.10.0"
|
||||
}
|
||||
},
|
||||
"node_modules/popper.js": {
|
||||
"version": "1.16.1",
|
||||
"resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1.tgz",
|
||||
"integrity": "sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ==",
|
||||
"deprecated": "You can find the new Popper v2 at @popperjs/core, this package is dedicated to the legacy v1",
|
||||
"peer": true,
|
||||
"funding": {
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/popperjs"
|
||||
}
|
||||
},
|
||||
"node_modules/pretty-bytes": {
|
||||
"version": "5.6.0",
|
||||
"resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz",
|
||||
@@ -1631,15 +1486,6 @@
|
||||
"url": "https://github.com/sponsors/sindresorhus"
|
||||
}
|
||||
},
|
||||
"node_modules/process": {
|
||||
"version": "0.11.10",
|
||||
"resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
|
||||
"integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==",
|
||||
"dev": true,
|
||||
"engines": {
|
||||
"node": ">= 0.6.0"
|
||||
}
|
||||
},
|
||||
"node_modules/proxy-from-env": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz",
|
||||
@@ -1663,9 +1509,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/punycode": {
|
||||
"version": "2.3.1",
|
||||
"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
|
||||
"integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
|
||||
"version": "2.3.0",
|
||||
"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz",
|
||||
"integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==",
|
||||
"dev": true,
|
||||
"engines": {
|
||||
"node": ">=6"
|
||||
@@ -1686,12 +1532,6 @@
|
||||
"url": "https://github.com/sponsors/ljharb"
|
||||
}
|
||||
},
|
||||
"node_modules/querystringify": {
|
||||
"version": "2.2.0",
|
||||
"resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz",
|
||||
"integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==",
|
||||
"dev": true
|
||||
},
|
||||
"node_modules/request-progress": {
|
||||
"version": "3.0.0",
|
||||
"resolved": "https://registry.npmjs.org/request-progress/-/request-progress-3.0.0.tgz",
|
||||
@@ -1701,12 +1541,6 @@
|
||||
"throttleit": "^1.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/requires-port": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
|
||||
"integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==",
|
||||
"dev": true
|
||||
},
|
||||
"node_modules/restore-cursor": {
|
||||
"version": "3.1.0",
|
||||
"resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz",
|
||||
@@ -1721,9 +1555,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/rfdc": {
|
||||
"version": "1.3.1",
|
||||
"resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.1.tgz",
|
||||
"integrity": "sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==",
|
||||
"version": "1.3.0",
|
||||
"resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz",
|
||||
"integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==",
|
||||
"dev": true
|
||||
},
|
||||
"node_modules/rimraf": {
|
||||
@@ -1777,9 +1611,9 @@
|
||||
"dev": true
|
||||
},
|
||||
"node_modules/semver": {
|
||||
"version": "7.6.0",
|
||||
"resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz",
|
||||
"integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==",
|
||||
"version": "7.5.1",
|
||||
"resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz",
|
||||
"integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"lru-cache": "^6.0.0"
|
||||
@@ -1791,23 +1625,6 @@
|
||||
"node": ">=10"
|
||||
}
|
||||
},
|
||||
"node_modules/set-function-length": {
|
||||
"version": "1.2.1",
|
||||
"resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.1.tgz",
|
||||
"integrity": "sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"define-data-property": "^1.1.2",
|
||||
"es-errors": "^1.3.0",
|
||||
"function-bind": "^1.1.2",
|
||||
"get-intrinsic": "^1.2.3",
|
||||
"gopd": "^1.0.1",
|
||||
"has-property-descriptors": "^1.0.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 0.4"
|
||||
}
|
||||
},
|
||||
"node_modules/shebang-command": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
|
||||
@@ -1830,18 +1647,14 @@
|
||||
}
|
||||
},
|
||||
"node_modules/side-channel": {
|
||||
"version": "1.0.5",
|
||||
"resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.5.tgz",
|
||||
"integrity": "sha512-QcgiIWV4WV7qWExbN5llt6frQB/lBven9pqliLXfGPB+K9ZYXxDozp0wLkHS24kWCm+6YXH/f0HhnObZnZOBnQ==",
|
||||
"version": "1.0.4",
|
||||
"resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
|
||||
"integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"call-bind": "^1.0.6",
|
||||
"es-errors": "^1.3.0",
|
||||
"get-intrinsic": "^1.2.4",
|
||||
"object-inspect": "^1.13.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 0.4"
|
||||
"call-bind": "^1.0.0",
|
||||
"get-intrinsic": "^1.0.2",
|
||||
"object-inspect": "^1.9.0"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/ljharb"
|
||||
@@ -1868,9 +1681,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/sshpk": {
|
||||
"version": "1.18.0",
|
||||
"resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz",
|
||||
"integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==",
|
||||
"version": "1.17.0",
|
||||
"resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz",
|
||||
"integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"asn1": "~0.2.3",
|
||||
@@ -1943,13 +1756,10 @@
|
||||
}
|
||||
},
|
||||
"node_modules/throttleit": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.1.tgz",
|
||||
"integrity": "sha512-vDZpf9Chs9mAdfY046mcPt8fg5QSZr37hEH4TXYBnDF+izxgrbRGUAAaBvIk/fJm9aOFCGFd1EsNg5AZCbnQCQ==",
|
||||
"dev": true,
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/sindresorhus"
|
||||
}
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz",
|
||||
"integrity": "sha512-rkTVqu6IjfQ/6+uNuuc3sZek4CEYxTJom3IktzgdSxcZqdARuebbA/f4QmAxMQIxqq9ZLEUkSYqvuk1I6VKq4g==",
|
||||
"dev": true
|
||||
},
|
||||
"node_modules/through": {
|
||||
"version": "2.3.8",
|
||||
@@ -1957,11 +1767,6 @@
|
||||
"integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==",
|
||||
"dev": true
|
||||
},
|
||||
"node_modules/tinymce": {
|
||||
"version": "6.8.3",
|
||||
"resolved": "https://registry.npmjs.org/tinymce/-/tinymce-6.8.3.tgz",
|
||||
"integrity": "sha512-3fCHKAeqT+xNwBVESf6iDbDV0VNwZNmfrkx9c/6Gz5iB8piMfaO6s7FvoiTrj1hf1gVbfyLTnz1DooI6DhgINQ=="
|
||||
},
|
||||
"node_modules/tmp": {
|
||||
"version": "0.2.1",
|
||||
"resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz",
|
||||
@@ -1975,33 +1780,22 @@
|
||||
}
|
||||
},
|
||||
"node_modules/tough-cookie": {
|
||||
"version": "4.1.3",
|
||||
"resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz",
|
||||
"integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==",
|
||||
"version": "2.5.0",
|
||||
"resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
|
||||
"integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"psl": "^1.1.33",
|
||||
"punycode": "^2.1.1",
|
||||
"universalify": "^0.2.0",
|
||||
"url-parse": "^1.5.3"
|
||||
"psl": "^1.1.28",
|
||||
"punycode": "^2.1.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=6"
|
||||
}
|
||||
},
|
||||
"node_modules/tough-cookie/node_modules/universalify": {
|
||||
"version": "0.2.0",
|
||||
"resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz",
|
||||
"integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==",
|
||||
"dev": true,
|
||||
"engines": {
|
||||
"node": ">= 4.0.0"
|
||||
"node": ">=0.8"
|
||||
}
|
||||
},
|
||||
"node_modules/tslib": {
|
||||
"version": "2.6.2",
|
||||
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz",
|
||||
"integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==",
|
||||
"version": "2.5.1",
|
||||
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.1.tgz",
|
||||
"integrity": "sha512-KaI6gPil5m9vF7DKaoXxx1ia9fxS4qG5YveErRRVknPDXXriu5M8h48YRjB6h5ZUOKuAKlSJYb0GaDe8I39fRw==",
|
||||
"dev": true
|
||||
},
|
||||
"node_modules/tunnel-agent": {
|
||||
@@ -2035,9 +1829,10 @@
|
||||
}
|
||||
},
|
||||
"node_modules/universalify": {
|
||||
"version": "2.0.1",
|
||||
"resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
|
||||
"integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz",
|
||||
"integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==",
|
||||
"dev": true,
|
||||
"engines": {
|
||||
"node": ">= 10.0.0"
|
||||
}
|
||||
@@ -2051,16 +1846,6 @@
|
||||
"node": ">=8"
|
||||
}
|
||||
},
|
||||
"node_modules/url-parse": {
|
||||
"version": "1.5.10",
|
||||
"resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz",
|
||||
"integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"querystringify": "^2.1.1",
|
||||
"requires-port": "^1.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/uuid": {
|
||||
"version": "8.3.2",
|
||||
"resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
|
||||
|
11
package.json
11
package.json
@@ -1,17 +1,8 @@
|
||||
{
|
||||
"scripts": {
|
||||
"cypress:open": "cypress open",
|
||||
"postinstall": "node ./npm-post-install.js"
|
||||
"cypress:open": "cypress open"
|
||||
},
|
||||
"devDependencies": {
|
||||
"cypress": "^12.12.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"@tinymce/tinymce-jquery": "^2.1.0",
|
||||
"bootstrap": "^4.6.2",
|
||||
"fs-extra": "^11.2.0",
|
||||
"jquery": "^3.7.1",
|
||||
"jquery-ui": "^1.13.2",
|
||||
"tinymce": "^6.8.3"
|
||||
}
|
||||
}
|
||||
|
@@ -1,13 +0,0 @@
|
||||
<?php
|
||||
|
||||
require __DIR__ . '/system/libs/pot/OTS.php';
|
||||
$ots = POT::getInstance();
|
||||
|
||||
require __DIR__ . '/system/libs/pot/InvitesDriver.php';
|
||||
require __DIR__ . '/system/libs/rfc6238.php';
|
||||
require __DIR__ . '/common.php';
|
||||
|
||||
const ACTION = '';
|
||||
const PAGE = '';
|
||||
const URI = '';
|
||||
define('SELF_NAME', basename(__FILE__));
|
39
phpstan.neon
39
phpstan.neon
@@ -1,39 +0,0 @@
|
||||
parameters:
|
||||
level: 3
|
||||
paths:
|
||||
- .
|
||||
- templates/tibiacom
|
||||
- templates/kathrine
|
||||
excludePaths:
|
||||
- system/cache/*
|
||||
- vendor/*
|
||||
- plugins/*
|
||||
- system/libs
|
||||
- tools/signature/mango.php
|
||||
- tools/signature/gd.class.php
|
||||
bootstrapFiles:
|
||||
- phpstan-bootstrap.php
|
||||
ignoreErrors:
|
||||
- '#Variable \$db might not be defined#'
|
||||
- '#Variable \$twig might not be defined#'
|
||||
- '#Variable \$hooks might not be defined#'
|
||||
- '#Variable \$account_logged might not be defined#'
|
||||
- '#Variable \$logged might not be defined#'
|
||||
- '#Variable \$config might not be defined#'
|
||||
- '#Variable \$action might not be defined#'
|
||||
- '#Variable \$errors might not be defined#'
|
||||
- '#Variable \$cache might not be defined#'
|
||||
- '#Variable \$status might not be defined#'
|
||||
- '#Variable \$player might not be defined#'
|
||||
- '#Variable \$guild might not be defined#'
|
||||
- '#Variable \$[a-zA-Z0-9\\_]+ might not be defined#'
|
||||
# Eloquent models
|
||||
- '#Call to an undefined static method [a-zA-Z0-9\\_]+::[a-zA-Z0-9\\_]+\(\)#'
|
||||
- '#Call to an undefined method object::toArray\(\)#'
|
||||
# system/pages/highscores.php
|
||||
- '#Call to an undefined method Illuminate\\Database\\Query\\Builder::withOnlineStatus\(\)#'
|
||||
- '#Access to an undefined property Illuminate\\Database\\Eloquent\\Model::\$online_status#'
|
||||
- '#Access to an undefined property Illuminate\\Database\\Eloquent\\Model::\$vocation_name#'
|
||||
-
|
||||
message: '#Variable \$tmp in empty\(\) always exists and is always falsy#'
|
||||
path: templates\kathrine\javascript.php
|
@@ -1,6 +1,8 @@
|
||||
<?php
|
||||
defined('MYAAC') or die('Direct access not allowed!');
|
||||
|
||||
$reward = setting('core.account_mail_confirmed_reward');
|
||||
|
||||
$hasCoinsColumn = $db->hasColumn('accounts', 'coins');
|
||||
$rewardCoins = setting('core.account_mail_confirmed_reward_coins');
|
||||
if ($rewardCoins > 0 && !$hasCoinsColumn) {
|
||||
|
@@ -25,8 +25,7 @@
|
||||
"hooks": {
|
||||
"Example Hook": {
|
||||
"type": "BEFORE_PAGE",
|
||||
"file": "plugins/example/before.php",
|
||||
"priority": 1000
|
||||
"file": "plugins/example/before.php"
|
||||
}
|
||||
},
|
||||
"routes": {
|
||||
@@ -34,20 +33,12 @@
|
||||
"pattern": "/YourAwesomePage/{name:string}/{page:int}",
|
||||
"file": "plugins/your-plugin/your-awesome-page.php",
|
||||
"method": "GET",
|
||||
"priority": 130
|
||||
"priority": "130"
|
||||
},
|
||||
"Redirect Example": {
|
||||
"redirect_from": "/redirectExample",
|
||||
"redirect_to": "account/manage"
|
||||
}
|
||||
},
|
||||
"routes-default-priority": 1000,
|
||||
"pages-default-priority": 1000,
|
||||
"settings": "plugins/your-plugin-folder/settings.php",
|
||||
"autoload": {
|
||||
"pages": true,
|
||||
"pagesSubFolders": false,
|
||||
"commands": true,
|
||||
"themes": true
|
||||
}
|
||||
"settings": "plugins/your-plugin-folder/settings.php"
|
||||
}
|
||||
|
@@ -38,11 +38,7 @@ if [ $1 = "prepare" ]; then
|
||||
cd $dir || exit
|
||||
|
||||
# dependencies
|
||||
composer install --no-dev --prefer-dist --optimize-autoloader
|
||||
npm install
|
||||
|
||||
# node_modules is useless, we already have copy in tools/ext
|
||||
rm -R node_modules
|
||||
composer install --no-dev
|
||||
|
||||
echo "Now you can make changes to $dir. When you are ready, type 'release.sh pack'"
|
||||
exit
|
||||
|
18
system/bin/clear_cache.php
Normal file
18
system/bin/clear_cache.php
Normal file
@@ -0,0 +1,18 @@
|
||||
<?php
|
||||
|
||||
if(PHP_SAPI !== 'cli') {
|
||||
echo 'This script can be run only in command line mode.';
|
||||
exit(1);
|
||||
}
|
||||
|
||||
require_once __DIR__ . '/../../common.php';
|
||||
require_once SYSTEM . 'functions.php';
|
||||
require_once SYSTEM . 'init.php';
|
||||
|
||||
if(clearCache()) {
|
||||
echo 'Cache cleared.' . PHP_EOL;
|
||||
}
|
||||
else {
|
||||
echo 'Unexpected error.' . PHP_EOL;
|
||||
exit(2);
|
||||
}
|
19
system/bin/cronjob.php
Normal file
19
system/bin/cronjob.php
Normal file
@@ -0,0 +1,19 @@
|
||||
<?php
|
||||
|
||||
require_once __DIR__ . '/../../common.php';
|
||||
require_once SYSTEM . 'functions.php';
|
||||
require_once SYSTEM . 'init.php';
|
||||
require_once SYSTEM . 'hooks.php';
|
||||
|
||||
$hooks = new Hooks();
|
||||
$hooks->load();
|
||||
|
||||
use GO\Scheduler;
|
||||
|
||||
// Create a new scheduler
|
||||
$scheduler = new Scheduler();
|
||||
|
||||
$hooks->trigger(HOOK_CRONJOB, ['scheduler' => $scheduler]);
|
||||
|
||||
// Let the scheduler execute jobs which are due.
|
||||
$scheduler->run();
|
15
system/bin/dump_database.php
Normal file
15
system/bin/dump_database.php
Normal file
@@ -0,0 +1,15 @@
|
||||
<?php
|
||||
|
||||
if(PHP_SAPI !== 'cli') {
|
||||
echo 'This script can be run only in command line mode.';
|
||||
exit(1);
|
||||
}
|
||||
|
||||
require_once __DIR__ . '/../../common.php';
|
||||
require_once SYSTEM . 'functions.php';
|
||||
require_once SYSTEM . 'init.php';
|
||||
|
||||
$test = new \Illuminate\Database\Schema\MySqlSchemaState($eloquentConnection);
|
||||
$test->dump($eloquentConnection, BASE . 'dump.sql');
|
||||
|
||||
echo 'Dumped.';
|
0
system/bin/index.html
Normal file
0
system/bin/index.html
Normal file
50
system/bin/install_cronjob.php
Normal file
50
system/bin/install_cronjob.php
Normal file
@@ -0,0 +1,50 @@
|
||||
<?php
|
||||
|
||||
require_once __DIR__ . '/../../common.php';
|
||||
require_once SYSTEM . 'functions.php';
|
||||
require_once SYSTEM . 'init.php';
|
||||
|
||||
if(!IS_CLI) {
|
||||
echo 'This script can be run only in command line mode.' . PHP_EOL;
|
||||
exit(1);
|
||||
}
|
||||
|
||||
if (MYAAC_OS !== 'LINUX') {
|
||||
echo 'This script can be run only on linux.' . PHP_EOL;
|
||||
exit(1);
|
||||
}
|
||||
|
||||
$job = '* * * * * /usr/bin/php ' . SYSTEM . 'bin/cronjob.php >> ' . SYSTEM . 'logs/cron.log 2>&1';
|
||||
|
||||
if (cronjob_exists($job)) {
|
||||
echo 'MyAAC cronjob already installed.' . PHP_EOL;
|
||||
exit(0);
|
||||
}
|
||||
|
||||
exec ('crontab -l', $content);
|
||||
|
||||
$content = implode(' ', $content);
|
||||
$content .= PHP_EOL . $job;
|
||||
|
||||
file_put_contents(CACHE . 'cronjob', $content . PHP_EOL);
|
||||
exec('crontab ' . CACHE. 'cronjob');
|
||||
|
||||
echo 'Installed crontab successfully.' . PHP_EOL;
|
||||
|
||||
function cronjob_exists($command)
|
||||
{
|
||||
$cronjob_exists=false;
|
||||
|
||||
exec('crontab -l', $crontab);
|
||||
if(isset($crontab)&&is_array($crontab)) {
|
||||
|
||||
$crontab = array_flip($crontab);
|
||||
|
||||
if(isset($crontab[$command])){
|
||||
$cronjob_exists = true;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return $cronjob_exists;
|
||||
}
|
42
system/bin/install_plugin.php
Normal file
42
system/bin/install_plugin.php
Normal file
@@ -0,0 +1,42 @@
|
||||
<?php
|
||||
|
||||
if(PHP_SAPI !== 'cli') {
|
||||
echo 'This script can be run only in command line mode.';
|
||||
exit(1);
|
||||
}
|
||||
|
||||
require_once __DIR__ . '/../../common.php';
|
||||
require_once SYSTEM . 'functions.php';
|
||||
require_once SYSTEM . 'init.php';
|
||||
require_once SYSTEM . 'hooks.php';
|
||||
require_once LIBS . 'plugins.php';
|
||||
|
||||
if($argc !== 2) {
|
||||
echo 'This command expects one parameter: zip file name (plugin)' . PHP_EOL;
|
||||
exit(2);
|
||||
}
|
||||
|
||||
$path_to_file = $argv[1];
|
||||
$ext = strtolower(pathinfo($path_to_file, PATHINFO_EXTENSION));
|
||||
if($ext !== 'zip') {// check if it is zipped/compressed file
|
||||
echo 'Please install only .zip files.' . PHP_EOL;
|
||||
exit(3);
|
||||
}
|
||||
|
||||
if(!file_exists($path_to_file)) {
|
||||
echo 'ERROR: File ' . $path_to_file . ' does not exist' . PHP_EOL;
|
||||
exit(4);
|
||||
}
|
||||
|
||||
if(Plugins::install($path_to_file)) {
|
||||
foreach(Plugins::getWarnings() as $warning) {
|
||||
echo 'WARNING: ' . $warning;
|
||||
}
|
||||
|
||||
$info = Plugins::getPluginJson();
|
||||
echo (isset($info['name']) ? $info['name'] . ' p' : 'P') . 'lugin has been successfully installed.' . PHP_EOL;
|
||||
}
|
||||
else {
|
||||
echo 'ERROR: ' . Plugins::getError() . PHP_EOL;
|
||||
exit(5);
|
||||
}
|
61
system/bin/send_email.php
Normal file
61
system/bin/send_email.php
Normal file
@@ -0,0 +1,61 @@
|
||||
<?php
|
||||
|
||||
if(PHP_SAPI !== 'cli') {
|
||||
echo 'This script can be run only in command line mode.';
|
||||
exit(1);
|
||||
}
|
||||
|
||||
require_once __DIR__ . '/../../common.php';
|
||||
require_once SYSTEM . 'functions.php';
|
||||
require_once SYSTEM . 'init.php';
|
||||
|
||||
if($argc !== 3) {
|
||||
echo 'This command expects two parameters: account_name_or_id|player_name|email address, subject.' . PHP_EOL;
|
||||
exit(2);
|
||||
}
|
||||
|
||||
$email_account_name = $argv[1];
|
||||
$subject = $argv[2];
|
||||
$message = file_get_contents('php://stdin');
|
||||
|
||||
if(strpos($email_account_name, '@') === false) {
|
||||
$account = new OTS_Account();
|
||||
if(USE_ACCOUNT_NAME) {
|
||||
$account->find($email_account_name);
|
||||
}
|
||||
else {
|
||||
$account->load($email_account_name);
|
||||
}
|
||||
|
||||
if($account->isLoaded()) {
|
||||
$email_account_name = $account->getEMail();
|
||||
}
|
||||
else {
|
||||
$player = new OTS_Player();
|
||||
$player->find($email_account_name);
|
||||
if($player->isLoaded()) {
|
||||
$email_account_name = $player->getAccount()->getEMail();
|
||||
}
|
||||
else {
|
||||
echo 'Cannot find player or account with name: ' . $email_account_name . '.' . PHP_EOL;
|
||||
exit(3);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(!Validator::email($email_account_name)) {
|
||||
echo 'Invalid E-Mail format.' . PHP_EOL;
|
||||
exit(4);
|
||||
}
|
||||
|
||||
if(strlen($subject) > 255) {
|
||||
echo 'Subject max length is 255 characters.' . PHP_EOL;
|
||||
exit(5);
|
||||
}
|
||||
|
||||
if(!_mail($email_account_name, $subject, $message)) {
|
||||
echo 'An error occurred while sending email. More info can be found in system/logs/mailer-error.log';
|
||||
exit(6);
|
||||
}
|
||||
|
||||
echo 'Mail sent to ' . $email_account_name . '.' . PHP_EOL;
|
@@ -105,8 +105,4 @@ $config['clients'] = [
|
||||
1316,
|
||||
1320,
|
||||
1321,
|
||||
1322,
|
||||
1330,
|
||||
1332,
|
||||
1340,
|
||||
];
|
||||
|
@@ -9,8 +9,6 @@
|
||||
*/
|
||||
defined('MYAAC') or die('Direct access not allowed!');
|
||||
|
||||
class Validator extends \MyAAC\Validator {}
|
||||
|
||||
function check_name($name, &$errors = '') {
|
||||
if(Validator::characterName($name))
|
||||
return true;
|
||||
@@ -74,7 +72,4 @@ function fieldExist($field, $table)
|
||||
global $db;
|
||||
return $db->hasColumn($table, $field);
|
||||
}
|
||||
|
||||
function getCreatureImgPath($creature): string {
|
||||
return getMonsterImgPath($creature);
|
||||
}
|
||||
?>
|
@@ -44,7 +44,7 @@ switch($page)
|
||||
break;
|
||||
|
||||
case 'killstatistics':
|
||||
$page = 'last-kills';
|
||||
$page = 'lastkills';
|
||||
break;
|
||||
|
||||
case 'buypoints':
|
||||
|
@@ -7,9 +7,6 @@
|
||||
* @copyright 2019 MyAAC
|
||||
* @link https://my-aac.org
|
||||
*/
|
||||
|
||||
use MyAAC\Cache\Cache;
|
||||
|
||||
defined('MYAAC') or die('Direct access not allowed!');
|
||||
define('COUNTER_SYNC', 10); // how often counter is synchronized with database (each x site refreshes)
|
||||
|
||||
|
@@ -111,6 +111,8 @@ try {
|
||||
$capsule->addConnection([
|
||||
'driver' => 'mysql',
|
||||
'database' => $config['database_name'],
|
||||
'username' => $config['database_user'],
|
||||
'password' => $config['database_password'],
|
||||
]);
|
||||
|
||||
$capsule->getConnection()->setPdo($db);
|
||||
@@ -127,7 +129,6 @@ try {
|
||||
}
|
||||
|
||||
if(defined('MYAAC_INSTALL')) {
|
||||
$error = $e->getMessage();
|
||||
return; // installer will take care of this
|
||||
}
|
||||
|
||||
|
@@ -8,8 +8,6 @@
|
||||
* @link https://my-aac.org
|
||||
*/
|
||||
|
||||
use MyAAC\Exceptions\SensitiveException;
|
||||
|
||||
if (class_exists(\Whoops\Run::class)) {
|
||||
$whoops = new \Whoops\Run;
|
||||
if(IS_CLI) {
|
||||
@@ -23,6 +21,8 @@ if (class_exists(\Whoops\Run::class)) {
|
||||
return;
|
||||
}
|
||||
|
||||
require LIBS . 'SensitiveException.php';
|
||||
|
||||
/**
|
||||
* @param Exception $exception
|
||||
*/
|
||||
|
@@ -9,17 +9,12 @@
|
||||
*/
|
||||
defined('MYAAC') or die('Direct access not allowed!');
|
||||
|
||||
use MyAAC\Cache\Cache;
|
||||
use MyAAC\CsrfToken;
|
||||
use MyAAC\Items;
|
||||
use MyAAC\Models\Config;
|
||||
use MyAAC\Models\Guild;
|
||||
use MyAAC\Models\House;
|
||||
use MyAAC\Models\Pages;
|
||||
use MyAAC\Models\Player;
|
||||
use MyAAC\News;
|
||||
use MyAAC\Plugins;
|
||||
use MyAAC\Settings;
|
||||
use PHPMailer\PHPMailer\PHPMailer;
|
||||
use Twig\Loader\ArrayLoader as Twig_ArrayLoader;
|
||||
|
||||
@@ -87,36 +82,25 @@ function getForumBoardLink($board_id, $page = NULL): string {
|
||||
return BASE_URL . (setting('core.friendly_urls') ? '' : 'index.php/') . 'forum/board/' . (int)$board_id . (isset($page) ? '/' . $page : '');
|
||||
}
|
||||
|
||||
function getPlayerLink($name, $generate = true, bool $colored = false): string
|
||||
function getPlayerLink($name, $generate = true): string
|
||||
{
|
||||
if(is_numeric($name))
|
||||
{
|
||||
$player = new OTS_Player();
|
||||
|
||||
if(is_numeric($name)) {
|
||||
$player->load((int)$name);
|
||||
}
|
||||
else {
|
||||
$player->find($name);
|
||||
}
|
||||
|
||||
if (!$player->isLoaded()) {
|
||||
return '(error)';
|
||||
}
|
||||
|
||||
if($player->isLoaded())
|
||||
$name = $player->getName();
|
||||
}
|
||||
|
||||
$url = BASE_URL . (setting('core.friendly_urls') ? '' : 'index.php/') . 'characters/' . urlencode($name);
|
||||
|
||||
if ($colored) {
|
||||
$name = '<span style="color: ' . ($player->isOnline() ? 'green' : 'red') . ';">' . $name . '</span>';
|
||||
}
|
||||
|
||||
if(!$generate) return $url;
|
||||
return generateLink($url, $name);
|
||||
}
|
||||
|
||||
function getMonsterLink($name, $generate = true): string
|
||||
{
|
||||
$url = BASE_URL . (setting('core.friendly_urls') ? '' : 'index.php/') . 'monsters/' . urlencode($name);
|
||||
$url = BASE_URL . (setting('core.friendly_urls') ? '' : 'index.php/') . 'creatures/' . urlencode($name);
|
||||
|
||||
if(!$generate) return $url;
|
||||
return generateLink($url, $name);
|
||||
@@ -153,6 +137,7 @@ function getGuildLink($name, $generate = true): string
|
||||
}
|
||||
|
||||
function getItemNameById($id) {
|
||||
require_once LIBS . 'items.php';
|
||||
$item = Items::get($id);
|
||||
return !empty($item['name']) ? $item['name'] : '';
|
||||
}
|
||||
@@ -212,7 +197,7 @@ function getFlagImage($country): string
|
||||
* @param mixed $v Variable to check.
|
||||
* @return bool Value boolean status.
|
||||
*/
|
||||
function getBoolean(mixed $v): bool
|
||||
function getBoolean($v): bool
|
||||
{
|
||||
if(is_bool($v)) {
|
||||
return $v;
|
||||
@@ -221,10 +206,6 @@ function getBoolean(mixed $v): bool
|
||||
if(is_numeric($v))
|
||||
return (int)$v > 0;
|
||||
|
||||
if (is_null($v)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$v = strtolower($v);
|
||||
return $v === 'yes' || $v === 'true';
|
||||
}
|
||||
@@ -272,7 +253,7 @@ function generateRandomString($length, $lowCase = true, $upCase = false, $numeri
|
||||
function getForumBoards()
|
||||
{
|
||||
global $db, $canEdit;
|
||||
$sections = $db->query('SELECT `id`, `name`, `description`, `closed`, `guild`, `access`' . ($canEdit ? ', `hide`, `ordering`' : '') . ' FROM `' . TABLE_PREFIX . 'forum_boards` ' . (!$canEdit ? ' WHERE `hide` != 1' : '') .
|
||||
$sections = $db->query('SELECT `id`, `name`, `description`, `closed`, `guild`, `access`' . ($canEdit ? ', `hidden`, `ordering`' : '') . ' FROM `' . TABLE_PREFIX . 'forum_boards` ' . (!$canEdit ? ' WHERE `hidden` != 1' : '') .
|
||||
' ORDER BY `ordering`;');
|
||||
if($sections)
|
||||
return $sections->fetchAll();
|
||||
@@ -429,10 +410,7 @@ function delete_guild($id)
|
||||
if(count($rank_list) > 0) {
|
||||
$rank_list->orderBy('level');
|
||||
|
||||
global $db;
|
||||
/**
|
||||
* @var OTS_GuildRank $rank_in_guild
|
||||
*/
|
||||
global $db, $ots;
|
||||
foreach($rank_list as $rank_in_guild) {
|
||||
if($db->hasTable('guild_members'))
|
||||
$players_with_rank = $db->query('SELECT `players`.`id` as `id`, `guild_members`.`rank_id` as `rank_id` FROM `players`, `guild_members` WHERE `guild_members`.`rank_id` = ' . $rank_in_guild->getId() . ' AND `players`.`id` = `guild_members`.`player_id` ORDER BY `name`;');
|
||||
@@ -724,8 +702,11 @@ function getSkillName($skillId, $suffix = true)
|
||||
/**
|
||||
* Performs flag check on the current logged in user.
|
||||
* Table in database: accounts, field: website_flags
|
||||
*
|
||||
* @param int @flag Flag to be verified.
|
||||
* @return bool If user got flag.
|
||||
*/
|
||||
function hasFlag(int $flag): bool {
|
||||
function hasFlag($flag) {
|
||||
global $logged, $logged_flags;
|
||||
return ($logged && ($logged_flags & $flag) == $flag);
|
||||
}
|
||||
@@ -798,7 +779,7 @@ function get_browser_languages()
|
||||
$languages = str_replace(' ', '', $languages);
|
||||
|
||||
foreach(explode(',', $languages) as $language_list)
|
||||
$ret[] = substr($language_list, 0, 2);
|
||||
$ret[] .= substr($language_list, 0, 2);
|
||||
|
||||
return $ret;
|
||||
}
|
||||
@@ -817,10 +798,6 @@ function get_templates()
|
||||
$ret[] = $file;
|
||||
}
|
||||
|
||||
foreach (Plugins::getThemes() as $name => $path) {
|
||||
$ret[] = $name;
|
||||
}
|
||||
|
||||
return $ret;
|
||||
}
|
||||
|
||||
@@ -1041,7 +1018,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));
|
||||
@@ -1075,8 +1052,8 @@ function unsetSession($key) {
|
||||
unset($_SESSION[setting('core.session_prefix') . $key]);
|
||||
}
|
||||
|
||||
function csrf(bool $return = false): string {
|
||||
return CsrfToken::create($return);
|
||||
function csrf(): void {
|
||||
CsrfToken::create();
|
||||
}
|
||||
|
||||
function csrfToken(): string {
|
||||
@@ -1085,7 +1062,7 @@ function csrfToken(): string {
|
||||
|
||||
function isValidToken(): bool {
|
||||
$token = $_POST['csrf_token'] ?? $_SERVER['HTTP_X_CSRF_TOKEN'] ?? null;
|
||||
return (!isRequestMethod('post') || (isset($token) && CsrfToken::isValid($token)));
|
||||
return ($_SERVER['REQUEST_METHOD'] !== 'POST' || (isset($token) && CsrfToken::isValid($token)));
|
||||
}
|
||||
|
||||
function csrfProtect(): void
|
||||
@@ -1214,48 +1191,72 @@ function setting($key)
|
||||
|
||||
function clearCache()
|
||||
{
|
||||
require_once LIBS . 'news.php';
|
||||
News::clearCache();
|
||||
|
||||
$cache = Cache::getInstance();
|
||||
|
||||
if($cache->enabled()) {
|
||||
$keysToClear = [
|
||||
'status', 'templates',
|
||||
'config_lua',
|
||||
'towns', 'groups', 'vocations',
|
||||
'visitors', 'views_counter', 'failed_logins',
|
||||
'template_menus',
|
||||
'last_kills',
|
||||
'hooks', 'plugins_hooks', 'plugins_routes', 'plugins_settings', 'plugins_themes', 'plugins_commands',
|
||||
'settings',
|
||||
];
|
||||
$tmp = '';
|
||||
|
||||
if ($cache->fetch('status', $tmp))
|
||||
$cache->delete('status');
|
||||
|
||||
if ($cache->fetch('templates', $tmp))
|
||||
$cache->delete('templates');
|
||||
|
||||
if ($cache->fetch('config_lua', $tmp))
|
||||
$cache->delete('config_lua');
|
||||
|
||||
if ($cache->fetch('vocations', $tmp))
|
||||
$cache->delete('vocations');
|
||||
|
||||
if ($cache->fetch('towns', $tmp))
|
||||
$cache->delete('towns');
|
||||
|
||||
if ($cache->fetch('groups', $tmp))
|
||||
$cache->delete('groups');
|
||||
|
||||
if ($cache->fetch('visitors', $tmp))
|
||||
$cache->delete('visitors');
|
||||
|
||||
if ($cache->fetch('views_counter', $tmp))
|
||||
$cache->delete('views_counter');
|
||||
|
||||
if ($cache->fetch('failed_logins', $tmp))
|
||||
$cache->delete('failed_logins');
|
||||
|
||||
foreach (get_templates() as $template) {
|
||||
$keysToClear[] = 'template_ini_' . $template;
|
||||
}
|
||||
|
||||
// highscores cache
|
||||
$configHighscoresPerPage = setting('core.highscores_per_page');
|
||||
$skills = [POT::SKILL_FIST, POT::SKILL_CLUB, POT::SKILL_SWORD, POT::SKILL_AXE, POT::SKILL_DIST, POT::SKILL_SHIELD, POT::SKILL_FISH, POT::SKILL_LEVEL, POT::SKILL__MAGLEVEL, SKILL_FRAGS, SKILL_BALANCE];
|
||||
foreach ($skills as $skill) {
|
||||
// config('vocations') may be empty after previous cache clear
|
||||
$vocations = (config('vocations') ?? []) + ['all'];
|
||||
foreach ($vocations as $vocation) {
|
||||
for($page = 0; $page < 10; $page++) {
|
||||
$cacheKey = 'highscores_' . $skill . '_' . strtolower($vocation) . '_' . $page . '_' . $configHighscoresPerPage;
|
||||
$keysToClear[] = $cacheKey;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
foreach ($keysToClear as $item) {
|
||||
$tmp = '';
|
||||
if ($cache->fetch($item, $tmp)) {
|
||||
$cache->delete($item);
|
||||
if ($cache->fetch('template_ini_' . $template, $tmp)) {
|
||||
$cache->delete('template_ini_' . $template);
|
||||
}
|
||||
}
|
||||
|
||||
global $db;
|
||||
$db->setClearCacheAfter(true);
|
||||
if ($cache->fetch('template_menus', $tmp)) {
|
||||
$cache->delete('template_menus');
|
||||
}
|
||||
if ($cache->fetch('database_tables', $tmp)) {
|
||||
$cache->delete('database_tables');
|
||||
}
|
||||
if ($cache->fetch('database_columns', $tmp)) {
|
||||
$cache->delete('database_columns');
|
||||
}
|
||||
if ($cache->fetch('database_checksum', $tmp)) {
|
||||
$cache->delete('database_checksum');
|
||||
}
|
||||
if ($cache->fetch('last_kills', $tmp)) {
|
||||
$cache->delete('last_kills');
|
||||
}
|
||||
|
||||
if ($cache->fetch('hooks', $tmp)) {
|
||||
$cache->delete('hooks');
|
||||
}
|
||||
if ($cache->fetch('plugins_hooks', $tmp)) {
|
||||
$cache->delete('plugins_hooks');
|
||||
}
|
||||
if ($cache->fetch('plugins_routes', $tmp)) {
|
||||
$cache->delete('plugins_routes');
|
||||
}
|
||||
}
|
||||
|
||||
deleteDirectory(CACHE . 'signatures', ['index.html'], true);
|
||||
@@ -1264,20 +1265,12 @@ function clearCache()
|
||||
deleteDirectory(CACHE, ['signatures', 'twig', 'plugins', 'index.html', 'persistent'], true);
|
||||
|
||||
// routes cache
|
||||
clearRouteCache();
|
||||
|
||||
global $hooks;
|
||||
$hooks->trigger(HOOK_CACHE_CLEAR, ['cache' => Cache::getInstance()]);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
function clearRouteCache(): void
|
||||
{
|
||||
$routeCacheFile = CACHE . 'route.cache';
|
||||
if (file_exists($routeCacheFile)) {
|
||||
unlink($routeCacheFile);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
function getCustomPageInfo($name)
|
||||
@@ -1319,6 +1312,13 @@ function getCustomPage($name, &$success): string
|
||||
else
|
||||
$tmp = $page['body'];
|
||||
|
||||
$php_errors = array();
|
||||
function error_handler($errno, $errstr) {
|
||||
global $php_errors;
|
||||
$php_errors[] = array('errno' => $errno, 'errstr' => $errstr);
|
||||
}
|
||||
set_error_handler('error_handler');
|
||||
|
||||
global $config;
|
||||
if(setting('core.backward_support')) {
|
||||
global $SQL, $main_content, $subtopic;
|
||||
@@ -1328,6 +1328,11 @@ function getCustomPage($name, &$success): string
|
||||
eval($tmp);
|
||||
$content .= ob_get_contents();
|
||||
ob_end_clean();
|
||||
|
||||
restore_error_handler();
|
||||
if(isset($php_errors[0]) && superAdmin()) {
|
||||
var_dump($php_errors);
|
||||
}
|
||||
}
|
||||
else {
|
||||
$oldLoader = $twig->getLoader();
|
||||
@@ -1571,19 +1576,18 @@ function right($str, $length) {
|
||||
return substr($str, -$length);
|
||||
}
|
||||
|
||||
function getMonsterImgPath($monster): string
|
||||
{
|
||||
$monster_path = setting('core.monsters_images_url');
|
||||
$monster_gfx_name = trim(strtolower($monster)) . setting('core.monsters_images_extension');
|
||||
if (!file_exists($monster_path . $monster_gfx_name)) {
|
||||
$monster_gfx_name = str_replace(" ", "", $monster_gfx_name);
|
||||
if (file_exists($monster_path . $monster_gfx_name)) {
|
||||
return $monster_path . $monster_gfx_name;
|
||||
function getCreatureImgPath($creature){
|
||||
$creature_path = setting('core.monsters_images_url');
|
||||
$creature_gfx_name = trim(strtolower($creature)) . setting('core.monsters_images_extension');
|
||||
if (!file_exists($creature_path . $creature_gfx_name)) {
|
||||
$creature_gfx_name = str_replace(" ", "", $creature_gfx_name);
|
||||
if (file_exists($creature_path . $creature_gfx_name)) {
|
||||
return $creature_path . $creature_gfx_name;
|
||||
} else {
|
||||
return $monster_path . 'nophoto.png';
|
||||
return $creature_path . 'nophoto.png';
|
||||
}
|
||||
} else {
|
||||
return $monster_path . $monster_gfx_name;
|
||||
return $creature_path . $creature_gfx_name;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1634,7 +1638,7 @@ function removeIfFirstSlash(&$text) {
|
||||
};
|
||||
|
||||
function escapeHtml($html) {
|
||||
return htmlspecialchars($html);
|
||||
return htmlentities($html, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8');
|
||||
}
|
||||
|
||||
function getGuildNameById($id)
|
||||
@@ -1671,15 +1675,8 @@ function displayErrorBoxWithBackButton($errors, $action = null) {
|
||||
]);
|
||||
}
|
||||
|
||||
function makeLinksClickable($text, $blank = true) {
|
||||
return preg_replace('!(((f|ht)tp(s)?://)[-a-zA-Zа-яА-Я()0-9@:%_+.~#?&;//=]+)!i', '<a href="$1"' . (!$blank ?: ' target="_blank"') . '>$1</a>', $text);
|
||||
}
|
||||
|
||||
function isRequestMethod(string $method): bool {
|
||||
return strtolower($_SERVER['REQUEST_METHOD']) == strtolower($method);
|
||||
}
|
||||
|
||||
// validator functions
|
||||
require_once LIBS . 'validator.php';
|
||||
require_once SYSTEM . 'compat/base.php';
|
||||
|
||||
// custom functions
|
||||
|
@@ -1,10 +1,15 @@
|
||||
<?php
|
||||
|
||||
const SKILL_FRAGS = -1;
|
||||
const SKILL_BALANCE = -2;
|
||||
/**
|
||||
* Events system
|
||||
*
|
||||
* @package MyAAC
|
||||
* @author Slawkens <slawkens@gmail.com>
|
||||
* @copyright 2019 MyAAC
|
||||
* @link https://my-aac.org
|
||||
*/
|
||||
defined('MYAAC') or die('Direct access not allowed!');
|
||||
|
||||
$i = 0;
|
||||
|
||||
define('HOOK_STARTUP', ++$i);
|
||||
define('HOOK_BEFORE_PAGE', ++$i);
|
||||
define('HOOK_AFTER_PAGE', ++$i);
|
||||
@@ -45,12 +50,6 @@ define('HOOK_ACCOUNT_CREATE_AFTER_TOWNS', ++$i);
|
||||
define('HOOK_ACCOUNT_CREATE_BEFORE_SUBMIT_BUTTON', ++$i);
|
||||
define('HOOK_ACCOUNT_CREATE_AFTER_FORM', ++$i);
|
||||
define('HOOK_ACCOUNT_CREATE_POST', ++$i);
|
||||
define('HOOK_ACCOUNT_CREATE_AFTER_SUBMIT', ++$i);
|
||||
define('HOOK_ACCOUNT_CREATE_AFTER_SAVED', ++$i);
|
||||
define('HOOK_ACCOUNT_MANAGE_BEFORE_GENERAL_INFORMATION', ++$i);
|
||||
define('HOOK_ACCOUNT_MANAGE_BEFORE_PUBLIC_INFORMATION', ++$i);
|
||||
define('HOOK_ACCOUNT_MANAGE_BEFORE_ACCOUNT_LOGS', ++$i);
|
||||
define('HOOK_ACCOUNT_MANAGE_BEFORE_CHARACTERS', ++$i);
|
||||
define('HOOK_ACCOUNT_LOGIN_BEFORE_PAGE', ++$i);
|
||||
define('HOOK_ACCOUNT_LOGIN_BEFORE_ACCOUNT', ++$i);
|
||||
define('HOOK_ACCOUNT_LOGIN_AFTER_ACCOUNT', ++$i);
|
||||
@@ -59,12 +58,6 @@ define('HOOK_ACCOUNT_LOGIN_AFTER_PASSWORD', ++$i);
|
||||
define('HOOK_ACCOUNT_LOGIN_AFTER_REMEMBER_ME', ++$i);
|
||||
define('HOOK_ACCOUNT_LOGIN_AFTER_PAGE', ++$i);
|
||||
define('HOOK_ACCOUNT_LOGIN_POST', ++$i);
|
||||
define('HOOK_ACCOUNT_CREATE_CHARACTER_AFTER', ++$i);
|
||||
define('HOOK_ACCOUNT_CREATE_CHARACTER_BEFORE_FIRST_TABLE', ++$i);
|
||||
define('HOOK_ACCOUNT_CREATE_CHARACTER_BEFORE_VOCATIONS', ++$i);
|
||||
define('HOOK_ACCOUNT_CREATE_CHARACTER_BEFORE_TOWNS', ++$i);
|
||||
define('HOOK_ACCOUNT_CREATE_CHARACTER_AFTER_TOWNS', ++$i);
|
||||
define('HOOK_ACCOUNT_CREATE_CHARACTER_AFTER_SECOND_TABLE', ++$i);
|
||||
define('HOOK_ADMIN_HEAD_END', ++$i);
|
||||
define('HOOK_ADMIN_HEAD_START', ++$i);
|
||||
define('HOOK_ADMIN_BODY_START', ++$i);
|
||||
@@ -84,37 +77,87 @@ define('HOOK_GUILDS_AFTER_GUILD_INFORMATION', ++$i);
|
||||
define('HOOK_GUILDS_AFTER_GUILD_MEMBERS', ++$i);
|
||||
define('HOOK_GUILDS_AFTER_INVITED_CHARACTERS', ++$i);
|
||||
define('HOOK_TWIG', ++$i);
|
||||
define('HOOK_CACHE_CLEAR', ++$i);
|
||||
define('HOOK_INSTALL_FINISH', ++$i);
|
||||
define('HOOK_INSTALL_FINISH_END', ++$i);
|
||||
|
||||
const HOOK_FIRST = HOOK_STARTUP;
|
||||
define('HOOK_LAST', $i);
|
||||
|
||||
function is_sub_dir($path = NULL, $parent_folder = BASE): bool|string
|
||||
require_once LIBS . 'plugins.php';
|
||||
class Hook
|
||||
{
|
||||
//Get directory path minus last folder
|
||||
$dir = dirname($path);
|
||||
$folder = substr($path, strlen($dir));
|
||||
private $_name, $_type, $_file;
|
||||
|
||||
//Check the base dir is valid
|
||||
$dir = realpath($dir);
|
||||
|
||||
//Only allow valid filename characters
|
||||
$folder = preg_replace('/[^a-z0-9\.\-_]/i', '', $folder);
|
||||
|
||||
//If this is a bad path or a bad end folder name
|
||||
if( !$dir OR !$folder OR $folder === '.') {
|
||||
return false;
|
||||
public function __construct($name, $type, $file) {
|
||||
$this->_name = $name;
|
||||
$this->_type = $type;
|
||||
$this->_file = $file;
|
||||
}
|
||||
|
||||
//Rebuild path
|
||||
$path = $dir. '/' . $folder;
|
||||
public function execute($params)
|
||||
{
|
||||
global $db, $config, $template_path, $ots, $content, $twig;
|
||||
|
||||
//If this path is higher than the parent folder
|
||||
if( strcasecmp($path, $parent_folder) > 0 ) {
|
||||
return $path;
|
||||
if(is_callable($this->_file))
|
||||
{
|
||||
$params['db'] = $db;
|
||||
$params['config'] = $config;
|
||||
$params['template_path'] = $template_path;
|
||||
$params['ots'] = $ots;
|
||||
$params['content'] = $content;
|
||||
$params['twig'] = $twig;
|
||||
|
||||
$tmp = $this->_file;
|
||||
$ret = $tmp($params);
|
||||
}
|
||||
else {
|
||||
extract($params);
|
||||
|
||||
$ret = include BASE . $this->_file;
|
||||
}
|
||||
|
||||
return false;
|
||||
return !isset($ret) || $ret == 1 || $ret;
|
||||
}
|
||||
|
||||
public function name() {return $this->_name;}
|
||||
public function type() {return $this->_type;}
|
||||
}
|
||||
|
||||
class Hooks
|
||||
{
|
||||
private static $_hooks = array();
|
||||
|
||||
public function register($hook, $type = '', $file = null) {
|
||||
if(!($hook instanceof Hook))
|
||||
$hook = new Hook($hook, $type, $file);
|
||||
|
||||
self::$_hooks[$hook->type()][] = $hook;
|
||||
}
|
||||
|
||||
public function trigger($type, $params = array())
|
||||
{
|
||||
$ret = true;
|
||||
if(isset(self::$_hooks[$type]))
|
||||
{
|
||||
foreach(self::$_hooks[$type] as $name => $hook) {
|
||||
/** @var $hook Hook */
|
||||
if (!$hook->execute($params)) {
|
||||
$ret = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $ret;
|
||||
}
|
||||
|
||||
public function exist($type) {
|
||||
return isset(self::$_hooks[$type]);
|
||||
}
|
||||
|
||||
public function load()
|
||||
{
|
||||
foreach(Plugins::getHooks() as $hook) {
|
||||
$this->register($hook['name'], $hook['type'], $hook['file']);
|
||||
}
|
||||
|
||||
Plugins::clearWarnings();
|
||||
}
|
||||
}
|
@@ -8,12 +8,7 @@
|
||||
* @link https://my-aac.org
|
||||
*/
|
||||
|
||||
use DebugBar\StandardDebugBar;
|
||||
use MyAAC\Cache\Cache;
|
||||
use MyAAC\CsrfToken;
|
||||
use MyAAC\Hooks;
|
||||
use MyAAC\Settings;
|
||||
use MyAAC\Towns;
|
||||
|
||||
defined('MYAAC') or die('Direct access not allowed!');
|
||||
|
||||
@@ -21,6 +16,8 @@ if(!isset($config['installed']) || !$config['installed']) {
|
||||
throw new RuntimeException('MyAAC has not been installed yet or there was error during installation. Please install again.');
|
||||
}
|
||||
|
||||
use DebugBar\StandardDebugBar;
|
||||
|
||||
if(config('env') === 'dev') {
|
||||
require SYSTEM . 'exception.php';
|
||||
}
|
||||
@@ -42,9 +39,11 @@ if(isset($config['gzip_output']) && $config['gzip_output'] && isset($_SERVER['HT
|
||||
ob_start('ob_gzhandler');
|
||||
|
||||
// cache
|
||||
require_once SYSTEM . 'libs/cache.php';
|
||||
$cache = Cache::getInstance();
|
||||
|
||||
// event system
|
||||
require_once SYSTEM . 'hooks.php';
|
||||
$hooks = new Hooks();
|
||||
$hooks->load();
|
||||
|
||||
@@ -55,24 +54,28 @@ require_once SYSTEM . 'twig.php';
|
||||
$action = $_REQUEST['action'] ?? '';
|
||||
define('ACTION', $action);
|
||||
|
||||
// errors, is also often used
|
||||
$errors = [];
|
||||
|
||||
// trim values we receive
|
||||
foreach($_POST as $var => $value) {
|
||||
if(isset($_POST))
|
||||
{
|
||||
foreach($_POST as $var => $value) {
|
||||
if(is_string($value)) {
|
||||
$_POST[$var] = trim($value);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
foreach($_GET as $var => $value) {
|
||||
if(isset($_GET))
|
||||
{
|
||||
foreach($_GET as $var => $value) {
|
||||
if(is_string($value))
|
||||
$_GET[$var] = trim($value);
|
||||
}
|
||||
}
|
||||
|
||||
foreach($_REQUEST as $var => $value) {
|
||||
if(isset($_REQUEST))
|
||||
{
|
||||
foreach($_REQUEST as $var => $value) {
|
||||
if(is_string($value))
|
||||
$_REQUEST[$var] = trim($value);
|
||||
}
|
||||
}
|
||||
|
||||
// load otserv config file
|
||||
@@ -128,21 +131,18 @@ if(!isset($foundValue)) {
|
||||
$config['data_path'] = $foundValue;
|
||||
unset($foundValue);
|
||||
|
||||
|
||||
// POT
|
||||
require_once SYSTEM . 'libs/pot/OTS.php';
|
||||
$ots = POT::getInstance();
|
||||
$eloquentConnection = null;
|
||||
require_once SYSTEM . 'database.php';
|
||||
|
||||
// verify myaac tables exists in database
|
||||
if(!defined('MYAAC_INSTALL') && !$db->hasTable('myaac_account_actions')) {
|
||||
throw new RuntimeException('Seems that the table myaac_account_actions of MyAAC doesn\'t exist in the database. This is a fatal error. You can try to reinstall MyAAC by visiting ' . BASE_URL . 'install');
|
||||
}
|
||||
|
||||
// execute migrations
|
||||
require SYSTEM . 'migrate.php';
|
||||
|
||||
// settings
|
||||
require_once LIBS . 'Settings.php';
|
||||
$settings = Settings::getInstance();
|
||||
$settings->load();
|
||||
|
||||
@@ -159,8 +159,8 @@ date_default_timezone_set(setting('core.date_timezone'));
|
||||
|
||||
setting(
|
||||
[
|
||||
'core.account_mail_verify',
|
||||
setting('core.account_mail_verify') && setting('core.mail_enabled')
|
||||
'core.account_create_character_create',
|
||||
setting('core.account_create_character_create') && (!setting('core.mail_enabled') || !setting('core.account_mail_verify'))
|
||||
]
|
||||
);
|
||||
|
||||
@@ -173,4 +173,5 @@ define('USE_ACCOUNT_NAME', $db->hasColumn('accounts', 'name'));
|
||||
define('USE_ACCOUNT_NUMBER', $db->hasColumn('accounts', 'number'));
|
||||
define('USE_ACCOUNT_SALT', $db->hasColumn('accounts', 'salt'));
|
||||
|
||||
require LIBS . 'Towns.php';
|
||||
Towns::load();
|
||||
|
@@ -1,7 +1,5 @@
|
||||
<?php
|
||||
|
||||
namespace MyAAC;
|
||||
|
||||
use MyAAC\Models\Player;
|
||||
|
||||
/**
|
||||
@@ -52,8 +50,8 @@ class CreateCharacter
|
||||
return false;
|
||||
}
|
||||
|
||||
if(!admin() && !\Validator::newCharacterName($name)) {
|
||||
$errors['name'] = \Validator::getLastError();
|
||||
if(!admin() && !Validator::newCharacterName($name)) {
|
||||
$errors['name'] = Validator::getLastError();
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -73,7 +71,7 @@ class CreateCharacter
|
||||
* @param array $errors
|
||||
* @return bool
|
||||
*/
|
||||
public function check($name, $sex, ?int &$vocation, ?int &$town, &$errors)
|
||||
public function check($name, $sex, &$vocation, &$town, &$errors)
|
||||
{
|
||||
$this->checkName($name, $errors);
|
||||
|
||||
@@ -125,13 +123,13 @@ class CreateCharacter
|
||||
* @param int $sex
|
||||
* @param int $vocation
|
||||
* @param int $town
|
||||
* @param \OTS_Account $account
|
||||
* @param OTS_Account $account
|
||||
* @param array $errors
|
||||
* @return bool
|
||||
* @throws \E_OTS_NotLoaded
|
||||
* @throws \Twig_Error_Loader
|
||||
* @throws \Twig_Error_Runtime
|
||||
* @throws \Twig_Error_Syntax
|
||||
* @throws E_OTS_NotLoaded
|
||||
* @throws Twig_Error_Loader
|
||||
* @throws Twig_Error_Runtime
|
||||
* @throws Twig_Error_Syntax
|
||||
*/
|
||||
public function doCreate($name, $sex, $vocation, $town, $account, &$errors)
|
||||
{
|
||||
@@ -149,9 +147,9 @@ class CreateCharacter
|
||||
if(empty($errors))
|
||||
{
|
||||
$char_to_copy_name = config('character_samples')[$vocation];
|
||||
$playerSample = new \OTS_Player();
|
||||
$playerSample->find($char_to_copy_name);
|
||||
if(!$playerSample->isLoaded())
|
||||
$char_to_copy = new OTS_Player();
|
||||
$char_to_copy->find($char_to_copy_name);
|
||||
if(!$char_to_copy->isLoaded())
|
||||
$errors[] = 'Wrong characters configuration. Try again or contact with admin. ADMIN: Go to Admin Panel -> Settings -> Create Character and set valid characters to copy names. Character to copy: <b>'.$char_to_copy_name.'</b> doesn\'t exist.';
|
||||
}
|
||||
|
||||
@@ -162,78 +160,78 @@ class CreateCharacter
|
||||
global $db;
|
||||
|
||||
if($sex == "0")
|
||||
$playerSample->setLookType(136);
|
||||
$char_to_copy->setLookType(136);
|
||||
|
||||
$player = new \OTS_Player();
|
||||
$player = new OTS_Player();
|
||||
$player->setName($name);
|
||||
$player->setAccount($account);
|
||||
$player->setGroupId(1);
|
||||
$player->setSex($sex);
|
||||
$player->setVocation($playerSample->getVocation());
|
||||
$player->setVocation($char_to_copy->getVocation());
|
||||
if($db->hasColumn('players', 'promotion'))
|
||||
$player->setPromotion($playerSample->getPromotion());
|
||||
$player->setPromotion($char_to_copy->getPromotion());
|
||||
|
||||
if($db->hasColumn('players', 'direction'))
|
||||
$player->setDirection($playerSample->getDirection());
|
||||
$player->setDirection($char_to_copy->getDirection());
|
||||
|
||||
$player->setConditions($playerSample->getConditions());
|
||||
$rank = $playerSample->getRank();
|
||||
$player->setConditions($char_to_copy->getConditions());
|
||||
$rank = $char_to_copy->getRank();
|
||||
if($rank->isLoaded()) {
|
||||
$player->setRank($playerSample->getRank());
|
||||
$player->setRank($char_to_copy->getRank());
|
||||
}
|
||||
|
||||
if($db->hasColumn('players', 'lookaddons'))
|
||||
$player->setLookAddons($playerSample->getLookAddons());
|
||||
$player->setLookAddons($char_to_copy->getLookAddons());
|
||||
|
||||
$player->setTownId($town);
|
||||
$player->setExperience($playerSample->getExperience());
|
||||
$player->setLevel($playerSample->getLevel());
|
||||
$player->setMagLevel($playerSample->getMagLevel());
|
||||
$player->setHealth($playerSample->getHealth());
|
||||
$player->setHealthMax($playerSample->getHealthMax());
|
||||
$player->setMana($playerSample->getMana());
|
||||
$player->setManaMax($playerSample->getManaMax());
|
||||
$player->setManaSpent($playerSample->getManaSpent());
|
||||
$player->setSoul($playerSample->getSoul());
|
||||
$player->setExperience($char_to_copy->getExperience());
|
||||
$player->setLevel($char_to_copy->getLevel());
|
||||
$player->setMagLevel($char_to_copy->getMagLevel());
|
||||
$player->setHealth($char_to_copy->getHealth());
|
||||
$player->setHealthMax($char_to_copy->getHealthMax());
|
||||
$player->setMana($char_to_copy->getMana());
|
||||
$player->setManaMax($char_to_copy->getManaMax());
|
||||
$player->setManaSpent($char_to_copy->getManaSpent());
|
||||
$player->setSoul($char_to_copy->getSoul());
|
||||
|
||||
for($skill = \POT::SKILL_FIRST; $skill <= \POT::SKILL_LAST; $skill++) {
|
||||
for($skill = POT::SKILL_FIRST; $skill <= POT::SKILL_LAST; $skill++) {
|
||||
$value = 10;
|
||||
if (setting('core.use_character_sample_skills')) {
|
||||
$value = $playerSample->getSkill($skill);
|
||||
$value = $char_to_copy->getSkill($skill);
|
||||
}
|
||||
|
||||
$player->setSkill($skill, $value);
|
||||
}
|
||||
|
||||
$player->setLookBody($playerSample->getLookBody());
|
||||
$player->setLookFeet($playerSample->getLookFeet());
|
||||
$player->setLookHead($playerSample->getLookHead());
|
||||
$player->setLookLegs($playerSample->getLookLegs());
|
||||
$player->setLookType($playerSample->getLookType());
|
||||
$player->setCap($playerSample->getCap());
|
||||
$player->setLookBody($char_to_copy->getLookBody());
|
||||
$player->setLookFeet($char_to_copy->getLookFeet());
|
||||
$player->setLookHead($char_to_copy->getLookHead());
|
||||
$player->setLookLegs($char_to_copy->getLookLegs());
|
||||
$player->setLookType($char_to_copy->getLookType());
|
||||
$player->setCap($char_to_copy->getCap());
|
||||
$player->setBalance(0);
|
||||
$player->setPosX(0);
|
||||
$player->setPosY(0);
|
||||
$player->setPosZ(0);
|
||||
|
||||
if($db->hasColumn('players', 'stamina')) {
|
||||
$player->setStamina($playerSample->getStamina());
|
||||
$player->setStamina($char_to_copy->getStamina());
|
||||
}
|
||||
|
||||
if($db->hasColumn('players', 'loss_experience')) {
|
||||
$player->setLossExperience($playerSample->getLossExperience());
|
||||
$player->setLossMana($playerSample->getLossMana());
|
||||
$player->setLossSkills($playerSample->getLossSkills());
|
||||
$player->setLossExperience($char_to_copy->getLossExperience());
|
||||
$player->setLossMana($char_to_copy->getLossMana());
|
||||
$player->setLossSkills($char_to_copy->getLossSkills());
|
||||
}
|
||||
if($db->hasColumn('players', 'loss_items')) {
|
||||
$player->setLossItems($playerSample->getLossItems());
|
||||
$player->setLossContainers($playerSample->getLossContainers());
|
||||
$player->setLossItems($char_to_copy->getLossItems());
|
||||
$player->setLossContainers($char_to_copy->getLossContainers());
|
||||
}
|
||||
|
||||
$player->save();
|
||||
$player->setCustomField('created', time());
|
||||
|
||||
$player = new \OTS_Player();
|
||||
$player = new OTS_Player();
|
||||
$player->find($name);
|
||||
|
||||
if(!$player->isLoaded()) {
|
||||
@@ -242,10 +240,10 @@ class CreateCharacter
|
||||
}
|
||||
|
||||
if($db->hasTable('player_skills')) {
|
||||
for($skill = \POT::SKILL_FIRST; $skill <= \POT::SKILL_LAST; $skill++) {
|
||||
for($skill = POT::SKILL_FIRST; $skill <= POT::SKILL_LAST; $skill++) {
|
||||
$value = 10;
|
||||
if (setting('core.use_character_sample_skills')) {
|
||||
$value = $playerSample->getSkill($skill);
|
||||
$value = $char_to_copy->getSkill($skill);
|
||||
}
|
||||
$skillExists = $db->query('SELECT `skillid` FROM `player_skills` WHERE `player_id` = ' . $player->getId() . ' AND `skillid` = ' . $skill);
|
||||
if($skillExists->rowCount() <= 0) {
|
||||
@@ -255,28 +253,13 @@ class CreateCharacter
|
||||
}
|
||||
|
||||
if ($db->hasTable('player_items') && $db->hasColumn('player_items', 'pid') && $db->hasColumn('player_items', 'sid') && $db->hasColumn('player_items', 'itemtype')) {
|
||||
$loaded_items_to_copy = $db->query("SELECT * FROM player_items WHERE player_id = ".$playerSample->getId()."");
|
||||
$loaded_items_to_copy = $db->query("SELECT * FROM player_items WHERE player_id = ".$char_to_copy->getId()."");
|
||||
foreach($loaded_items_to_copy as $save_item) {
|
||||
$blob = $db->quote($save_item['attributes']);
|
||||
$db->query("INSERT INTO `player_items` (`player_id` ,`pid` ,`sid` ,`itemtype`, `count`, `attributes`) VALUES ('".$player->getId()."', '".$save_item['pid']."', '".$save_item['sid']."', '".$save_item['itemtype']."', '".$save_item['count']."', $blob);");
|
||||
}
|
||||
}
|
||||
|
||||
global $hooks;
|
||||
if (!$hooks->trigger(HOOK_ACCOUNT_CREATE_CHARACTER_AFTER,
|
||||
[
|
||||
'account' => $account,
|
||||
'player' => $player,
|
||||
'playerSample' => $playerSample,
|
||||
'name' => $name,
|
||||
'sex' => $sex,
|
||||
'vocation' => $vocation,
|
||||
'town' => $town,
|
||||
]
|
||||
)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
global $twig;
|
||||
$twig->display('success.html.twig', array(
|
||||
'title' => 'Character Created',
|
@@ -23,8 +23,9 @@
|
||||
* @link https://my-aac.org
|
||||
*/
|
||||
|
||||
namespace MyAAC;
|
||||
|
||||
/**
|
||||
* Class DataLoader
|
||||
*/
|
||||
class DataLoader
|
||||
{
|
||||
private static $locale;
|
||||
@@ -37,6 +38,7 @@ class DataLoader
|
||||
{
|
||||
self::$startTime = microtime(true);
|
||||
|
||||
require_once LIBS . 'items.php';
|
||||
if(Items::loadFromXML()) {
|
||||
success(self::$locale['step_database_loaded_items'] . self::getLoadedTime());
|
||||
}
|
||||
@@ -46,20 +48,22 @@ class DataLoader
|
||||
|
||||
self::$startTime = microtime(true);
|
||||
|
||||
if(Monsters::loadFromXML()) {
|
||||
require LIBS . 'creatures.php';
|
||||
if(Creatures::loadFromXML()) {
|
||||
success(self::$locale['step_database_loaded_monsters'] . self::getLoadedTime());
|
||||
|
||||
if(Monsters::getMonstersList()->hasErrors()) {
|
||||
if(Creatures::getMonstersList()->hasErrors()) {
|
||||
self::$locale['step_database_error_monsters'] = str_replace('$LOG$', 'system/logs/error.log', self::$locale['step_database_error_monsters']);
|
||||
warning(self::$locale['step_database_error_monsters']);
|
||||
}
|
||||
}
|
||||
else {
|
||||
error(Monsters::getLastError());
|
||||
error(Creatures::getLastError());
|
||||
}
|
||||
|
||||
self::$startTime = microtime(true);
|
||||
|
||||
require_once LIBS . 'npc.php';
|
||||
if(NPCs::loadFromXML()) {
|
||||
success(self::$locale['step_database_loaded_npcs'] . self::getLoadedTime());
|
||||
}
|
||||
@@ -69,6 +73,7 @@ class DataLoader
|
||||
|
||||
self::$startTime = microtime(true);
|
||||
|
||||
require LIBS . 'spells.php';
|
||||
if(Spells::loadFromXML()) {
|
||||
success(self::$locale['step_database_loaded_spells'] . self::getLoadedTime());
|
||||
}
|
||||
@@ -87,6 +92,7 @@ class DataLoader
|
||||
|
||||
self::$startTime = microtime(true);
|
||||
|
||||
require LIBS . 'weapons.php';
|
||||
if(Weapons::loadFromXML()) {
|
||||
success(self::$locale['step_database_loaded_weapons'] . self::getLoadedTime());
|
||||
}
|
3
system/libs/SensitiveException.php
Normal file
3
system/libs/SensitiveException.php
Normal file
@@ -0,0 +1,3 @@
|
||||
<?php
|
||||
|
||||
class SensitiveException extends Exception {}
|
@@ -1,11 +1,17 @@
|
||||
<?php
|
||||
|
||||
namespace MyAAC;
|
||||
|
||||
use MyAAC\Cache\Cache;
|
||||
use MyAAC\Models\Settings as ModelsSettings;
|
||||
|
||||
class Settings implements \ArrayAccess
|
||||
/**
|
||||
* CreateCharacter
|
||||
*
|
||||
* @package MyAAC
|
||||
* @author Slawkens <slawkens@gmail.com>
|
||||
* @copyright 2020 MyAAC
|
||||
* @link https://my-aac.org
|
||||
*/
|
||||
|
||||
class Settings implements ArrayAccess
|
||||
{
|
||||
static private $instance;
|
||||
private $settingsFile = [];
|
||||
@@ -38,7 +44,8 @@ class Settings implements \ArrayAccess
|
||||
}
|
||||
|
||||
$settings = ModelsSettings::all();
|
||||
foreach ($settings as $setting) {
|
||||
foreach ($settings as $setting)
|
||||
{
|
||||
$this->settingsDatabase[$setting->name][$setting->key] = $setting->value;
|
||||
}
|
||||
|
||||
@@ -47,12 +54,9 @@ class Settings implements \ArrayAccess
|
||||
}
|
||||
}
|
||||
|
||||
public function save($pluginName, $values)
|
||||
{
|
||||
$this->loadPlugin($pluginName);
|
||||
|
||||
public function save($pluginName, $values) {
|
||||
if (!isset($this->settingsFile[$pluginName])) {
|
||||
throw new \RuntimeException("Error on save settings: plugin $pluginName does not exist");
|
||||
throw new RuntimeException('Error on save settings: plugin does not exist');
|
||||
}
|
||||
|
||||
$settings = $this->settingsFile[$pluginName];
|
||||
@@ -87,27 +91,23 @@ class Settings implements \ArrayAccess
|
||||
'key' => $key,
|
||||
'value' => $value
|
||||
]);
|
||||
} catch (\PDOException $error) {
|
||||
} catch (PDOException $error) {
|
||||
$this->errors[] = 'Error while saving setting (' . $pluginName . ' - ' . $key . '): ' . $error->getMessage();
|
||||
}
|
||||
}
|
||||
|
||||
$this->clearCache();
|
||||
$cache = Cache::getInstance();
|
||||
if ($cache->enabled()) {
|
||||
$cache->delete('settings');
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public function updateInDatabase($pluginName, $key, $value)
|
||||
{
|
||||
if (ModelsSettings::where(['name' => $pluginName, 'key' => $key])->exists()) {
|
||||
ModelsSettings::where(['name' => $pluginName, 'key' => $key])->update(['value' => $value]);
|
||||
}
|
||||
else {
|
||||
// insert new
|
||||
ModelsSettings::create(['name' => $pluginName, 'key' => $key, 'value' => $value]);
|
||||
}
|
||||
|
||||
$this->clearCache();
|
||||
}
|
||||
|
||||
public function deleteFromDatabase($pluginName, $key = null)
|
||||
{
|
||||
@@ -117,8 +117,6 @@ class Settings implements \ArrayAccess
|
||||
else {
|
||||
ModelsSettings::where('name', $pluginName)->where('key', $key)->delete();
|
||||
}
|
||||
|
||||
$this->clearCache();
|
||||
}
|
||||
|
||||
public static function display($plugin, $settings): array
|
||||
@@ -251,10 +249,6 @@ class Settings implements \ArrayAccess
|
||||
}
|
||||
|
||||
else if($setting['type'] === 'textarea') {
|
||||
if (isset($settingsDb[$key]) && is_array($settingsDb[$key])) {
|
||||
$settingsDb[$key] = implode(',', $settingsDb[$key]);
|
||||
}
|
||||
|
||||
$value = ($settingsDb[$key] ?? ($setting['default'] ?? ''));
|
||||
$valueWithSpaces = array_map('trim', preg_split('/\r\n|\r|\n/', trim($value)));
|
||||
$rows = count($valueWithSpaces);
|
||||
@@ -289,7 +283,7 @@ class Settings implements \ArrayAccess
|
||||
}
|
||||
else if ($setting['options'] == '$timezones') {
|
||||
$timezones = [];
|
||||
foreach (\DateTimeZone::listIdentifiers() as $value) {
|
||||
foreach (DateTimeZone::listIdentifiers() as $value) {
|
||||
$timezones[$value] = $value;
|
||||
}
|
||||
|
||||
@@ -328,7 +322,7 @@ class Settings implements \ArrayAccess
|
||||
</td>
|
||||
<td>
|
||||
<div class="well setting-default"><?php
|
||||
echo (isset($setting['desc']) ? makeLinksClickable($setting['desc']) : '');
|
||||
echo ($setting['desc'] ?? '');
|
||||
echo '<br/>';
|
||||
echo '<strong>Default:</strong> ';
|
||||
|
||||
@@ -339,7 +333,7 @@ class Settings implements \ArrayAccess
|
||||
echo $setting['default'];
|
||||
}
|
||||
else if ($setting['type'] === 'options') {
|
||||
if (is_int($setting['default']) || !empty($setting['default'])) {
|
||||
if (!empty($setting['default'])) {
|
||||
echo $setting['options'][$setting['default']];
|
||||
}
|
||||
}
|
||||
@@ -382,8 +376,6 @@ class Settings implements \ArrayAccess
|
||||
}
|
||||
|
||||
$this->settingsDatabase[$pluginKeyName][$key] = $value;
|
||||
// invalidate cache
|
||||
unset($this->cache[$offset]);
|
||||
}
|
||||
|
||||
#[\ReturnTypeWillChange]
|
||||
@@ -450,7 +442,7 @@ class Settings implements \ArrayAccess
|
||||
// return specified plugin settings (all)
|
||||
if(!isset($key)) {
|
||||
if (!isset($this->settingsFile[$pluginKeyName]['settings'])) {
|
||||
throw new \RuntimeException('Unknown plugin settings: ' . $pluginKeyName);
|
||||
throw new RuntimeException('Unknown plugin settings: ' . $pluginKeyName);
|
||||
}
|
||||
return $this->settingsFile[$pluginKeyName]['settings'];
|
||||
}
|
||||
@@ -466,15 +458,9 @@ class Settings implements \ArrayAccess
|
||||
$ret['value'] = $value;
|
||||
}
|
||||
else {
|
||||
if (!isset($this->settingsFile[$pluginKeyName]['settings'][$key])) {
|
||||
return null;
|
||||
}
|
||||
|
||||
$ret['value'] = $this->settingsFile[$pluginKeyName]['settings'][$key]['default'];
|
||||
}
|
||||
|
||||
$ret['key'] = $key;
|
||||
|
||||
if(isset($ret['type'])) {
|
||||
switch($ret['type']) {
|
||||
case 'boolean':
|
||||
@@ -559,10 +545,10 @@ class Settings implements \ArrayAccess
|
||||
$content .= ';' . PHP_EOL;
|
||||
}
|
||||
|
||||
$success = @file_put_contents($filename, $content);
|
||||
$success = file_put_contents($filename, $content);
|
||||
|
||||
// we saved new config.php, need to revalidate cache (only if opcache is enabled)
|
||||
if ($success && function_exists('opcache_invalidate')) {
|
||||
if (function_exists('opcache_invalidate')) {
|
||||
opcache_invalidate($filename);
|
||||
}
|
||||
|
||||
@@ -596,10 +582,10 @@ class Settings implements \ArrayAccess
|
||||
}
|
||||
|
||||
try {
|
||||
$connectionTest = new \PDO('mysql:' . implode(';', $dns), $user, $password);
|
||||
$connectionTest->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
|
||||
$connectionTest = new PDO('mysql:' . implode(';', $dns), $user, $password);
|
||||
$connectionTest->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
|
||||
}
|
||||
catch(\PDOException $error) {
|
||||
catch(PDOException $error) {
|
||||
error('MySQL connection failed. Settings has been reverted.');
|
||||
error($error->getMessage());
|
||||
return false;
|
||||
@@ -608,15 +594,7 @@ class Settings implements \ArrayAccess
|
||||
return true;
|
||||
}
|
||||
|
||||
public function getErrors(): array {
|
||||
public function getErrors() {
|
||||
return $this->errors;
|
||||
}
|
||||
|
||||
public function clearCache(): void
|
||||
{
|
||||
$cache = Cache::getInstance();
|
||||
if ($cache->enabled()) {
|
||||
$cache->delete('settings');
|
||||
}
|
||||
}
|
||||
}
|
@@ -23,10 +23,11 @@
|
||||
* @link https://my-aac.org
|
||||
*/
|
||||
|
||||
namespace MyAAC;
|
||||
|
||||
use MyAAC\Models\Town;
|
||||
|
||||
/**
|
||||
* Class Towns
|
||||
*/
|
||||
class Towns
|
||||
{
|
||||
/**
|
||||
@@ -108,6 +109,7 @@ class Towns
|
||||
if (file_exists($mapFile)) {
|
||||
ini_set('memory_limit', '-1');
|
||||
|
||||
require LIBS . 'TownsReader.php';
|
||||
$townsReader = new TownsReader($mapFile);
|
||||
$townsReader->load();
|
||||
|
||||
@@ -124,6 +126,6 @@ class Towns
|
||||
*/
|
||||
public static function getFromDatabase()
|
||||
{
|
||||
return Town::orderBy('id', 'ASC')->pluck('name', 'id')->toArray();
|
||||
return Town::pluck('name', 'id')->toArray();
|
||||
}
|
||||
}
|
@@ -19,10 +19,8 @@
|
||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
namespace MyAAC;
|
||||
|
||||
/*
|
||||
This code bases on original OTServ code for .otbm files - file iomapotbm.cpp rev.2141
|
||||
This code bases on oryginal OTServ code for .otbm files - file iomapotbm.cpp rev.2141
|
||||
*/
|
||||
class TownsReader
|
||||
{
|
@@ -8,8 +8,7 @@
|
||||
* @copyright 2019 MyAAC
|
||||
* @link https://my-aac.org
|
||||
*/
|
||||
|
||||
namespace MyAAC\Cache;
|
||||
defined('MYAAC') or die('Direct access not allowed!');
|
||||
|
||||
/**
|
||||
* Class Cache
|
||||
@@ -42,30 +41,40 @@ class Cache
|
||||
*/
|
||||
public static function generateInstance($engine = '', $prefix = '')
|
||||
{
|
||||
if (config('env') === 'dev') {
|
||||
if(config('env') === 'dev') {
|
||||
self::$instance = new self();
|
||||
return self::$instance;
|
||||
}
|
||||
|
||||
switch (strtolower($engine)) {
|
||||
switch(strtolower($engine)) {
|
||||
case 'apc':
|
||||
self::$instance = new APC($prefix);
|
||||
require 'cache_apc.php';
|
||||
self::$instance = new Cache_APC($prefix);
|
||||
break;
|
||||
|
||||
case 'apcu':
|
||||
self::$instance = new APCu($prefix);
|
||||
require 'cache_apcu.php';
|
||||
self::$instance = new Cache_APCu($prefix);
|
||||
break;
|
||||
|
||||
case 'eaccelerator':
|
||||
require 'cache_eaccelerator.php';
|
||||
self::$instance = new Cache_eAccelerator($prefix);
|
||||
break;
|
||||
|
||||
case 'xcache':
|
||||
self::$instance = new XCache($prefix);
|
||||
require 'cache_xcache.php';
|
||||
self::$instance = new Cache_XCache($prefix);
|
||||
break;
|
||||
|
||||
case 'file':
|
||||
self::$instance = new File($prefix, CACHE);
|
||||
require 'cache_file.php';
|
||||
self::$instance = new Cache_File($prefix, CACHE);
|
||||
break;
|
||||
|
||||
case 'php':
|
||||
self::$instance = new PHP($prefix, CACHE);
|
||||
require 'cache_php.php';
|
||||
self::$instance = new Cache_PHP($prefix, CACHE);
|
||||
break;
|
||||
|
||||
case 'auto':
|
||||
@@ -85,11 +94,13 @@ class Cache
|
||||
*/
|
||||
public static function detect()
|
||||
{
|
||||
if (function_exists('apc_fetch'))
|
||||
if(function_exists('apc_fetch'))
|
||||
return 'apc';
|
||||
else if (function_exists('apcu_fetch'))
|
||||
else if(function_exists('apcu_fetch'))
|
||||
return 'apcu';
|
||||
else if (function_exists('xcache_get') && ini_get('xcache.var_size'))
|
||||
else if(function_exists('eaccelerator_get'))
|
||||
return 'eaccelerator';
|
||||
else if(function_exists('xcache_get') && ini_get('xcache.var_size'))
|
||||
return 'xcache';
|
||||
|
||||
return 'file';
|
||||
@@ -98,15 +109,12 @@ class Cache
|
||||
/**
|
||||
* @return bool
|
||||
*/
|
||||
public function enabled()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
public function enabled() {return false;}
|
||||
|
||||
public static function remember($key, $ttl, $callback)
|
||||
{
|
||||
$cache = self::getInstance();
|
||||
if (!$cache->enabled()) {
|
||||
if(!$cache->enabled()) {
|
||||
return $callback();
|
||||
}
|
||||
|
||||
@@ -116,7 +124,7 @@ class Cache
|
||||
}
|
||||
|
||||
$value = $callback();
|
||||
$cache->set($key, serialize($value), $ttl);
|
||||
$cache->set($key, serialize($value),$ttl);
|
||||
return $value;
|
||||
}
|
||||
}
|
@@ -8,10 +8,9 @@
|
||||
* @copyright 2019 MyAAC
|
||||
* @link https://my-aac.org
|
||||
*/
|
||||
defined('MYAAC') or die('Direct access not allowed!');
|
||||
|
||||
namespace MyAAC\Cache;
|
||||
|
||||
class APC
|
||||
class Cache_APC
|
||||
{
|
||||
private $prefix;
|
||||
private $enabled;
|
||||
@@ -32,25 +31,22 @@ class APC
|
||||
public function get($key)
|
||||
{
|
||||
$tmp = '';
|
||||
if ($this->fetch($this->prefix . $key, $tmp)) {
|
||||
if($this->fetch($this->prefix . $key, $tmp)) {
|
||||
return $tmp;
|
||||
}
|
||||
|
||||
return '';
|
||||
}
|
||||
|
||||
public function fetch($key, &$var)
|
||||
{
|
||||
public function fetch($key, &$var) {
|
||||
return ($var = apc_fetch($this->prefix . $key)) !== false;
|
||||
}
|
||||
|
||||
public function delete($key)
|
||||
{
|
||||
public function delete($key) {
|
||||
apc_delete($this->prefix . $key);
|
||||
}
|
||||
|
||||
public function enabled()
|
||||
{
|
||||
public function enabled() {
|
||||
return $this->enabled;
|
||||
}
|
||||
}
|
@@ -8,10 +8,9 @@
|
||||
* @copyright 2019 MyAAC
|
||||
* @link https://my-aac.org
|
||||
*/
|
||||
defined('MYAAC') or die('Direct access not allowed!');
|
||||
|
||||
namespace MyAAC\Cache;
|
||||
|
||||
class APCu
|
||||
class Cache_APCu
|
||||
{
|
||||
private $prefix;
|
||||
private $enabled;
|
||||
@@ -32,25 +31,22 @@ class APCu
|
||||
public function get($key)
|
||||
{
|
||||
$tmp = '';
|
||||
if ($this->fetch($this->prefix . $key, $tmp)) {
|
||||
if($this->fetch($this->prefix . $key, $tmp)) {
|
||||
return $tmp;
|
||||
}
|
||||
|
||||
return '';
|
||||
}
|
||||
|
||||
public function fetch($key, &$var)
|
||||
{
|
||||
public function fetch($key, &$var) {
|
||||
return ($var = apcu_fetch($this->prefix . $key)) !== false;
|
||||
}
|
||||
|
||||
public function delete($key)
|
||||
{
|
||||
public function delete($key) {
|
||||
apcu_delete($this->prefix . $key);
|
||||
}
|
||||
|
||||
public function enabled()
|
||||
{
|
||||
public function enabled() {
|
||||
return $this->enabled;
|
||||
}
|
||||
}
|
51
system/libs/cache_eaccelerator.php
Normal file
51
system/libs/cache_eaccelerator.php
Normal file
@@ -0,0 +1,51 @@
|
||||
<?php
|
||||
/**
|
||||
* Cache eAccelerator class
|
||||
*
|
||||
* @package MyAAC
|
||||
* @author Slawkens <slawkens@gmail.com>
|
||||
* @author Mark Samman (Talaturen) <marksamman@gmail.com>
|
||||
* @copyright 2019 MyAAC
|
||||
* @link https://my-aac.org
|
||||
*/
|
||||
defined('MYAAC') or die('Direct access not allowed!');
|
||||
|
||||
class Cache_eAccelerator
|
||||
{
|
||||
private $prefix;
|
||||
private $enabled;
|
||||
|
||||
public function __construct($prefix = '') {
|
||||
$this->prefix = $prefix;
|
||||
$this->enabled = function_exists('eaccelerator_get');
|
||||
}
|
||||
|
||||
public function set($key, $var, $ttl = 0)
|
||||
{
|
||||
$key = $this->prefix . $key;
|
||||
eaccelerator_rm($key);
|
||||
eaccelerator_put($key, $var, $ttl);
|
||||
}
|
||||
|
||||
public function get($key)
|
||||
{
|
||||
$tmp = '';
|
||||
if($this->fetch($this->prefix . $key, $tmp)) {
|
||||
return $tmp;
|
||||
}
|
||||
|
||||
return '';
|
||||
}
|
||||
|
||||
public function fetch($key, &$var) {
|
||||
return ($var = eaccelerator_get($this->prefix . $key)) !== null;
|
||||
}
|
||||
|
||||
public function delete($key) {
|
||||
eaccelerator_rm($this->prefix . $key);
|
||||
}
|
||||
|
||||
public function enabled() {
|
||||
return $this->enabled;
|
||||
}
|
||||
}
|
@@ -7,17 +7,15 @@
|
||||
* @copyright 2019 MyAAC
|
||||
* @link https://my-aac.org
|
||||
*/
|
||||
defined('MYAAC') or die('Direct access not allowed!');
|
||||
|
||||
namespace MyAAC\Cache;
|
||||
|
||||
class File
|
||||
class Cache_File
|
||||
{
|
||||
private $prefix;
|
||||
private $dir;
|
||||
private $enabled;
|
||||
|
||||
public function __construct($prefix = '', $dir = '')
|
||||
{
|
||||
public function __construct($prefix = '', $dir = '') {
|
||||
$this->prefix = $prefix;
|
||||
$this->dir = $dir;
|
||||
$this->enabled = (file_exists($this->dir) && is_dir($this->dir) && is_writable($this->dir));
|
||||
@@ -38,7 +36,7 @@ class File
|
||||
public function get($key)
|
||||
{
|
||||
$tmp = '';
|
||||
if ($this->fetch($key, $tmp)) {
|
||||
if($this->fetch($key, $tmp)) {
|
||||
return $tmp;
|
||||
}
|
||||
|
||||
@@ -48,7 +46,7 @@ class File
|
||||
public function fetch($key, &$var)
|
||||
{
|
||||
$file = $this->_name($key);
|
||||
if (!file_exists($file) || filemtime($file) < time()) {
|
||||
if(!file_exists($file) || filemtime($file) < time()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -59,18 +57,16 @@ class File
|
||||
public function delete($key)
|
||||
{
|
||||
$file = $this->_name($key);
|
||||
if (file_exists($file)) {
|
||||
if(file_exists($file)) {
|
||||
unlink($file);
|
||||
}
|
||||
}
|
||||
|
||||
public function enabled()
|
||||
{
|
||||
public function enabled() {
|
||||
return $this->enabled;
|
||||
}
|
||||
|
||||
private function _name($key)
|
||||
{
|
||||
private function _name($key) {
|
||||
return sprintf('%s%s%s', $this->dir, $this->prefix, sha1($key));
|
||||
}
|
||||
}
|
@@ -7,17 +7,15 @@
|
||||
* @copyright 2019 MyAAC
|
||||
* @link https://my-aac.org
|
||||
*/
|
||||
defined('MYAAC') or die('Direct access not allowed!');
|
||||
|
||||
namespace MyAAC\Cache;
|
||||
|
||||
class PHP
|
||||
class Cache_PHP
|
||||
{
|
||||
private $prefix;
|
||||
private $dir;
|
||||
private $enabled;
|
||||
|
||||
public function __construct($prefix = '', $dir = '')
|
||||
{
|
||||
public function __construct($prefix = '', $dir = '') {
|
||||
$this->prefix = $prefix;
|
||||
$this->dir = $dir;
|
||||
$this->enabled = (file_exists($this->dir) && is_dir($this->dir) && is_writable($this->dir));
|
||||
@@ -44,7 +42,7 @@ class PHP
|
||||
public function get($key)
|
||||
{
|
||||
$tmp = '';
|
||||
if ($this->fetch($key, $tmp)) {
|
||||
if($this->fetch($key, $tmp)) {
|
||||
return $tmp;
|
||||
}
|
||||
|
||||
@@ -54,7 +52,7 @@ class PHP
|
||||
public function fetch($key, &$var)
|
||||
{
|
||||
$file = $this->_name($key);
|
||||
if (!file_exists($file) || filemtime($file) < time()) {
|
||||
if(!file_exists($file) || filemtime($file) < time()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -66,18 +64,16 @@ class PHP
|
||||
public function delete($key)
|
||||
{
|
||||
$file = $this->_name($key);
|
||||
if (file_exists($file)) {
|
||||
if(file_exists($file)) {
|
||||
unlink($file);
|
||||
}
|
||||
}
|
||||
|
||||
public function enabled()
|
||||
{
|
||||
public function enabled() {
|
||||
return $this->enabled;
|
||||
}
|
||||
|
||||
private function _name($key)
|
||||
{
|
||||
private function _name($key) {
|
||||
return sprintf('%s%s%s', $this->dir, $this->prefix, sha1($key) . '.php');
|
||||
}
|
||||
}
|
@@ -8,16 +8,14 @@
|
||||
* @copyright 2019 MyAAC
|
||||
* @link https://my-aac.org
|
||||
*/
|
||||
defined('MYAAC') or die('Direct access not allowed!');
|
||||
|
||||
namespace MyAAC\Cache;
|
||||
|
||||
class XCache
|
||||
class Cache_XCache
|
||||
{
|
||||
private $prefix;
|
||||
private $enabled;
|
||||
|
||||
public function __construct($prefix = '')
|
||||
{
|
||||
public function __construct($prefix = '') {
|
||||
$this->prefix = $prefix;
|
||||
$this->enabled = function_exists('xcache_get') && ini_get('xcache.var_size');
|
||||
}
|
||||
@@ -32,7 +30,7 @@ class XCache
|
||||
public function get($key)
|
||||
{
|
||||
$tmp = '';
|
||||
if ($this->fetch($this->prefix . $key, $tmp)) {
|
||||
if($this->fetch($this->prefix . $key, $tmp)) {
|
||||
return $tmp;
|
||||
}
|
||||
|
||||
@@ -42,7 +40,7 @@ class XCache
|
||||
public function fetch($key, &$var)
|
||||
{
|
||||
$key = $this->prefix . $key;
|
||||
if (!xcache_isset($key)) {
|
||||
if(!xcache_isset($key)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -50,13 +48,11 @@ class XCache
|
||||
return true;
|
||||
}
|
||||
|
||||
public function delete($key)
|
||||
{
|
||||
public function delete($key) {
|
||||
xcache_unset($this->prefix . $key);
|
||||
}
|
||||
|
||||
public function enabled()
|
||||
{
|
||||
public function enabled() {
|
||||
return $this->enabled;
|
||||
}
|
||||
}
|
@@ -1,8 +1,5 @@
|
||||
<?php
|
||||
|
||||
namespace MyAAC;
|
||||
|
||||
use MyAAC\Cache\Cache;
|
||||
use MyAAC\Models\Changelog as ModelsChangelog;
|
||||
|
||||
class Changelog
|
||||
@@ -88,17 +85,17 @@ class Changelog
|
||||
return true;
|
||||
}
|
||||
|
||||
static public function toggleHide($id, &$errors, &$status)
|
||||
static public function toggleHidden($id, &$errors, &$status)
|
||||
{
|
||||
if(isset($id))
|
||||
{
|
||||
$row = ModelsChangelog::find($id);
|
||||
if ($row) {
|
||||
$row->hide = $row->hide == 1 ? 0 : 1;
|
||||
$row->hidden = $row->hidden == 1 ? 0 : 1;
|
||||
if (!$row->save()) {
|
||||
$errors[] = 'Fail during toggle hide Changelog.';
|
||||
$errors[] = 'Fail during toggle hidden Changelog.';
|
||||
}
|
||||
$status = $row->hide;
|
||||
$status = $row->hidden;
|
||||
} else {
|
||||
$errors[] = 'Changelog with id ' . $id . ' does not exists.';
|
||||
}
|
@@ -9,13 +9,14 @@
|
||||
* @link https://my-aac.org
|
||||
*/
|
||||
|
||||
namespace MyAAC;
|
||||
|
||||
use MyAAC\Models\Monster;
|
||||
|
||||
class Monsters {
|
||||
defined('MYAAC') or die('Direct access not allowed!');
|
||||
|
||||
require_once LIBS . 'items.php';
|
||||
class Creatures {
|
||||
/**
|
||||
* @var \OTS_MonstersList
|
||||
* @var OTS_MonstersList
|
||||
*/
|
||||
private static $monstersList;
|
||||
private static $lastError = '';
|
||||
@@ -23,7 +24,7 @@ class Monsters {
|
||||
public static function loadFromXML($show = false) {
|
||||
try {
|
||||
Monster::query()->delete();
|
||||
} catch(\Exception $error) {}
|
||||
} catch(Exception $error) {}
|
||||
|
||||
if($show) {
|
||||
echo '<h2>Reload monsters.</h2>';
|
||||
@@ -31,9 +32,9 @@ class Monsters {
|
||||
}
|
||||
|
||||
try {
|
||||
self::$monstersList = new \OTS_MonstersList(config('data_path') . 'monster/');
|
||||
self::$monstersList = new OTS_MonstersList(config('data_path') . 'monster/');
|
||||
}
|
||||
catch(\Exception $e) {
|
||||
catch(Exception $e) {
|
||||
self::$lastError = $e->getMessage();
|
||||
return false;
|
||||
}
|
||||
@@ -118,7 +119,7 @@ class Monsters {
|
||||
$summons = $monster->getSummons();
|
||||
$loot = $monster->getLoot();
|
||||
foreach($loot as &$item) {
|
||||
if(!\Validator::number($item['id'])) {
|
||||
if(!Validator::number($item['id'])) {
|
||||
if(isset($items[$item['id']])) {
|
||||
$item['id'] = $items[$item['id']];
|
||||
}
|
||||
@@ -160,7 +161,7 @@ class Monsters {
|
||||
success('Added: ' . $name . '<br/>');
|
||||
}
|
||||
}
|
||||
catch(\Exception $error) {
|
||||
catch(Exception $error) {
|
||||
if($show) {
|
||||
warning('Error while adding monster (' . $name . '): ' . $error->getMessage());
|
||||
}
|
@@ -7,8 +7,7 @@
|
||||
* @copyright 2019 MyAAC
|
||||
* @link https://my-aac.org
|
||||
*/
|
||||
|
||||
namespace MyAAC;
|
||||
defined('MYAAC') or die('Direct access not allowed!');
|
||||
|
||||
class Data
|
||||
{
|
@@ -8,13 +8,12 @@
|
||||
* @copyright 2019 MyAAC
|
||||
* @link https://my-aac.org
|
||||
*/
|
||||
|
||||
namespace MyAAC;
|
||||
defined('MYAAC') or die('Direct access not allowed!');
|
||||
|
||||
$settingForumTablePrefix = setting('core.forum_table_prefix');
|
||||
if(null !== $settingForumTablePrefix && !empty(trim($settingForumTablePrefix))) {
|
||||
if(!in_array($settingForumTablePrefix, array('myaac_', 'z_'))) {
|
||||
throw new \RuntimeException('Invalid value for forum_table_prefix in config.php. Can be only: "myaac_" or "z_".');
|
||||
throw new RuntimeException('Invalid value for forum_table_prefix in config.php. Can be only: "myaac_" or "z_".');
|
||||
}
|
||||
|
||||
define('FORUM_TABLE_PREFIX', $settingForumTablePrefix);
|
||||
@@ -31,9 +30,9 @@ else {
|
||||
class Forum
|
||||
{
|
||||
/**
|
||||
* @param \OTS_Account $account
|
||||
* @param OTS_Account $account
|
||||
* @return bool
|
||||
* @throws \E_OTS_NotLoaded
|
||||
* @throws E_OTS_NotLoaded
|
||||
*/
|
||||
public static function canPost($account)
|
||||
{
|
||||
@@ -155,14 +154,14 @@ class Forum
|
||||
return !count($errors);
|
||||
}
|
||||
|
||||
public static function toggleHide_board($id, &$errors)
|
||||
public static function toggleHidden_board($id, &$errors)
|
||||
{
|
||||
global $db;
|
||||
if(isset($id))
|
||||
{
|
||||
$query = self::get_board($id);
|
||||
if($query !== false)
|
||||
$db->update(TABLE_PREFIX . 'forum_boards', array('hide' => ($query['hide'] == 1 ? 0 : 1)), array('id' => $id));
|
||||
$db->update(TABLE_PREFIX . 'forum_boards', array('hidden' => ($query['hidden'] == 1 ? 0 : 1)), array('id' => $id));
|
||||
else
|
||||
$errors[] = 'Forum board with id ' . $id . ' does not exists.';
|
||||
}
|
||||
@@ -295,7 +294,7 @@ class Forum
|
||||
$section = $sections[$board_id];
|
||||
if($section['guild'] > 0) {
|
||||
if($logged) {
|
||||
$guild = new \OTS_Guild();
|
||||
$guild = new OTS_Guild();
|
||||
$guild->load($section['guild']);
|
||||
$status = false;
|
||||
if($guild->isLoaded()) {
|
||||
@@ -323,3 +322,4 @@ class Forum
|
||||
return $hasAccess;
|
||||
}
|
||||
}
|
||||
?>
|
@@ -8,11 +8,7 @@
|
||||
* @copyright 2019 MyAAC
|
||||
* @link https://my-aac.org
|
||||
*/
|
||||
|
||||
namespace MyAAC;
|
||||
|
||||
use MyAAC\Cache\PHP as CachePHP;
|
||||
use MyAAC\Models\Spell;
|
||||
defined('MYAAC') or die('Direct access not allowed!');
|
||||
|
||||
class Items
|
||||
{
|
||||
@@ -27,7 +23,7 @@ class Items
|
||||
return false;
|
||||
}
|
||||
|
||||
$xml = new \DOMDocument;
|
||||
$xml = new DOMDocument;
|
||||
$xml->load($file_path);
|
||||
|
||||
$items = array();
|
||||
@@ -43,7 +39,8 @@ class Items
|
||||
}
|
||||
}
|
||||
|
||||
$cache_php = new CachePHP(config('cache_prefix'), CACHE . 'persistent/');
|
||||
require_once LIBS . 'cache_php.php';
|
||||
$cache_php = new Cache_PHP(config('cache_prefix'), CACHE . 'persistent/');
|
||||
$cache_php->set('items', $items, 5 * 365 * 24 * 60 * 60);
|
||||
return true;
|
||||
}
|
||||
@@ -70,7 +67,8 @@ class Items
|
||||
return;
|
||||
}
|
||||
|
||||
$cache_php = new CachePHP(config('cache_prefix'), CACHE . 'persistent/');
|
||||
require_once LIBS . 'cache_php.php';
|
||||
$cache_php = new Cache_PHP(config('cache_prefix'), CACHE . 'persistent/');
|
||||
self::$items = $cache_php->get('items');
|
||||
}
|
||||
|
||||
@@ -112,7 +110,7 @@ class Items
|
||||
$s .= 'an item of type ' . $item['id'];
|
||||
|
||||
if(isset($attr['type']) && strtolower($attr['type']) == 'rune') {
|
||||
$item = Spell::where('item_id', $id)->first();
|
||||
$item = Spells::where('item_id', $id)->first();
|
||||
if($item) {
|
||||
if($item->level > 0 && $item->maglevel > 0) {
|
||||
$s .= '. ' . ($count > 1 ? "They" : "It") . ' can only be used by ';
|
@@ -1,8 +1,5 @@
|
||||
<?php
|
||||
|
||||
namespace MyAAC;
|
||||
|
||||
use MyAAC\Cache\Cache;
|
||||
use MyAAC\Models\News as ModelsNews;
|
||||
|
||||
class News
|
||||
@@ -101,18 +98,18 @@ class News
|
||||
return true;
|
||||
}
|
||||
|
||||
static public function toggleHide($id, &$errors, &$status)
|
||||
static public function toggleHidden($id, &$errors, &$status)
|
||||
{
|
||||
if(isset($id))
|
||||
{
|
||||
$row = ModelsNews::find($id);
|
||||
if($row)
|
||||
{
|
||||
$row->hide = $row->hide == 1 ? 0 : 1;
|
||||
$row->hidden = $row->hidden == 1 ? 0 : 1;
|
||||
if (!$row->save()) {
|
||||
$errors[] = 'Fail during toggle hide News.';
|
||||
$errors[] = 'Fail during toggle hidden News.';
|
||||
}
|
||||
$status = $row->hide;
|
||||
$status = $row->hidden;
|
||||
}
|
||||
else
|
||||
$errors[] = 'News with id ' . $id . ' does not exists.';
|
@@ -9,10 +9,7 @@
|
||||
* @copyright 2021 MyAAC
|
||||
* @link https://my-aac.org
|
||||
*/
|
||||
|
||||
namespace MyAAC;
|
||||
|
||||
use MyAAC\Cache\PHP as CachePHP;
|
||||
defined('MYAAC') or die('Direct access not allowed!');
|
||||
|
||||
class NPCs
|
||||
{
|
||||
@@ -25,7 +22,7 @@ class NPCs
|
||||
return false;
|
||||
|
||||
$npcs = [];
|
||||
$xml = new \DOMDocument();
|
||||
$xml = new DOMDocument();
|
||||
foreach (preg_grep('~\.(xml)$~i', scandir($npc_path)) as $npc) {
|
||||
$xml->load($npc_path . $npc);
|
||||
if ($xml) {
|
||||
@@ -43,7 +40,8 @@ class NPCs
|
||||
return false;
|
||||
}
|
||||
|
||||
$cache_php = new CachePHP(config('cache_prefix'), CACHE . 'persistent/');
|
||||
require_once LIBS . 'cache_php.php';
|
||||
$cache_php = new Cache_PHP(config('cache_prefix'), CACHE . 'persistent/');
|
||||
$cache_php->set('npcs', $npcs, 5 * 365 * 24 * 60 * 60);
|
||||
return true;
|
||||
}
|
||||
@@ -54,7 +52,8 @@ class NPCs
|
||||
return;
|
||||
}
|
||||
|
||||
$cache_php = new CachePHP(config('cache_prefix'), CACHE . 'persistent/');
|
||||
require_once LIBS . 'cache_php.php';
|
||||
$cache_php = new Cache_PHP(config('cache_prefix'), CACHE . 'persistent/');
|
||||
self::$npcs = $cache_php->get('npcs');
|
||||
}
|
||||
}
|
@@ -1,9 +1,44 @@
|
||||
<?php
|
||||
/**
|
||||
* Plugins class
|
||||
*
|
||||
* @package MyAAC
|
||||
* @author Gesior <jerzyskalski@wp.pl>
|
||||
* @author Slawkens <slawkens@gmail.com>
|
||||
* @copyright 2019 MyAAC
|
||||
* @link https://my-aac.org
|
||||
*/
|
||||
defined('MYAAC') or die('Direct access not allowed!');
|
||||
|
||||
namespace MyAAC;
|
||||
function is_sub_dir($path = NULL, $parent_folder = BASE) {
|
||||
|
||||
//Get directory path minus last folder
|
||||
$dir = dirname($path);
|
||||
$folder = substr($path, strlen($dir));
|
||||
|
||||
//Check the the base dir is valid
|
||||
$dir = realpath($dir);
|
||||
|
||||
//Only allow valid filename characters
|
||||
$folder = preg_replace('/[^a-z0-9\.\-_]/i', '', $folder);
|
||||
|
||||
//If this is a bad path or a bad end folder name
|
||||
if( !$dir OR !$folder OR $folder === '.') {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
//Rebuild path
|
||||
$path = $dir. '/' . $folder;
|
||||
|
||||
//If this path is higher than the parent folder
|
||||
if( strcasecmp($path, $parent_folder) > 0 ) {
|
||||
return $path;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
use Composer\Semver\Semver;
|
||||
use MyAAC\Cache\Cache;
|
||||
use MyAAC\Models\Menu;
|
||||
|
||||
class Plugins {
|
||||
@@ -23,15 +58,10 @@ class Plugins {
|
||||
|
||||
$routes = [];
|
||||
foreach(self::getAllPluginsJson() as $plugin) {
|
||||
$routesDefaultPriority = 1000;
|
||||
if (isset($plugin['routes-default-priority'])) {
|
||||
$routesDefaultPriority = $plugin['routes-default-priority'];
|
||||
}
|
||||
|
||||
$warningPreTitle = 'Plugin: ' . $plugin['name'] . ' - ';
|
||||
|
||||
if (isset($plugin['routes'])) {
|
||||
foreach ($plugin['routes'] as $info) {
|
||||
foreach ($plugin['routes'] as $_name => $info) {
|
||||
// default method: get
|
||||
$method = $info['method'] ?? ['GET'];
|
||||
if ($method !== '*') {
|
||||
@@ -48,7 +78,7 @@ class Plugins {
|
||||
}
|
||||
|
||||
if (!isset($info['priority'])) {
|
||||
$info['priority'] = $routesDefaultPriority; // default priority taken from plugin.json
|
||||
$info['priority'] = 100; // default priority
|
||||
}
|
||||
|
||||
if (isset($info['redirect_from'])) {
|
||||
@@ -64,63 +94,27 @@ class Plugins {
|
||||
}
|
||||
}
|
||||
|
||||
// replace first occurrence of / in pattern if found (will be auto-added later)
|
||||
// replace first occurence of / in pattern if found (will be auto-added later)
|
||||
removeIfFirstSlash($info['pattern']);
|
||||
|
||||
foreach ($routes as $id => &$route) {
|
||||
if($route[1] == $info['pattern']) {
|
||||
if($info['priority'] < $route[3]) {
|
||||
self::$warnings[] = $warningPreTitle . "Duplicated route with lower priority: {$info['pattern']}. Disabling this route...";
|
||||
continue 2;
|
||||
}
|
||||
else {
|
||||
self::$warnings[] = $warningPreTitle . "Duplicated route with lower priority: {$route[1]} ({$route[3]}). Disabling this route...";
|
||||
unset($routes[$id]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$routes[] = [$methods, $info['pattern'], $info['file'], $info['priority']];
|
||||
}
|
||||
}
|
||||
|
||||
$pagesDefaultPriority = 1000;
|
||||
if (isset($plugin['pages-default-priority'])) {
|
||||
$pagesDefaultPriority = $plugin['pages-default-priority'];
|
||||
}
|
||||
|
||||
if (self::getAutoLoadOption($plugin, 'pages', true)) {
|
||||
//
|
||||
// Get all plugins/*/pages/*.php pages
|
||||
//
|
||||
$pluginPages = glob(PLUGINS . $plugin['filename'] . '/pages/*.php');
|
||||
foreach ($pluginPages as $file) {
|
||||
$file = str_replace(PLUGINS, 'plugins/', $file);
|
||||
$name = pathinfo($file, PATHINFO_FILENAME);
|
||||
|
||||
$routes[] = [['get', 'post'], $name, $file, $pagesDefaultPriority];
|
||||
}
|
||||
}
|
||||
|
||||
if (self::getAutoLoadOption($plugin, 'pagesSubFolders', true)) {
|
||||
//
|
||||
// Get all plugins/*/pages/subFolder/*.php pages
|
||||
//
|
||||
$pluginPagesSubFolders = glob(PLUGINS . $plugin['filename'] . '/pages/*', GLOB_ONLYDIR);
|
||||
foreach ($pluginPagesSubFolders as $folder) {
|
||||
$folderName = pathinfo($folder, PATHINFO_FILENAME);
|
||||
|
||||
$subFiles = glob(PLUGINS . $plugin['filename'] . '/pages/' . $folderName . '/*.php');
|
||||
foreach ($subFiles as $file) {
|
||||
$file = str_replace(PLUGINS, 'plugins/', $file);
|
||||
$name = $folderName . '/' . pathinfo($file, PATHINFO_FILENAME);
|
||||
|
||||
$routes[] = [['get', 'post'], $name, $file, $pagesDefaultPriority];
|
||||
}
|
||||
|
||||
$subFolders = glob(PLUGINS . $plugin['filename'] . '/pages/' . $folderName . '/*', GLOB_ONLYDIR);
|
||||
foreach ($subFolders as $subFolder) {
|
||||
$subFolderName = pathinfo($subFolder, PATHINFO_FILENAME);
|
||||
$subSubFiles = glob(PLUGINS . $plugin['filename'] . '/pages/' . $folderName . '/' . $subFolderName . '/*.php');
|
||||
|
||||
foreach ($subSubFiles as $subSubFile) {
|
||||
$subSubFile = str_replace(PLUGINS, 'plugins/', $subSubFile);
|
||||
$name = $folderName . '/' . $subFolderName . '/' . pathinfo($subSubFile, PATHINFO_FILENAME);
|
||||
|
||||
$routes[] = [['get', 'post'], $name, $subSubFile, $pagesDefaultPriority];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
usort($routes, function ($a, $b)
|
||||
{
|
||||
// key 3 is priority
|
||||
@@ -128,14 +122,14 @@ class Plugins {
|
||||
return 0;
|
||||
}
|
||||
|
||||
return ($a[3] < $b[3]) ? -1 : 1;
|
||||
return ($a[3] > $b[3]) ? -1 : 1;
|
||||
});
|
||||
|
||||
*/
|
||||
// cleanup before passing back
|
||||
// priority is not needed anymore
|
||||
//foreach ($routes as &$route) {
|
||||
// unset($route[3]);
|
||||
//}
|
||||
foreach ($routes as &$route) {
|
||||
unset($route[3]);
|
||||
}
|
||||
|
||||
if ($cache->enabled()) {
|
||||
$cache->set('plugins_routes', serialize($routes), 600);
|
||||
@@ -144,67 +138,6 @@ class Plugins {
|
||||
return $routes;
|
||||
}
|
||||
|
||||
public static function getThemes()
|
||||
{
|
||||
$cache = Cache::getInstance();
|
||||
if ($cache->enabled()) {
|
||||
$tmp = '';
|
||||
if ($cache->fetch('plugins_themes', $tmp)) {
|
||||
return unserialize($tmp);
|
||||
}
|
||||
}
|
||||
|
||||
$themes = [];
|
||||
foreach(self::getAllPluginsJson() as $plugin) {
|
||||
if (!self::getAutoLoadOption($plugin, 'themes', true)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$pluginThemes = glob(PLUGINS . $plugin['filename'] . '/themes/*', GLOB_ONLYDIR);
|
||||
foreach ($pluginThemes as $path) {
|
||||
$path = str_replace(PLUGINS, 'plugins/', $path);
|
||||
$name = pathinfo($path, PATHINFO_FILENAME);
|
||||
|
||||
$themes[$name] = $path;
|
||||
}
|
||||
}
|
||||
|
||||
if ($cache->enabled()) {
|
||||
$cache->set('plugins_themes', serialize($themes), 600);
|
||||
}
|
||||
|
||||
return $themes;
|
||||
}
|
||||
|
||||
public static function getCommands()
|
||||
{
|
||||
$cache = Cache::getInstance();
|
||||
if ($cache->enabled()) {
|
||||
$tmp = '';
|
||||
if ($cache->fetch('plugins_commands', $tmp)) {
|
||||
return unserialize($tmp);
|
||||
}
|
||||
}
|
||||
|
||||
$commands = [];
|
||||
foreach(self::getAllPluginsJson() as $plugin) {
|
||||
if (!self::getAutoLoadOption($plugin, 'commands', true)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$pluginCommands = glob(PLUGINS . $plugin['filename'] . '/commands/*.php');
|
||||
foreach ($pluginCommands as $path) {
|
||||
$commands[] = $path;
|
||||
}
|
||||
}
|
||||
|
||||
if ($cache->enabled()) {
|
||||
$cache->set('plugins_commands', serialize($commands), 600);
|
||||
}
|
||||
|
||||
return $commands;
|
||||
}
|
||||
|
||||
public static function getHooks()
|
||||
{
|
||||
$cache = Cache::getInstance();
|
||||
@@ -219,19 +152,13 @@ class Plugins {
|
||||
foreach(self::getAllPluginsJson() as $plugin) {
|
||||
if (isset($plugin['hooks'])) {
|
||||
foreach ($plugin['hooks'] as $_name => $info) {
|
||||
$priority = 1000;
|
||||
|
||||
if (str_contains($info['type'], 'HOOK_')) {
|
||||
$info['type'] = str_replace('HOOK_', '', $info['type']);
|
||||
}
|
||||
|
||||
if (isset($info['priority'])) {
|
||||
$priority = (int)$info['priority'];
|
||||
}
|
||||
|
||||
if (defined('HOOK_'. $info['type'])) {
|
||||
$hook = constant('HOOK_'. $info['type']);
|
||||
$hooks[] = ['name' => $_name, 'type' => $hook, 'file' => $info['file'], 'priority' => $priority];
|
||||
$hooks[] = ['name' => $_name, 'type' => $hook, 'file' => $info['file']];
|
||||
} else {
|
||||
self::$warnings[] = 'Plugin: ' . $plugin['name'] . '. Unknown event type: ' . $info['type'];
|
||||
}
|
||||
@@ -239,15 +166,6 @@ class Plugins {
|
||||
}
|
||||
}
|
||||
|
||||
usort($hooks, function ($a, $b)
|
||||
{
|
||||
if ($a['priority'] == $b['priority']) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
return ($a['priority'] < $b['priority']) ? -1 : 1;
|
||||
});
|
||||
|
||||
if ($cache->enabled()) {
|
||||
$cache->set('plugins_hooks', serialize($hooks), 600);
|
||||
}
|
||||
@@ -359,11 +277,11 @@ class Plugins {
|
||||
{
|
||||
global $db;
|
||||
|
||||
if(!\class_exists('\ZipArchive')) {
|
||||
throw new \RuntimeException('Please install PHP zip extension. Plugins upload disabled until then.');
|
||||
if(!\class_exists('ZipArchive')) {
|
||||
throw new RuntimeException('Please install PHP zip extension. Plugins upload disabled until then.');
|
||||
}
|
||||
|
||||
$zip = new \ZipArchive();
|
||||
$zip = new ZipArchive();
|
||||
if($zip->open($file) !== true) {
|
||||
self::$error = 'There was a problem with opening zip archive.';
|
||||
return false;
|
||||
@@ -587,7 +505,12 @@ class Plugins {
|
||||
self::$warnings[] = 'Cannot load install script. Your plugin might be not working correctly.';
|
||||
}
|
||||
|
||||
clearCache();
|
||||
$cache = Cache::getInstance();
|
||||
if($cache->enabled()) {
|
||||
$cache->delete('templates');
|
||||
$cache->delete('hooks');
|
||||
$cache->delete('template_menus');
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
@@ -634,45 +557,6 @@ class Plugins {
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* This function is to execute the "install" part of the plugin
|
||||
*
|
||||
* @param $plugin_name
|
||||
* @return bool
|
||||
*/
|
||||
public static function executeInstall($plugin_name): bool
|
||||
{
|
||||
$filename = BASE . 'plugins/' . $plugin_name . '.json';
|
||||
if(!file_exists($filename)) {
|
||||
self::$error = 'Plugin ' . $plugin_name . ' does not exist.';
|
||||
return false;
|
||||
}
|
||||
|
||||
$string = file_get_contents($filename);
|
||||
$plugin_json = json_decode($string, true);
|
||||
if(!$plugin_json) {
|
||||
self::$error = 'Cannot load plugin info ' . $plugin_name . '.json';
|
||||
return false;
|
||||
}
|
||||
|
||||
if(!isset($plugin_json['install'])) {
|
||||
self::$error = "Plugin doesn't have install options defined. Skipping...";
|
||||
return false;
|
||||
}
|
||||
|
||||
global $db;
|
||||
if (file_exists(BASE . $plugin_json['install'])) {
|
||||
$db->revalidateCache();
|
||||
require BASE . $plugin_json['install'];
|
||||
$db->revalidateCache();
|
||||
}
|
||||
else {
|
||||
self::$warnings[] = 'Cannot load install script. Your plugin might be not working correctly.';
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public static function uninstall($plugin_name): bool
|
||||
{
|
||||
$filename = BASE . 'plugins/' . $plugin_name . '.json';
|
||||
@@ -768,17 +652,14 @@ class Plugins {
|
||||
* @param string $templateName
|
||||
* @param array $categories
|
||||
*/
|
||||
public static function installMenus($templateName, $categories, $clearOld = true)
|
||||
public static function installMenus($templateName, $categories)
|
||||
{
|
||||
global $db;
|
||||
if (!$db->hasTable(TABLE_PREFIX . 'menu')) {
|
||||
// check if menus already exist
|
||||
$menuInstalled = Menu::where('template', $templateName)->select('id')->first();
|
||||
if ($menuInstalled) {
|
||||
return;
|
||||
}
|
||||
|
||||
if ($clearOld) {
|
||||
Menu::where('template', $templateName)->delete();
|
||||
}
|
||||
|
||||
foreach ($categories as $category => $menus) {
|
||||
$i = 0;
|
||||
foreach ($menus as $name => $link) {
|
||||
@@ -813,21 +694,4 @@ class Plugins {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static function getAutoLoadOption(array $plugin, string $optionName, bool $default = true)
|
||||
{
|
||||
if (isset($plugin['autoload'])) {
|
||||
$autoload = $plugin['autoload'];
|
||||
if (is_array($autoload)) {
|
||||
if (isset($autoload[$optionName])) {
|
||||
return getBoolean($autoload[$optionName]);
|
||||
}
|
||||
}
|
||||
else if (is_bool($autoload)) {
|
||||
return $autoload;
|
||||
}
|
||||
}
|
||||
|
||||
return $default;
|
||||
}
|
||||
}
|
@@ -83,4 +83,38 @@ abstract class OTS_Base_DAO implements IOTS_DAO
|
||||
{
|
||||
unset($this->data['id']);
|
||||
}
|
||||
|
||||
/**
|
||||
* Magic PHP5 method.
|
||||
*
|
||||
* <p>
|
||||
* Allows object importing from {@link http://www.php.net/manual/en/function.var-export.php var_export()}.
|
||||
* </p>
|
||||
*
|
||||
* @version 0.1.0
|
||||
* @param array $properties List of object properties.
|
||||
*/
|
||||
public static function __set_state($properties)
|
||||
{
|
||||
// deletes database handle
|
||||
if( isset($properties['db']) )
|
||||
{
|
||||
unset($properties['db']);
|
||||
}
|
||||
|
||||
// initializes new object with current database connection
|
||||
$object = new self();
|
||||
|
||||
// loads properties
|
||||
foreach($properties as $name => $value)
|
||||
{
|
||||
$object->$name = $value;
|
||||
}
|
||||
|
||||
return $object;
|
||||
}
|
||||
}
|
||||
|
||||
/**#@-*/
|
||||
|
||||
?>
|
||||
|
@@ -184,14 +184,8 @@ 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++) {
|
||||
$value = 'NULL';
|
||||
if ($values[$i] !== null) {
|
||||
$value = $this->quote($values[$i]);
|
||||
}
|
||||
|
||||
$query.= $this->fieldName($fields[$i]).' = '.$value.', ';
|
||||
}
|
||||
for ($i = 0; $i < $count; $i++)
|
||||
$query.= $this->fieldName($fields[$i]).' = '.$this->quote($values[$i]).', ';
|
||||
|
||||
$query = substr($query, 0, -2);
|
||||
$query.=' WHERE (';
|
||||
|
@@ -196,16 +196,6 @@ class OTS_Buffer
|
||||
return $value[1];
|
||||
}
|
||||
|
||||
public function getLongLong()
|
||||
{
|
||||
// checks buffer size
|
||||
$this->check(8);
|
||||
|
||||
$value = unpack('P', substr($this->buffer, $this->pos, 8) );
|
||||
$this->pos += 8;
|
||||
return $value[1];
|
||||
}
|
||||
|
||||
/**
|
||||
* Appends quater byte to buffer.
|
||||
*
|
||||
|
@@ -12,8 +12,6 @@
|
||||
* @license http://www.gnu.org/licenses/lgpl-3.0.txt GNU Lesser General Public License, Version 3
|
||||
*/
|
||||
|
||||
use MyAAC\Cache\Cache;
|
||||
|
||||
/**
|
||||
* MySQL connection interface.
|
||||
*
|
||||
@@ -28,8 +26,6 @@ class OTS_DB_MySQL extends OTS_Base_DB
|
||||
{
|
||||
private $has_table_cache = array();
|
||||
private $has_column_cache = array();
|
||||
|
||||
private $clearCacheAfter = false;
|
||||
/**
|
||||
* Creates database connection.
|
||||
*
|
||||
@@ -98,8 +94,7 @@ class OTS_DB_MySQL extends OTS_Base_DB
|
||||
}
|
||||
|
||||
global $config;
|
||||
$cache = Cache::getInstance();
|
||||
if($cache->enabled()) {
|
||||
if(class_exists('Cache') && ($cache = Cache::getInstance()) && $cache->enabled()) {
|
||||
$tmp = null;
|
||||
$need_revalidation = true;
|
||||
if($cache->fetch('database_checksum', $tmp) && $tmp) {
|
||||
@@ -150,19 +145,11 @@ class OTS_DB_MySQL extends OTS_Base_DB
|
||||
{
|
||||
global $config;
|
||||
|
||||
$cache = Cache::getInstance();
|
||||
if($cache->enabled()) {
|
||||
if ($this->clearCacheAfter) {
|
||||
$cache->delete('database_tables');
|
||||
$cache->delete('database_columns');
|
||||
$cache->delete('database_checksum');
|
||||
}
|
||||
else {
|
||||
if(class_exists('Cache') && ($cache = Cache::getInstance()) && $cache->enabled()) {
|
||||
$cache->set('database_tables', serialize($this->has_table_cache), 3600);
|
||||
$cache->set('database_columns', serialize($this->has_column_cache), 3600);
|
||||
$cache->set('database_checksum', serialize(sha1($config['database_host'] . '.' . $config['database_name'])), 3600);
|
||||
}
|
||||
}
|
||||
|
||||
if($this->logged) {
|
||||
log_append('database.log', $_SERVER['REQUEST_URI'] . PHP_EOL . $this->getLog());
|
||||
@@ -249,11 +236,6 @@ class OTS_DB_MySQL extends OTS_Base_DB
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public function setClearCacheAfter($clearCache)
|
||||
{
|
||||
$this->clearCacheAfter = $clearCache;
|
||||
}
|
||||
}
|
||||
|
||||
/**#@-*/
|
||||
|
@@ -8,8 +8,6 @@
|
||||
* @license http://www.gnu.org/licenses/lgpl-3.0.txt GNU Lesser General Public License, Version 3
|
||||
*/
|
||||
|
||||
use MyAAC\Cache\Cache;
|
||||
|
||||
/**
|
||||
* List of groups.
|
||||
*
|
||||
|
@@ -60,7 +60,12 @@ 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(PDO::FETCH_ASSOC);
|
||||
$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]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public function find($name)
|
||||
|
@@ -41,10 +41,9 @@
|
||||
class OTS_Monster extends DOMDocument
|
||||
{
|
||||
private $loaded = false;
|
||||
public function loadXML(string $source , int $options = 0): bool
|
||||
public function loadXML($source , $options = 0)
|
||||
{
|
||||
$this->loaded = parent::loadXML($source, $options);
|
||||
return $this->loaded;
|
||||
}
|
||||
|
||||
public function loaded()
|
||||
@@ -135,14 +134,13 @@ class OTS_Monster extends DOMDocument
|
||||
{
|
||||
$flags = array();
|
||||
|
||||
if ($this->documentElement->getElementsByTagName('flags')->item(0)) {
|
||||
// read all flags
|
||||
foreach( $this->documentElement->getElementsByTagName('flags')->item(0)->getElementsByTagName('flag') as $flag)
|
||||
{
|
||||
$flag = $flag->attributes->item(0);
|
||||
|
||||
$flags[$flag->nodeName] = (int) $flag->nodeValue;
|
||||
}
|
||||
}
|
||||
|
||||
return $flags;
|
||||
}
|
||||
|
@@ -90,7 +90,7 @@ class OTS_Player extends OTS_Row_DAO
|
||||
* @version 0.1.2
|
||||
* @var array
|
||||
*/
|
||||
private $data = array('group_id' => 1, 'sex' => 0, 'vocation' => 0, 'experience' => 0, 'level' => 1, 'maglevel' => 0, 'health' => 100, 'healthmax' => 100, 'mana' => 100, 'manamax' => 100, 'manaspent' => 0, 'soul' => 0, 'lookbody' => 10, 'lookfeet' => 10, 'lookhead' => 10, 'looklegs' => 10, 'looktype' => 136, 'lookaddons' => 0, 'posx' => 0, 'posy' => 0, 'posz' => 0, 'cap' => 0, 'lastlogin' => 0, 'lastip' => 0, 'save' => true, 'skulltime' => 0, 'skull' => 0, 'balance' => 0, 'lastlogout' => 0, 'blessings' => 0, 'stamina' => 0, 'online' => 0, 'comment' => '', 'created' => 0, 'hide' => 0);
|
||||
private $data = array('sex' => 0, 'vocation' => 0, 'experience' => 0, 'level' => 1, 'maglevel' => 0, 'health' => 100, 'healthmax' => 100, 'mana' => 100, 'manamax' => 100, 'manaspent' => 0, 'soul' => 0, 'lookbody' => 10, 'lookfeet' => 10, 'lookhead' => 10, 'looklegs' => 10, 'looktype' => 136, 'lookaddons' => 0, 'posx' => 0, 'posy' => 0, 'posz' => 0, 'cap' => 0, 'lastlogin' => 0, 'lastip' => 0, 'save' => true, 'skulltime' => 0, 'skull' => 0, 'balance' => 0, 'lastlogout' => 0, 'blessings' => 0, 'stamina' => 0, 'online' => 0, 'comment' => '', 'created' => 0, 'hidden' => 0);
|
||||
|
||||
/**
|
||||
* Player skills.
|
||||
@@ -231,7 +231,7 @@ class OTS_Player extends OTS_Row_DAO
|
||||
}
|
||||
else {
|
||||
// SELECT query on database
|
||||
$this->data = $this->db->query('SELECT `id`, `name`, `account_id`, `group_id`, `sex`, `vocation`, `experience`, `level`, `maglevel`, `health`, `healthmax`, `mana`, `manamax`, `manaspent`, `soul`, `lookbody`, `lookfeet`, `lookhead`, `looklegs`, `looktype`' . ($this->db->hasColumn('players', 'lookaddons') ? ', `lookaddons`' : '') . ', `posx`, `posy`, `posz`, `cap`, `lastlogin`, `lastlogout`, `lastip`, `save`, `conditions`, `' . $__load['skull_time'] . '` as `skulltime`, `' . $__load['skull_type'] . '` as `skull`' . $__load['guild_info'] . ', `town_id`' . $__load['loss_experience'] . $__load['loss_items'] . ', `balance`' . ($__load['blessings'] ? ', `blessings`' : '') . ($__load['direction'] ? ', `direction`' : '') . ($__load['stamina'] ? ', `stamina`' : '') . ($__load['world_id'] ? ', `world_id`' : '') . ($__load['online'] ? ', `online`' : '') . ', `' . ($__load['deletion'] ? 'deletion' : 'deleted') . '`' . ($__load['promotion'] ? ', `promotion`' : '') . ($__load['marriage'] ? ', `marriage`' : '') . ', `comment`, `created`, `hide` FROM `players` WHERE `id` = ' . (int)$id)->fetch();
|
||||
$this->data = $this->db->query('SELECT `id`, `name`, `account_id`, `group_id`, `sex`, `vocation`, `experience`, `level`, `maglevel`, `health`, `healthmax`, `mana`, `manamax`, `manaspent`, `soul`, `lookbody`, `lookfeet`, `lookhead`, `looklegs`, `looktype`' . ($this->db->hasColumn('players', 'lookaddons') ? ', `lookaddons`' : '') . ', `posx`, `posy`, `posz`, `cap`, `lastlogin`, `lastlogout`, `lastip`, `save`, `conditions`, `' . $__load['skull_time'] . '` as `skulltime`, `' . $__load['skull_type'] . '` as `skull`' . $__load['guild_info'] . ', `town_id`' . $__load['loss_experience'] . $__load['loss_items'] . ', `balance`' . ($__load['blessings'] ? ', `blessings`' : '') . ($__load['direction'] ? ', `direction`' : '') . ($__load['stamina'] ? ', `stamina`' : '') . ($__load['world_id'] ? ', `world_id`' : '') . ($__load['online'] ? ', `online`' : '') . ', `' . ($__load['deletion'] ? 'deletion' : 'deleted') . '`' . ($__load['promotion'] ? ', `promotion`' : '') . ($__load['marriage'] ? ', `marriage`' : '') . ', `comment`, `created`, `hidden` FROM `players` WHERE `id` = ' . (int)$id)->fetch();
|
||||
}
|
||||
|
||||
// loads skills
|
||||
@@ -521,17 +521,17 @@ class OTS_Player extends OTS_Row_DAO
|
||||
|
||||
public function isHidden()
|
||||
{
|
||||
if( !isset($this->data['hide']) )
|
||||
if( !isset($this->data['hidden']) )
|
||||
{
|
||||
throw new E_OTS_NotLoaded();
|
||||
}
|
||||
|
||||
return $this->data['hide'] == 1;
|
||||
return $this->data['hidden'] == 1;
|
||||
}
|
||||
|
||||
public function setHidden($hidden)
|
||||
{
|
||||
$this->data['hide'] = (int) $hidden;
|
||||
$this->data['hidden'] = (int) $hidden;
|
||||
}
|
||||
|
||||
public function getMarriage()
|
||||
@@ -1229,13 +1229,6 @@ class OTS_Player extends OTS_Row_DAO
|
||||
$this->data['direction'] = (int) $direction;
|
||||
}
|
||||
|
||||
public function getOutfit(): string
|
||||
{
|
||||
$hasLookAddons = $this->db->hasColumn('players', 'lookaddons');
|
||||
|
||||
return setting('core.outfit_images_url') . '?id=' . $this->getLookType() . ($hasLookAddons ? '&addons=' . $this->getLookAddons() : '') . '&head=' . $this->getLookHead() . '&body=' . $this->getLookBody() . '&legs=' . $this->getLookLegs() . '&feet=' . $this->getLookFeet();
|
||||
}
|
||||
|
||||
/**
|
||||
* Body color.
|
||||
*
|
||||
|
@@ -9,10 +9,10 @@
|
||||
* @link https://my-aac.org
|
||||
*/
|
||||
|
||||
namespace MyAAC;
|
||||
|
||||
use MyAAC\Models\Spell;
|
||||
|
||||
defined('MYAAC') or die('Direct access not allowed!');
|
||||
|
||||
class Spells {
|
||||
private static $spellsList = null;
|
||||
private static $lastError = '';
|
||||
@@ -38,7 +38,7 @@ class Spells {
|
||||
|
||||
try {
|
||||
Spell::query()->delete();
|
||||
} catch(\Exception $error) {}
|
||||
} catch(Exception $error) {}
|
||||
|
||||
if($show) {
|
||||
echo '<h2>Reload spells.</h2>';
|
||||
@@ -46,9 +46,9 @@ class Spells {
|
||||
}
|
||||
|
||||
try {
|
||||
self::$spellsList = new \OTS_SpellsList($config['data_path'].'spells/spells.xml');
|
||||
self::$spellsList = new OTS_SpellsList($config['data_path'].'spells/spells.xml');
|
||||
}
|
||||
catch(\Exception $e) {
|
||||
catch(Exception $e) {
|
||||
self::$lastError = $e->getMessage();
|
||||
return false;
|
||||
}
|
||||
@@ -81,14 +81,14 @@ class Spells {
|
||||
'conjure_count' => $spell->getConjureCount(),
|
||||
'conjure_id' => $spell->getConjureId(),
|
||||
'reagent' => $spell->getReagentId(),
|
||||
'hide' => $spell->isEnabled() ? 0 : 1
|
||||
'hidden' => $spell->isEnabled() ? 0 : 1
|
||||
));
|
||||
|
||||
if($show) {
|
||||
success('Added: ' . $name . '<br/>');
|
||||
}
|
||||
}
|
||||
catch(\PDOException $error) {
|
||||
catch(PDOException $error) {
|
||||
if($show) {
|
||||
warning('Error while adding spell (' . $name . '): ' . $error->getMessage());
|
||||
}
|
||||
@@ -121,14 +121,14 @@ class Spells {
|
||||
'premium' => $spell->isPremium() ? 1 : 0,
|
||||
'vocations' => json_encode($spell->getVocations()),
|
||||
'conjure_count' => 0,
|
||||
'hide' => $spell->isEnabled() ? 0 : 1
|
||||
'hidden' => $spell->isEnabled() ? 0 : 1
|
||||
));
|
||||
|
||||
if($show) {
|
||||
success('Added: ' . $name . '<br/>');
|
||||
}
|
||||
}
|
||||
catch(\PDOException $error) {
|
||||
catch(PDOException $error) {
|
||||
if($show) {
|
||||
warning('Error while adding spell (' . $name . '): ' . $error->getMessage());
|
||||
}
|
||||
@@ -159,14 +159,14 @@ class Spells {
|
||||
'vocations' => json_encode($spell->getVocations()),
|
||||
'conjure_count' => 0,
|
||||
'item_id' => $spell->getID(),
|
||||
'hide' => $spell->isEnabled() ? 0 : 1
|
||||
'hidden' => $spell->isEnabled() ? 0 : 1
|
||||
));
|
||||
|
||||
if($show) {
|
||||
success('Added: ' . $name . '<br/>');
|
||||
}
|
||||
}
|
||||
catch(\PDOException $error) {
|
||||
catch(PDOException $error) {
|
||||
if($show) {
|
||||
warning('Error while adding spell (' . $name . '): ' . $error->getMessage());
|
||||
}
|
@@ -7,8 +7,7 @@
|
||||
* @copyright 2019 MyAAC
|
||||
* @link https://my-aac.org
|
||||
*/
|
||||
|
||||
namespace MyAAC;
|
||||
defined('MYAAC') or die('Direct access not allowed!');
|
||||
|
||||
class Timer
|
||||
{
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user