mirror of
https://github.com/slawkens/myaac.git
synced 2025-09-14 12:33:35 +02:00
Compare commits
6 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
d297e434b8 | ||
![]() |
c7966b7c55 | ||
![]() |
3e12f70861 | ||
![]() |
4aede4c626 | ||
![]() |
57643bb4aa | ||
![]() |
0139e4b446 |
@@ -15,5 +15,5 @@ trim_trailing_whitespace = false
|
|||||||
[{composer.json,package.json}]
|
[{composer.json,package.json}]
|
||||||
indent_style = space
|
indent_style = space
|
||||||
|
|
||||||
[{package.json, *.yml}]
|
[package.json]
|
||||||
indent_size = 2
|
indent_size = 2
|
1
.gitattributes
vendored
1
.gitattributes
vendored
@@ -9,5 +9,6 @@ release.sh export-ignore
|
|||||||
# cypress
|
# cypress
|
||||||
cypress export-ignore
|
cypress export-ignore
|
||||||
cypress.config.js export-ignore
|
cypress.config.js export-ignore
|
||||||
|
cypress.env.json
|
||||||
|
|
||||||
*.sh text eol=lf
|
*.sh text eol=lf
|
||||||
|
102
.github/workflows/cypress.yml
vendored
102
.github/workflows/cypress.yml
vendored
@@ -1,9 +1,9 @@
|
|||||||
name: Cypress
|
name: Cypress
|
||||||
on:
|
on:
|
||||||
pull_request:
|
pull_request:
|
||||||
branches: [develop]
|
branches: [0.9]
|
||||||
push:
|
push:
|
||||||
branches: [develop]
|
branches: [0.9]
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
cypress:
|
cypress:
|
||||||
@@ -22,9 +22,8 @@ jobs:
|
|||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
php-versions: [ '8.1', '8.2', '8.3' ]
|
php-versions: [ '7.4', '8.0', '8.1' ]
|
||||||
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: MyAAC on PHP ${{ matrix.php-versions }}
|
||||||
name: Cypress (PHP ${{ matrix.php-versions }}, ${{ matrix.ots }})
|
|
||||||
steps:
|
steps:
|
||||||
- name: 📌 MySQL Start & init & show db
|
- name: 📌 MySQL Start & init & show db
|
||||||
run: |
|
run: |
|
||||||
@@ -33,81 +32,47 @@ jobs:
|
|||||||
mysql -e "SHOW DATABASES" -uroot -proot
|
mysql -e "SHOW DATABASES" -uroot -proot
|
||||||
|
|
||||||
- name: Checkout MyAAC
|
- name: Checkout MyAAC
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v3
|
||||||
with:
|
with:
|
||||||
ref: develop
|
ref: 0.9
|
||||||
|
|
||||||
- uses: actions/setup-node@v4
|
|
||||||
with:
|
|
||||||
node-version: 18
|
|
||||||
- run: npm ci
|
|
||||||
|
|
||||||
- name: Checkout TFS
|
- name: Checkout TFS
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v3
|
||||||
if: matrix.ots == 'tfs-1.4'
|
|
||||||
with:
|
with:
|
||||||
repository: otland/forgottenserver
|
repository: otland/forgottenserver
|
||||||
ref: 1.4
|
ref: 1.4
|
||||||
path: ots
|
path: tfs
|
||||||
|
|
||||||
- name: Checkout TFS
|
- name: Import TFS Schema
|
||||||
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
|
|
||||||
run: |
|
run: |
|
||||||
mysql -uroot -proot myaac < ots/schema.sql
|
mysql -uroot -proot myaac < tfs/schema.sql
|
||||||
|
|
||||||
- name: Rename config.lua
|
- 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)
|
- name: Replace mysqlUser
|
||||||
uses: jacobtomlinson/gha-find-replace@v3
|
uses: jacobtomlinson/gha-find-replace@v2
|
||||||
if: matrix.ots == 'tfs-1.4'
|
|
||||||
with:
|
with:
|
||||||
find: 'mysqlUser = "forgottenserver"'
|
find: 'mysqlUser = "forgottenserver"'
|
||||||
replace: 'mysqlUser = "root"'
|
replace: 'mysqlUser = "root"'
|
||||||
regex: false
|
regex: false
|
||||||
include: 'ots/config.lua'
|
include: 'tfs/config.lua'
|
||||||
|
|
||||||
- name: Replace mysqlPass (TFS 1.4)
|
- name: Replace mysqlPass
|
||||||
uses: jacobtomlinson/gha-find-replace@v3
|
uses: jacobtomlinson/gha-find-replace@v2
|
||||||
if: matrix.ots == 'tfs-1.4'
|
|
||||||
with:
|
with:
|
||||||
find: 'mysqlPass = ""'
|
find: 'mysqlPass = ""'
|
||||||
replace: 'mysqlPass = "root"'
|
replace: 'mysqlPass = "root"'
|
||||||
regex: false
|
regex: false
|
||||||
include: 'ots/config.lua'
|
include: 'tfs/config.lua'
|
||||||
|
|
||||||
- name: Replace mysqlDatabase (TFS 1.4)
|
- name: Replace mysqlDatabase
|
||||||
uses: jacobtomlinson/gha-find-replace@v3
|
uses: jacobtomlinson/gha-find-replace@v2
|
||||||
if: matrix.ots == 'tfs-1.4'
|
|
||||||
with:
|
with:
|
||||||
find: 'mysqlDatabase = "forgottenserver"'
|
find: 'mysqlDatabase = "forgottenserver"'
|
||||||
replace: 'mysqlDatabase = "myaac"'
|
replace: 'mysqlDatabase = "myaac"'
|
||||||
regex: false
|
regex: false
|
||||||
include: 'ots/config.lua'
|
include: 'tfs/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'
|
|
||||||
|
|
||||||
- name: Setup PHP
|
- name: Setup PHP
|
||||||
uses: shivammathur/setup-php@v2
|
uses: shivammathur/setup-php@v2
|
||||||
@@ -120,13 +85,13 @@ jobs:
|
|||||||
run: echo "dir=$(composer config cache-files-dir)" >> $GITHUB_OUTPUT
|
run: echo "dir=$(composer config cache-files-dir)" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
- name: Cache composer dependencies
|
- name: Cache composer dependencies
|
||||||
uses: actions/cache@v4
|
uses: actions/cache@v3
|
||||||
with:
|
with:
|
||||||
path: ${{ steps.composer-cache.outputs.dir }}
|
path: ${{ steps.composer-cache.outputs.dir }}
|
||||||
# Use composer.json for key, if composer.lock is not committed.
|
# Use composer.json for key, if composer.lock is not committed.
|
||||||
key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }}
|
# key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }}
|
||||||
#key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}
|
key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}
|
||||||
restore-keys: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }}
|
restore-keys: ${{ runner.os }}-composer-
|
||||||
|
|
||||||
- name: Install Composer dependencies
|
- name: Install Composer dependencies
|
||||||
run: composer install --no-progress --prefer-dist --optimize-autoloader
|
run: composer install --no-progress --prefer-dist --optimize-autoloader
|
||||||
@@ -135,28 +100,21 @@ jobs:
|
|||||||
run: nohup php -S localhost:8080 > php.log 2>&1 &
|
run: nohup php -S localhost:8080 > php.log 2>&1 &
|
||||||
|
|
||||||
- name: Cypress Run
|
- name: Cypress Run
|
||||||
uses: cypress-io/github-action@v6
|
uses: cypress-io/github-action@v5
|
||||||
env:
|
env:
|
||||||
CYPRESS_URL: http://localhost:8080
|
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
|
- name: Save screenshots
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v3
|
||||||
if: always()
|
if: always()
|
||||||
with:
|
with:
|
||||||
name: cypress-screenshots-${{ matrix.php-versions }}-${{ matrix.ots }}
|
name: cypress-screenshots
|
||||||
path: cypress/screenshots
|
path: cypress/screenshots
|
||||||
|
|
||||||
- name: Upload Cypress Videos
|
- name: Upload Cypress Videos
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v3
|
||||||
if: always()
|
if: always()
|
||||||
with:
|
with:
|
||||||
name: cypress-videos-${{ matrix.php-versions }}-${{ matrix.ots }}
|
name: cypress-videos
|
||||||
path: 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"
|
|
5
.gitignore
vendored
5
.gitignore
vendored
@@ -6,17 +6,15 @@ Thumbs.db
|
|||||||
/.htaccess
|
/.htaccess
|
||||||
|
|
||||||
# composer
|
# composer
|
||||||
composer.phar
|
composer.lock
|
||||||
vendor
|
vendor
|
||||||
|
|
||||||
# npm
|
# npm
|
||||||
node_modules
|
node_modules
|
||||||
tools/ext
|
|
||||||
|
|
||||||
# cypress
|
# cypress
|
||||||
cypress.env.json
|
cypress.env.json
|
||||||
cypress/e2e/2-advanced-examples
|
cypress/e2e/2-advanced-examples
|
||||||
cypress/screenshots
|
|
||||||
|
|
||||||
# created by release.sh
|
# created by release.sh
|
||||||
releases
|
releases
|
||||||
@@ -49,7 +47,6 @@ system/cache/*
|
|||||||
!system/cache/twig/index.html
|
!system/cache/twig/index.html
|
||||||
!system/cache/signatures/index.html
|
!system/cache/signatures/index.html
|
||||||
!system/cache/plugins/index.html
|
!system/cache/plugins/index.html
|
||||||
!system/cache/persistent/index.html
|
|
||||||
|
|
||||||
# logs
|
# logs
|
||||||
system/logs/*
|
system/logs/*
|
||||||
|
26
CHANGELOG.md
26
CHANGELOG.md
@@ -1,8 +1,8 @@
|
|||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
## [1.0-beta - 18.05.2024]
|
## [0.9.0-alpha - 02.06.2023]
|
||||||
|
|
||||||
Minimum PHP version for this release is 8.1.
|
Minimum PHP version for this release is 7.2.5.
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
* reworked Admin Panel (@Leesneaks, @gpedro, @slawkens)
|
* reworked Admin Panel (@Leesneaks, @gpedro, @slawkens)
|
||||||
@@ -11,26 +11,17 @@ Minimum PHP version for this release is 8.1.
|
|||||||
* new Dashboard: statistics, server status
|
* new Dashboard: statistics, server status
|
||||||
* new Admin Bar showed on top when admin logged in
|
* new Admin Bar showed on top when admin logged in
|
||||||
* new page: Server Data, to reload server data
|
* new page: Server Data, to reload server data
|
||||||
* Towns, NPCs & Items are stored in permanent cache
|
|
||||||
* new pages: mass account & teleport tools
|
* new pages: mass account & teleport tools
|
||||||
* changelogs editor
|
* changelogs editor
|
||||||
* revised Accounts & Players editors
|
* revised Accounts & Players editors
|
||||||
* option to add/modify admin menus with plugins
|
* option to add/modify menus with plugins
|
||||||
* option to enable/disable plugins
|
* option to enable/disable plugins
|
||||||
* better, updated TinyMCE editor (v6.x)
|
* better, updated TinyMCE editor (v6.x)
|
||||||
* with option to upload images
|
* with option to upload images
|
||||||
* list of open source libraries used in project page
|
* list of open source libraries used in project
|
||||||
* 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)
|
|
||||||
* brand new charming installation page (by @fernandomatos)
|
* brand new charming installation page (by @fernandomatos)
|
||||||
* using Bootstrap
|
* using Bootstrap
|
||||||
* new pages router: nikic/fast-route, allowing for better customisation
|
* new pages router: nikic/fast-route, allowing for better customisation
|
||||||
* Plugin cronjobs: central control of the cronjobs
|
|
||||||
* Guild Wars support (available as plugin)
|
* Guild Wars support (available as plugin)
|
||||||
* support for login and create account only by email (configurable)
|
* support for login and create account only by email (configurable)
|
||||||
* with no need for account name
|
* with no need for account name
|
||||||
@@ -40,13 +31,10 @@ Minimum PHP version for this release is 8.1.
|
|||||||
* suggest account number option
|
* suggest account number option
|
||||||
* many new functions, hooks and configurables
|
* many new functions, hooks and configurables
|
||||||
* better Exception Handler (Whoops - https://github.com/filp/whoops)
|
* better Exception Handler (Whoops - https://github.com/filp/whoops)
|
||||||
* automated website tests (using Cypress)
|
* add Cypress testing
|
||||||
* 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
|
|
||||||
|
|
||||||
### Changed
|
### 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
|
* 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
|
* 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
|
* visitors counter shows now user browser, and also if its bot
|
||||||
@@ -57,7 +45,7 @@ Minimum PHP version for this release is 8.1.
|
|||||||
* Highscores
|
* Highscores
|
||||||
* frags works for TFS 1.x
|
* frags works for TFS 1.x
|
||||||
* cached
|
* cached
|
||||||
* Monsters
|
* creatures
|
||||||
* moved pages to Twig:
|
* moved pages to Twig:
|
||||||
* experience stages
|
* experience stages
|
||||||
* update player_deaths entries on name change
|
* update player_deaths entries on name change
|
||||||
|
@@ -8,11 +8,7 @@ Fernando Matos <fernando@pixele.com.br>
|
|||||||
Lee <42119604+Leesneaks@users.noreply.github.com>
|
Lee <42119604+Leesneaks@users.noreply.github.com>
|
||||||
caio <caio.zucoli@gmail.com>
|
caio <caio.zucoli@gmail.com>
|
||||||
slawkens <slawkens@gmail.com>
|
slawkens <slawkens@gmail.com>
|
||||||
tobi132 <tobi132@gmx.net>
|
tobi132 <52947952+tobi132@users.noreply.github.com>
|
||||||
vankk <nwtr.otland@hotmail.com>
|
vankk <nwtr.otland@hotmail.com>
|
||||||
whiteblXK <krzys16001@gmail.com>
|
whiteblXK <krzys16001@gmail.com>
|
||||||
xitobuh <jonas.hockert92@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>
|
|
||||||
|
24
README.md
24
README.md
@@ -10,20 +10,21 @@ Official website: https://my-aac.org
|
|||||||
[](https://discord.gg/2J39Wus)
|
[](https://discord.gg/2J39Wus)
|
||||||
[](https://github.com/slawkens/myaac/issues?q=is%3Aissue+is%3Aclosed)
|
[](https://github.com/slawkens/myaac/issues?q=is%3Aissue+is%3Aclosed)
|
||||||
|
|
||||||
| Version | Status | Branch | Requirements |
|
| Version | Status | Branch | Requirements |
|
||||||
|:--------|:-----------------------|:--------|:---------------|
|
|:-----------|:------------------------------------------|:--------|:---------------|
|
||||||
| **1.x** | **Active development** | develop | **PHP >= 8.1** |
|
| **0.10.x** | **Active development** | develop | **PHP >= 8.0** |
|
||||||
| 0.9.x | Not developed anymore | 0.9 | PHP >= 7.2.5 |
|
| 0.9.x | Active support | 0.9 | PHP >= 7.2.5 |
|
||||||
| 0.8.x | Active support | master | 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 |
|
| 0.7.x | End Of Life | 0.7 | PHP >= 5.3.3 |
|
||||||
|
|
||||||
### Requirements
|
### Requirements
|
||||||
|
|
||||||
|
- PHP 7.2.5 or later
|
||||||
- MySQL database
|
- MySQL database
|
||||||
- PHP Extensions: pdo, xml, json
|
- PDO PHP Extension
|
||||||
- (optional) apache2 mod_rewrite (to use friendly_urls)
|
- XML PHP Extension
|
||||||
- (optional) zip PHP Extension (to install plugins)
|
- (optional) ZIP PHP Extension
|
||||||
- (optional) gd PHP Extension (for generating signature images)
|
- (optional) mod_rewrite to use friendly_urls
|
||||||
|
|
||||||
### Installation
|
### Installation
|
||||||
|
|
||||||
@@ -47,8 +48,7 @@ Official website: https://my-aac.org
|
|||||||
|
|
||||||
### Configuration
|
### 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.
|
Use *config.local.php* for your local configuration changes.
|
||||||
|
|
||||||
### Branches
|
### 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,22 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
$hooks->register('debugbar_admin_head_end', HOOK_ADMIN_HEAD_END, function ($params) {
|
|
||||||
global $debugBar;
|
|
||||||
|
|
||||||
if (!isset($debugBar)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
$debugBarRenderer = $debugBar->getJavascriptRenderer();
|
|
||||||
echo $debugBarRenderer->renderHead();
|
|
||||||
});
|
|
||||||
$hooks->register('debugbar_admin_body_end', HOOK_ADMIN_BODY_END, function ($params) {
|
|
||||||
global $debugBar;
|
|
||||||
|
|
||||||
if (!isset($debugBar)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
$debugBarRenderer = $debugBar->getJavascriptRenderer();
|
|
||||||
echo $debugBarRenderer->render();
|
|
||||||
});
|
|
@@ -1,37 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
use MyAAC\Plugins;
|
|
||||||
|
|
||||||
$order = 10;
|
|
||||||
|
|
||||||
$settingsMenu = [];
|
|
||||||
|
|
||||||
$settingsMenu[] = [
|
|
||||||
'name' => 'MyAAC',
|
|
||||||
'link' => 'settings&plugin=core',
|
|
||||||
'icon' => 'list',
|
|
||||||
'order' => $order,
|
|
||||||
];
|
|
||||||
|
|
||||||
foreach (Plugins::getAllPluginsSettings() as $setting) {
|
|
||||||
$file = BASE . $setting['settingsFilename'];
|
|
||||||
if (!file_exists($file)) {
|
|
||||||
warning('Plugin setting: ' . $file . ' - cannot be loaded.');
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
$order += 10;
|
|
||||||
|
|
||||||
$settings = require $file;
|
|
||||||
|
|
||||||
$settingsMenu[] = [
|
|
||||||
'name' => $settings['name'],
|
|
||||||
'link' => 'settings&plugin=' . $setting['pluginFilename'],
|
|
||||||
'icon' => 'list',
|
|
||||||
'order' => $order,
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
unset($settings, $file, $order);
|
|
||||||
|
|
||||||
return $settingsMenu;
|
|
@@ -6,6 +6,10 @@ require '../common.php';
|
|||||||
const ADMIN_PANEL = true;
|
const ADMIN_PANEL = true;
|
||||||
const MYAAC_ADMIN = true;
|
const MYAAC_ADMIN = true;
|
||||||
|
|
||||||
|
if(file_exists(BASE . 'config.local.php')) {
|
||||||
|
require_once BASE . 'config.local.php';
|
||||||
|
}
|
||||||
|
|
||||||
if(file_exists(BASE . 'install') && (!isset($config['installed']) || !$config['installed']))
|
if(file_exists(BASE . 'install') && (!isset($config['installed']) || !$config['installed']))
|
||||||
{
|
{
|
||||||
header('Location: ' . BASE_URL . 'install/');
|
header('Location: ' . BASE_URL . 'install/');
|
||||||
@@ -25,9 +29,25 @@ define('PAGE', $page);
|
|||||||
require SYSTEM . 'functions.php';
|
require SYSTEM . 'functions.php';
|
||||||
require SYSTEM . 'init.php';
|
require SYSTEM . 'init.php';
|
||||||
|
|
||||||
require __DIR__ . '/includes/debugbar.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.');
|
||||||
|
}
|
||||||
|
|
||||||
|
if(config('env') === 'dev') {
|
||||||
|
ini_set('display_errors', 1);
|
||||||
|
ini_set('display_startup_errors', 1);
|
||||||
|
error_reporting(E_ALL);
|
||||||
|
}
|
||||||
|
|
||||||
|
// event system
|
||||||
|
require_once SYSTEM . 'hooks.php';
|
||||||
|
$hooks = new Hooks();
|
||||||
|
$hooks->load();
|
||||||
|
|
||||||
require SYSTEM . 'status.php';
|
require SYSTEM . 'status.php';
|
||||||
require SYSTEM . 'login.php';
|
require SYSTEM . 'login.php';
|
||||||
|
require SYSTEM . 'migrate.php';
|
||||||
require __DIR__ . '/includes/functions.php';
|
require __DIR__ . '/includes/functions.php';
|
||||||
|
|
||||||
$twig->addGlobal('config', $config);
|
$twig->addGlobal('config', $config);
|
||||||
@@ -45,7 +65,7 @@ if(!$logged || !admin()) {
|
|||||||
// include our page
|
// include our page
|
||||||
$file = __DIR__ . '/pages/' . $page . '.php';
|
$file = __DIR__ . '/pages/' . $page . '.php';
|
||||||
if(!@file_exists($file)) {
|
if(!@file_exists($file)) {
|
||||||
if (str_contains($page, 'plugins/')) {
|
if (strpos($page, 'plugins/') !== false) {
|
||||||
$file = BASE . $page;
|
$file = BASE . $page;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@@ -7,19 +7,13 @@
|
|||||||
* @copyright 2020 MyAAC
|
* @copyright 2020 MyAAC
|
||||||
* @link https://my-aac.org
|
* @link https://my-aac.org
|
||||||
*/
|
*/
|
||||||
|
|
||||||
use MyAAC\Models\Player;
|
|
||||||
|
|
||||||
defined('MYAAC') or die('Direct access not allowed!');
|
defined('MYAAC') or die('Direct access not allowed!');
|
||||||
|
|
||||||
$title = 'Account editor';
|
$title = 'Account editor';
|
||||||
|
|
||||||
csrfProtect();
|
|
||||||
|
|
||||||
$admin_base = ADMIN_URL . '?p=accounts';
|
$admin_base = ADMIN_URL . '?p=accounts';
|
||||||
$use_datatable = true;
|
$use_datatable = true;
|
||||||
|
|
||||||
if (setting('core.account_country'))
|
if ($config['account_country'])
|
||||||
require SYSTEM . 'countries.conf.php';
|
require SYSTEM . 'countries.conf.php';
|
||||||
|
|
||||||
$nameOrNumberColumn = 'name';
|
$nameOrNumberColumn = 'name';
|
||||||
@@ -33,7 +27,7 @@ $hasPointsColumn = $db->hasColumn('accounts', 'premium_points');
|
|||||||
$hasTypeColumn = $db->hasColumn('accounts', 'type');
|
$hasTypeColumn = $db->hasColumn('accounts', 'type');
|
||||||
$hasGroupColumn = $db->hasColumn('accounts', 'group_id');
|
$hasGroupColumn = $db->hasColumn('accounts', 'group_id');
|
||||||
|
|
||||||
if (setting('core.account_country')) {
|
if ($config['account_country']) {
|
||||||
$countries = array();
|
$countries = array();
|
||||||
foreach (array('pl', 'se', 'br', 'us', 'gb') as $c)
|
foreach (array('pl', 'se', 'br', 'us', 'gb') as $c)
|
||||||
$countries[$c] = $config['countries'][$c];
|
$countries[$c] = $config['countries'][$c];
|
||||||
@@ -43,7 +37,7 @@ if (setting('core.account_country')) {
|
|||||||
$countries[$code] = $c;
|
$countries[$code] = $c;
|
||||||
}
|
}
|
||||||
$web_acc = ACCOUNT_WEB_FLAGS;
|
$web_acc = ACCOUNT_WEB_FLAGS;
|
||||||
$acc_type = setting('core.account_types');
|
$acc_type = config('account_types');
|
||||||
?>
|
?>
|
||||||
|
|
||||||
<link rel="stylesheet" type="text/css" href="<?php echo BASE_URL; ?>tools/css/jquery.datetimepicker.css"/ >
|
<link rel="stylesheet" type="text/css" href="<?php echo BASE_URL; ?>tools/css/jquery.datetimepicker.css"/ >
|
||||||
@@ -85,7 +79,7 @@ else if (isset($_REQUEST['search'])) {
|
|||||||
$account = new OTS_Account();
|
$account = new OTS_Account();
|
||||||
$account->load($id);
|
$account->load($id);
|
||||||
|
|
||||||
if (isset($_POST['save']) && $account->isLoaded()) {
|
if (isset($account, $_POST['save']) && $account->isLoaded()) {
|
||||||
$error = false;
|
$error = false;
|
||||||
|
|
||||||
$_error = '';
|
$_error = '';
|
||||||
@@ -269,9 +263,6 @@ else if (isset($_REQUEST['search'])) {
|
|||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link active" id="accounts-acc-tab" data-toggle="pill" href="#accounts-acc">Account</a>
|
<a class="nav-link active" id="accounts-acc-tab" data-toggle="pill" href="#accounts-acc">Account</a>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
|
||||||
<a class="nav-link" id="accounts-logs-tab" data-toggle="pill" href="#accounts-logs">Logs</a>
|
|
||||||
</li>
|
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link" id="accounts-chars-tab" data-toggle="pill" href="#accounts-chars">Characters</a>
|
<a class="nav-link" id="accounts-chars-tab" data-toggle="pill" href="#accounts-chars">Characters</a>
|
||||||
</li>
|
</li>
|
||||||
@@ -291,8 +282,7 @@ else if (isset($_REQUEST['search'])) {
|
|||||||
<div class="card-body">
|
<div class="card-body">
|
||||||
<div class="tab-content" id="accounts-tabContent">
|
<div class="tab-content" id="accounts-tabContent">
|
||||||
<div class="tab-pane fade active show" id="accounts-acc">
|
<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">
|
<div class="form-group row">
|
||||||
<?php if (USE_ACCOUNT_NAME): ?>
|
<?php if (USE_ACCOUNT_NAME): ?>
|
||||||
<div class="col-12 col-sm-12 col-lg-4">
|
<div class="col-12 col-sm-12 col-lg-4">
|
||||||
@@ -331,8 +321,8 @@ else if (isset($_REQUEST['search'])) {
|
|||||||
<div class="col-12 col-sm-12 col-lg-6">
|
<div class="col-12 col-sm-12 col-lg-6">
|
||||||
<label for="group">Account Type:</label>
|
<label for="group">Account Type:</label>
|
||||||
<select name="group" id="group" class="form-control">
|
<select name="group" id="group" class="form-control">
|
||||||
<?php foreach ($acc_type as $_id => $a_type): ?>
|
<?php foreach ($acc_type as $id => $a_type): ?>
|
||||||
<option value="<?php echo($_id); ?>" <?php echo($acc_group == ($_id) ? 'selected' : ''); ?>><?php echo $a_type; ?></option>
|
<option value="<?php echo($id); ?>" <?php echo($acc_group == ($id) ? 'selected' : ''); ?>><?php echo $a_type; ?></option>
|
||||||
<?php endforeach; ?>
|
<?php endforeach; ?>
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
@@ -342,8 +332,8 @@ else if (isset($_REQUEST['search'])) {
|
|||||||
<div class="col-12 col-sm-12 col-lg-6">
|
<div class="col-12 col-sm-12 col-lg-6">
|
||||||
<label for="group">Account Type:</label>
|
<label for="group">Account Type:</label>
|
||||||
<select name="group" id="group" class="form-control">
|
<select name="group" id="group" class="form-control">
|
||||||
<?php foreach ($groups->getGroups() as $_id => $group): ?>
|
<?php foreach ($groups->getGroups() as $id => $group): ?>
|
||||||
<option value="<?php echo $_id; ?>" <?php echo($acc_group == $_id ? 'selected' : ''); ?>><?php echo $group->getName(); ?></option>
|
<option value="<?php echo $id; ?>" <?php echo($acc_group == $id ? 'selected' : ''); ?>><?php echo $group->getName(); ?></option>
|
||||||
<?php endforeach; ?>
|
<?php endforeach; ?>
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
@@ -351,8 +341,8 @@ else if (isset($_REQUEST['search'])) {
|
|||||||
<div class="col-12 col-sm-12 col-lg-6">
|
<div class="col-12 col-sm-12 col-lg-6">
|
||||||
<label for="web_flags">Website Access:</label>
|
<label for="web_flags">Website Access:</label>
|
||||||
<select name="web_flags" id="web_flags" class="form-control">
|
<select name="web_flags" id="web_flags" class="form-control">
|
||||||
<?php foreach ($web_acc as $_id => $a_type): ?>
|
<?php foreach ($web_acc as $id => $a_type): ?>
|
||||||
<option value="<?php echo($_id); ?>" <?php echo($account->getWebFlags() == ($_id) ? 'selected' : ''); ?>><?php echo $a_type; ?></option>
|
<option value="<?php echo($id); ?>" <?php echo($account->getWebFlags() == ($id) ? 'selected' : ''); ?>><?php echo $a_type; ?></option>
|
||||||
<?php endforeach; ?>
|
<?php endforeach; ?>
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
@@ -371,7 +361,7 @@ else if (isset($_REQUEST['search'])) {
|
|||||||
</div>
|
</div>
|
||||||
<div class="form-group row">
|
<div class="form-group row">
|
||||||
<div class="col-12 col-sm-12 col-lg-6">
|
<div class="col-12 col-sm-12 col-lg-6">
|
||||||
<label for="email">Email:</label><?php echo (setting('core.mail_enabled') ? ' (<a href="' . ADMIN_URL . '?p=mailer&mail_to=' . $account->getEMail() . '">Send Mail</a>)' : ''); ?>
|
<label for="email">Email:</label><?php echo (config('mail_enabled') ? ' (<a href="' . ADMIN_URL . '?p=mailer&mail_to=' . $account->getEMail() . '">Send Mail</a>)' : ''); ?>
|
||||||
<input type="text" class="form-control" id="email" name="email" autocomplete="off" value="<?php echo $account->getEMail(); ?>"/>
|
<input type="text" class="form-control" id="email" name="email" autocomplete="off" value="<?php echo $account->getEMail(); ?>"/>
|
||||||
</div>
|
</div>
|
||||||
<?php if ($hasCoinsColumn): ?>
|
<?php if ($hasCoinsColumn): ?>
|
||||||
@@ -404,16 +394,14 @@ else if (isset($_REQUEST['search'])) {
|
|||||||
autocomplete="off" maxlength="20"
|
autocomplete="off" maxlength="20"
|
||||||
value="<?php echo $account->getLocation(); ?>"/>
|
value="<?php echo $account->getLocation(); ?>"/>
|
||||||
</div>
|
</div>
|
||||||
<?php if(setting('core.account_country')): ?>
|
|
||||||
<div class="col-12 col-sm-12 col-lg-4">
|
<div class="col-12 col-sm-12 col-lg-4">
|
||||||
<label for="rl_country">Country:</label>
|
<label for="rl_country">Country:</label>
|
||||||
<select name="rl_country" id="rl_country" class="form-control">
|
<select name="rl_country" id="rl_country" class="form-control">
|
||||||
<?php foreach ($countries as $_id => $a_type): ?>
|
<?php foreach ($countries as $id => $a_type): ?>
|
||||||
<option value="<?php echo($_id); ?>" <?php echo($account->getCountry() == ($_id) ? 'selected' : ''); ?>><?php echo $a_type; ?></option>
|
<option value="<?php echo($id); ?>" <?php echo($account->getCountry() == ($id) ? 'selected' : ''); ?>><?php echo $a_type; ?></option>
|
||||||
<?php endforeach; ?>
|
<?php endforeach; ?>
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
<?php endif; ?>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group row">
|
<div class="form-group row">
|
||||||
<div class="col-12 col-sm-12 col-lg-6">
|
<div class="col-12 col-sm-12 col-lg-6">
|
||||||
@@ -432,39 +420,12 @@ else if (isset($_REQUEST['search'])) {
|
|||||||
<a href="<?php echo ADMIN_URL; ?>?p=accounts" class="btn btn-danger float-right"><i class="fas fa-cancel"></i> Cancel</a>
|
<a href="<?php echo ADMIN_URL; ?>?p=accounts" class="btn btn-danger float-right"><i class="fas fa-cancel"></i> Cancel</a>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
<div class="tab-pane fade" id="accounts-logs">
|
|
||||||
<div class="row">
|
|
||||||
<table class="table table-striped table-condensed table-responsive d-md-table">
|
|
||||||
<thead>
|
|
||||||
<tr>
|
|
||||||
<th>#</th>
|
|
||||||
<th>Date</th>
|
|
||||||
<th>Action</th>
|
|
||||||
<th>IP</th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody>
|
|
||||||
<?php
|
|
||||||
$accountActions = \MyAAC\Models\AccountAction::where('account_id', $account->getId())->orderByDesc('date')->get();
|
|
||||||
foreach ($accountActions as $i => $log):
|
|
||||||
$log->ip = ($log->ip != 0 ? long2ip($log->ip) : inet_ntop($log->ipv6));
|
|
||||||
?>
|
|
||||||
<tr>
|
|
||||||
<td><?php echo $i + 1; ?></td>
|
|
||||||
<td><?= date("M d Y, H:i:s", $log->date); ?></td>
|
|
||||||
<td><?= $log->action; ?></td>
|
|
||||||
<td><?= $log->ip; ?></td>
|
|
||||||
</tr>
|
|
||||||
<?php endforeach; ?>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="tab-pane fade" id="accounts-chars">
|
<div class="tab-pane fade" id="accounts-chars">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<?php
|
<?php
|
||||||
if (isset($account) && $account->isLoaded()) {
|
if (isset($account) && $account->isLoaded()) {
|
||||||
$account_players = Player::where('account_id', $account->getId())->orderBy('id')->get();
|
$account_players = $account->getPlayersList();
|
||||||
|
$account_players->orderBy('id');
|
||||||
if (isset($account_players)) { ?>
|
if (isset($account_players)) { ?>
|
||||||
<table class="table table-striped table-condensed table-responsive d-md-table">
|
<table class="table table-striped table-condensed table-responsive d-md-table">
|
||||||
<thead>
|
<thead>
|
||||||
@@ -477,13 +438,25 @@ else if (isset($_REQUEST['search'])) {
|
|||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
<?php foreach ($account_players as $i => $player): ?>
|
<?php $i= 0;
|
||||||
|
foreach ($account_players as $i => $player):
|
||||||
|
$i++;
|
||||||
|
$player_vocation = $player->getVocation();
|
||||||
|
$player_promotion = $player->getPromotion();
|
||||||
|
if (isset($player_promotion)) {
|
||||||
|
if ((int)$player_promotion > 0)
|
||||||
|
$player_vocation += ($player_promotion * $config['vocations_amount']);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isset($config['vocations'][$player_vocation])) {
|
||||||
|
$vocation_name = $config['vocations'][$player_vocation];
|
||||||
|
} ?>
|
||||||
<tr>
|
<tr>
|
||||||
<th><?php echo $i + 1; ?></th>
|
<th><?php echo $i; ?></th>
|
||||||
<td><?php echo $player->name; ?></td>
|
<td><?php echo $player->getName(); ?></td>
|
||||||
<td><?php echo $player->level; ?></td>
|
<td><?php echo $player->getLevel(); ?></td>
|
||||||
<td><?php echo $player->vocation_name; ?></td>
|
<td><?php echo $vocation_name; ?></td>
|
||||||
<td><a href="?p=players&id=<?php echo $player->getKey() ?>" class=" btn btn-success btn-sm" title="Edit"><i class="fas fa-pencil-alt"></i></a></td>
|
<td><a href="?p=players&id=<?php echo $player->getId() ?>" class=" btn btn-success btn-sm" title="Edit"><i class="fas fa-pencil-alt"></i></a></td>
|
||||||
</tr>
|
</tr>
|
||||||
<?php endforeach ?>
|
<?php endforeach ?>
|
||||||
</tbody>
|
</tbody>
|
||||||
@@ -587,20 +560,18 @@ else if (isset($_REQUEST['search'])) {
|
|||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-6 col-lg-12">
|
<div class="col-6 col-lg-12">
|
||||||
<form action="<?php echo $admin_base; ?>" method="post">
|
<form action="<?php echo $admin_base; ?>" method="post">
|
||||||
<?php csrf(); ?>
|
<label for="name">Account Name:</label>
|
||||||
<label for="search">Account Name:</label>
|
|
||||||
<div class="input-group input-group-sm">
|
<div class="input-group input-group-sm">
|
||||||
<input type="text" class="form-control" id="search" name="search" value="<?= escapeHtml($search_account); ?>" maxlength="32" size="32">
|
<input type="text" class="form-control" name="search" value="<?php echo $search_account; ?>" maxlength="32" size="32">
|
||||||
<span class="input-group-append"><button type="submit" class="btn btn-info btn-flat">Search</button></span>
|
<span class="input-group-append"><button type="submit" class="btn btn-info btn-flat">Search</button></span>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-6 col-lg-12">
|
<div class="col-6 col-lg-12">
|
||||||
<form action="<?php echo $admin_base; ?>" method="post">
|
<form action="<?php echo $admin_base; ?>" method="post">
|
||||||
<?php csrf(); ?>
|
<label for="name">Account ID:</label>
|
||||||
<label for="id">Account ID:</label>
|
|
||||||
<div class="input-group input-group-sm">
|
<div class="input-group input-group-sm">
|
||||||
<input type="text" class="form-control" id="id" name="id" value="<?= $id; ?>" maxlength="32" size="32">
|
<input type="text" class="form-control" name="id" value="" maxlength="32" size="32">
|
||||||
<span class="input-group-append"><button type="submit" class="btn btn-info btn-flat">Search</button></span>
|
<span class="input-group-append"><button type="submit" class="btn btn-info btn-flat">Search</button></span>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
|
@@ -8,34 +8,32 @@
|
|||||||
* @copyright 2020 MyAAC
|
* @copyright 2020 MyAAC
|
||||||
* @link https://my-aac.org
|
* @link https://my-aac.org
|
||||||
*/
|
*/
|
||||||
|
|
||||||
use MyAAC\Changelog;
|
|
||||||
use MyAAC\Models\Changelog as ModelsChangelog;
|
|
||||||
|
|
||||||
defined('MYAAC') or die('Direct access not allowed!');
|
defined('MYAAC') or die('Direct access not allowed!');
|
||||||
|
|
||||||
$title = 'Changelog';
|
|
||||||
|
|
||||||
csrfProtect();
|
|
||||||
|
|
||||||
if (!hasFlag(FLAG_CONTENT_PAGES) && !superAdmin()) {
|
if (!hasFlag(FLAG_CONTENT_PAGES) && !superAdmin()) {
|
||||||
echo 'Access denied.';
|
echo 'Access denied.';
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$title = 'Changelog';
|
||||||
$use_datatable = true;
|
$use_datatable = true;
|
||||||
const CL_LIMIT = 600; // maximum changelog body length
|
const CL_LIMIT = 600; // maximum changelog body length
|
||||||
|
?>
|
||||||
|
|
||||||
|
<link rel="stylesheet" type="text/css" href="<?php echo BASE_URL; ?>tools/css/jquery.datetimepicker.css"/ >
|
||||||
|
<script src="<?php echo BASE_URL; ?>tools/js/jquery.datetimepicker.js"></script>
|
||||||
|
<?php
|
||||||
$id = $_GET['id'] ?? 0;
|
$id = $_GET['id'] ?? 0;
|
||||||
|
require_once LIBS . 'changelog.php';
|
||||||
|
|
||||||
if(!empty($action) && isRequestMethod('post'))
|
if(!empty($action))
|
||||||
{
|
{
|
||||||
$id = $_POST['id'] ?? null;
|
$id = $_REQUEST['id'] ?? null;
|
||||||
$body = isset($_POST['body']) ? stripslashes($_POST['body']) : null;
|
$body = isset($_REQUEST['body']) ? stripslashes($_REQUEST['body']) : null;
|
||||||
$create_date = isset($_POST['createdate']) ? (int)strtotime($_POST['createdate'] ): null;
|
$create_date = isset($_REQUEST['createdate']) ? (int)strtotime($_REQUEST['createdate'] ): null;
|
||||||
$player_id = isset($_POST['player_id']) ? (int)$_POST['player_id'] : null;
|
$player_id = isset($_REQUEST['player_id']) ? (int)$_REQUEST['player_id'] : null;
|
||||||
$type = isset($_POST['type']) ? (int)$_POST['type'] : null;
|
$type = isset($_REQUEST['type']) ? (int)$_REQUEST['type'] : null;
|
||||||
$where = isset($_POST['where']) ? (int)$_POST['where'] : null;
|
$where = isset($_REQUEST['where']) ? (int)$_REQUEST['where'] : null;
|
||||||
|
|
||||||
$errors = array();
|
$errors = array();
|
||||||
|
|
||||||
@@ -45,13 +43,12 @@ if(!empty($action) && isRequestMethod('post'))
|
|||||||
$body = '';
|
$body = '';
|
||||||
$type = $where = $player_id = $create_date = 0;
|
$type = $where = $player_id = $create_date = 0;
|
||||||
|
|
||||||
success('Added successful.');
|
success("Added successful.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if($action == 'delete') {
|
else if($action == 'delete') {
|
||||||
if (Changelog::delete($id, $errors)) {
|
Changelog::delete($id, $errors);
|
||||||
success('Deleted successful.');
|
success("Deleted successful.");
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else if($action == 'edit')
|
else if($action == 'edit')
|
||||||
{
|
{
|
||||||
@@ -68,21 +65,20 @@ if(!empty($action) && isRequestMethod('post'))
|
|||||||
$action = $body = '';
|
$action = $body = '';
|
||||||
$type = $where = $player_id = $create_date = 0;
|
$type = $where = $player_id = $create_date = 0;
|
||||||
|
|
||||||
success('Updated successful.');
|
success("Updated successful.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if($action == 'hide') {
|
else if($action == 'hide') {
|
||||||
if (Changelog::toggleHide($id, $errors, $status)) {
|
Changelog::toggleHidden($id, $errors, $status);
|
||||||
success(($status == 1 ? 'Hide' : 'Show') . ' successful.');
|
success(($status == 1 ? 'Show' : 'Hide') . " successful.");
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!empty($errors))
|
if(!empty($errors))
|
||||||
error(implode(", ", $errors));
|
error(implode(", ", $errors));
|
||||||
}
|
}
|
||||||
|
|
||||||
$changelogs = ModelsChangelog::orderBy('id')->get()->toArray();
|
$changelogs = $db->query('SELECT * FROM `' . TABLE_PREFIX . 'changelog' . '` ORDER BY `id` DESC')->fetchAll();
|
||||||
|
|
||||||
$i = 0;
|
$i = 0;
|
||||||
|
|
||||||
@@ -114,7 +110,7 @@ if($action == 'edit' || $action == 'new') {
|
|||||||
$account_players->orderBy('group_id', POT::ORDER_DESC);
|
$account_players->orderBy('group_id', POT::ORDER_DESC);
|
||||||
$twig->display('admin.changelog.form.html.twig', array(
|
$twig->display('admin.changelog.form.html.twig', array(
|
||||||
'action' => $action,
|
'action' => $action,
|
||||||
'cl_link_form' => constant('ADMIN_URL').'?p=changelog',
|
'cl_link_form' => constant('ADMIN_URL').'?p=changelog&action=' . ($action == 'edit' ? 'edit' : 'new'),
|
||||||
'cl_id' => $id ?? null,
|
'cl_id' => $id ?? null,
|
||||||
'body' => isset($body) ? escapeHtml($body) : '',
|
'body' => isset($body) ? escapeHtml($body) : '',
|
||||||
'create_date' => $create_date ?? '',
|
'create_date' => $create_date ?? '',
|
||||||
@@ -129,3 +125,15 @@ if($action == 'edit' || $action == 'new') {
|
|||||||
$twig->display('admin.changelog.html.twig', array(
|
$twig->display('admin.changelog.html.twig', array(
|
||||||
'changelogs' => $changelogs,
|
'changelogs' => $changelogs,
|
||||||
));
|
));
|
||||||
|
|
||||||
|
?>
|
||||||
|
<script>
|
||||||
|
$(document).ready(function () {
|
||||||
|
$('#createdate').datetimepicker({format: "M d Y, H:i:s",});
|
||||||
|
|
||||||
|
$('.tb_datatable').DataTable({
|
||||||
|
"order": [[0, "desc"]],
|
||||||
|
"columnDefs": [{targets: [1, 2,4,5],orderable: false}]
|
||||||
|
});
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
@@ -10,9 +10,7 @@
|
|||||||
defined('MYAAC') or die('Direct access not allowed!');
|
defined('MYAAC') or die('Direct access not allowed!');
|
||||||
$title = 'Dashboard';
|
$title = 'Dashboard';
|
||||||
|
|
||||||
csrfProtect();
|
if (isset($_GET['clear_cache'])) {
|
||||||
|
|
||||||
if (isset($_POST['clear_cache'])) {
|
|
||||||
if (clearCache()) {
|
if (clearCache()) {
|
||||||
success('Cache cleared.');
|
success('Cache cleared.');
|
||||||
} else {
|
} else {
|
||||||
@@ -20,7 +18,7 @@ if (isset($_POST['clear_cache'])) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isset($_POST['maintenance'])) {
|
if (isset($_GET['maintenance'])) {
|
||||||
$message = (!empty($_POST['message']) ? $_POST['message'] : null);
|
$message = (!empty($_POST['message']) ? $_POST['message'] : null);
|
||||||
$_status = (isset($_POST['status']) && $_POST['status'] == 'true');
|
$_status = (isset($_POST['status']) && $_POST['status'] == 'true');
|
||||||
$_status = ($_status ? '0' : '1');
|
$_status = ($_status ? '0' : '1');
|
||||||
@@ -49,11 +47,12 @@ $tmp = '';
|
|||||||
if (fetchDatabaseConfig('site_closed_message', $tmp))
|
if (fetchDatabaseConfig('site_closed_message', $tmp))
|
||||||
$closed_message = $tmp;
|
$closed_message = $tmp;
|
||||||
|
|
||||||
$settingAdminPanelModules = setting('core.admin_panel_modules');
|
$configAdminPanelModules = config('admin_panel_modules');
|
||||||
if (count($settingAdminPanelModules) > 0) {
|
if (isset($configAdminPanelModules)) {
|
||||||
echo '<div class="row">';
|
echo '<div class="row">';
|
||||||
|
$configAdminPanelModules = explode(',', $configAdminPanelModules);
|
||||||
$twig_loader->prependPath(__DIR__ . '/modules/templates');
|
$twig_loader->prependPath(__DIR__ . '/modules/templates');
|
||||||
foreach ($settingAdminPanelModules as $box) {
|
foreach ($configAdminPanelModules as $box) {
|
||||||
$file = __DIR__ . '/modules/' . $box . '.php';
|
$file = __DIR__ . '/modules/' . $box . '.php';
|
||||||
if (file_exists($file)) {
|
if (file_exists($file)) {
|
||||||
include($file);
|
include($file);
|
||||||
|
@@ -10,8 +10,6 @@
|
|||||||
defined('MYAAC') or die('Direct access not allowed!');
|
defined('MYAAC') or die('Direct access not allowed!');
|
||||||
$title = 'Login';
|
$title = 'Login';
|
||||||
|
|
||||||
csrfProtect();
|
|
||||||
|
|
||||||
require PAGES . 'account/login.php';
|
require PAGES . 'account/login.php';
|
||||||
if ($logged) {
|
if ($logged) {
|
||||||
header('Location: ' . (admin() ? ADMIN_URL : BASE_URL));
|
header('Location: ' . (admin() ? ADMIN_URL : BASE_URL));
|
||||||
|
@@ -10,19 +10,17 @@
|
|||||||
defined('MYAAC') or die('Direct access not allowed!');
|
defined('MYAAC') or die('Direct access not allowed!');
|
||||||
$title = 'Mailer';
|
$title = 'Mailer';
|
||||||
|
|
||||||
csrfProtect();
|
|
||||||
|
|
||||||
if (!hasFlag(FLAG_CONTENT_MAILER) && !superAdmin()) {
|
if (!hasFlag(FLAG_CONTENT_MAILER) && !superAdmin()) {
|
||||||
echo 'Access denied.';
|
echo 'Access denied.';
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!setting('core.mail_enabled')) {
|
if (!config('mail_enabled')) {
|
||||||
echo 'Mail support disabled in config.';
|
echo 'Mail support disabled in config.';
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
$mail_to = isset($_POST['mail_to']) ? stripslashes(trim($_POST['mail_to'])) : null;
|
$mail_to = isset($_REQUEST['mail_to']) ? stripslashes(trim($_REQUEST['mail_to'])) : null;
|
||||||
$mail_subject = isset($_POST['mail_subject']) ? stripslashes($_POST['mail_subject']) : null;
|
$mail_subject = isset($_POST['mail_subject']) ? stripslashes($_POST['mail_subject']) : null;
|
||||||
$mail_content = isset($_POST['mail_content']) ? stripslashes($_POST['mail_content']) : null;
|
$mail_content = isset($_POST['mail_content']) ? stripslashes($_POST['mail_content']) : null;
|
||||||
|
|
||||||
@@ -56,7 +54,7 @@ if (!empty($mail_content) && !empty($mail_subject) && empty($mail_to)) {
|
|||||||
$failed = 0;
|
$failed = 0;
|
||||||
|
|
||||||
$add = '';
|
$add = '';
|
||||||
if (setting('core.account_mail_verify')) {
|
if (config('account_mail_verify')) {
|
||||||
note('Note: Sending only to users with verified E-Mail.');
|
note('Note: Sending only to users with verified E-Mail.');
|
||||||
$add = ' AND `email_verified` = 1';
|
$add = ' AND `email_verified` = 1';
|
||||||
}
|
}
|
||||||
|
@@ -9,15 +9,10 @@
|
|||||||
* @copyright 2020 MyAAC
|
* @copyright 2020 MyAAC
|
||||||
* @link https://my-aac.org
|
* @link https://my-aac.org
|
||||||
*/
|
*/
|
||||||
|
|
||||||
use MyAAC\Models\Account;
|
|
||||||
|
|
||||||
defined('MYAAC') or die('Direct access not allowed!');
|
defined('MYAAC') or die('Direct access not allowed!');
|
||||||
|
|
||||||
$title = 'Mass Account Actions';
|
$title = 'Mass Account Actions';
|
||||||
|
|
||||||
csrfProtect();
|
|
||||||
|
|
||||||
$hasCoinsColumn = $db->hasColumn('accounts', 'coins');
|
$hasCoinsColumn = $db->hasColumn('accounts', 'coins');
|
||||||
$hasPointsColumn = $db->hasColumn('accounts', 'premium_points');
|
$hasPointsColumn = $db->hasColumn('accounts', 'premium_points');
|
||||||
$freePremium = $config['lua']['freePremium'];
|
$freePremium = $config['lua']['freePremium'];
|
||||||
@@ -31,14 +26,15 @@ function admin_give_points($points)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
$statement = $db->prepare('UPDATE `accounts` SET `premium_points` = `premium_points` + :points');
|
$statement = $db->prepare('UPDATE `accounts` SET `premium_points` = `premium_points` + :points');
|
||||||
if (!$statement) {
|
if (!$statement) {
|
||||||
displayMessage('Failed to prepare query statement.');
|
displayMessage('Failed to prepare query statement.');
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!Account::query()->increment('premium_points', $points)) {
|
if (!$statement->execute([
|
||||||
|
'points' => $points
|
||||||
|
])) {
|
||||||
displayMessage('Failed to add points.');
|
displayMessage('Failed to add points.');
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -54,7 +50,15 @@ function admin_give_coins($coins)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!Account::query()->increment('coins', $coins)) {
|
$statement = $db->prepare('UPDATE `accounts` SET `coins` = `coins` + :coins');
|
||||||
|
if (!$statement) {
|
||||||
|
displayMessage('Failed to prepare query statement.');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!$statement->execute([
|
||||||
|
'coins' => $coins
|
||||||
|
])) {
|
||||||
displayMessage('Failed to add coins.');
|
displayMessage('Failed to add coins.');
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -162,9 +166,9 @@ function admin_give_premdays($days)
|
|||||||
displayMessage('Premium Days not supported.');
|
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)) {
|
if (preg_match("/[^A-z0-9_\-]/", $action)) {
|
||||||
displayMessage('Invalid action.');
|
displayMessage('Invalid action.');
|
||||||
|
@@ -8,21 +8,22 @@
|
|||||||
* @copyright 2020 MyAAC
|
* @copyright 2020 MyAAC
|
||||||
* @link https://my-aac.org
|
* @link https://my-aac.org
|
||||||
*/
|
*/
|
||||||
|
|
||||||
use MyAAC\Models\Player;
|
|
||||||
use MyAAC\Models\PlayerOnline;
|
|
||||||
|
|
||||||
defined('MYAAC') or die('Direct access not allowed!');
|
defined('MYAAC') or die('Direct access not allowed!');
|
||||||
|
|
||||||
$title = 'Mass Teleport Actions';
|
$title = 'Mass Teleport Actions';
|
||||||
|
|
||||||
csrfProtect();
|
|
||||||
|
|
||||||
function admin_teleport_position($x, $y, $z) {
|
function admin_teleport_position($x, $y, $z) {
|
||||||
if (!Player::query()->update([
|
global $db;
|
||||||
'posx' => $x, 'posy' => $y, 'posz' => $z
|
$statement = $db->prepare('UPDATE `players` SET `posx` = :x, `posy` = :y, `posz` = :z');
|
||||||
|
if (!$statement) {
|
||||||
|
displayMessage('Failed to prepare query statement.');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!$statement->execute([
|
||||||
|
'x' => $x, 'y' => $y, 'z' => $z
|
||||||
])) {
|
])) {
|
||||||
displayMessage('Failed to execute query. Probably already updated.');
|
displayMessage('Failed to execute query.');
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -30,19 +31,26 @@ function admin_teleport_position($x, $y, $z) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function admin_teleport_town($town_id) {
|
function admin_teleport_town($town_id) {
|
||||||
if (!Player::query()->update([
|
global $db;
|
||||||
'town_id' => $town_id,
|
$statement = $db->prepare('UPDATE `players` SET `town_id` = :town_id');
|
||||||
|
if (!$statement) {
|
||||||
|
displayMessage('Failed to prepare query statement.');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!$statement->execute([
|
||||||
|
'town_id' => $town_id
|
||||||
])) {
|
])) {
|
||||||
displayMessage('Failed to execute query. Probably already updated.');
|
displayMessage('Failed to execute query.');
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
displayMessage('Player\'s town updated.', true);
|
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)) {
|
if (preg_match("/[^A-z0-9_\-]/", $action)) {
|
||||||
displayMessage('Invalid action.');
|
displayMessage('Invalid action.');
|
||||||
@@ -50,12 +58,13 @@ if (!empty(ACTION) && isRequestMethod('post')) {
|
|||||||
|
|
||||||
$playersOnline = 0;
|
$playersOnline = 0;
|
||||||
if($db->hasTable('players_online')) {// tfs 1.0
|
if($db->hasTable('players_online')) {// tfs 1.0
|
||||||
$playersOnline = PlayerOnline::count();
|
$query = $db->query('SELECT count(*) AS `count` FROM `players_online`');
|
||||||
} else {
|
} else {
|
||||||
$playersOnline = Player::online()->count();
|
$query = $db->query('SELECT count(*) AS `count` FROM `players` WHERE `players`.`online` > 0');
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($playersOnline > 0) {
|
$playersOnline = $query->fetch(PDO::FETCH_ASSOC);
|
||||||
|
if ($playersOnline['count'] > 0) {
|
||||||
displayMessage('Please, close the server before execute this action otherwise players will not be affected.');
|
displayMessage('Please, close the server before execute this action otherwise players will not be affected.');
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@@ -7,49 +7,35 @@
|
|||||||
* @copyright 2019 MyAAC
|
* @copyright 2019 MyAAC
|
||||||
* @link https://my-aac.org
|
* @link https://my-aac.org
|
||||||
*/
|
*/
|
||||||
|
|
||||||
use MyAAC\Cache\Cache;
|
|
||||||
use MyAAC\Models\Menu;
|
|
||||||
|
|
||||||
defined('MYAAC') or die('Direct access not allowed!');
|
defined('MYAAC') or die('Direct access not allowed!');
|
||||||
$title = 'Menus';
|
$title = 'Menus';
|
||||||
|
|
||||||
csrfProtect();
|
|
||||||
|
|
||||||
if (!hasFlag(FLAG_CONTENT_MENUS) && !superAdmin()) {
|
if (!hasFlag(FLAG_CONTENT_MENUS) && !superAdmin()) {
|
||||||
echo 'Access denied.';
|
echo 'Access denied.';
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isset($_POST['template'])) {
|
if (isset($_REQUEST['template'])) {
|
||||||
$template = $_POST['template'];
|
$template = $_REQUEST['template'];
|
||||||
|
|
||||||
if (isset($_POST['menu'])) {
|
if (isset($_REQUEST['menu'])) {
|
||||||
$post_menu = $_POST['menu'];
|
$post_menu = $_REQUEST['menu'];
|
||||||
$post_menu_link = $_POST['menu_link'];
|
$post_menu_link = $_REQUEST['menu_link'];
|
||||||
$post_menu_blank = $_POST['menu_blank'];
|
$post_menu_blank = $_REQUEST['menu_blank'];
|
||||||
$post_menu_color = $_POST['menu_color'];
|
$post_menu_color = $_REQUEST['menu_color'];
|
||||||
if (count($post_menu) != count($post_menu_link)) {
|
if (count($post_menu) != count($post_menu_link)) {
|
||||||
echo 'Menu count is not equal menu links. Something went wrong when sending form.';
|
echo 'Menu count is not equal menu links. Something went wrong when sending form.';
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Menu::where('template', $template)->delete();
|
$db->query('DELETE FROM `' . TABLE_PREFIX . 'menu` WHERE `template` = ' . $db->quote($template));
|
||||||
foreach ($post_menu as $category => $menus) {
|
foreach ($post_menu as $category => $menus) {
|
||||||
foreach ($menus as $i => $menu) {
|
foreach ($menus as $i => $menu) {
|
||||||
if (empty($menu)) // don't save empty menu item
|
if (empty($menu)) // don't save empty menu item
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
Menu::create([
|
$db->insert(TABLE_PREFIX . 'menu', array('template' => $template, 'name' => $menu, 'link' => $post_menu_link[$category][$i], 'blank' => $post_menu_blank[$category][$i] == 'on' ? 1 : 0, 'color' => str_replace('#', '', $post_menu_color[$category][$i]), 'category' => $category, 'ordering' => $i));
|
||||||
'template' => $template,
|
|
||||||
'name' => $menu,
|
|
||||||
'link' => $post_menu_link[$category][$i],
|
|
||||||
'blank' => $post_menu_blank[$category][$i] == 'on' ? 1 : 0,
|
|
||||||
'color' => str_replace('#', '', $post_menu_color[$category][$i]),
|
|
||||||
'category' => $category,
|
|
||||||
'ordering' => $i
|
|
||||||
]);
|
|
||||||
} catch (PDOException $error) {
|
} catch (PDOException $error) {
|
||||||
warning('Error while adding menu item (' . $menu . '): ' . $error->getMessage());
|
warning('Error while adding menu item (' . $menu . '): ' . $error->getMessage());
|
||||||
}
|
}
|
||||||
@@ -72,16 +58,6 @@ if (isset($_POST['template'])) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isset($_GET['reset_colors'])) {
|
|
||||||
if (isset($config['menu_default_color'])) {
|
|
||||||
Menu::where('template', $template)->update(['color' => str_replace('#', '', $config['menu_default_color'])]);
|
|
||||||
success('Colors has been reset.');
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
warning('There is no default color defined, cannot reset colors.');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!isset($config['menu_categories'])) {
|
if (!isset($config['menu_categories'])) {
|
||||||
echo "No menu categories set in template config.php.<br/>This template doesn't support dynamic menus.";
|
echo "No menu categories set in template config.php.<br/>This template doesn't support dynamic menus.";
|
||||||
return;
|
return;
|
||||||
@@ -95,31 +71,17 @@ if (isset($_POST['template'])) {
|
|||||||
Hint: Add links to external sites using: <b>http://</b> or <b>https://</b> prefix.<br/>
|
Hint: Add links to external sites using: <b>http://</b> or <b>https://</b> prefix.<br/>
|
||||||
Not all templates support blank and colorful links.
|
Not all templates support blank and colorful links.
|
||||||
</p>
|
</p>
|
||||||
<?php if (isset($config['menu_default_color'])) {?>
|
|
||||||
<form method="post" action="?p=menus&reset_colors" onsubmit="return confirm('Do you really want to reset colors?');">
|
|
||||||
<?php csrf(); ?>
|
|
||||||
<input type="hidden" name="template" value="<?php echo $template ?>"/>
|
|
||||||
<button type="submit" class="btn btn-danger">Reset Colors to default</button>
|
|
||||||
</form>
|
|
||||||
<br/>
|
|
||||||
<?php } ?>
|
|
||||||
</div>
|
</div>
|
||||||
<?php
|
<?php
|
||||||
$menus = Menu::query()
|
$menus = array();
|
||||||
->select('name', 'link', 'blank', 'color', 'category', 'ordering')
|
$menus_db = $db->query('SELECT `name`, `link`, `blank`, `color`, `category`, `ordering` FROM `' . TABLE_PREFIX . 'menu` WHERE `enabled` = 1 AND `template` = ' . $db->quote($template) . ' ORDER BY `ordering` ASC;')->fetchAll();
|
||||||
->where('enabled', 1)
|
foreach ($menus_db as $menu) {
|
||||||
->where('template', $template)
|
$menus[$menu['category']][] = array('name' => $menu['name'], 'link' => $menu['link'], 'blank' => $menu['blank'], 'color' => $menu['color'], 'ordering' => $menu['ordering']);
|
||||||
->orderBy('ordering')
|
}
|
||||||
->get()
|
|
||||||
->groupBy('category')
|
|
||||||
->toArray();
|
|
||||||
|
|
||||||
$last_id = array();
|
$last_id = array();
|
||||||
?>
|
?>
|
||||||
<form method="post" id="menus-form" action="?p=menus">
|
<form method="post" id="menus-form" action="?p=menus">
|
||||||
<?php csrf(); ?>
|
|
||||||
<input type="hidden" name="template" value="<?php echo $template ?>"/>
|
<input type="hidden" name="template" value="<?php echo $template ?>"/>
|
||||||
<button type="submit" class="btn btn-info">Save</button><br/><br/>
|
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<?php foreach ($config['menu_categories'] as $id => $cat): ?>
|
<?php foreach ($config['menu_categories'] as $id => $cat): ?>
|
||||||
<div class="col-md-12 col-lg-6">
|
<div class="col-md-12 col-lg-6">
|
||||||
@@ -151,7 +113,7 @@ if (isset($_POST['template'])) {
|
|||||||
</div>
|
</div>
|
||||||
<div class="row pb-2">
|
<div class="row pb-2">
|
||||||
<div class="col-md-12">
|
<div class="col-md-12">
|
||||||
<button type="submit" class="btn btn-info">Save</button>
|
<button type="submit" class="btn btn-info"><i class="fas fa-update"></i> Save</button>
|
||||||
<?php
|
<?php
|
||||||
echo '<button type="button" class="btn btn-danger float-right" value="Cancel" onclick="window.location = \'' . ADMIN_URL . '?p=menus\';"><i class="fas fa-cancel"></i> Cancel</button>';
|
echo '<button type="button" class="btn btn-danger float-right" value="Cancel" onclick="window.location = \'' . ADMIN_URL . '?p=menus\';"><i class="fas fa-cancel"></i> Cancel</button>';
|
||||||
?>
|
?>
|
||||||
@@ -167,7 +129,7 @@ if (isset($_POST['template'])) {
|
|||||||
?>
|
?>
|
||||||
<?php
|
<?php
|
||||||
} else {
|
} else {
|
||||||
$templates = Menu::select('template')->distinct()->get()->toArray();
|
$templates = $db->query('SELECT `template` FROM `' . TABLE_PREFIX . 'menu` GROUP BY `template`;')->fetchAll();
|
||||||
foreach ($templates as $key => $value) {
|
foreach ($templates as $key => $value) {
|
||||||
$file = TEMPLATES . $value['template'] . '/config.php';
|
$file = TEMPLATES . $value['template'] . '/config.php';
|
||||||
if (!file_exists($file)) {
|
if (!file_exists($file)) {
|
||||||
|
@@ -1,14 +1,7 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
use MyAAC\Models\Player;
|
|
||||||
|
|
||||||
defined('MYAAC') or die('Direct access not allowed!');
|
defined('MYAAC') or die('Direct access not allowed!');
|
||||||
|
|
||||||
$balance = 0;
|
$balance = ($db->hasColumn('players', 'balance') ? $db->query('SELECT `balance`, `id`, `name`,`level` FROM `players` ORDER BY `balance` DESC LIMIT 10;') : 0);
|
||||||
|
|
||||||
if ($db->hasColumn('players', 'balance')) {
|
|
||||||
$balance = Player::orderByDesc('balance')->limit(10)->get(['balance', 'id','name', 'level'])->toArray();
|
|
||||||
}
|
|
||||||
|
|
||||||
$twig->display('balance.html.twig', array(
|
$twig->display('balance.html.twig', array(
|
||||||
'balance' => $balance
|
'balance' => $balance
|
||||||
|
@@ -1,14 +1,7 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
use MyAAC\Models\Account;
|
|
||||||
|
|
||||||
defined('MYAAC') or die('Direct access not allowed!');
|
defined('MYAAC') or die('Direct access not allowed!');
|
||||||
|
|
||||||
$coins = 0;
|
$coins = ($db->hasColumn('accounts', 'coins') ? $db->query('SELECT `coins`, `' . (USE_ACCOUNT_NAME ? 'name' : 'id') . '` as `name` FROM `accounts` ORDER BY `coins` DESC LIMIT 10;') : 0);
|
||||||
|
|
||||||
if ($db->hasColumn('accounts', 'coins')) {
|
|
||||||
$coins = Account::orderByDesc('coins')->limit(10)->get(['coins', (USE_ACCOUNT_NAME ? 'name' : 'id')])->toArray();
|
|
||||||
}
|
|
||||||
|
|
||||||
$twig->display('coins.html.twig', array(
|
$twig->display('coins.html.twig', array(
|
||||||
'coins' => $coins
|
'coins' => $coins
|
||||||
|
@@ -1,15 +1,8 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
use MyAAC\Models\Account;
|
|
||||||
|
|
||||||
defined('MYAAC') or die('Direct access not allowed!');
|
defined('MYAAC') or die('Direct access not allowed!');
|
||||||
|
|
||||||
$accounts = 0;
|
$players = ($db->hasColumn('accounts', 'created') ? $db->query('SELECT `created`, `' . (USE_ACCOUNT_NAME ? 'name' : 'id') . '` as `name` FROM `accounts` ORDER BY `created` DESC LIMIT 10;') : 0);
|
||||||
|
|
||||||
if ($db->hasColumn('accounts', 'created')) {
|
|
||||||
$accounts = Account::orderByDesc('created')->limit(10)->get(['created', (USE_ACCOUNT_NAME ? 'name' : 'id')])->toArray();
|
|
||||||
}
|
|
||||||
|
|
||||||
$twig->display('created.html.twig', array(
|
$twig->display('created.html.twig', array(
|
||||||
'accounts' => $accounts,
|
'players' => $players,
|
||||||
));
|
));
|
||||||
|
@@ -1,15 +1,7 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
use MyAAC\Models\Player;
|
|
||||||
|
|
||||||
defined('MYAAC') or die('Direct access not allowed!');
|
defined('MYAAC') or die('Direct access not allowed!');
|
||||||
|
|
||||||
$players = 0;
|
$players = ($db->hasColumn('players', 'lastlogin') ? $db->query('SELECT name, level, lastlogin FROM players ORDER BY lastlogin DESC LIMIT 10;') : 0);
|
||||||
|
|
||||||
if ($db->hasColumn('players', 'lastlogin')) {
|
|
||||||
$players = Player::orderByDesc('lastlogin')->limit(10)->get(['name', 'level', 'lastlogin'])->toArray();
|
|
||||||
}
|
|
||||||
|
|
||||||
$twig->display('lastlogin.html.twig', array(
|
$twig->display('lastlogin.html.twig', array(
|
||||||
'players' => $players,
|
'players' => $players,
|
||||||
));
|
));
|
||||||
|
@@ -1,14 +1,7 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
use MyAAC\Models\Account;
|
|
||||||
|
|
||||||
defined('MYAAC') or die('Direct access not allowed!');
|
defined('MYAAC') or die('Direct access not allowed!');
|
||||||
|
|
||||||
$points = 0;
|
$points = ($db->hasColumn('accounts', 'premium_points') ? $db->query('SELECT `premium_points`, `' . (USE_ACCOUNT_NAME ? 'name' : 'id') . '` as `name` FROM `accounts` ORDER BY `premium_points` DESC LIMIT 10;') : 0);
|
||||||
|
|
||||||
if ($db->hasColumn('accounts', 'premium_points')) {
|
|
||||||
$coins = Account::orderByDesc('premium_points')->limit(10)->get(['premium_points', (USE_ACCOUNT_NAME ? 'name' : 'id')])->toArray();
|
|
||||||
}
|
|
||||||
|
|
||||||
$twig->display('points.html.twig', array(
|
$twig->display('points.html.twig', array(
|
||||||
'points' => $points,
|
'points' => $points,
|
||||||
|
@@ -1,20 +1,11 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
use MyAAC\Models\Account;
|
|
||||||
use MyAAC\Models\Guild;
|
|
||||||
use MyAAC\Models\House;
|
|
||||||
use MyAAC\Models\Monster;
|
|
||||||
use MyAAC\Models\Player;
|
|
||||||
|
|
||||||
defined('MYAAC') or die('Direct access not allowed!');
|
defined('MYAAC') or die('Direct access not allowed!');
|
||||||
$count = $eloquentConnection->query()
|
$count = $db->query('SELECT
|
||||||
->select([
|
(SELECT COUNT(*) FROM `accounts`) as total_accounts,
|
||||||
'total_accounts' => Account::selectRaw('COUNT(id)'),
|
(SELECT COUNT(*) FROM `players`) as total_players,
|
||||||
'total_players' => Player::selectRaw('COUNT(id)'),
|
(SELECT COUNT(*) FROM `guilds`) as total_guilds,
|
||||||
'total_guilds' => Guild::selectRaw('COUNT(id)'),
|
(SELECT COUNT(*) FROM `' . TABLE_PREFIX . 'monsters`) as total_monsters,
|
||||||
'total_monsters' => Monster::selectRaw('COUNT(id)'),
|
(SELECT COUNT(*) FROM `houses`) as total_houses;')->fetch();
|
||||||
'total_houses' => House::selectRaw('COUNT(id)'),
|
|
||||||
])->first();
|
|
||||||
|
|
||||||
$twig->display('statistics.html.twig', array(
|
$twig->display('statistics.html.twig', array(
|
||||||
'count' => $count,
|
'count' => $count,
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
{% if accounts is iterable %}
|
{% if players is iterable %}
|
||||||
<div class=" col-md-6 col-lg-3">
|
<div class=" col-md-6 col-lg-3">
|
||||||
<div class="card card-info card-outline">
|
<div class="card card-info card-outline">
|
||||||
<div class="card-header">
|
<div class="card-header">
|
||||||
@@ -15,7 +15,7 @@
|
|||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
{% set i = 0 %}
|
{% set i = 0 %}
|
||||||
{% for result in accounts %}
|
{% for result in players %}
|
||||||
{% set i = i + 1 %}
|
{% set i = i + 1 %}
|
||||||
<tr>
|
<tr>
|
||||||
<th>{{ i }}</th>
|
<th>{{ i }}</th>
|
||||||
|
@@ -1,32 +1,28 @@
|
|||||||
<div class="col-12 col-md-6">
|
<div class="col-12 col-md-6">
|
||||||
<div class="card card-warning card-outline">
|
<div class="card card-warning card-outline">
|
||||||
<div class="card-header">
|
<form action="?p=dashboard&maintenance" method="post" class="form-horizontal">
|
||||||
<span class="m-0">Website Status<span class="float-right">
|
<div class="card-header">
|
||||||
<div class="custom-control custom-switch custom-switch-off-danger custom-switch-on-success">
|
<span class="m-0">Website Status<span class="float-right">
|
||||||
<input form="maintenance-form" type="checkbox" class="custom-control-input" name="status" id="status" value="true" {% if not is_closed %} checked{% endif %}>
|
<div class="custom-control custom-switch custom-switch-off-danger custom-switch-on-success">
|
||||||
<label id="status-label" class="custom-control-label" for="status"> {% if is_closed %}Closed{% else %}Open{% endif %}</label>
|
<input type="checkbox" class="custom-control-input" name="status" id="status" value="true" {% if not is_closed %} checked{% endif %}>
|
||||||
</div></span>
|
<label id="status-label" class="custom-control-label" for="status"> {% if is_closed %}Closed{% else %}Open{% endif %}</label>
|
||||||
</span>
|
</div></span>
|
||||||
</div>
|
</span>
|
||||||
<div class="card-body p-2">
|
|
||||||
<div class="col-sm-12">
|
|
||||||
<label for="message" class="col-form-label">Maintenance Message</label>
|
|
||||||
<textarea form="maintenance-form" name="message" class="form-control" cols="40" rows="3" maxlength="255" placeholder="Enter ...">{{ closed_message }}</textarea>
|
|
||||||
<small>(only visible if closed)</small>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
<div class="card-body p-2">
|
||||||
<div class="card-footer">
|
<div class="col-sm-12">
|
||||||
<form id="maintenance-form" method="post" action="?p=dashboard" class="float-left">
|
<label for="message" class="col-form-label">Maintenance Message</label>
|
||||||
{{ csrf() }}
|
<textarea name="message" class="form-control" cols="40" rows="3" maxlength="255" placeholder="Enter ...">{{ closed_message }}</textarea>
|
||||||
<input type="hidden" name="maintenance" value="1" />
|
<small>(only visible if closed)</small>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="card-footer">
|
||||||
<button type="submit" class="btn btn-info"><i class="far fa-update"></i> Update</button>
|
<button type="submit" class="btn btn-info"><i class="far fa-update"></i> Update</button>
|
||||||
</form>
|
<a href="?p=dashboard&clear_cache" onclick="return confirm('Are you sure?');" class="float-right">
|
||||||
<form method="post" action="?p=dashboard" class="float-right">
|
<span class="btn btn-danger"><i class="fas fa-clear"></i>Clear cache</span>
|
||||||
{{ csrf() }}
|
</a>
|
||||||
<input type="hidden" name="clear_cache" value="1" />
|
</div>
|
||||||
<button type="submit" onclick="return confirm('Are you sure that you want to clear cache?');" class="btn btn-danger" title="Clear Cache"><i class="fas fa-clear"></i>Clear cache</button>
|
</form>
|
||||||
</form>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@@ -7,16 +7,12 @@
|
|||||||
* @copyright 2019 MyAAC
|
* @copyright 2019 MyAAC
|
||||||
* @link https://my-aac.org
|
* @link https://my-aac.org
|
||||||
*/
|
*/
|
||||||
|
|
||||||
use MyAAC\Forum;
|
|
||||||
use MyAAC\News;
|
|
||||||
|
|
||||||
defined('MYAAC') or die('Direct access not allowed!');
|
defined('MYAAC') or die('Direct access not allowed!');
|
||||||
|
|
||||||
|
require_once LIBS . 'forum.php';
|
||||||
|
require_once LIBS . 'news.php';
|
||||||
|
|
||||||
$title = 'News Panel';
|
$title = 'News Panel';
|
||||||
|
|
||||||
csrfProtect();
|
|
||||||
|
|
||||||
$use_datatable = true;
|
$use_datatable = true;
|
||||||
|
|
||||||
if (!hasFlag(FLAG_CONTENT_PAGES) && !superAdmin()) {
|
if (!hasFlag(FLAG_CONTENT_PAGES) && !superAdmin()) {
|
||||||
@@ -27,79 +23,80 @@ if (!hasFlag(FLAG_CONTENT_PAGES) && !superAdmin()) {
|
|||||||
header('X-XSS-Protection:0');
|
header('X-XSS-Protection:0');
|
||||||
|
|
||||||
// some constants, used mainly by database (cannot by modified without schema changes)
|
// some constants, used mainly by database (cannot by modified without schema changes)
|
||||||
const NEWS_TITLE_LIMIT = 100;
|
define('NEWS_TITLE_LIMIT', 100);
|
||||||
const NEWS_BODY_LIMIT = 65535; // maximum news body length
|
define('NEWS_BODY_LIMIT', 65535); // maximum news body length
|
||||||
const ARTICLE_TEXT_LIMIT = 300;
|
define('ARTICLE_TEXT_LIMIT', 300);
|
||||||
const ARTICLE_IMAGE_LIMIT = 100;
|
define('ARTICLE_IMAGE_LIMIT', 100);
|
||||||
|
|
||||||
$name = $p_title = '';
|
$name = $p_title = '';
|
||||||
if(!empty($action))
|
if(!empty($action))
|
||||||
{
|
{
|
||||||
$id = $_POST['id'] ?? null;
|
$id = isset($_REQUEST['id']) ? $_REQUEST['id'] : null;
|
||||||
$p_title = $_POST['title'] ?? null;
|
$p_title = isset($_REQUEST['title']) ? $_REQUEST['title'] : null;
|
||||||
$body = isset($_POST['body']) ? stripslashes($_POST['body']) : null;
|
$body = isset($_REQUEST['body']) ? stripslashes($_REQUEST['body']) : null;
|
||||||
$comments = $_POST['comments'] ?? null;
|
$comments = isset($_REQUEST['comments']) ? $_REQUEST['comments'] : null;
|
||||||
$type = isset($_REQUEST['type']) ? (int)$_REQUEST['type'] : 1;
|
$type = isset($_REQUEST['type']) ? (int)$_REQUEST['type'] : null;
|
||||||
$category = isset($_POST['category']) ? (int)$_POST['category'] : null;
|
$category = isset($_REQUEST['category']) ? (int)$_REQUEST['category'] : null;
|
||||||
$player_id = isset($_POST['player_id']) ? (int)$_POST['player_id'] : null;
|
$player_id = isset($_REQUEST['player_id']) ? (int)$_REQUEST['player_id'] : null;
|
||||||
$article_text = $_POST['article_text'] ?? null;
|
$article_text = isset($_REQUEST['article_text']) ? $_REQUEST['article_text'] : null;
|
||||||
$article_image = $_POST['article_image'] ?? null;
|
$article_image = isset($_REQUEST['article_image']) ? $_REQUEST['article_image'] : null;
|
||||||
$forum_section = $_POST['forum_section'] ?? null;
|
$forum_section = isset($_REQUEST['forum_section']) ? $_REQUEST['forum_section'] : null;
|
||||||
$errors = [];
|
$errors = array();
|
||||||
|
|
||||||
if (isRequestMethod('post')) {
|
if($action == 'new') {
|
||||||
if ($action == 'new') {
|
if(isset($forum_section) && $forum_section != '-1') {
|
||||||
if (isset($forum_section) && $forum_section != '-1') {
|
$forum_add = Forum::add_thread($p_title, $body, $forum_section, $player_id, $account_logged->getId(), $errors);
|
||||||
$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 = '';
|
$p_title = $body = $comments = $article_text = $article_image = '';
|
||||||
|
$type = $category = $player_id = 0;
|
||||||
|
|
||||||
|
success("Added successful.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if($action == 'delete') {
|
||||||
|
News::delete($id, $errors);
|
||||||
|
success("Deleted successful.");
|
||||||
|
}
|
||||||
|
else if($action == 'edit')
|
||||||
|
{
|
||||||
|
if(isset($id) && !isset($p_title)) {
|
||||||
|
$news = News::get($id);
|
||||||
|
$p_title = $news['title'];
|
||||||
|
$body = $news['body'];
|
||||||
|
$comments = $news['comments'];
|
||||||
|
$type = $news['type'];
|
||||||
|
$category = $news['category'];
|
||||||
|
$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)) {
|
||||||
|
// 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));
|
||||||
|
}
|
||||||
|
|
||||||
|
$action = $p_title = $body = $comments = $article_text = $article_image = '';
|
||||||
$type = $category = $player_id = 0;
|
$type = $category = $player_id = 0;
|
||||||
|
|
||||||
success('Added successful.');
|
success("Updated successful.");
|
||||||
}
|
|
||||||
} else if ($action == 'delete') {
|
|
||||||
if (News::delete($id, $errors)) {
|
|
||||||
success('Deleted successful.');
|
|
||||||
}
|
|
||||||
} else if ($action == 'edit') {
|
|
||||||
if (isset($id) && !isset($p_title)) {
|
|
||||||
$news = News::get($id);
|
|
||||||
$p_title = $news['title'];
|
|
||||||
$body = $news['body'];
|
|
||||||
$comments = $news['comments'];
|
|
||||||
$type = $news['type'];
|
|
||||||
$category = $news['category'];
|
|
||||||
$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)) {
|
|
||||||
// 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));
|
|
||||||
}
|
|
||||||
|
|
||||||
$action = $p_title = $body = $comments = $article_text = $article_image = '';
|
|
||||||
$type = $category = $player_id = 0;
|
|
||||||
|
|
||||||
success('Updated successful.');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if ($action == 'hide') {
|
|
||||||
if (News::toggleHide($id, $errors, $status)) {
|
|
||||||
success(($status == 1 ? 'Hide' : 'Show') . ' successful.');
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if($action == 'hide') {
|
||||||
|
News::toggleHidden($id, $errors, $status);
|
||||||
|
success(($status == 1 ? 'Show' : 'Hide') . " successful.");
|
||||||
|
}
|
||||||
|
|
||||||
if(!empty($errors))
|
if(!empty($errors))
|
||||||
error(implode(", ", $errors));
|
error(implode(", ", $errors));
|
||||||
}
|
}
|
||||||
|
|
||||||
$categories = array();
|
$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(
|
$categories[$cat['id']] = array(
|
||||||
'name' => $cat['name'],
|
'name' => $cat['name'],
|
||||||
@@ -117,10 +114,12 @@ if($action == 'edit' || $action == 'new') {
|
|||||||
$account_players->orderBy('group_id', POT::ORDER_DESC);
|
$account_players->orderBy('group_id', POT::ORDER_DESC);
|
||||||
$twig->display('admin.news.form.html.twig', array(
|
$twig->display('admin.news.form.html.twig', array(
|
||||||
'action' => $action,
|
'action' => $action,
|
||||||
|
'news_link' => getLink(PAGE),
|
||||||
|
'news_link_form' => '?p=news&action=' . ($action == 'edit' ? 'edit' : 'new'),
|
||||||
'news_id' => $id ?? null,
|
'news_id' => $id ?? null,
|
||||||
'title' => $p_title ?? '',
|
'title' => $p_title ?? '',
|
||||||
'body' => isset($body) ? escapeHtml($body) : '',
|
'body' => isset($body) ? escapeHtml($body) : '',
|
||||||
'type' => $type,
|
'type' => $type ?? null,
|
||||||
'player' => isset($player) && $player->isLoaded() ? $player : null,
|
'player' => isset($player) && $player->isLoaded() ? $player : null,
|
||||||
'player_id' => $player_id ?? null,
|
'player_id' => $player_id ?? null,
|
||||||
'account_players' => $account_players,
|
'account_players' => $account_players,
|
||||||
@@ -142,12 +141,12 @@ foreach ($query as $_news) {
|
|||||||
|
|
||||||
$newses[$_news['type']][] = array(
|
$newses[$_news['type']][] = array(
|
||||||
'id' => $_news['id'],
|
'id' => $_news['id'],
|
||||||
'hide' => $_news['hide'],
|
'hidden' => $_news['hidden'],
|
||||||
'archive_link' => getLink('news') . '/archive/' . $_news['id'],
|
'archive_link' => getLink('news') . '/archive/' . $_news['id'],
|
||||||
'title' => $_news['title'],
|
'title' => $_news['title'],
|
||||||
'date' => $_news['date'],
|
'date' => $_news['date'],
|
||||||
'player_name' => $_player->isLoaded() ? $_player->getName() : '',
|
'player_name' => isset($_player) && $_player->isLoaded() ? $_player->getName() : '',
|
||||||
'player_link' => $_player->isLoaded() ? getPlayerLink($_player->getName(), false) : '',
|
'player_link' => isset($_player) && $_player->isLoaded() ? getPlayerLink($_player->getName(), false) : '',
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -7,35 +7,46 @@
|
|||||||
* @copyright 2019 MyAAC
|
* @copyright 2019 MyAAC
|
||||||
* @link https://my-aac.org
|
* @link https://my-aac.org
|
||||||
*/
|
*/
|
||||||
|
|
||||||
use MyAAC\Models\Notepad as ModelsNotepad;
|
|
||||||
|
|
||||||
defined('MYAAC') or die('Direct access not allowed!');
|
defined('MYAAC') or die('Direct access not allowed!');
|
||||||
$title = 'Notepad';
|
$title = 'Notepad';
|
||||||
|
|
||||||
csrfProtect();
|
$notepad_content = Notepad::get($account_logged->getId());
|
||||||
|
|
||||||
/**
|
|
||||||
* @var OTS_Account $account_logged
|
|
||||||
*/
|
|
||||||
$_content = '';
|
|
||||||
$notepad = ModelsNotepad::where('account_id', $account_logged->getId())->first();
|
|
||||||
if (isset($_POST['content'])) {
|
if (isset($_POST['content'])) {
|
||||||
$_content = html_entity_decode(stripslashes($_POST['content']));
|
$_content = html_entity_decode(stripslashes($_POST['content']));
|
||||||
if (!$notepad) {
|
if (!$notepad_content)
|
||||||
ModelsNotepad::create([
|
Notepad::create($account_logged->getId(), $_content);
|
||||||
'account_id' => $account_logged->getId(),
|
else
|
||||||
'content' => $_content
|
Notepad::update($account_logged->getId(), $_content);
|
||||||
]);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
ModelsNotepad::where('account_id', $account_logged->getId())->update(['content' => $_content]);
|
|
||||||
}
|
|
||||||
|
|
||||||
success('Saved at ' . date('H:i'));
|
echo '<div class="success" style="text-align: center;">Saved at ' . date('H:i') . '</div>';
|
||||||
} else {
|
} else {
|
||||||
if ($notepad)
|
if ($notepad_content !== false)
|
||||||
$_content = $notepad->content;
|
$_content = $notepad_content;
|
||||||
}
|
}
|
||||||
|
|
||||||
$twig->display('admin.notepad.html.twig', ['content' => $_content]);
|
$twig->display('admin.notepad.html.twig', array('content' => isset($_content) ? $_content : null));
|
||||||
|
|
||||||
|
class Notepad
|
||||||
|
{
|
||||||
|
static public function get($account_id)
|
||||||
|
{
|
||||||
|
global $db;
|
||||||
|
$query = $db->select(TABLE_PREFIX . 'notepad', array('account_id' => $account_id));
|
||||||
|
if ($query !== false)
|
||||||
|
return $query['content'];
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
static public function create($account_id, $content = '')
|
||||||
|
{
|
||||||
|
global $db;
|
||||||
|
$db->insert(TABLE_PREFIX . 'notepad', array('account_id' => $account_id, 'content' => $content));
|
||||||
|
}
|
||||||
|
|
||||||
|
static public function update($account_id, $content = '')
|
||||||
|
{
|
||||||
|
global $db;
|
||||||
|
$db->update(TABLE_PREFIX . 'notepad', array('content' => $content), array('account_id' => $account_id));
|
||||||
|
}
|
||||||
|
}
|
@@ -7,16 +7,10 @@
|
|||||||
* @copyright 2019 MyAAC
|
* @copyright 2019 MyAAC
|
||||||
* @link https://my-aac.org
|
* @link https://my-aac.org
|
||||||
*/
|
*/
|
||||||
|
|
||||||
use MyAAC\Models\Pages as ModelsPages;
|
|
||||||
use MyAAC\Admin\Pages;
|
|
||||||
|
|
||||||
defined('MYAAC') or die('Direct access not allowed!');
|
defined('MYAAC') or die('Direct access not allowed!');
|
||||||
$title = 'Pages';
|
$title = 'Pages';
|
||||||
$use_datatable = true;
|
$use_datatable = true;
|
||||||
|
|
||||||
csrfProtect();
|
|
||||||
|
|
||||||
if (!hasFlag(FLAG_CONTENT_PAGES) && !superAdmin()) {
|
if (!hasFlag(FLAG_CONTENT_PAGES) && !superAdmin()) {
|
||||||
echo 'Access denied.';
|
echo 'Access denied.';
|
||||||
return;
|
return;
|
||||||
@@ -32,36 +26,31 @@ $enable_tinymce = true;
|
|||||||
$access = 0;
|
$access = 0;
|
||||||
|
|
||||||
// some constants, used mainly by database (cannot by modified without schema changes)
|
// some constants, used mainly by database (cannot by modified without schema changes)
|
||||||
const PAGE_TITLE_LIMIT = 30;
|
define('PAGE_TITLE_LIMIT', 30);
|
||||||
const PAGE_NAME_LIMIT = 30;
|
define('PAGE_NAME_LIMIT', 30);
|
||||||
const PAGE_BODY_LIMIT = 65535; // maximum page body length
|
define('PAGE_BODY_LIMIT', 65535); // maximum page body length
|
||||||
|
|
||||||
if (!empty($action) && isRequestMethod('post')) {
|
if (!empty($action)) {
|
||||||
if ($action == 'delete' || $action == 'edit' || $action == 'hide') {
|
if ($action == 'delete' || $action == 'edit' || $action == 'hide')
|
||||||
$id = $_POST['id'];
|
$id = $_REQUEST['id'];
|
||||||
|
|
||||||
|
if (isset($_REQUEST['name']))
|
||||||
|
$name = $_REQUEST['name'];
|
||||||
|
|
||||||
|
if (isset($_REQUEST['title']))
|
||||||
|
$p_title = $_REQUEST['title'];
|
||||||
|
|
||||||
|
$php = isset($_REQUEST['php']) && $_REQUEST['php'] == 1;
|
||||||
|
$enable_tinymce = isset($_REQUEST['enable_tinymce']) && $_REQUEST['enable_tinymce'] == 1;
|
||||||
|
if ($php)
|
||||||
|
$body = $_REQUEST['body'];
|
||||||
|
else if (isset($_REQUEST['body'])) {
|
||||||
|
//$body = $_REQUEST['body'];
|
||||||
|
$body = html_entity_decode(stripslashes($_REQUEST['body']));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isset($_POST['name'])) {
|
if (isset($_REQUEST['access']))
|
||||||
$name = $_POST['name'];
|
$access = $_REQUEST['access'];
|
||||||
}
|
|
||||||
|
|
||||||
if (isset($_POST['title'])) {
|
|
||||||
$p_title = $_POST['title'];
|
|
||||||
}
|
|
||||||
|
|
||||||
$php = isset($_POST['php']) && $_POST['php'] == 1;
|
|
||||||
$enable_tinymce = (isset($_POST['enable_tinymce']) && $_POST['enable_tinymce'] == 1) ?: $enable_tinymce;
|
|
||||||
if ($php) {
|
|
||||||
$body = $_POST['body'];
|
|
||||||
}
|
|
||||||
else if (isset($_POST['body'])) {
|
|
||||||
//$body = $_POST['body'];
|
|
||||||
$body = html_entity_decode(stripslashes($_POST['body']));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (isset($_POST['access'])) {
|
|
||||||
$access = $_POST['access'];
|
|
||||||
}
|
|
||||||
|
|
||||||
$errors = array();
|
$errors = array();
|
||||||
$player_id = 1;
|
$player_id = 1;
|
||||||
@@ -78,7 +67,7 @@ if (!empty($action) && isRequestMethod('post')) {
|
|||||||
if (Pages::delete($id, $errors))
|
if (Pages::delete($id, $errors))
|
||||||
success('Page with id ' . $id . ' has been deleted');
|
success('Page with id ' . $id . ' has been deleted');
|
||||||
} else if ($action == 'edit') {
|
} else if ($action == 'edit') {
|
||||||
if (isset($id) && !isset($_POST['name'])) {
|
if (isset($id) && !isset($_REQUEST['name'])) {
|
||||||
$_page = Pages::get($id);
|
$_page = Pages::get($id);
|
||||||
$name = $_page['name'];
|
$name = $_page['name'];
|
||||||
$p_title = $_page['title'];
|
$p_title = $_page['title'];
|
||||||
@@ -97,26 +86,29 @@ if (!empty($action) && isRequestMethod('post')) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if ($action == 'hide') {
|
} else if ($action == 'hide') {
|
||||||
if (Pages::toggleHide($id, $errors, $status)) {
|
Pages::toggleHidden($id, $errors, $status);
|
||||||
success(($status == 0 ? 'Show' : 'Hide') . ' successful.');
|
success(($status == 1 ? 'Show' : 'Hide') . ' successful.');
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!empty($errors))
|
if (!empty($errors))
|
||||||
error(implode(", ", $errors));
|
error(implode(", ", $errors));
|
||||||
}
|
}
|
||||||
|
|
||||||
$pages = ModelsPages::all()->map(function ($e) {
|
$query =
|
||||||
return [
|
$db->query('SELECT * FROM ' . $db->tableName(TABLE_PREFIX . 'pages'));
|
||||||
'link' => getFullLink($e->name, $e->name, true),
|
|
||||||
'title' => substr($e->title, 0, 20),
|
|
||||||
'php' => $e->php == '1',
|
|
||||||
'id' => $e->id,
|
|
||||||
'hide' => $e->hide
|
|
||||||
];
|
|
||||||
})->toArray();
|
|
||||||
|
|
||||||
$twig->display('admin.pages.form.html.twig', [
|
$pages = array();
|
||||||
|
foreach ($query as $_page) {
|
||||||
|
$pages[] = array(
|
||||||
|
'link' => getFullLink($_page['name'], $_page['name'], true),
|
||||||
|
'title' => substr($_page['title'], 0, 20),
|
||||||
|
'php' => $_page['php'] == '1',
|
||||||
|
'id' => $_page['id'],
|
||||||
|
'hidden' => $_page['hidden']
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
$twig->display('admin.pages.form.html.twig', array(
|
||||||
'action' => $action,
|
'action' => $action,
|
||||||
'id' => $action == 'edit' ? $id : null,
|
'id' => $action == 'edit' ? $id : null,
|
||||||
'name' => $name,
|
'name' => $name,
|
||||||
@@ -126,8 +118,143 @@ $twig->display('admin.pages.form.html.twig', [
|
|||||||
'body' => isset($body) ? escapeHtml($body) : '',
|
'body' => isset($body) ? escapeHtml($body) : '',
|
||||||
'groups' => $groups->getGroups(),
|
'groups' => $groups->getGroups(),
|
||||||
'access' => $access
|
'access' => $access
|
||||||
]);
|
));
|
||||||
|
|
||||||
$twig->display('admin.pages.html.twig', [
|
$twig->display('admin.pages.html.twig', array(
|
||||||
'pages' => $pages
|
'pages' => $pages
|
||||||
]);
|
));
|
||||||
|
|
||||||
|
class Pages
|
||||||
|
{
|
||||||
|
static public function verify($name, $title, $body, $player_id, $php, $enable_tinymce, $access, &$errors)
|
||||||
|
{
|
||||||
|
if(!isset($title[0]) || !isset($body[0])) {
|
||||||
|
$errors[] = 'Please fill all inputs.';
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if(strlen($name) > PAGE_NAME_LIMIT) {
|
||||||
|
$errors[] = 'Page name cannot be longer than ' . PAGE_NAME_LIMIT . ' characters.';
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if(strlen($title) > PAGE_TITLE_LIMIT) {
|
||||||
|
$errors[] = 'Page title cannot be longer than ' . PAGE_TITLE_LIMIT . ' characters.';
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if(strlen($body) > PAGE_BODY_LIMIT) {
|
||||||
|
$errors[] = 'Page content cannot be longer than ' . PAGE_BODY_LIMIT . ' characters.';
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if(!isset($player_id) || $player_id == 0) {
|
||||||
|
$errors[] = 'Player ID is wrong.';
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if(!isset($php) || ($php != 0 && $php != 1)) {
|
||||||
|
$errors[] = 'Enable PHP is wrong.';
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if ($php == 1 && !getBoolean(config('admin_pages_php_enable'))) {
|
||||||
|
$errors[] = 'PHP pages disabled on this server. To enable go to config.php and change admin_pages_php_enable to "yes".';
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if(!isset($enable_tinymce) || ($enable_tinymce != 0 && $enable_tinymce != 1)) {
|
||||||
|
$errors[] = 'Enable TinyMCE is wrong.';
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if(!isset($access) || $access < 0 || $access > PHP_INT_MAX) {
|
||||||
|
$errors[] = 'Access is wrong.';
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static public function get($id)
|
||||||
|
{
|
||||||
|
global $db;
|
||||||
|
$query = $db->select(TABLE_PREFIX . 'pages', array('id' => $id));
|
||||||
|
if ($query !== false)
|
||||||
|
return $query;
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
static public function add($name, $title, $body, $player_id, $php, $enable_tinymce, $access, &$errors)
|
||||||
|
{
|
||||||
|
if(!self::verify($name, $title, $body, $player_id, $php, $enable_tinymce, $access, $errors)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
global $db;
|
||||||
|
$query = $db->select(TABLE_PREFIX . 'pages', array('name' => $name));
|
||||||
|
if ($query === false)
|
||||||
|
$db->insert(TABLE_PREFIX . 'pages',
|
||||||
|
array(
|
||||||
|
'name' => $name,
|
||||||
|
'title' => $title,
|
||||||
|
'body' => $body,
|
||||||
|
'player_id' => $player_id,
|
||||||
|
'php' => $php ? '1' : '0',
|
||||||
|
'enable_tinymce' => $enable_tinymce ? '1' : '0',
|
||||||
|
'access' => $access
|
||||||
|
)
|
||||||
|
);
|
||||||
|
else
|
||||||
|
$errors[] = 'Page with this link already exists.';
|
||||||
|
|
||||||
|
return !count($errors);
|
||||||
|
}
|
||||||
|
|
||||||
|
static public function update($id, $name, $title, $body, $player_id, $php, $enable_tinymce, $access, &$errors)
|
||||||
|
{
|
||||||
|
if(!self::verify($name, $title, $body, $player_id, $php, $enable_tinymce, $access, $errors)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
global $db;
|
||||||
|
$db->update(TABLE_PREFIX . 'pages',
|
||||||
|
array(
|
||||||
|
'name' => $name,
|
||||||
|
'title' => $title,
|
||||||
|
'body' => $body,
|
||||||
|
'player_id' => $player_id,
|
||||||
|
'php' => $php ? '1' : '0',
|
||||||
|
'enable_tinymce' => $enable_tinymce ? '1' : '0',
|
||||||
|
'access' => $access
|
||||||
|
),
|
||||||
|
array('id' => $id));
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static public function delete($id, &$errors)
|
||||||
|
{
|
||||||
|
global $db;
|
||||||
|
if (isset($id)) {
|
||||||
|
if ($db->select(TABLE_PREFIX . 'pages', array('id' => $id)) !== false)
|
||||||
|
$db->delete(TABLE_PREFIX . 'pages', array('id' => $id));
|
||||||
|
else
|
||||||
|
$errors[] = 'Page with id ' . $id . ' does not exists.';
|
||||||
|
} else
|
||||||
|
$errors[] = 'id not set';
|
||||||
|
|
||||||
|
return !count($errors);
|
||||||
|
}
|
||||||
|
|
||||||
|
static public function toggleHidden($id, &$errors, &$status)
|
||||||
|
{
|
||||||
|
global $db;
|
||||||
|
if (isset($id)) {
|
||||||
|
$query = $db->select(TABLE_PREFIX . 'pages', array('id' => $id));
|
||||||
|
if ($query !== false) {
|
||||||
|
$db->update(TABLE_PREFIX . 'pages', array('hidden' => ($query['hidden'] == 1 ? 0 : 1)), array('id' => $id));
|
||||||
|
$status = $query['hidden'];
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$errors[] = 'Page with id ' . $id . ' does not exists.';
|
||||||
|
}
|
||||||
|
} else
|
||||||
|
$errors[] = 'id not set';
|
||||||
|
|
||||||
|
return !count($errors);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@@ -7,19 +7,13 @@
|
|||||||
* @copyright 2019 MyAAC
|
* @copyright 2019 MyAAC
|
||||||
* @link https://my-aac.org
|
* @link https://my-aac.org
|
||||||
*/
|
*/
|
||||||
|
|
||||||
use MyAAC\Forum;
|
|
||||||
use MyAAC\Models\Player;
|
|
||||||
|
|
||||||
defined('MYAAC') or die('Direct access not allowed!');
|
defined('MYAAC') or die('Direct access not allowed!');
|
||||||
|
|
||||||
$title = 'Player editor';
|
$title = 'Player editor';
|
||||||
|
|
||||||
csrfProtect();
|
|
||||||
|
|
||||||
$player_base = ADMIN_URL . '?p=players';
|
$player_base = ADMIN_URL . '?p=players';
|
||||||
|
|
||||||
$use_datatable = true;
|
$use_datatable = true;
|
||||||
|
require_once LIBS . 'forum.php';
|
||||||
|
|
||||||
$skills = array(
|
$skills = array(
|
||||||
POT::SKILL_FIST => array('Fist fighting', 'fist'),
|
POT::SKILL_FIST => array('Fist fighting', 'fist'),
|
||||||
@@ -78,7 +72,7 @@ else if (isset($_REQUEST['search'])) {
|
|||||||
$player = new OTS_Player();
|
$player = new OTS_Player();
|
||||||
$player->load($id);
|
$player->load($id);
|
||||||
|
|
||||||
if ($player->isLoaded() && isset($_POST['save'])) {// we want to save
|
if (isset($player) && $player->isLoaded() && isset($_POST['save'])) {// we want to save
|
||||||
$error = false;
|
$error = false;
|
||||||
|
|
||||||
if ($player->isOnline())
|
if ($player->isOnline())
|
||||||
@@ -213,7 +207,7 @@ else if (isset($_REQUEST['search'])) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
$deleted = (isset($_POST['deleted']) && $_POST['deleted'] == 'true');
|
$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']);
|
$created = strtotime($_POST['created']);
|
||||||
verify_number($created, 'Created', 11);
|
verify_number($created, 'Created', 11);
|
||||||
@@ -290,7 +284,7 @@ else if (isset($_REQUEST['search'])) {
|
|||||||
$player->setCustomField('deletion', $deleted ? '1' : '0');
|
$player->setCustomField('deletion', $deleted ? '1' : '0');
|
||||||
else
|
else
|
||||||
$player->setCustomField('deleted', $deleted ? '1' : '0');
|
$player->setCustomField('deleted', $deleted ? '1' : '0');
|
||||||
$player->setCustomField('hide', $hide ? '1' : '0');
|
$player->setCustomField('hidden', $hidden ? '1' : '0');
|
||||||
$player->setCustomField('created', $created);
|
$player->setCustomField('created', $created);
|
||||||
if (isset($comment))
|
if (isset($comment))
|
||||||
$player->setCustomField('comment', $comment);
|
$player->setCustomField('comment', $comment);
|
||||||
@@ -375,8 +369,7 @@ else if (isset($_REQUEST['search'])) {
|
|||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</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="card-body">
|
||||||
<div class="tab-content" id="tabs-tabContent">
|
<div class="tab-content" id="tabs-tabContent">
|
||||||
<div class="tab-pane fade active show" id="tabs-home">
|
<div class="tab-pane fade active show" id="tabs-home">
|
||||||
@@ -394,8 +387,8 @@ else if (isset($_REQUEST['search'])) {
|
|||||||
<div class="col-12 col-sm-12 col-lg-6">
|
<div class="col-12 col-sm-12 col-lg-6">
|
||||||
<label for="group">Group:</label>
|
<label for="group">Group:</label>
|
||||||
<select name="group" id="group" class="form-control custom-select">
|
<select name="group" id="group" class="form-control custom-select">
|
||||||
<?php foreach ($groups->getGroups() as $_id => $group): ?>
|
<?php foreach ($groups->getGroups() as $id => $group): ?>
|
||||||
<option value="<?php echo $_id; ?>" <?php echo($player->getGroup()->getId() == $_id ? 'selected' : ''); ?>><?php echo $group->getName(); ?></option>
|
<option value="<?php echo $id; ?>" <?php echo($player->getGroup()->getId() == $id ? 'selected' : ''); ?>><?php echo $group->getName(); ?></option>
|
||||||
<?php endforeach; ?>
|
<?php endforeach; ?>
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
@@ -403,8 +396,8 @@ else if (isset($_REQUEST['search'])) {
|
|||||||
<label for="vocation">Vocation</label>
|
<label for="vocation">Vocation</label>
|
||||||
<select name="vocation" id="vocation" class="form-control custom-select">
|
<select name="vocation" id="vocation" class="form-control custom-select">
|
||||||
<?php
|
<?php
|
||||||
foreach ($config['vocations'] as $_id => $name) {
|
foreach ($config['vocations'] as $id => $name) {
|
||||||
echo '<option value=' . $_id . ($_id == $player->getVocation() ? ' selected' : '') . '>' . $name . '</option>';
|
echo '<option value=' . $id . ($id == $player->getVocation() ? ' selected' : '') . '>' . $name . '</option>';
|
||||||
}
|
}
|
||||||
?>
|
?>
|
||||||
</select>
|
</select>
|
||||||
@@ -414,8 +407,8 @@ else if (isset($_REQUEST['search'])) {
|
|||||||
<div class="col-12 col-sm-12 col-lg-6">
|
<div class="col-12 col-sm-12 col-lg-6">
|
||||||
<label for="sex">Sex:</label>
|
<label for="sex">Sex:</label>
|
||||||
<select name="sex" id="sex" class="form-control custom-select">>
|
<select name="sex" id="sex" class="form-control custom-select">>
|
||||||
<?php foreach ($config['genders'] as $_id => $sex): ?>
|
<?php foreach ($config['genders'] as $id => $sex): ?>
|
||||||
<option value="<?php echo $_id; ?>" <?php echo($player->getSex() == $_id ? 'selected' : ''); ?>><?php echo strtolower($sex); ?></option>
|
<option value="<?php echo $id; ?>" <?php echo($player->getSex() == $id ? 'selected' : ''); ?>><?php echo strtolower($sex); ?></option>
|
||||||
<?php endforeach; ?>
|
<?php endforeach; ?>
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
@@ -428,8 +421,8 @@ else if (isset($_REQUEST['search'])) {
|
|||||||
$configTowns[$player->getTownId()] = 'Unknown Town';
|
$configTowns[$player->getTownId()] = 'Unknown Town';
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach ($configTowns as $_id => $town): ?>
|
foreach ($configTowns as $id => $town): ?>
|
||||||
<option value="<?php echo $_id; ?>" <?php echo($player->getTownId() == $_id ? 'selected' : ''); ?>><?php echo $town; ?></option>
|
<option value="<?php echo $id; ?>" <?php echo($player->getTownId() == $id ? 'selected' : ''); ?>><?php echo $town; ?></option>
|
||||||
<?php endforeach; ?>
|
<?php endforeach; ?>
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
@@ -440,8 +433,8 @@ else if (isset($_REQUEST['search'])) {
|
|||||||
<select name="skull" id="skull" class="form-control custom-select">
|
<select name="skull" id="skull" class="form-control custom-select">
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
foreach ($skull_type as $_id => $s_name) {
|
foreach ($skull_type as $id => $s_name) {
|
||||||
echo '<option value=' . $_id . ($_id == $player->getSkull() ? ' selected' : '') . '>' . $s_name . '</option>';
|
echo '<option value=' . $id . ($id == $player->getSkull() ? ' selected' : '') . '>' . $s_name . '</option>';
|
||||||
}
|
}
|
||||||
?>
|
?>
|
||||||
</select>
|
</select>
|
||||||
@@ -485,8 +478,8 @@ else if (isset($_REQUEST['search'])) {
|
|||||||
</div>
|
</div>
|
||||||
<div class="col-12 col-sm-12 col-lg-6">
|
<div class="col-12 col-sm-12 col-lg-6">
|
||||||
<div class="custom-control custom-switch custom-switch-on-success">
|
<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' : ''); ?>>
|
<input type="checkbox" class="custom-control-input" name="hidden" id="hidden" value="true" <?php echo($player->isHidden() ? ' checked' : ''); ?>>
|
||||||
<label class="custom-control-label" for="hide">Hidden</label>
|
<label class="custom-control-label" for="hidden">Hidden</label>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -558,22 +551,22 @@ else if (isset($_REQUEST['search'])) {
|
|||||||
</div>
|
</div>
|
||||||
<div class="tab-pane fade" id="tabs-skills">
|
<div class="tab-pane fade" id="tabs-skills">
|
||||||
<?php
|
<?php
|
||||||
foreach ($skills as $_id => $info) {
|
foreach ($skills as $id => $info) {
|
||||||
?>
|
?>
|
||||||
<div class="form-group row">
|
<div class="form-group row">
|
||||||
<div class="col-12 col-sm-12 col-lg-6">
|
<div class="col-12 col-sm-12 col-lg-6">
|
||||||
<?php echo '<label for="skills[' . $_id . ']" class="control-label">' . $info[0] . '</label>
|
<?php echo '<label for="skills[' . $id . ']" class="control-label">' . $info[0] . '</label>
|
||||||
<input type="text" class="form-control" id="skills[' . $_id . ']" name="skills[' . $_id . ']" maxlength="10" autocomplete="off" value="' . $player->getSkill($_id) . '"/>'; ?>
|
<input type="text" class="form-control" id="skills[' . $id . ']" name="skills[' . $id . ']" maxlength="10" autocomplete="off" value="' . $player->getSkill($id) . '"/>'; ?>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-12 col-sm-12 col-lg-6">
|
<div class="col-12 col-sm-12 col-lg-6">
|
||||||
<?php echo '<label for="skills_tries[' . $_id . ']" class="control-label">' . $info[0] . ' tries</label>
|
<?php echo '<label for="skills_tries[' . $id . ']" class="control-label">' . $info[0] . ' tries</label>
|
||||||
<input type="text" class="form-control" id="skills_tries[' . $_id . ']" name="skills_tries[' . $_id . ']" maxlength="10" autocomplete="off" value="' . $player->getSkillTries($_id) . '"/>'; ?>
|
<input type="text" class="form-control" id="skills_tries[' . $id . ']" name="skills_tries[' . $id . ']" maxlength="10" autocomplete="off" value="' . $player->getSkillTries($id) . '"/>'; ?>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<?php } ?>
|
<?php } ?>
|
||||||
</div>
|
</div>
|
||||||
<div class="tab-pane fade" id="tabs-pos">
|
<div class="tab-pane fade" id="tabs-pos">
|
||||||
<?php $outfit = setting('core.outfit_images_url') . '?id=' . $player->getLookType() . ($hasLookAddons ? '&addons=' . $player->getLookAddons() : '') . '&head=' . $player->getLookHead() . '&body=' . $player->getLookBody() . '&legs=' . $player->getLookLegs() . '&feet=' . $player->getLookFeet(); ?>
|
<?php $outfit = $config['outfit_images_url'] . '?id=' . $player->getLookType() . ($hasLookAddons ? '&addons=' . $player->getLookAddons() : '') . '&head=' . $player->getLookHead() . '&body=' . $player->getLookBody() . '&legs=' . $player->getLookLegs() . '&feet=' . $player->getLookFeet(); ?>
|
||||||
<div id="imgchar" style="width:64px;height:64px;position:absolute; top:30px; right:30px">
|
<div id="imgchar" style="width:64px;height:64px;position:absolute; top:30px; right:30px">
|
||||||
<img id="player_outfit" style="margin-left:0;margin-top:0;width:64px;height:64px;" src="<?php echo $outfit; ?>" alt="player outfit"/>
|
<img id="player_outfit" style="margin-left:0;margin-top:0;width:64px;height:64px;" src="<?php echo $outfit; ?>" alt="player outfit"/>
|
||||||
</div>
|
</div>
|
||||||
@@ -626,7 +619,7 @@ else if (isset($_REQUEST['search'])) {
|
|||||||
if ($outfitlist) { ?>
|
if ($outfitlist) { ?>
|
||||||
<select name="look_type" id="look_type" class="form-control custom-select">
|
<select name="look_type" id="look_type" class="form-control custom-select">
|
||||||
<?php
|
<?php
|
||||||
foreach ($outfitlist as $_id => $outfit) {
|
foreach ($outfitlist as $id => $outfit) {
|
||||||
if ($outfit['enabled'] == 'yes') ;
|
if ($outfit['enabled'] == 'yes') ;
|
||||||
echo '<option value=' . $outfit['id'] . ($outfit['id'] == $player->getLookType() ? ' selected' : '') . '>' . $outfit['name'] . ' - ' . ($outfit['type'] == 1 ? 'Male' : 'Female') . '</option>';
|
echo '<option value=' . $outfit['id'] . ($outfit['id'] == $player->getLookType() ? ' selected' : '') . '>' . $outfit['name'] . ' - ' . ($outfit['type'] == 1 ? 'Male' : 'Female') . '</option>';
|
||||||
}
|
}
|
||||||
@@ -642,8 +635,8 @@ else if (isset($_REQUEST['search'])) {
|
|||||||
<select name="look_addons" id="look_addons" class="form-control custom-select">
|
<select name="look_addons" id="look_addons" class="form-control custom-select">
|
||||||
<?php
|
<?php
|
||||||
$addon_type = array("None", "First", "Second", "Both");
|
$addon_type = array("None", "First", "Second", "Both");
|
||||||
foreach ($addon_type as $_id => $s_name) {
|
foreach ($addon_type as $id => $s_name) {
|
||||||
echo '<option value=' . $_id . ($_id == $player->getLookAddons() ? ' selected' : '') . '>' . $s_name . '</option>';
|
echo '<option value=' . $id . ($id == $player->getLookAddons() ? ' selected' : '') . '>' . $s_name . '</option>';
|
||||||
}
|
}
|
||||||
?>
|
?>
|
||||||
</select>
|
</select>
|
||||||
@@ -708,7 +701,7 @@ else if (isset($_REQUEST['search'])) {
|
|||||||
<div class="form-group row">
|
<div class="form-group row">
|
||||||
<div class="col-12">
|
<div class="col-12">
|
||||||
<label for="comment" class="control-label">Comment:</label>
|
<label for="comment" class="control-label">Comment:</label>
|
||||||
<textarea class="form-control" id="comment" name="comment" rows="10" cols="50" wrap="virtual"><?php echo $player->getCustomField("comment"); ?></textarea>
|
<textarea class="form-control" name="comment" rows="10" cols="50" wrap="virtual"><?php echo $player->getCustomField("comment"); ?></textarea>
|
||||||
<small>[max. length: 2000 chars, 50 lines (ENTERs)]</small>
|
<small>[max. length: 2000 chars, 50 lines (ENTERs)]</small>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -751,7 +744,8 @@ else if (isset($_REQUEST['search'])) {
|
|||||||
<div class="row">
|
<div class="row">
|
||||||
<?php
|
<?php
|
||||||
if (isset($account) && $account->isLoaded()) {
|
if (isset($account) && $account->isLoaded()) {
|
||||||
$account_players = Player::where('account_id', $account->getId())->orderBy('id')->get();
|
$account_players = $account->getPlayersList();
|
||||||
|
$account_players->orderBy('id');
|
||||||
if (isset($account_players)) { ?>
|
if (isset($account_players)) { ?>
|
||||||
<table class="table table-striped table-condensed table-responsive d-md-table">
|
<table class="table table-striped table-condensed table-responsive d-md-table">
|
||||||
<thead>
|
<thead>
|
||||||
@@ -764,13 +758,23 @@ else if (isset($_REQUEST['search'])) {
|
|||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
<?php foreach ($account_players as $i => $player): ?>
|
<?php foreach ($account_players as $i => $player):
|
||||||
|
$player_vocation = $player->getVocation();
|
||||||
|
$player_promotion = $player->getPromotion();
|
||||||
|
if (isset($player_promotion)) {
|
||||||
|
if ((int)$player_promotion > 0)
|
||||||
|
$player_vocation += ($player_promotion * $config['vocations_amount']);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isset($config['vocations'][$player_vocation])) {
|
||||||
|
$vocation_name = $config['vocations'][$player_vocation];
|
||||||
|
} ?>
|
||||||
<tr>
|
<tr>
|
||||||
<th><?php echo $i + 1; ?></th>
|
<th><?php echo $i; ?></th>
|
||||||
<td><?php echo $player->name; ?></td>
|
<td><?php echo $player->getName(); ?></td>
|
||||||
<td><?php echo $player->level; ?></td>
|
<td><?php echo $player->getLevel(); ?></td>
|
||||||
<td><?php echo $player->vocation_name; ?></td>
|
<td><?php echo $vocation_name; ?></td>
|
||||||
<td><a href="?p=players&id=<?php echo $player->getKey() ?>" class=" btn btn-success btn-sm" title="Edit"><i class="fas fa-pencil-alt"></i></a></td>
|
<td><a href="?p=players&id=<?php echo $player->getId() ?>" class=" btn btn-success btn-sm" title="Edit"><i class="fas fa-pencil-alt"></i></a></td>
|
||||||
</tr>
|
</tr>
|
||||||
<?php endforeach ?>
|
<?php endforeach ?>
|
||||||
</tbody>
|
</tbody>
|
||||||
@@ -845,7 +849,7 @@ else if (isset($_REQUEST['search'])) {
|
|||||||
|
|
||||||
<?php if($hasLookAddons): ?>
|
<?php if($hasLookAddons): ?>
|
||||||
const $addonvalue = $('#look_addons');
|
const $addonvalue = $('#look_addons');
|
||||||
$addonvalue.on('change', () => {
|
$('#look_addons').on('change', () => {
|
||||||
updateOutfit();
|
updateOutfit();
|
||||||
});
|
});
|
||||||
<?php endif; ?>
|
<?php endif; ?>
|
||||||
@@ -862,7 +866,7 @@ else if (isset($_REQUEST['search'])) {
|
|||||||
<?php if($hasLookAddons): ?>
|
<?php if($hasLookAddons): ?>
|
||||||
look_addons = '&addons=' + $('#look_addons').val();
|
look_addons = '&addons=' + $('#look_addons').val();
|
||||||
<?php endif; ?>
|
<?php endif; ?>
|
||||||
$("#player_outfit").attr("src", '<?= setting('core.outfit_images_url'); ?>?id=' + look_type + look_addons + '&head=' + look_head + '&body=' + look_body + '&legs=' + look_legs + '&feet=' + look_feet);
|
$("#player_outfit").attr("src", '<?= $config['outfit_images_url']; ?>?id=' + look_type + look_addons + '&head=' + look_head + '&body=' + look_body + '&legs=' + look_legs + '&feet=' + look_feet);
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
<?php } ?>
|
<?php } ?>
|
||||||
@@ -874,20 +878,18 @@ else if (isset($_REQUEST['search'])) {
|
|||||||
<div class="card-body row">
|
<div class="card-body row">
|
||||||
<div class="col-6 col-lg-12">
|
<div class="col-6 col-lg-12">
|
||||||
<form action="<?php echo $player_base; ?>" method="post">
|
<form action="<?php echo $player_base; ?>" method="post">
|
||||||
<?php csrf(); ?>
|
<label for="name">Player Name:</label>
|
||||||
<label for="search">Player Name:</label>
|
|
||||||
<div class="input-group input-group-sm">
|
<div class="input-group input-group-sm">
|
||||||
<input type="text" class="form-control" id="search" name="search" value="<?= escapeHtml($search_player); ?>" maxlength="32" size="32">
|
<input type="text" class="form-control" name="search" value="<?php echo $search_player; ?>" maxlength="32" size="32">
|
||||||
<span class="input-group-append"><button type="submit" class="btn btn-info btn-flat">Search</button></span>
|
<span class="input-group-append"><button type="submit" class="btn btn-info btn-flat">Search</button></span>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-6 col-lg-12">
|
<div class="col-6 col-lg-12">
|
||||||
<form action="<?php echo $player_base; ?>" method="post">
|
<form action="<?php echo $player_base; ?>" method="post">
|
||||||
<?php csrf(); ?>
|
<label for="name">Player ID:</label>
|
||||||
<label for="id">Player ID:</label>
|
|
||||||
<div class="input-group input-group-sm">
|
<div class="input-group input-group-sm">
|
||||||
<input type="text" class="form-control" id="id" name="id" value="<?= $id; ?>" maxlength="32" size="32">
|
<input type="text" class="form-control" name="id" value="" maxlength="32" size="32">
|
||||||
<span class="input-group-append"><button type="submit" class="btn btn-info btn-flat">Search</button></span>
|
<span class="input-group-append"><button type="submit" class="btn btn-info btn-flat">Search</button></span>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
@@ -898,7 +900,7 @@ else if (isset($_REQUEST['search'])) {
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
$(function () {
|
$(document).ready(function () {
|
||||||
$('.player_datatable').DataTable({
|
$('.player_datatable').DataTable({
|
||||||
"order": [[0, "asc"]]
|
"order": [[0, "asc"]]
|
||||||
});
|
});
|
||||||
|
@@ -7,39 +7,35 @@
|
|||||||
* @copyright 2019 MyAAC
|
* @copyright 2019 MyAAC
|
||||||
* @link https://my-aac.org
|
* @link https://my-aac.org
|
||||||
*/
|
*/
|
||||||
|
|
||||||
use MyAAC\Plugins;
|
|
||||||
|
|
||||||
defined('MYAAC') or die('Direct access not allowed!');
|
defined('MYAAC') or die('Direct access not allowed!');
|
||||||
$title = 'Plugin manager';
|
$title = 'Plugin manager';
|
||||||
|
|
||||||
csrfProtect();
|
|
||||||
|
|
||||||
$use_datatable = true;
|
$use_datatable = true;
|
||||||
|
|
||||||
if (!getBoolean(setting('core.admin_plugins_manage_enable'))) {
|
require_once LIBS . 'plugins.php';
|
||||||
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>.');
|
|
||||||
|
if (!getBoolean(config('admin_plugins_manage_enable'))) {
|
||||||
|
warning('Plugin installation and management is disabled in config.<br/>If you wish to enable, go to config.php and change <b>admin_plugins_manage_enable</b> to "yes".');
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
$twig->display('admin.plugins.form.html.twig');
|
$twig->display('admin.plugins.form.html.twig');
|
||||||
|
|
||||||
if (isset($_POST['uninstall'])) {
|
if (isset($_REQUEST['uninstall'])) {
|
||||||
$uninstall = $_POST['uninstall'];
|
$uninstall = $_REQUEST['uninstall'];
|
||||||
|
|
||||||
if (Plugins::uninstall($uninstall)) {
|
if (Plugins::uninstall($uninstall)) {
|
||||||
success('Successfully uninstalled plugin ' . $uninstall);
|
success('Successfully uninstalled plugin ' . $uninstall);
|
||||||
} else {
|
} else {
|
||||||
error('Error while uninstalling plugin ' . $uninstall . ': ' . Plugins::getError());
|
error('Error while uninstalling plugin ' . $uninstall . ': ' . Plugins::getError());
|
||||||
}
|
}
|
||||||
} else if (isset($_POST['enable'])) {
|
} else if (isset($_REQUEST['enable'])) {
|
||||||
$enable = $_POST['enable'];
|
$enable = $_REQUEST['enable'];
|
||||||
if (Plugins::enable($enable)) {
|
if (Plugins::enable($enable)) {
|
||||||
success('Successfully enabled plugin ' . $enable);
|
success('Successfully enabled plugin ' . $enable);
|
||||||
} else {
|
} else {
|
||||||
error('Error while enabling plugin ' . $enable . ': ' . Plugins::getError());
|
error('Error while enabling plugin ' . $enable . ': ' . Plugins::getError());
|
||||||
}
|
}
|
||||||
} else if (isset($_POST['disable'])) {
|
} else if (isset($_REQUEST['disable'])) {
|
||||||
$disable = $_POST['disable'];
|
$disable = $_REQUEST['disable'];
|
||||||
if (Plugins::disable($disable)) {
|
if (Plugins::disable($disable)) {
|
||||||
success('Successfully disabled plugin ' . $disable);
|
success('Successfully disabled plugin ' . $disable);
|
||||||
} else {
|
} else {
|
||||||
@@ -120,7 +116,7 @@ foreach (get_plugins(true) as $plugin) {
|
|||||||
if (!$plugin_info) {
|
if (!$plugin_info) {
|
||||||
warning('Cannot load plugin info ' . $plugin . '.json');
|
warning('Cannot load plugin info ' . $plugin . '.json');
|
||||||
} else {
|
} else {
|
||||||
$disabled = (str_contains($plugin, 'disabled.'));
|
$disabled = (strpos($plugin, 'disabled.') !== false);
|
||||||
$pluginOriginal = ($disabled ? str_replace('disabled.', '', $plugin) : $plugin);
|
$pluginOriginal = ($disabled ? str_replace('disabled.', '', $plugin) : $plugin);
|
||||||
$plugins[] = array(
|
$plugins[] = array(
|
||||||
'name' => $plugin_info['name'] ?? '',
|
'name' => $plugin_info['name'] ?? '',
|
||||||
|
@@ -1,60 +0,0 @@
|
|||||||
<?php
|
|
||||||
/**
|
|
||||||
* Menus
|
|
||||||
*
|
|
||||||
* @package MyAAC
|
|
||||||
* @author Slawkens <slawkens@gmail.com>
|
|
||||||
* @copyright 2019 MyAAC
|
|
||||||
* @link https://my-aac.org
|
|
||||||
*/
|
|
||||||
|
|
||||||
use MyAAC\Plugins;
|
|
||||||
use MyAAC\Settings;
|
|
||||||
|
|
||||||
defined('MYAAC') or die('Direct access not allowed!');
|
|
||||||
$title = 'Settings';
|
|
||||||
|
|
||||||
require_once SYSTEM . 'clients.conf.php';
|
|
||||||
if (empty($_GET['plugin'])) {
|
|
||||||
error('Please select plugin from left Panel.');
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
$plugin = $_GET['plugin'];
|
|
||||||
|
|
||||||
if($plugin != 'core') {
|
|
||||||
$pluginSettings = Plugins::getPluginSettings($plugin);
|
|
||||||
if (!$pluginSettings) {
|
|
||||||
error('This plugin does not exist or does not have settings defined.');
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
$settingsFilePath = BASE . $pluginSettings;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
$settingsFilePath = SYSTEM . 'settings.php';
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!file_exists($settingsFilePath)) {
|
|
||||||
error("Plugin $plugin does not exist or does not have settings defined.");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
$settingsFile = require $settingsFilePath;
|
|
||||||
if (!is_array($settingsFile)) {
|
|
||||||
error("Cannot load settings file for plugin $plugin");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
$settingsKeyName = ($plugin == 'core' ? $plugin : $settingsFile['key']);
|
|
||||||
|
|
||||||
$title = ($plugin == 'core' ? 'Settings' : 'Plugin Settings - ' . $plugin);
|
|
||||||
|
|
||||||
$settingsParsed = Settings::display($settingsKeyName, $settingsFile['settings']);
|
|
||||||
|
|
||||||
$twig->display('admin.settings.html.twig', [
|
|
||||||
'settingsParsed' => $settingsParsed['content'],
|
|
||||||
'settings' => $settingsFile['settings'],
|
|
||||||
'script' => $settingsParsed['script'],
|
|
||||||
'settingsKeyName' => $settingsKeyName,
|
|
||||||
]);
|
|
@@ -7,25 +7,26 @@
|
|||||||
* @copyright 2019 MyAAC
|
* @copyright 2019 MyAAC
|
||||||
* @link https://my-aac.org
|
* @link https://my-aac.org
|
||||||
*/
|
*/
|
||||||
|
|
||||||
use MyAAC\Models\Account;
|
|
||||||
use MyAAC\Models\Guild;
|
|
||||||
use MyAAC\Models\House;
|
|
||||||
use MyAAC\Models\Player;
|
|
||||||
|
|
||||||
defined('MYAAC') or die('Direct access not allowed!');
|
defined('MYAAC') or die('Direct access not allowed!');
|
||||||
$title = 'Statistics';
|
$title = 'Statistics';
|
||||||
|
|
||||||
$total_accounts = Account::count();
|
$query = $db->query('SELECT count(*) as `how_much` FROM `accounts`;');
|
||||||
$total_players = Player::count();
|
$query = $query->fetch();
|
||||||
$total_guilds = Guild::count();
|
$total_accounts = $query['how_much'];
|
||||||
$total_houses = House::count();
|
|
||||||
|
|
||||||
$points = Account::select(['premium_points', (USE_ACCOUNT_NAME ? 'name' : 'id')])
|
$query = $db->query('SELECT count(*) as `how_much` FROM `players`;');
|
||||||
->orderByDesc('premium_points')
|
$query = $query->fetch();
|
||||||
->limit(10)
|
$total_players = $query['how_much'];
|
||||||
->get()
|
|
||||||
->toArray();
|
$query = $db->query('SELECT count(*) as `how_much` FROM `guilds`;');
|
||||||
|
$query = $query->fetch();
|
||||||
|
$total_guilds = $query['how_much'];
|
||||||
|
|
||||||
|
$query = $db->query('SELECT count(*) as `how_much` FROM `houses`;');
|
||||||
|
$query = $query->fetch();
|
||||||
|
$total_houses = $query['how_much'];
|
||||||
|
|
||||||
|
$points = $db->query('SELECT `premium_points`, `' . (USE_ACCOUNT_NAME ? 'name' : 'id') . '` as `name` FROM `accounts` ORDER BY `premium_points` DESC LIMIT 10;');
|
||||||
|
|
||||||
$twig->display('admin.statistics.html.twig', array(
|
$twig->display('admin.statistics.html.twig', array(
|
||||||
'total_accounts' => $total_accounts,
|
'total_accounts' => $total_accounts,
|
||||||
|
@@ -12,12 +12,11 @@ defined('MYAAC') or die('Direct access not allowed!');
|
|||||||
use DeviceDetector\DeviceDetector;
|
use DeviceDetector\DeviceDetector;
|
||||||
use DeviceDetector\Parser\Client\Browser;
|
use DeviceDetector\Parser\Client\Browser;
|
||||||
use DeviceDetector\Parser\OperatingSystem;
|
use DeviceDetector\Parser\OperatingSystem;
|
||||||
use MyAAC\Visitors;
|
|
||||||
|
|
||||||
$title = 'Visitors';
|
$title = 'Visitors';
|
||||||
$use_datatable = true;
|
$use_datatable = true;
|
||||||
|
|
||||||
if (!setting('core.visitors_counter')): ?>
|
if (!$config['visitors_counter']): ?>
|
||||||
Visitors counter is disabled.<br/>
|
Visitors counter is disabled.<br/>
|
||||||
You can enable it by editing this configurable in <b>config.local.php</b> file:<br/>
|
You can enable it by editing this configurable in <b>config.local.php</b> file:<br/>
|
||||||
<p style="margin-left: 3em;"><b>$config['visitors_counter'] = true;</b></p>
|
<p style="margin-left: 3em;"><b>$config['visitors_counter'] = true;</b></p>
|
||||||
@@ -25,9 +24,11 @@ if (!setting('core.visitors_counter')): ?>
|
|||||||
return;
|
return;
|
||||||
endif;
|
endif;
|
||||||
|
|
||||||
$visitors = new Visitors(setting('core.visitors_counter_ttl'));
|
require SYSTEM . 'libs/visitors.php';
|
||||||
|
$visitors = new Visitors($config['visitors_counter_ttl']);
|
||||||
|
|
||||||
function compare($a, $b): int {
|
function compare($a, $b)
|
||||||
|
{
|
||||||
return $a['lastvisit'] > $b['lastvisit'] ? -1 : 1;
|
return $a['lastvisit'] > $b['lastvisit'] ? -1 : 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -60,7 +61,7 @@ foreach ($tmp as &$visitor) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
$twig->display('admin.visitors.html.twig', array(
|
$twig->display('admin.visitors.html.twig', array(
|
||||||
'config_visitors_counter_ttl' => setting('core.visitors_counter_ttl'),
|
'config_visitors_counter_ttl' => $config['visitors_counter_ttl'],
|
||||||
'visitors' => $tmp
|
'visitors' => $tmp
|
||||||
));
|
));
|
||||||
?>
|
?>
|
||||||
|
@@ -2,10 +2,7 @@
|
|||||||
|
|
||||||
$menus = [
|
$menus = [
|
||||||
['name' => 'Dashboard', 'icon' => 'tachometer-alt', 'order' => 10, 'link' => 'dashboard'],
|
['name' => 'Dashboard', 'icon' => 'tachometer-alt', 'order' => 10, 'link' => 'dashboard'],
|
||||||
['name' => 'Settings', 'icon' => 'edit', 'order' => 19, 'link' =>
|
['name' => 'News', 'icon' => 'newspaper', 'order' => 20, 'link' =>
|
||||||
require ADMIN . 'includes/settings_menus.php'
|
|
||||||
],
|
|
||||||
['name' => 'News', 'icon' => 'newspaper', 'order' => 20, 'link' =>
|
|
||||||
[
|
[
|
||||||
['name' => 'View', 'link' => 'news', 'icon' => 'list', 'order' => 10],
|
['name' => 'View', 'link' => 'news', 'icon' => 'list', 'order' => 10],
|
||||||
['name' => 'Add news', 'link' => 'news&action=new&type=1', 'icon' => 'plus', 'order' => 20],
|
['name' => 'Add news', 'link' => 'news&action=new&type=1', 'icon' => 'plus', 'order' => 20],
|
||||||
@@ -19,7 +16,7 @@ $menus = [
|
|||||||
['name' => 'Add', 'link' => 'changelog&action=new', 'icon' => 'plus', 'order' => 20],
|
['name' => 'Add', 'link' => 'changelog&action=new', 'icon' => 'plus', 'order' => 20],
|
||||||
],
|
],
|
||||||
],
|
],
|
||||||
['name' => 'Mailer', 'icon' => 'envelope', 'order' => 40, 'link' => 'mailer', 'disabled' => !setting('core.mail_enabled')],
|
['name' => 'Mailer', 'icon' => 'envelope', 'order' => 40, 'link' => 'mailer', 'disabled' => !config('mail_enabled')],
|
||||||
['name' => 'Pages', 'icon' => 'book', 'order' => 50, 'link' =>
|
['name' => 'Pages', 'icon' => 'book', 'order' => 50, 'link' =>
|
||||||
[
|
[
|
||||||
['name' => 'View', 'link' => 'pages', 'icon' => 'list', 'order' => 10],
|
['name' => 'View', 'link' => 'pages', 'icon' => 'list', 'order' => 10],
|
||||||
|
@@ -7,9 +7,4 @@
|
|||||||
|
|
||||||
.sidebar-mini.sidebar-collapse .menu-text {
|
.sidebar-mini.sidebar-collapse .menu-text {
|
||||||
display: none;
|
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/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/jquery-ui.min.js"></script>
|
||||||
<?php if (isset($use_datatable)) { ?>
|
<?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.min.js"></script>
|
||||||
<script src="<?php echo BASE_URL; ?>tools/js/datatables.bs.min.js"></script>
|
<script src="<?php echo BASE_URL; ?>tools/js/datatables.bs.min.js"></script>
|
||||||
|
@@ -22,10 +22,7 @@
|
|||||||
* @copyright 2020 MyAAC
|
* @copyright 2020 MyAAC
|
||||||
* @link https://my-aac.org
|
* @link https://my-aac.org
|
||||||
*/
|
*/
|
||||||
|
define('MYAAC_ADMIN', true);
|
||||||
use MyAAC\DataLoader;
|
|
||||||
|
|
||||||
const MYAAC_ADMIN = true;
|
|
||||||
|
|
||||||
require '../../common.php';
|
require '../../common.php';
|
||||||
require SYSTEM . 'functions.php';
|
require SYSTEM . 'functions.php';
|
||||||
@@ -37,9 +34,11 @@ if (!admin())
|
|||||||
|
|
||||||
ini_set('max_execution_time', 300);
|
ini_set('max_execution_time', 300);
|
||||||
ob_implicit_flush();
|
ob_implicit_flush();
|
||||||
@ob_end_flush();
|
ob_end_flush();
|
||||||
header('X-Accel-Buffering: no');
|
header('X-Accel-Buffering: no');
|
||||||
|
|
||||||
|
require LIBS . 'DataLoader.php';
|
||||||
|
|
||||||
require LOCALE . 'en/main.php';
|
require LOCALE . 'en/main.php';
|
||||||
require LOCALE . 'en/install.php';
|
require LOCALE . 'en/install.php';
|
||||||
|
|
||||||
|
@@ -1,42 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
use MyAAC\Hooks;
|
|
||||||
use MyAAC\Settings;
|
|
||||||
|
|
||||||
const MYAAC_ADMIN = true;
|
|
||||||
|
|
||||||
require '../../common.php';
|
|
||||||
require SYSTEM . 'functions.php';
|
|
||||||
require SYSTEM . 'init.php';
|
|
||||||
require SYSTEM . 'login.php';
|
|
||||||
|
|
||||||
if(!admin()) {
|
|
||||||
http_response_code(500);
|
|
||||||
die('Access denied.');
|
|
||||||
}
|
|
||||||
|
|
||||||
csrfProtect();
|
|
||||||
|
|
||||||
if (!isset($_REQUEST['plugin'])) {
|
|
||||||
http_response_code(500);
|
|
||||||
die('Please enter plugin name.');
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!isset($_POST['settings'])) {
|
|
||||||
http_response_code(500);
|
|
||||||
die('Please enter settings.');
|
|
||||||
}
|
|
||||||
|
|
||||||
$settings = Settings::getInstance();
|
|
||||||
|
|
||||||
$success = $settings->save($_REQUEST['plugin'], $_POST['settings']);
|
|
||||||
|
|
||||||
$errors = $settings->getErrors();
|
|
||||||
if (count($errors) > 0) {
|
|
||||||
http_response_code(500);
|
|
||||||
die(implode('<br/>', $errors));
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($success) {
|
|
||||||
echo 'Saved at ' . date('H:i');
|
|
||||||
}
|
|
40
common.php
40
common.php
@@ -23,11 +23,11 @@
|
|||||||
* @copyright 2019 MyAAC
|
* @copyright 2019 MyAAC
|
||||||
* @link https://my-aac.org
|
* @link https://my-aac.org
|
||||||
*/
|
*/
|
||||||
if (version_compare(phpversion(), '8.1', '<')) die('PHP version 8.1 or higher is required.');
|
if (version_compare(phpversion(), '7.2.5', '<')) die('PHP version 7.2.5 or higher is required.');
|
||||||
|
|
||||||
const MYAAC = true;
|
const MYAAC = true;
|
||||||
const MYAAC_VERSION = '1.0-beta';
|
const MYAAC_VERSION = '0.9.0-alpha';
|
||||||
const DATABASE_VERSION = 40;
|
const DATABASE_VERSION = 35;
|
||||||
const TABLE_PREFIX = 'myaac_';
|
const TABLE_PREFIX = 'myaac_';
|
||||||
define('START_TIME', microtime(true));
|
define('START_TIME', microtime(true));
|
||||||
define('MYAAC_OS', stripos(PHP_OS, 'WIN') === 0 ? 'WINDOWS' : (strtoupper(PHP_OS) === 'DARWIN' ? 'MAC' : 'LINUX'));
|
define('MYAAC_OS', stripos(PHP_OS, 'WIN') === 0 ? 'WINDOWS' : (strtoupper(PHP_OS) === 'DARWIN' ? 'MAC' : 'LINUX'));
|
||||||
@@ -108,13 +108,6 @@ const TFS_FIRST = TFS_02;
|
|||||||
const TFS_LAST = TFS_03;
|
const TFS_LAST = TFS_03;
|
||||||
|
|
||||||
// other definitions
|
// other definitions
|
||||||
const MAIL_MAIL = 0;
|
|
||||||
const MAIL_SMTP = 1;
|
|
||||||
|
|
||||||
const SMTP_SECURITY_NONE = 0;
|
|
||||||
const SMTP_SECURITY_SSL = 1;
|
|
||||||
const SMTP_SECURITY_TLS = 2;
|
|
||||||
|
|
||||||
const ACCOUNT_NUMBER_LENGTH = 8;
|
const ACCOUNT_NUMBER_LENGTH = 8;
|
||||||
|
|
||||||
if (!IS_CLI) {
|
if (!IS_CLI) {
|
||||||
@@ -143,41 +136,16 @@ if(!IS_CLI) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
define('SERVER_URL', 'http' . (isHttps() ? 's' : '') . '://' . $baseHost);
|
define('SERVER_URL', 'http' . (isset($_SERVER['HTTPS'][0]) && strtolower($_SERVER['HTTPS']) === 'on' ? 's' : '') . '://' . $baseHost);
|
||||||
define('BASE_URL', SERVER_URL . BASE_DIR . '/');
|
define('BASE_URL', SERVER_URL . BASE_DIR . '/');
|
||||||
define('ADMIN_URL', SERVER_URL . BASE_DIR . '/' . ADMIN_PANEL_FOLDER . '/');
|
define('ADMIN_URL', SERVER_URL . BASE_DIR . '/' . ADMIN_PANEL_FOLDER . '/');
|
||||||
|
|
||||||
//define('CURRENT_URL', BASE_URL . $_SERVER['REQUEST_URI']);
|
//define('CURRENT_URL', BASE_URL . $_SERVER['REQUEST_URI']);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (file_exists(BASE . 'config.local.php')) {
|
|
||||||
require BASE . 'config.local.php';
|
|
||||||
}
|
|
||||||
|
|
||||||
/** @var array $config */
|
|
||||||
ini_set('log_errors', 1);
|
|
||||||
if(@$config['env'] === 'dev') {
|
|
||||||
ini_set('display_errors', 1);
|
|
||||||
ini_set('display_startup_errors', 1);
|
|
||||||
error_reporting(E_ALL);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
ini_set('display_errors', 0);
|
|
||||||
ini_set('display_startup_errors', 0);
|
|
||||||
error_reporting(E_ALL & ~E_DEPRECATED & ~E_STRICT);
|
|
||||||
}
|
|
||||||
|
|
||||||
$autoloadFile = VENDOR . 'autoload.php';
|
$autoloadFile = VENDOR . 'autoload.php';
|
||||||
if (!is_file($autoloadFile)) {
|
if (!is_file($autoloadFile)) {
|
||||||
throw new RuntimeException('The vendor folder is missing. Please download Composer: <a href="https://getcomposer.org/download">https://getcomposer.org/download</a>, install it and execute in the main MyAAC directory this command: <b>composer install</b>. Or download MyAAC from <a href="https://github.com/slawkens/myaac/releases">GitHub releases</a>, which includes Vendor folder.');
|
throw new RuntimeException('The vendor folder is missing. Please download Composer: <a href="https://getcomposer.org/download">https://getcomposer.org/download</a>, install it and execute in the main MyAAC directory this command: <b>composer install</b>. Or download MyAAC from <a href="https://github.com/slawkens/myaac/releases">GitHub releases</a>, which includes Vendor folder.');
|
||||||
}
|
}
|
||||||
|
|
||||||
require $autoloadFile;
|
require $autoloadFile;
|
||||||
|
|
||||||
function isHttps(): bool
|
|
||||||
{
|
|
||||||
return
|
|
||||||
(!empty($_SERVER['HTTP_X_FORWARDED_PROTO']) && strtolower($_SERVER['HTTP_X_FORWARDED_PROTO']) === 'https')
|
|
||||||
|| (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off')
|
|
||||||
|| (isset($_SERVER['SERVER_PORT']) && (int) $_SERVER['SERVER_PORT'] === 443);
|
|
||||||
}
|
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"require": {
|
"require": {
|
||||||
"php": "^8.0",
|
"php": "^7.2.5 || ^8.0",
|
||||||
"ext-pdo": "*",
|
"ext-pdo": "*",
|
||||||
"ext-pdo_mysql": "*",
|
"ext-pdo_mysql": "*",
|
||||||
"ext-json": "*",
|
"ext-json": "*",
|
||||||
@@ -11,22 +11,9 @@
|
|||||||
"twig/twig": "^2.0",
|
"twig/twig": "^2.0",
|
||||||
"erusev/parsedown": "^1.7",
|
"erusev/parsedown": "^1.7",
|
||||||
"nikic/fast-route": "^1.3",
|
"nikic/fast-route": "^1.3",
|
||||||
"matomo/device-detector": "^6.0",
|
"matomo/device-detector": "^6.0"
|
||||||
"illuminate/database": "^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"
|
|
||||||
},
|
},
|
||||||
"require-dev": {
|
"require-dev": {
|
||||||
"phpstan/phpstan": "^1.10"
|
"filp/whoops": "^2.15"
|
||||||
},
|
|
||||||
"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
318
config.php
Normal file
318
config.php
Normal file
@@ -0,0 +1,318 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* This is MyAAC's Main Configuration file
|
||||||
|
*
|
||||||
|
* All the default values are kept here, you should not modify it but use
|
||||||
|
* a config.local.php file instead to override the settings from here.
|
||||||
|
*
|
||||||
|
* This is a piece of PHP code so PHP syntax applies!
|
||||||
|
* For boolean values please use true/false.
|
||||||
|
*
|
||||||
|
* Minimally 'server_path' directive have to be filled, other options are optional.
|
||||||
|
*
|
||||||
|
* @package MyAAC
|
||||||
|
* @author Slawkens <slawkens@gmail.com>
|
||||||
|
* @copyright 2019 MyAAC
|
||||||
|
* @link https://my-aac.org
|
||||||
|
*/
|
||||||
|
|
||||||
|
$config = array(
|
||||||
|
// directories & files
|
||||||
|
'server_path' => '', // path to the server directory (same directory where config file is located)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Environment Setting
|
||||||
|
*
|
||||||
|
* if you use this script on your live server - set to 'prod' (production)
|
||||||
|
* if you want to test and debug the script locally, or develop plugins, set to 'dev' (development)
|
||||||
|
* WARNING: on 'dev' cache is disabled, so site will be significantly slower !!!
|
||||||
|
* WARNING2: on 'dev' all PHP errors/warnings are displayed
|
||||||
|
* Recommended: 'prod' cause of speed (page load time is better)
|
||||||
|
*/
|
||||||
|
'env' => 'prod', // 'prod' for production and 'dev' for development
|
||||||
|
|
||||||
|
'template' => 'kathrine', // template used by website (kathrine, tibiacom)
|
||||||
|
'template_allow_change' => true, // allow users to choose their own template while browsing website?
|
||||||
|
|
||||||
|
'vocations_amount' => 4, // how much basic vocations your server got (without promotion)
|
||||||
|
|
||||||
|
// what client version are you using on this OT?
|
||||||
|
// used for the Downloads page and some templates aswell
|
||||||
|
'client' => 1098, // 954 = client 9.54
|
||||||
|
|
||||||
|
'session_prefix' => 'myaac_', // must be unique for every site on your server
|
||||||
|
'friendly_urls' => false, // mod_rewrite is required for this, it makes links looks more elegant to eye, and also are SEO friendly (example: https://my-aac.org/guilds/Testing instead of https://my-aac.org/?subtopic=guilds&name=Testing). Remember to rename .htaccess.dist to .htaccess
|
||||||
|
'gzip_output' => false, // gzip page content before sending it to the browser, uses less bandwidth but more cpu cycles
|
||||||
|
|
||||||
|
// gesior backward support (templates & pages)
|
||||||
|
// allows using gesior templates and pages with myaac
|
||||||
|
// might bring some performance when disabled
|
||||||
|
'backward_support' => true,
|
||||||
|
|
||||||
|
// head options (html)
|
||||||
|
'meta_description' => 'Tibia is a free massive multiplayer online role playing game (MMORPG).', // description of the site
|
||||||
|
'meta_keywords' => 'free online game, free multiplayer game, ots, open tibia server', // keywords list separated by commas
|
||||||
|
|
||||||
|
// footer
|
||||||
|
'footer' => ''/*'<br/>Your Server © 2016. All rights reserved.'*/,
|
||||||
|
|
||||||
|
'language' => 'en', // default language (currently only 'en' available)
|
||||||
|
'language_allow_change' => false,
|
||||||
|
|
||||||
|
'visitors_counter' => true,
|
||||||
|
'visitors_counter_ttl' => 10, // how long visitor will be marked as online (in minutes)
|
||||||
|
'views_counter' => true,
|
||||||
|
|
||||||
|
// cache system. by default file cache is used
|
||||||
|
'cache_engine' => 'auto', // apc, apcu, eaccelerator, xcache, file, auto, or blank to disable.
|
||||||
|
'cache_prefix' => 'myaac_', // have to be unique if running more MyAAC instances on the same server (except file system cache)
|
||||||
|
|
||||||
|
// database details (leave blank for auto detect from config.lua)
|
||||||
|
'database_host' => '',
|
||||||
|
'database_port' => '', // leave blank to default 3306
|
||||||
|
'database_user' => '',
|
||||||
|
'database_password' => '',
|
||||||
|
'database_name' => '',
|
||||||
|
'database_log' => false, // should database queries be logged and saved into system/logs/database.log?
|
||||||
|
'database_socket' => '', // set if you want to connect to database through socket (example: /var/run/mysqld/mysqld.sock)
|
||||||
|
'database_persistent' => false, // use database permanent connection (like server), may speed up your site
|
||||||
|
|
||||||
|
// multiworld system (only TFS 0.3)
|
||||||
|
'multiworld' => false, // use multiworld system?
|
||||||
|
'worlds' => array( // list of worlds
|
||||||
|
//'1' => 'Your World Name',
|
||||||
|
//'2' => 'Your Second World Name'
|
||||||
|
),
|
||||||
|
|
||||||
|
// images
|
||||||
|
'outfit_images_url' => 'https://outfit-images.ots.me/outfit.php', // set to animoutfit.php for animated outfit
|
||||||
|
'outfit_images_wrong_looktypes' => [75, 126, 127, 266, 302], // this looktypes needs to have different margin-top and margin-left because they are wrong positioned
|
||||||
|
'item_images_url' => 'https://item-images.ots.me/1092/', // set to images/items if you host your own items in images folder
|
||||||
|
'item_images_extension' => '.gif',
|
||||||
|
|
||||||
|
// creatures
|
||||||
|
'creatures_images_url' => 'images/monsters/', // set to images/monsters if you host your own creatures in images folder
|
||||||
|
'creatures_images_extension' => '.gif',
|
||||||
|
'creatures_images_preview' => false, // set to true to allow picture previews for creatures
|
||||||
|
'creatures_items_url' => 'https://tibia.fandom.com/wiki/', // set to website which shows details about items.
|
||||||
|
'creatures_loot_percentage' => true, // set to true to show the loot tooltip percent
|
||||||
|
|
||||||
|
// account
|
||||||
|
'account_management' => true, // disable if you're using other method to manage users (fe. tfs account manager)
|
||||||
|
'account_login_by_email' => false, // use email instead of Account Name like in latest Tibia
|
||||||
|
'account_login_by_email_fallback' => false, // allow also additionally login by Account Name/Number (for users that might forget their email)
|
||||||
|
'account_create_auto_login' => false, // auto login after creating account?
|
||||||
|
'account_create_character_create' => true, // allow directly to create character on create account page?
|
||||||
|
'account_mail_verify' => false, // force users to confirm their email addresses when registering
|
||||||
|
'account_mail_confirmed_reward' => [ // reward users for confirming their E-Mails
|
||||||
|
// account_mail_verify needs to be enabled too
|
||||||
|
'premium_days' => 0,
|
||||||
|
'premium_points' => 0,
|
||||||
|
'coins' => 0,
|
||||||
|
'message' => 'You received %d %s for confirming your E-Mail address.' // example: You received 20 premium points for confirming your E-Mail address.
|
||||||
|
],
|
||||||
|
'account_mail_unique' => true, // email addresses cannot be duplicated? (one account = one email)
|
||||||
|
'account_mail_block_plus_sign' => true, // block email with '+' signs like test+box@gmail.com (help protect against spamming accounts)
|
||||||
|
'account_premium_days' => 0, // default premium days on new account
|
||||||
|
'account_premium_points' => 0, // default premium points on new account
|
||||||
|
'account_welcome_mail' => true, // send welcome email when user registers
|
||||||
|
'account_mail_change' => 2, // how many days user need to change email to account - block hackers
|
||||||
|
'account_country' => true, // user will be able to set country of origin when registering account, this information will be viewable in others places aswell
|
||||||
|
'account_country_recognize' => true, // should country of user be automatically recognized by his IP? This makes an external API call to http://ipinfo.io
|
||||||
|
'account_change_character_name' => false, // can user change their character name for premium points?
|
||||||
|
'account_change_character_name_points' => 30, // cost of name change
|
||||||
|
'account_change_character_sex' => false, // can user change their character sex for premium points?
|
||||||
|
'account_change_character_sex_points' => 30, // cost of sex change
|
||||||
|
'characters_per_account' => 10, // max. number of characters per account
|
||||||
|
|
||||||
|
// mail
|
||||||
|
'mail_enabled' => false, // is aac maker configured to send e-mails?
|
||||||
|
'mail_address' => 'no-reply@your-server.org', // server e-mail address (from:)
|
||||||
|
'mail_admin' => 'your-address@your-server.org', // admin email address, where mails from contact form will be sent
|
||||||
|
'mail_signature' => array( // signature that will be included at the end of every message sent using _mail function
|
||||||
|
'plain' => ""/*"--\nMy Server,\nhttp://www.myserver.com"*/,
|
||||||
|
'html' => ''/*'<br/>My Server,\n<a href="http://www.myserver.com">myserver.com</a>'*/
|
||||||
|
),
|
||||||
|
'smtp_enabled' => false, // send by smtp or mail function (set false if use mail function, set to true if you use GMail or Microsoft Outlook)
|
||||||
|
'smtp_host' => '', // mail host. smtp.gmail.com for GMail / smtp-mail.outlook.com for Microsoft Outlook
|
||||||
|
'smtp_port' => 25, // 25 (default) / 465 (ssl, GMail) / 587 (tls, Microsoft Outlook)
|
||||||
|
'smtp_auth' => true, // need authorization?
|
||||||
|
'smtp_user' => 'admin@example.org', // here your email username
|
||||||
|
'smtp_pass' => '',
|
||||||
|
'smtp_secure' => '', // What kind of encryption to use on the SMTP connection. Options: '', 'ssl' (GMail) or 'tls' (Microsoft Outlook)
|
||||||
|
'smtp_debug' => false, // set true to debug (you will see more info in error.log)
|
||||||
|
|
||||||
|
//
|
||||||
|
'generate_new_reckey' => true, // let player generate new recovery key, he will receive e-mail with new rec key (not display on page, hacker can't generate rec key)
|
||||||
|
'generate_new_reckey_price' => 20, // price for new recovery key
|
||||||
|
'send_mail_when_change_password' => true, // send e-mail with new password when change password to account
|
||||||
|
'send_mail_when_generate_reckey' => true, // send e-mail with rec key (key is displayed on page anyway when generate)
|
||||||
|
|
||||||
|
// you may need to adjust this for older tfs versions
|
||||||
|
// by removing Community Manager
|
||||||
|
'account_types' => [
|
||||||
|
'None',
|
||||||
|
'Normal',
|
||||||
|
'Tutor',
|
||||||
|
'Senior Tutor',
|
||||||
|
'Gamemaster',
|
||||||
|
'Community Manager',
|
||||||
|
'God',
|
||||||
|
],
|
||||||
|
|
||||||
|
// genders (aka sex)
|
||||||
|
'genders' => array(
|
||||||
|
0 => 'Female',
|
||||||
|
1 => 'Male'
|
||||||
|
),
|
||||||
|
|
||||||
|
// new character config
|
||||||
|
'character_samples' => array( // vocations, format: ID_of_vocation => 'Name of Character to copy'
|
||||||
|
//0 => 'Rook Sample',
|
||||||
|
1 => 'Sorcerer Sample',
|
||||||
|
2 => 'Druid Sample',
|
||||||
|
3 => 'Paladin Sample',
|
||||||
|
4 => 'Knight Sample'
|
||||||
|
),
|
||||||
|
|
||||||
|
'use_character_sample_skills' => false,
|
||||||
|
|
||||||
|
// it must show limited number of players after using search in character page
|
||||||
|
'characters_search_limit' => 15,
|
||||||
|
|
||||||
|
// town list used when creating character
|
||||||
|
// won't be displayed if there is only one item (rookgaard for example)
|
||||||
|
'character_towns' => array(1),
|
||||||
|
|
||||||
|
// characters length
|
||||||
|
// This is the minimum and the maximum length that a player can create a character. It is highly recommend the maximum length to be 21.
|
||||||
|
'character_name_min_length' => 4,
|
||||||
|
'character_name_max_length' => 21,
|
||||||
|
'character_name_npc_check' => true,
|
||||||
|
|
||||||
|
// list of towns
|
||||||
|
// if you use TFS 1.3 with support for 'towns' table in database, then you can ignore this - it will be configured automatically (from MySQL database - Table - towns)
|
||||||
|
// otherwise it will try to load from your .OTBM map file
|
||||||
|
// if you don't see towns on website, then you need to fill this out
|
||||||
|
'towns' => array(
|
||||||
|
0 => 'No town',
|
||||||
|
1 => 'Sample town'
|
||||||
|
),
|
||||||
|
|
||||||
|
// guilds
|
||||||
|
'guild_management' => true, // enable guild management system on the site?
|
||||||
|
'guild_need_level' => 1, // min. level to form a guild
|
||||||
|
'guild_need_premium' => true, // require premium account to form a guild?
|
||||||
|
'guild_image_size_kb' => 80, // maximum size of the guild logo image in KB (kilobytes)
|
||||||
|
'guild_description_default' => 'New guild. Leader must edit this text :)',
|
||||||
|
'guild_description_chars_limit' => 1000, // limit of guild description
|
||||||
|
'guild_description_lines_limit' => 6, // limit of lines, if description has more lines it will be showed as long text, without 'enters'
|
||||||
|
'guild_motd_chars_limit' => 150, // limit of MOTD (message of the day) that is shown later in the game on the guild channel
|
||||||
|
|
||||||
|
// online page
|
||||||
|
'online_record' => true, // display players record?
|
||||||
|
'online_vocations' => false, // display vocation statistics?
|
||||||
|
'online_vocations_images' => false, // display vocation images?
|
||||||
|
'online_skulls' => false, // display skull images
|
||||||
|
'online_outfit' => true,
|
||||||
|
'online_afk' => false,
|
||||||
|
|
||||||
|
// support list page
|
||||||
|
'team_style' => 2, // 1/2 (1 - normal table, 2 - in boxes, grouped by group id)
|
||||||
|
'team_display_status' => true,
|
||||||
|
'team_display_lastlogin' => true,
|
||||||
|
'team_display_world' => false,
|
||||||
|
'team_display_outfit' => true,
|
||||||
|
|
||||||
|
// bans page
|
||||||
|
'bans_per_page' => 20,
|
||||||
|
|
||||||
|
// highscores page
|
||||||
|
'highscores_vocation_box' => true, // show 'Choose a vocation' box on the highscores (allowing peoples to sort highscores by vocation)?
|
||||||
|
'highscores_vocation' => true, // show player vocation under his nickname?
|
||||||
|
'highscores_frags' => false, // show 'Frags' tab (best fraggers on the server)?
|
||||||
|
'highscores_balance' => false, // show 'Balance' tab (richest players on the server)
|
||||||
|
'highscores_outfit' => true, // show player outfit?
|
||||||
|
'highscores_country_box' => false, // doesnt work yet! (not implemented)
|
||||||
|
'highscores_groups_hidden' => 3, // this group id and higher won't be shown on the highscores
|
||||||
|
'highscores_ids_hidden' => array(0), // this ids of players will be hidden on the highscores (should be ids of samples)
|
||||||
|
'highscores_per_page' => 100, // how many records per page on highscores
|
||||||
|
'highscores_cache_ttl' => 15, // how often to update highscores from database in minutes (default 15 minutes)
|
||||||
|
|
||||||
|
// characters page
|
||||||
|
'characters' => array( // what things to display on character view page (true/false in each option)
|
||||||
|
'level' => true,
|
||||||
|
'experience' => false,
|
||||||
|
'magic_level' => false,
|
||||||
|
'balance' => false,
|
||||||
|
'marriage_info' => true, // only 0.3
|
||||||
|
'outfit' => true,
|
||||||
|
'creation_date' => true,
|
||||||
|
'quests' => true,
|
||||||
|
'skills' => true,
|
||||||
|
'equipment' => true,
|
||||||
|
'frags' => false,
|
||||||
|
'deleted' => false, // should deleted characters from same account be still listed on the list of characters? When enabled it will show that character is "[DELETED]"
|
||||||
|
),
|
||||||
|
'quests' => array(
|
||||||
|
//'Some Quest' => 123,
|
||||||
|
//'Some Quest Two' => 456,
|
||||||
|
), // quests list (displayed in character view), name => storage
|
||||||
|
'signature_enabled' => true,
|
||||||
|
'signature_type' => 'tibian', // signature engine to use: tibian, mango, gesior
|
||||||
|
'signature_cache_time' => 5, // how long to store cached file (in minutes), default 5 minutes
|
||||||
|
'signature_browser_cache' => 60, // how long to cache by browser (in minutes), default 1 hour
|
||||||
|
|
||||||
|
// news page
|
||||||
|
'news_limit' => 5, // limit of news on the latest news page
|
||||||
|
'news_ticker_limit' => 5, // limit of news in tickers (mini news) (0 to disable)
|
||||||
|
'news_date_format' => 'j.n.Y', // check php manual date() function for more info about this
|
||||||
|
'news_author' => true, // show author of the news
|
||||||
|
|
||||||
|
// gifts/shop system
|
||||||
|
'gifts_system' => false,
|
||||||
|
|
||||||
|
// support/system
|
||||||
|
'bug_report' => true, // this configurable has no effect, its always enabled
|
||||||
|
|
||||||
|
// forum
|
||||||
|
'forum' => 'site', // link to the server forum, set to "site" if you want to use build in forum system, otherwise leave empty if you aren't going to use any forum
|
||||||
|
'forum_level_required' => 0, // level required to post, 0 to disable
|
||||||
|
'forum_post_interval' => 30, // in seconds
|
||||||
|
'forum_posts_per_page' => 20,
|
||||||
|
'forum_threads_per_page' => 20,
|
||||||
|
// uncomment to force use table for forum
|
||||||
|
//'forum_table_prefix' => 'z_', // what forum mysql table to use, z_ (for gesior old forum) or myaac_ (for myaac)
|
||||||
|
|
||||||
|
// last kills
|
||||||
|
'last_kills_limit' => 50, // max. number of deaths shown on the last kills page
|
||||||
|
|
||||||
|
// status, took automatically from config file if empty
|
||||||
|
'status_enabled' => true, // you can disable status checking by settings this to "false"
|
||||||
|
'status_ip' => '',
|
||||||
|
'status_port' => '',
|
||||||
|
'status_timeout' => 2.0, // how long to wait for the initial response from the server (default: 2 seconds)
|
||||||
|
|
||||||
|
// how often to connect to server and update status (default: every minute)
|
||||||
|
// if your status timeout in config.lua is bigger, that it will be used instead
|
||||||
|
// when server is offline, it will be checked every time web refreshes, ignoring this variable
|
||||||
|
'status_interval' => 60,
|
||||||
|
|
||||||
|
// admin panel
|
||||||
|
'admin_plugins_manage_enable' => 'yes', // you can disable possibility to upload and uninstall plugins, for security
|
||||||
|
// enable support for plain php pages in admin panel, for security
|
||||||
|
// existing pages still will be working, so you need to delete them manually
|
||||||
|
'admin_pages_php_enable' => 'no',
|
||||||
|
'admin_panel_modules' => 'statistics,web_status,server_status,lastlogin,created,points,coins,balance', // default - statistics,web_status,server_status,lastlogin,created,points,coins,balance
|
||||||
|
|
||||||
|
// other
|
||||||
|
'anonymous_usage_statistics' => true,
|
||||||
|
'email_lai_sec_interval' => 60, // time in seconds between e-mails to one account from lost account interface, block spam
|
||||||
|
'google_analytics_id' => '', // e.g.: UA-XXXXXXX-X
|
||||||
|
'experiencetable_columns' => 3, // how many columns to display in experience table page. * experiencetable_rows, 5 = 500 (will show up to 500 level)
|
||||||
|
'experiencetable_rows' => 200, // till how many levels in one column
|
||||||
|
'date_timezone' => 'Europe/Berlin', // more info at http://php.net/manual/en/timezones.php
|
||||||
|
'footer_show_load_time' => true, // display load time of the page in the footer
|
||||||
|
|
||||||
|
'npc' => array()
|
||||||
|
);
|
@@ -38,6 +38,7 @@ describe('Install MyAAC', () => {
|
|||||||
cy.contains('Basic configuration');
|
cy.contains('Basic configuration');
|
||||||
|
|
||||||
cy.get('#vars_server_path').click().clear().type(Cypress.env('SERVER_PATH'))
|
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
|
cy.get('[type="checkbox"]').uncheck() // usage statistics uncheck
|
||||||
|
|
||||||
@@ -67,9 +68,7 @@ describe('Install MyAAC', () => {
|
|||||||
|
|
||||||
cy.get('form').submit()
|
cy.get('form').submit()
|
||||||
|
|
||||||
cy.contains('[class="alert alert-success"]', 'Congratulations', { timeout: 60000 }).should('be.visible')
|
cy.contains('[class="alert alert-success"]', 'Congratulations', { timeout: 30000 }).should('be.visible')
|
||||||
|
|
||||||
cy.wait(2000);
|
|
||||||
|
|
||||||
cy.screenshot('install-finish')
|
cy.screenshot('install-finish')
|
||||||
})
|
})
|
||||||
|
@@ -14,7 +14,7 @@ describe('Create Account Page', () => {
|
|||||||
cy.get('#email').type('tester@example.com')
|
cy.get('#email').type('tester@example.com')
|
||||||
|
|
||||||
cy.get('#password').type('test1234')
|
cy.get('#password').type('test1234')
|
||||||
cy.get('#password_confirm').type('test1234')
|
cy.get('#password2').type('test1234')
|
||||||
|
|
||||||
cy.get('#character_name').type('Slaw')
|
cy.get('#character_name').type('Slaw')
|
||||||
|
|
||||||
@@ -22,7 +22,7 @@ describe('Create Account Page', () => {
|
|||||||
cy.get('#vocation1').check()
|
cy.get('#vocation1').check()
|
||||||
cy.get('#accept_rules').check()
|
cy.get('#accept_rules').check()
|
||||||
|
|
||||||
cy.get('#form').submit()
|
cy.get('#createaccount').submit()
|
||||||
|
|
||||||
// no errors please
|
// no errors please
|
||||||
cy.contains('The Following Errors Have Occurred:').should('not.exist')
|
cy.contains('The Following Errors Have Occurred:').should('not.exist')
|
||||||
|
@@ -82,7 +82,7 @@ describe('Check Public Pages', () => {
|
|||||||
|
|
||||||
it('Go to last kills page', () => {
|
it('Go to last kills page', () => {
|
||||||
cy.visit({
|
cy.visit({
|
||||||
url: Cypress.env('URL') + '/last-kills',
|
url: Cypress.env('URL') + '/lastkills',
|
||||||
method: 'GET',
|
method: 'GET',
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
@@ -132,7 +132,7 @@ describe('Check Public Pages', () => {
|
|||||||
|
|
||||||
it('Go to server info page', () => {
|
it('Go to server info page', () => {
|
||||||
cy.visit({
|
cy.visit({
|
||||||
url: Cypress.env('URL') + '/server-info',
|
url: Cypress.env('URL') + '/serverInfo',
|
||||||
method: 'GET',
|
method: 'GET',
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
@@ -160,7 +160,7 @@ describe('Check Public Pages', () => {
|
|||||||
|
|
||||||
it('Go to experience table page', () => {
|
it('Go to experience table page', () => {
|
||||||
cy.visit({
|
cy.visit({
|
||||||
url: Cypress.env('URL') + '/exp-table',
|
url: Cypress.env('URL') + '/experienceTable',
|
||||||
method: 'GET',
|
method: 'GET',
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
122
index.php
122
index.php
@@ -24,9 +24,6 @@
|
|||||||
* @link https://my-aac.org
|
* @link https://my-aac.org
|
||||||
*/
|
*/
|
||||||
|
|
||||||
use MyAAC\UsageStatistics;
|
|
||||||
use MyAAC\Visitors;
|
|
||||||
|
|
||||||
require_once 'common.php';
|
require_once 'common.php';
|
||||||
require_once SYSTEM . 'functions.php';
|
require_once SYSTEM . 'functions.php';
|
||||||
|
|
||||||
@@ -59,16 +56,41 @@ if(preg_match("/^(.*)\.(gif|jpg|png|jpeg|tiff|bmp|css|js|less|map|html|zip|rar|g
|
|||||||
exit;
|
exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(file_exists(BASE . 'config.local.php')) {
|
||||||
|
require_once BASE . 'config.local.php';
|
||||||
|
}
|
||||||
|
|
||||||
|
ini_set('log_errors', 1);
|
||||||
|
if(config('env') === 'dev') {
|
||||||
|
ini_set('display_errors', 1);
|
||||||
|
ini_set('display_startup_errors', 1);
|
||||||
|
error_reporting(E_ALL);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
ini_set('display_errors', 0);
|
||||||
|
ini_set('display_startup_errors', 0);
|
||||||
|
error_reporting(E_ALL & ~E_DEPRECATED & ~E_STRICT);
|
||||||
|
}
|
||||||
|
|
||||||
if((!isset($config['installed']) || !$config['installed']) && file_exists(BASE . 'install'))
|
if((!isset($config['installed']) || !$config['installed']) && file_exists(BASE . 'install'))
|
||||||
{
|
{
|
||||||
header('Location: ' . BASE_URL . '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();
|
$template_place_holders = array();
|
||||||
|
|
||||||
require_once SYSTEM . 'init.php';
|
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.');
|
||||||
|
}
|
||||||
|
|
||||||
|
// event system
|
||||||
|
require_once SYSTEM . 'hooks.php';
|
||||||
|
$hooks = new Hooks();
|
||||||
|
$hooks->load();
|
||||||
require_once SYSTEM . 'template.php';
|
require_once SYSTEM . 'template.php';
|
||||||
require_once SYSTEM . 'login.php';
|
require_once SYSTEM . 'login.php';
|
||||||
require_once SYSTEM . 'status.php';
|
require_once SYSTEM . 'status.php';
|
||||||
@@ -76,52 +98,15 @@ require_once SYSTEM . 'status.php';
|
|||||||
$twig->addGlobal('config', $config);
|
$twig->addGlobal('config', $config);
|
||||||
$twig->addGlobal('status', $status);
|
$twig->addGlobal('status', $status);
|
||||||
|
|
||||||
// backward support for gesior
|
|
||||||
if(setting('core.backward_support')) {
|
|
||||||
define('INITIALIZED', true);
|
|
||||||
$SQL = $db;
|
|
||||||
$layout_header = template_header();
|
|
||||||
$layout_name = $template_path;
|
|
||||||
$news_content = '';
|
|
||||||
$tickers_content = '';
|
|
||||||
$main_content = '';
|
|
||||||
|
|
||||||
$config['access_admin_panel'] = 2;
|
|
||||||
$group_id_of_acc_logged = 0;
|
|
||||||
if($logged && $account_logged)
|
|
||||||
$group_id_of_acc_logged = $account_logged->getGroupId();
|
|
||||||
|
|
||||||
$config['site'] = &$config;
|
|
||||||
$config['server'] = &$config['lua'];
|
|
||||||
$config['site']['shop_system'] = setting('core.gifts_system');
|
|
||||||
$config['site']['gallery_page'] = true;
|
|
||||||
|
|
||||||
if(!isset($config['vdarkborder']))
|
|
||||||
$config['vdarkborder'] = '#505050';
|
|
||||||
if(!isset($config['darkborder']))
|
|
||||||
$config['darkborder'] = '#D4C0A1';
|
|
||||||
if(!isset($config['lightborder']))
|
|
||||||
$config['lightborder'] = '#F1E0C6';
|
|
||||||
|
|
||||||
$config['site']['download_page'] = true;
|
|
||||||
$config['site']['serverinfo_page'] = true;
|
|
||||||
$config['site']['screenshot_page'] = true;
|
|
||||||
|
|
||||||
$forumSetting = setting('core.forum');
|
|
||||||
if($forumSetting != '')
|
|
||||||
$config['forum_link'] = (strtolower($forumSetting) === 'site' ? getLink('forum') : $forumSetting);
|
|
||||||
|
|
||||||
foreach($status as $key => $value)
|
|
||||||
$config['status']['serverStatus_' . $key] = $value;
|
|
||||||
}
|
|
||||||
|
|
||||||
require_once SYSTEM . 'router.php';
|
require_once SYSTEM . 'router.php';
|
||||||
|
|
||||||
|
require SYSTEM . 'migrate.php';
|
||||||
|
|
||||||
$hooks->trigger(HOOK_STARTUP);
|
$hooks->trigger(HOOK_STARTUP);
|
||||||
|
|
||||||
// anonymous usage statistics
|
// anonymous usage statistics
|
||||||
// sent only when user agrees
|
// sent only when user agrees
|
||||||
if(setting('core.anonymous_usage_statistics')) {
|
if(isset($config['anonymous_usage_statistics']) && $config['anonymous_usage_statistics']) {
|
||||||
$report_time = 30 * 24 * 60 * 60; // report one time per 30 days
|
$report_time = 30 * 24 * 60 * 60; // report one time per 30 days
|
||||||
$should_report = true;
|
$should_report = true;
|
||||||
|
|
||||||
@@ -144,7 +129,8 @@ if(setting('core.anonymous_usage_statistics')) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if($should_report) {
|
if($should_report) {
|
||||||
UsageStatistics::report();
|
require_once LIBS . 'usage_statistics.php';
|
||||||
|
Usage_Statistics::report();
|
||||||
|
|
||||||
updateDatabaseConfig('last_usage_report', time());
|
updateDatabaseConfig('last_usage_report', time());
|
||||||
if($cache->enabled()) {
|
if($cache->enabled()) {
|
||||||
@@ -153,11 +139,51 @@ if(setting('core.anonymous_usage_statistics')) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(setting('core.views_counter'))
|
if($config['views_counter'])
|
||||||
require_once SYSTEM . 'counter.php';
|
require_once SYSTEM . 'counter.php';
|
||||||
|
|
||||||
if(setting('core.visitors_counter')) {
|
if($config['visitors_counter'])
|
||||||
$visitors = new Visitors(setting('core.visitors_counter_ttl'));
|
{
|
||||||
|
require_once SYSTEM . 'libs/visitors.php';
|
||||||
|
$visitors = new Visitors($config['visitors_counter_ttl']);
|
||||||
|
}
|
||||||
|
|
||||||
|
// backward support for gesior
|
||||||
|
if($config['backward_support']) {
|
||||||
|
define('INITIALIZED', true);
|
||||||
|
$SQL = $db;
|
||||||
|
$layout_header = template_header();
|
||||||
|
$layout_name = $template_path;
|
||||||
|
$news_content = '';
|
||||||
|
$tickers_content = '';
|
||||||
|
$main_content = '';
|
||||||
|
|
||||||
|
$config['access_admin_panel'] = 2;
|
||||||
|
$group_id_of_acc_logged = 0;
|
||||||
|
if($logged && $account_logged)
|
||||||
|
$group_id_of_acc_logged = $account_logged->getGroupId();
|
||||||
|
|
||||||
|
$config['site'] = &$config;
|
||||||
|
$config['server'] = &$config['lua'];
|
||||||
|
$config['site']['shop_system'] = $config['gifts_system'];
|
||||||
|
$config['site']['gallery_page'] = true;
|
||||||
|
|
||||||
|
if(!isset($config['vdarkborder']))
|
||||||
|
$config['vdarkborder'] = '#505050';
|
||||||
|
if(!isset($config['darkborder']))
|
||||||
|
$config['darkborder'] = '#D4C0A1';
|
||||||
|
if(!isset($config['lightborder']))
|
||||||
|
$config['lightborder'] = '#F1E0C6';
|
||||||
|
|
||||||
|
$config['site']['download_page'] = true;
|
||||||
|
$config['site']['serverinfo_page'] = true;
|
||||||
|
$config['site']['screenshot_page'] = true;
|
||||||
|
|
||||||
|
if($config['forum'] != '')
|
||||||
|
$config['forum_link'] = (strtolower($config['forum']) === 'site' ? getLink('forum') : $config['forum']);
|
||||||
|
|
||||||
|
foreach($status as $key => $value)
|
||||||
|
$config['status']['serverStatus_' . $key] = $value;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -11,13 +11,13 @@ function query($query)
|
|||||||
error($error_);
|
error($error_);
|
||||||
$error = true;
|
$error = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
return !$error;
|
return !$error;
|
||||||
}
|
}
|
||||||
|
|
||||||
// define php version id if its not already
|
// define php version id if its not already
|
||||||
if(!defined('PHP_VERSION_ID')) {
|
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]));
|
define('PHP_VERSION_ID', ($version[0] * 10000 + $version[1] * 100 + $version[2]));
|
||||||
}
|
}
|
||||||
@@ -97,4 +97,4 @@ function win_is_writable($path) {
|
|||||||
unlink($path);
|
unlink($path);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
@@ -1,4 +1,4 @@
|
|||||||
SET @myaac_database_version = 40;
|
SET @myaac_database_version = 35;
|
||||||
|
|
||||||
CREATE TABLE `myaac_account_actions`
|
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',
|
`where` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '1 - server, 2 - site',
|
||||||
`date` INT(11) NOT NULL DEFAULT 0,
|
`date` INT(11) NOT NULL DEFAULT 0,
|
||||||
`player_id` 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`)
|
PRIMARY KEY (`id`)
|
||||||
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8;
|
) 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`
|
CREATE TABLE `myaac_config`
|
||||||
(
|
(
|
||||||
@@ -67,7 +67,7 @@ CREATE TABLE `myaac_faq`
|
|||||||
`question` VARCHAR(255) NOT NULL DEFAULT '',
|
`question` VARCHAR(255) NOT NULL DEFAULT '',
|
||||||
`answer` VARCHAR(1020) NOT NULL DEFAULT '',
|
`answer` VARCHAR(1020) NOT NULL DEFAULT '',
|
||||||
`ordering` INT(11) NOT NULL DEFAULT 0,
|
`ordering` INT(11) NOT NULL DEFAULT 0,
|
||||||
`hide` TINYINT(1) NOT NULL DEFAULT 0,
|
`hidden` TINYINT(1) NOT NULL DEFAULT 0,
|
||||||
PRIMARY KEY (`id`)
|
PRIMARY KEY (`id`)
|
||||||
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8;
|
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8;
|
||||||
|
|
||||||
@@ -80,7 +80,7 @@ CREATE TABLE `myaac_forum_boards`
|
|||||||
`guild` INT(11) NOT NULL DEFAULT 0,
|
`guild` INT(11) NOT NULL DEFAULT 0,
|
||||||
`access` INT(11) NOT NULL DEFAULT 0,
|
`access` INT(11) NOT NULL DEFAULT 0,
|
||||||
`closed` TINYINT(1) 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`)
|
PRIMARY KEY (`id`)
|
||||||
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8;
|
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8;
|
||||||
INSERT INTO `myaac_forum_boards` (`id`, `name`, `description`, `ordering`, `closed`) VALUES (NULL, 'News', 'News commenting', 0, 1);
|
INSERT INTO `myaac_forum_boards` (`id`, `name`, `description`, `ordering`, `closed`) VALUES (NULL, 'News', 'News commenting', 0, 1);
|
||||||
@@ -127,9 +127,78 @@ CREATE TABLE `myaac_menu`
|
|||||||
PRIMARY KEY (`id`)
|
PRIMARY KEY (`id`)
|
||||||
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8;
|
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8;
|
||||||
|
|
||||||
|
/* MENU_CATEGORY_NEWS kathrine */
|
||||||
|
INSERT INTO `myaac_menu` (`template`, `name`, `link`, `category`, `ordering`) VALUES ('kathrine', 'Latest News', 'news', 1, 0);
|
||||||
|
INSERT INTO `myaac_menu` (`template`, `name`, `link`, `category`, `ordering`) VALUES ('kathrine', 'News Archive', 'news/archive', 1, 1);
|
||||||
|
INSERT INTO `myaac_menu` (`template`, `name`, `link`, `category`, `ordering`) VALUES ('kathrine', 'Changelog', 'changelog', 1, 2);
|
||||||
|
/* MENU_CATEGORY_ACCOUNT kathrine */
|
||||||
|
INSERT INTO `myaac_menu` (`template`, `name`, `link`, `category`, `ordering`) VALUES ('kathrine', 'Account Management', 'account/manage', 2, 0);
|
||||||
|
INSERT INTO `myaac_menu` (`template`, `name`, `link`, `category`, `ordering`) VALUES ('kathrine', 'Create Account', 'account/create', 2, 1);
|
||||||
|
INSERT INTO `myaac_menu` (`template`, `name`, `link`, `category`, `ordering`) VALUES ('kathrine', 'Lost Account?', 'account/lost', 2, 2);
|
||||||
|
INSERT INTO `myaac_menu` (`template`, `name`, `link`, `category`, `ordering`) VALUES ('kathrine', 'Server Rules', 'rules', 2, 3);
|
||||||
|
INSERT INTO `myaac_menu` (`template`, `name`, `link`, `category`, `ordering`) VALUES ('kathrine', 'Downloads', 'downloads', 5, 4);
|
||||||
|
INSERT INTO `myaac_menu` (`template`, `name`, `link`, `category`, `ordering`) VALUES ('kathrine', 'Report Bug', 'bugtracker', 2, 5);
|
||||||
|
/* MENU_CATEGORY_COMMUNITY kathrine */
|
||||||
|
INSERT INTO `myaac_menu` (`template`, `name`, `link`, `category`, `ordering`) VALUES ('kathrine', 'Who is Online?', 'online', 3, 0);
|
||||||
|
INSERT INTO `myaac_menu` (`template`, `name`, `link`, `category`, `ordering`) VALUES ('kathrine', 'Characters', 'characters', 3, 1);
|
||||||
|
INSERT INTO `myaac_menu` (`template`, `name`, `link`, `category`, `ordering`) VALUES ('kathrine', 'Guilds', 'guilds', 3, 2);
|
||||||
|
INSERT INTO `myaac_menu` (`template`, `name`, `link`, `category`, `ordering`) VALUES ('kathrine', 'Highscores', 'highscores', 3, 3);
|
||||||
|
INSERT INTO `myaac_menu` (`template`, `name`, `link`, `category`, `ordering`) VALUES ('kathrine', 'Last Deaths', 'lastkills', 3, 4);
|
||||||
|
INSERT INTO `myaac_menu` (`template`, `name`, `link`, `category`, `ordering`) VALUES ('kathrine', 'Houses', 'houses', 3, 5);
|
||||||
|
INSERT INTO `myaac_menu` (`template`, `name`, `link`, `category`, `ordering`) VALUES ('kathrine', 'Bans', 'bans', 3, 6);
|
||||||
|
INSERT INTO `myaac_menu` (`template`, `name`, `link`, `category`, `ordering`) VALUES ('kathrine', 'Forum', 'forum', 3, 7);
|
||||||
|
INSERT INTO `myaac_menu` (`template`, `name`, `link`, `category`, `ordering`) VALUES ('kathrine', 'Team', 'team', 3, 8);
|
||||||
|
/* MENU_CATEGORY_LIBRARY kathrine */
|
||||||
|
INSERT INTO `myaac_menu` (`template`, `name`, `link`, `category`, `ordering`) VALUES ('kathrine', 'Monsters', 'creatures', 5, 0);
|
||||||
|
INSERT INTO `myaac_menu` (`template`, `name`, `link`, `category`, `ordering`) VALUES ('kathrine', 'Spells', 'spells', 5, 1);
|
||||||
|
INSERT INTO `myaac_menu` (`template`, `name`, `link`, `category`, `ordering`) VALUES ('kathrine', 'Server Info', 'serverInfo', 5, 2);
|
||||||
|
INSERT INTO `myaac_menu` (`template`, `name`, `link`, `category`, `ordering`) VALUES ('kathrine', 'Commands', 'commands', 5, 3);
|
||||||
|
INSERT INTO `myaac_menu` (`template`, `name`, `link`, `category`, `ordering`) VALUES ('kathrine', 'Gallery', 'gallery', 5, 4);
|
||||||
|
INSERT INTO `myaac_menu` (`template`, `name`, `link`, `category`, `ordering`) VALUES ('kathrine', 'Experience Table', 'experienceTable', 5, 5);
|
||||||
|
INSERT INTO `myaac_menu` (`template`, `name`, `link`, `category`, `ordering`) VALUES ('kathrine', 'FAQ', 'faq', 5, 6);
|
||||||
|
/* MENU_CATEGORY_SHOP kathrine */
|
||||||
|
INSERT INTO `myaac_menu` (`template`, `name`, `link`, `category`, `ordering`) VALUES ('kathrine', 'Buy Points', 'points', 6, 0);
|
||||||
|
INSERT INTO `myaac_menu` (`template`, `name`, `link`, `category`, `ordering`) VALUES ('kathrine', 'Shop Offer', 'gifts', 6, 1);
|
||||||
|
INSERT INTO `myaac_menu` (`template`, `name`, `link`, `category`, `ordering`) VALUES ('kathrine', 'Shop History', 'gifts/history', 6, 2);
|
||||||
|
/* MENU_CATEGORY_NEWS tibiacom */
|
||||||
|
INSERT INTO `myaac_menu` (`template`, `name`, `link`, `category`, `ordering`) VALUES ('tibiacom', 'Latest News', 'news', 1, 0);
|
||||||
|
INSERT INTO `myaac_menu` (`template`, `name`, `link`, `category`, `ordering`) VALUES ('tibiacom', 'News Archive', 'news/archive', 1, 1);
|
||||||
|
INSERT INTO `myaac_menu` (`template`, `name`, `link`, `category`, `ordering`) VALUES ('tibiacom', 'Changelog', 'changelog', 1, 2);
|
||||||
|
/* MENU_CATEGORY_ACCOUNT tibiacom */
|
||||||
|
INSERT INTO `myaac_menu` (`template`, `name`, `link`, `category`, `ordering`) VALUES ('tibiacom', 'Account Management', 'account/manage', 2, 0);
|
||||||
|
INSERT INTO `myaac_menu` (`template`, `name`, `link`, `category`, `ordering`) VALUES ('tibiacom', 'Create Account', 'account/create', 2, 1);
|
||||||
|
INSERT INTO `myaac_menu` (`template`, `name`, `link`, `category`, `ordering`) VALUES ('tibiacom', 'Lost Account?', 'account/lost', 2, 2);
|
||||||
|
INSERT INTO `myaac_menu` (`template`, `name`, `link`, `category`, `ordering`) VALUES ('tibiacom', 'Server Rules', 'rules', 2, 3);
|
||||||
|
INSERT INTO `myaac_menu` (`template`, `name`, `link`, `category`, `ordering`) VALUES ('tibiacom', 'Downloads', 'downloads', 2, 4);
|
||||||
|
INSERT INTO `myaac_menu` (`template`, `name`, `link`, `category`, `ordering`) VALUES ('tibiacom', 'Report Bug', 'bugtracker', 2, 5);
|
||||||
|
/* MENU_CATEGORY_COMMUNITY tibiacom */
|
||||||
|
INSERT INTO `myaac_menu` (`template`, `name`, `link`, `category`, `ordering`) VALUES ('tibiacom', 'Characters', 'characters', 3, 0);
|
||||||
|
INSERT INTO `myaac_menu` (`template`, `name`, `link`, `category`, `ordering`) VALUES ('tibiacom', 'Who Is Online?', 'online', 3, 1);
|
||||||
|
INSERT INTO `myaac_menu` (`template`, `name`, `link`, `category`, `ordering`) VALUES ('tibiacom', 'Highscores', 'highscores', 3, 2);
|
||||||
|
INSERT INTO `myaac_menu` (`template`, `name`, `link`, `category`, `ordering`) VALUES ('tibiacom', 'Last Kills', 'lastkills', 3, 3);
|
||||||
|
INSERT INTO `myaac_menu` (`template`, `name`, `link`, `category`, `ordering`) VALUES ('tibiacom', 'Houses', 'houses', 3, 4);
|
||||||
|
INSERT INTO `myaac_menu` (`template`, `name`, `link`, `category`, `ordering`) VALUES ('tibiacom', 'Guilds', 'guilds', 3, 5);
|
||||||
|
INSERT INTO `myaac_menu` (`template`, `name`, `link`, `category`, `ordering`) VALUES ('tibiacom', 'Polls', 'polls', 3, 6);
|
||||||
|
INSERT INTO `myaac_menu` (`template`, `name`, `link`, `category`, `ordering`) VALUES ('tibiacom', 'Bans', 'bans', 3, 7);
|
||||||
|
INSERT INTO `myaac_menu` (`template`, `name`, `link`, `category`, `ordering`) VALUES ('tibiacom', 'Support List', 'team', 3, 8);
|
||||||
|
/* MENU_CATEGORY_FORUM tibiacom */
|
||||||
|
INSERT INTO `myaac_menu` (`template`, `name`, `link`, `category`, `ordering`) VALUES ('tibiacom', 'Forum', 'forum', 4, 0);
|
||||||
|
/* MENU_CATEGORY_LIBRARY tibiacom */
|
||||||
|
INSERT INTO `myaac_menu` (`template`, `name`, `link`, `category`, `ordering`) VALUES ('tibiacom', 'Creatures', 'creatures', 5, 0);
|
||||||
|
INSERT INTO `myaac_menu` (`template`, `name`, `link`, `category`, `ordering`) VALUES ('tibiacom', 'Spells', 'spells', 5, 1);
|
||||||
|
INSERT INTO `myaac_menu` (`template`, `name`, `link`, `category`, `ordering`) VALUES ('tibiacom', 'Commands', 'commands', 5, 2);
|
||||||
|
INSERT INTO `myaac_menu` (`template`, `name`, `link`, `category`, `ordering`) VALUES ('tibiacom', 'Exp Stages', 'experienceStages', 5, 3);
|
||||||
|
INSERT INTO `myaac_menu` (`template`, `name`, `link`, `category`, `ordering`) VALUES ('tibiacom', 'Gallery', 'gallery', 5, 4);
|
||||||
|
INSERT INTO `myaac_menu` (`template`, `name`, `link`, `category`, `ordering`) VALUES ('tibiacom', 'Server Info', 'serverInfo', 5, 5);
|
||||||
|
INSERT INTO `myaac_menu` (`template`, `name`, `link`, `category`, `ordering`) VALUES ('tibiacom', 'Experience Table', 'experienceTable', 5, 6);
|
||||||
|
/* MENU_CATEGORY_SHOP tibiacom */
|
||||||
|
INSERT INTO `myaac_menu` (`template`, `name`, `link`, `category`, `ordering`) VALUES ('tibiacom', 'Buy Points', 'points', 6, 0);
|
||||||
|
INSERT INTO `myaac_menu` (`template`, `name`, `link`, `category`, `ordering`) VALUES ('tibiacom', 'Shop Offer', 'gifts', 6, 1);
|
||||||
|
INSERT INTO `myaac_menu` (`template`, `name`, `link`, `category`, `ordering`) VALUES ('tibiacom', 'Shop History', 'gifts/history', 6, 2);
|
||||||
|
|
||||||
CREATE TABLE `myaac_monsters` (
|
CREATE TABLE `myaac_monsters` (
|
||||||
`id` int(11) NOT NULL AUTO_INCREMENT,
|
`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,
|
`name` varchar(255) NOT NULL,
|
||||||
`mana` int(11) NOT NULL DEFAULT 0,
|
`mana` int(11) NOT NULL DEFAULT 0,
|
||||||
`exp` int(11) NOT NULL,
|
`exp` int(11) NOT NULL,
|
||||||
@@ -174,7 +243,7 @@ CREATE TABLE `myaac_news`
|
|||||||
`comments` VARCHAR(50) NOT NULL DEFAULT '',
|
`comments` VARCHAR(50) NOT NULL DEFAULT '',
|
||||||
`article_text` VARCHAR(300) NOT NULL DEFAULT '',
|
`article_text` VARCHAR(300) NOT NULL DEFAULT '',
|
||||||
`article_image` VARCHAR(100) 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`)
|
PRIMARY KEY (`id`)
|
||||||
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8;
|
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8;
|
||||||
|
|
||||||
@@ -184,7 +253,7 @@ CREATE TABLE `myaac_news_categories`
|
|||||||
`name` VARCHAR(50) NOT NULL DEFAULT "",
|
`name` VARCHAR(50) NOT NULL DEFAULT "",
|
||||||
`description` VARCHAR(50) NOT NULL DEFAULT "",
|
`description` VARCHAR(50) NOT NULL DEFAULT "",
|
||||||
`icon_id` INT(2) NOT NULL DEFAULT 0,
|
`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`)
|
PRIMARY KEY (`id`)
|
||||||
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8;
|
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8;
|
||||||
|
|
||||||
@@ -215,7 +284,7 @@ CREATE TABLE `myaac_pages`
|
|||||||
`php` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '0 - plain html, 1 - php',
|
`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',
|
`enable_tinymce` TINYINT(1) NOT NULL DEFAULT 1 COMMENT '1 - enabled, 0 - disabled',
|
||||||
`access` TINYINT(2) NOT NULL DEFAULT 0,
|
`access` TINYINT(2) NOT NULL DEFAULT 0,
|
||||||
`hide` TINYINT(1) NOT NULL DEFAULT 0,
|
`hidden` TINYINT(1) NOT NULL DEFAULT 0,
|
||||||
PRIMARY KEY (`id`),
|
PRIMARY KEY (`id`),
|
||||||
UNIQUE (`name`)
|
UNIQUE (`name`)
|
||||||
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8;
|
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8;
|
||||||
@@ -228,22 +297,12 @@ CREATE TABLE `myaac_gallery`
|
|||||||
`thumb` VARCHAR(255) NOT NULL,
|
`thumb` VARCHAR(255) NOT NULL,
|
||||||
`author` VARCHAR(50) NOT NULL DEFAULT '',
|
`author` VARCHAR(50) NOT NULL DEFAULT '',
|
||||||
`ordering` INT(11) NOT NULL DEFAULT 0,
|
`ordering` INT(11) NOT NULL DEFAULT 0,
|
||||||
`hide` TINYINT(1) NOT NULL DEFAULT 0,
|
`hidden` TINYINT(1) NOT NULL DEFAULT 0,
|
||||||
PRIMARY KEY (`id`)
|
PRIMARY KEY (`id`)
|
||||||
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8;
|
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8;
|
||||||
|
|
||||||
INSERT INTO `myaac_gallery` (`id`, `ordering`, `comment`, `image`, `thumb`, `author`) VALUES (NULL, 1, 'Demon', 'images/gallery/demon.jpg', 'images/gallery/demon_thumb.gif', 'MyAAC');
|
INSERT INTO `myaac_gallery` (`id`, `ordering`, `comment`, `image`, `thumb`, `author`) VALUES (NULL, 1, 'Demon', 'images/gallery/demon.jpg', 'images/gallery/demon_thumb.gif', 'MyAAC');
|
||||||
|
|
||||||
CREATE TABLE `myaac_settings`
|
|
||||||
(
|
|
||||||
`id` int(11) NOT NULL AUTO_INCREMENT,
|
|
||||||
`name` VARCHAR(255) NOT NULL DEFAULT '',
|
|
||||||
`key` VARCHAR(255) NOT NULL DEFAULT '',
|
|
||||||
`value` TEXT NOT NULL,
|
|
||||||
PRIMARY KEY (`id`),
|
|
||||||
KEY `key` (`key`)
|
|
||||||
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8;
|
|
||||||
|
|
||||||
CREATE TABLE `myaac_spells`
|
CREATE TABLE `myaac_spells`
|
||||||
(
|
(
|
||||||
`id` INT(11) NOT NULL AUTO_INCREMENT,
|
`id` INT(11) NOT NULL AUTO_INCREMENT,
|
||||||
@@ -262,7 +321,7 @@ CREATE TABLE `myaac_spells`
|
|||||||
`item_id` INT(11) NOT NULL DEFAULT 0,
|
`item_id` INT(11) NOT NULL DEFAULT 0,
|
||||||
`premium` TINYINT(1) NOT NULL DEFAULT 0,
|
`premium` TINYINT(1) NOT NULL DEFAULT 0,
|
||||||
`vocations` VARCHAR(100) NOT NULL DEFAULT '',
|
`vocations` VARCHAR(100) NOT NULL DEFAULT '',
|
||||||
`hide` TINYINT(1) NOT NULL DEFAULT 0,
|
`hidden` TINYINT(1) NOT NULL DEFAULT 0,
|
||||||
PRIMARY KEY (`id`),
|
PRIMARY KEY (`id`),
|
||||||
UNIQUE (`name`)
|
UNIQUE (`name`)
|
||||||
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8;
|
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8;
|
||||||
|
@@ -13,6 +13,9 @@ require BASE . 'install/includes/functions.php';
|
|||||||
require BASE . 'install/includes/locale.php';
|
require BASE . 'install/includes/locale.php';
|
||||||
require SYSTEM . 'clients.conf.php';
|
require SYSTEM . 'clients.conf.php';
|
||||||
|
|
||||||
|
if(file_exists(BASE . 'config.local.php'))
|
||||||
|
require BASE . 'config.local.php';
|
||||||
|
|
||||||
// ignore undefined index from Twig autoloader
|
// ignore undefined index from Twig autoloader
|
||||||
$config['env'] = 'prod';
|
$config['env'] = 'prod';
|
||||||
|
|
||||||
@@ -88,6 +91,10 @@ if($step == 'database') {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if($key == 'mail_admin' && !Validator::email($value)) {
|
||||||
|
$errors[] = $locale['step_config_mail_admin_error'];
|
||||||
|
break;
|
||||||
|
}
|
||||||
else if($key == 'timezone' && !in_array($value, DateTimeZone::listIdentifiers())) {
|
else if($key == 'timezone' && !in_array($value, DateTimeZone::listIdentifiers())) {
|
||||||
$errors[] = $locale['step_config_timezone_error'];
|
$errors[] = $locale['step_config_timezone_error'];
|
||||||
break;
|
break;
|
||||||
|
@@ -1,7 +1,4 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
use MyAAC\Settings;
|
|
||||||
|
|
||||||
defined('MYAAC') or die('Direct access not allowed!');
|
defined('MYAAC') or die('Direct access not allowed!');
|
||||||
|
|
||||||
//ini_set('display_errors', false);
|
//ini_set('display_errors', false);
|
||||||
@@ -14,12 +11,16 @@ if(!isset($_SESSION['var_server_path'])) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(!$error) {
|
if(!$error) {
|
||||||
$configToSave = [
|
$content = "<?php";
|
||||||
// by default, set env to prod
|
$content .= PHP_EOL;
|
||||||
// user can disable when he wants
|
$content .= '// place for your configuration directives, so you can later easily update myaac';
|
||||||
'env' => 'prod',
|
$content .= PHP_EOL;
|
||||||
];
|
$content .= '$config[\'installed\'] = true;';
|
||||||
|
$content .= PHP_EOL;
|
||||||
|
// by default, set env to prod
|
||||||
|
// user can disable when he wants
|
||||||
|
$content .= '$config[\'env\'] = \'prod\'; // dev or prod';
|
||||||
|
$content .= PHP_EOL;
|
||||||
foreach($_SESSION as $key => $value)
|
foreach($_SESSION as $key => $value)
|
||||||
{
|
{
|
||||||
if(strpos($key, 'var_') !== false)
|
if(strpos($key, 'var_') !== false)
|
||||||
@@ -31,16 +32,17 @@ if(!$error) {
|
|||||||
$value .= '/';
|
$value .= '/';
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!in_array($key, ['var_usage', 'var_date_timezone', 'var_client', 'var_account', 'var_account_id', 'var_password', 'var_password_confirm', 'var_step', 'var_email', 'var_player_name'], true)) {
|
if($key === 'var_usage') {
|
||||||
$configToSave[str_replace('var_', '', $key)] = $value;
|
$content .= '$config[\'anonymous_usage_statistics\'] = ' . ((int)$value == 1 ? 'true' : 'false') . ';';
|
||||||
|
$content .= PHP_EOL;
|
||||||
|
}
|
||||||
|
else if(!in_array($key, array('var_account', 'var_account_id', 'var_password', 'var_step', 'var_email', 'var_player_name'), true)) {
|
||||||
|
$content .= '$config[\'' . str_replace('var_', '', $key) . '\'] = \'' . $value . '\';';
|
||||||
|
$content .= PHP_EOL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$configToSave['gzip_output'] = false;
|
|
||||||
$configToSave['cache_engine'] = 'auto';
|
|
||||||
$configToSave['cache_prefix'] = 'myaac_' . generateRandomString(8, true, false, true);
|
|
||||||
|
|
||||||
require BASE . 'install/includes/config.php';
|
require BASE . 'install/includes/config.php';
|
||||||
|
|
||||||
if(!$error) {
|
if(!$error) {
|
||||||
@@ -77,17 +79,31 @@ if(!$error) {
|
|||||||
'message' => $locale['loading_spinner']
|
'message' => $locale['loading_spinner']
|
||||||
));
|
));
|
||||||
|
|
||||||
$content = '';
|
if(!Validator::email($_SESSION['var_mail_admin'])) {
|
||||||
$saved = Settings::saveConfig($configToSave, BASE . 'config.local.php', $content);
|
error($locale['step_config_mail_admin_error']);
|
||||||
|
$error = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
$content .= '$config[\'session_prefix\'] = \'myaac_' . generateRandomString(8, true, false, true, false) . '_\';';
|
||||||
|
$content .= PHP_EOL;
|
||||||
|
$content .= '$config[\'cache_prefix\'] = \'myaac_' . generateRandomString(8, true, false, true, false) . '_\';';
|
||||||
|
|
||||||
|
$saved = true;
|
||||||
|
if(!$error) {
|
||||||
|
$saved = file_put_contents(BASE . 'config.local.php', $content);
|
||||||
|
}
|
||||||
|
|
||||||
if($saved) {
|
if($saved) {
|
||||||
success($locale['step_database_config_saved']);
|
success($locale['step_database_config_saved']);
|
||||||
$_SESSION['saved'] = true;
|
if(!$error) {
|
||||||
|
$_SESSION['saved'] = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
$_SESSION['config_content'] = $content;
|
$_SESSION['config_content'] = $content;
|
||||||
unset($_SESSION['saved']);
|
unset($_SESSION['saved']);
|
||||||
|
|
||||||
$locale['step_database_error_file'] = str_replace('$FILE$', '<b>' . BASE . 'config.php</b>', $locale['step_database_error_file']);
|
$locale['step_database_error_file'] = str_replace('$FILE$', '<b>' . BASE . 'config.local.php</b>', $locale['step_database_error_file']);
|
||||||
error($locale['step_database_error_file'] . '<br/>
|
error($locale['step_database_error_file'] . '<br/>
|
||||||
<textarea cols="70" rows="10">' . $content . '</textarea>');
|
<textarea cols="70" rows="10">' . $content . '</textarea>');
|
||||||
}
|
}
|
||||||
|
@@ -1,7 +1,4 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
use MyAAC\Settings;
|
|
||||||
|
|
||||||
defined('MYAAC') or die('Direct access not allowed!');
|
defined('MYAAC') or die('Direct access not allowed!');
|
||||||
|
|
||||||
ini_set('max_execution_time', 300);
|
ini_set('max_execution_time', 300);
|
||||||
@@ -113,29 +110,12 @@ else {
|
|||||||
|
|
||||||
$query = $db->query("SELECT `id` FROM `" . TABLE_PREFIX ."news` WHERE `title` LIKE 'Hello!';");
|
$query = $db->query("SELECT `id` FROM `" . TABLE_PREFIX ."news` WHERE `title` LIKE 'Hello!';");
|
||||||
if($query->rowCount() == 0) {
|
if($query->rowCount() == 0) {
|
||||||
if(query("INSERT INTO `" . TABLE_PREFIX ."news` (`id`, `type`, `date`, `category`, `title`, `body`, `player_id`, `comments`, `hide`) VALUES (NULL, '1', UNIX_TIMESTAMP(), '2', 'Hello!', 'MyAAC is just READY to use!', " . $player_id . ", 'https://my-aac.org', '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`, `hide`) VALUES (NULL, '2', UNIX_TIMESTAMP(), '4', 'Hello tickets!', 'https://my-aac.org', " . $player_id . ", '', '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']);
|
success($locale['step_database_created_news']);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$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';
|
|
||||||
$value = ((int)$value == 1 ? 'true' : 'false');
|
|
||||||
} elseif ($key == 'var_date_timezone') {
|
|
||||||
$key = 'date_timezone';
|
|
||||||
} elseif ($key == 'var_client') {
|
|
||||||
$key = 'client';
|
|
||||||
}
|
|
||||||
|
|
||||||
$settings->updateInDatabase('core', $key, $value);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
success('Settings saved.');
|
|
||||||
|
|
||||||
$twig->display('install.installer.html.twig', array(
|
$twig->display('install.installer.html.twig', array(
|
||||||
'url' => 'tools/7-finish.php',
|
'url' => 'tools/7-finish.php',
|
||||||
'message' => $locale['importing_spinner']
|
'message' => $locale['importing_spinner']
|
||||||
|
@@ -6,7 +6,7 @@
|
|||||||
<title>MyAAC - <?php echo $locale['installation']; ?></title>
|
<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 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" />
|
<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>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
|
|
||||||
|
@@ -11,10 +11,8 @@ $error = false;
|
|||||||
require BASE . 'install/includes/config.php';
|
require BASE . 'install/includes/config.php';
|
||||||
|
|
||||||
ini_set('max_execution_time', 300);
|
ini_set('max_execution_time', 300);
|
||||||
|
|
||||||
@ob_end_flush();
|
|
||||||
ob_implicit_flush();
|
ob_implicit_flush();
|
||||||
|
ob_end_flush();
|
||||||
header('X-Accel-Buffering: no');
|
header('X-Accel-Buffering: no');
|
||||||
|
|
||||||
if(!$error) {
|
if(!$error) {
|
||||||
@@ -180,17 +178,17 @@ if(!$db->hasColumn('players', 'deleted') && !$db->hasColumn('players', 'deletion
|
|||||||
}
|
}
|
||||||
|
|
||||||
if($db->hasColumn('players', 'hide_char')) {
|
if($db->hasColumn('players', 'hide_char')) {
|
||||||
if(!$db->hasColumn('players', 'hide')) {
|
if(!$db->hasColumn('players', 'hidden')) {
|
||||||
if(query("ALTER TABLE `players` CHANGE `hide_char` `hide` TINYINT(1) NOT NULL DEFAULT 0;")) {
|
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$', '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);
|
success($tmp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if(!$db->hasColumn('players', 'hide')) {
|
else if(!$db->hasColumn('players', 'hidden')) {
|
||||||
if(query("ALTER TABLE `players` ADD `hide` TINYINT(1) NOT NULL DEFAULT 0;"))
|
if(query("ALTER TABLE `players` ADD `hidden` TINYINT(1) NOT NULL DEFAULT 0;"))
|
||||||
success($locale['step_database_adding_field'] . ' players.hide...');
|
success($locale['step_database_adding_field'] . ' players.hidden...');
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!$db->hasColumn('players', 'comment')) {
|
if(!$db->hasColumn('players', 'comment')) {
|
||||||
|
@@ -1,10 +1,6 @@
|
|||||||
<?php
|
<?php
|
||||||
define('MYAAC_INSTALL', true);
|
define('MYAAC_INSTALL', true);
|
||||||
|
|
||||||
use MyAAC\DataLoader;
|
|
||||||
use MyAAC\Models\FAQ as ModelsFAQ;
|
|
||||||
use MyAAC\Plugins;
|
|
||||||
|
|
||||||
require_once '../../common.php';
|
require_once '../../common.php';
|
||||||
|
|
||||||
require SYSTEM . 'functions.php';
|
require SYSTEM . 'functions.php';
|
||||||
@@ -12,16 +8,14 @@ require BASE . 'install/includes/functions.php';
|
|||||||
require BASE . 'install/includes/locale.php';
|
require BASE . 'install/includes/locale.php';
|
||||||
|
|
||||||
ini_set('max_execution_time', 300);
|
ini_set('max_execution_time', 300);
|
||||||
|
|
||||||
@ob_end_flush();
|
|
||||||
ob_implicit_flush();
|
ob_implicit_flush();
|
||||||
|
ob_end_flush();
|
||||||
header('X-Accel-Buffering: no');
|
header('X-Accel-Buffering: no');
|
||||||
/*
|
|
||||||
if(isset($config['installed']) && $config['installed'] && !isset($_SESSION['saved'])) {
|
if(isset($config['installed']) && $config['installed'] && !isset($_SESSION['saved'])) {
|
||||||
warning($locale['already_installed']);
|
warning($locale['already_installed']);
|
||||||
return;
|
return;
|
||||||
}*/
|
}
|
||||||
|
|
||||||
require SYSTEM . 'init.php';
|
require SYSTEM . 'init.php';
|
||||||
|
|
||||||
@@ -35,7 +29,7 @@ function insert_sample_if_not_exist($p) {
|
|||||||
|
|
||||||
$query = $db->query('SELECT `id` FROM `players` WHERE `name` = ' . $db->quote($p['name']));
|
$query = $db->query('SELECT `id` FROM `players` WHERE `name` = ' . $db->quote($p['name']));
|
||||||
if($query->rowCount() == 0) {
|
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("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 = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -51,14 +45,19 @@ if($success) {
|
|||||||
success($locale['step_database_imported_players']);
|
success($locale['step_database_imported_players']);
|
||||||
}
|
}
|
||||||
|
|
||||||
Plugins::installMenus('kathrine', require TEMPLATES . 'kathrine/menus.php');
|
require LIBS . 'DataLoader.php';
|
||||||
Plugins::installMenus('tibiacom', require TEMPLATES . 'tibiacom/menus.php');
|
|
||||||
|
|
||||||
DataLoader::setLocale($locale);
|
DataLoader::setLocale($locale);
|
||||||
DataLoader::load();
|
DataLoader::load();
|
||||||
|
|
||||||
// update config.highscores_ids_hidden
|
// update config.highscores_ids_hidden
|
||||||
require_once SYSTEM . 'migrations/20.php';
|
require_once SYSTEM . 'migrations/20.php';
|
||||||
|
$database_migration_20 = true;
|
||||||
|
$content = '';
|
||||||
|
if(!databaseMigration20($content)) {
|
||||||
|
$locale['step_database_error_file'] = str_replace('$FILE$', '<b>' . BASE . 'config.local.php</b>', $locale['step_database_error_file']);
|
||||||
|
warning($locale['step_database_error_file'] . '<br/>
|
||||||
|
<textarea cols="70" rows="10">' . $content . '</textarea>');
|
||||||
|
}
|
||||||
|
|
||||||
// add z_polls tables
|
// add z_polls tables
|
||||||
require_once SYSTEM . 'migrations/22.php';
|
require_once SYSTEM . 'migrations/22.php';
|
||||||
@@ -67,18 +66,6 @@ require_once SYSTEM . 'migrations/22.php';
|
|||||||
require_once SYSTEM . 'migrations/27.php';
|
require_once SYSTEM . 'migrations/27.php';
|
||||||
require_once SYSTEM . 'migrations/30.php';
|
require_once SYSTEM . 'migrations/30.php';
|
||||||
|
|
||||||
// new monster columns
|
|
||||||
require_once SYSTEM . 'migrations/31.php';
|
|
||||||
|
|
||||||
if(ModelsFAQ::count() == 0) {
|
|
||||||
ModelsFAQ::create([
|
|
||||||
'question' => 'What is this?',
|
|
||||||
'answer' => 'This is website for OTS powered by MyAAC.',
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
|
|
||||||
$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('$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('$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']);
|
$locale['step_finish_desc'] = str_replace('$LINK$', generateLink('https://my-aac.org', 'https://my-aac.org', true), $locale['step_finish_desc']);
|
||||||
|
104
login.php
104
login.php
@@ -1,11 +1,7 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
use MyAAC\Models\BoostedCreature;
|
|
||||||
use MyAAC\Models\PlayerOnline;
|
|
||||||
use MyAAC\Models\Account;
|
|
||||||
use MyAAC\Models\Player;
|
|
||||||
|
|
||||||
require_once 'common.php';
|
require_once 'common.php';
|
||||||
|
require_once 'config.php';
|
||||||
|
require_once 'config.local.php';
|
||||||
require_once SYSTEM . 'functions.php';
|
require_once SYSTEM . 'functions.php';
|
||||||
require_once SYSTEM . 'init.php';
|
require_once SYSTEM . 'init.php';
|
||||||
require_once SYSTEM . 'status.php';
|
require_once SYSTEM . 'status.php';
|
||||||
@@ -49,9 +45,9 @@ $action = $request->type ?? '';
|
|||||||
|
|
||||||
switch ($action) {
|
switch ($action) {
|
||||||
case 'cacheinfo':
|
case 'cacheinfo':
|
||||||
$playersonline = PlayerOnline::count();
|
$playersonline = $db->query("select count(*) from `players_online`")->fetchAll();
|
||||||
die(json_encode([
|
die(json_encode([
|
||||||
'playersonline' => $playersonline,
|
'playersonline' => (intval($playersonline[0][0])),
|
||||||
'twitchstreams' => 0,
|
'twitchstreams' => 0,
|
||||||
'twitchviewer' => 0,
|
'twitchviewer' => 0,
|
||||||
'gamingyoutubestreams' => 0,
|
'gamingyoutubestreams' => 0,
|
||||||
@@ -85,11 +81,13 @@ switch ($action) {
|
|||||||
die(json_encode(['eventlist' => $eventlist, 'lastupdatetimestamp' => time()]));
|
die(json_encode(['eventlist' => $eventlist, 'lastupdatetimestamp' => time()]));
|
||||||
|
|
||||||
case 'boostedcreature':
|
case 'boostedcreature':
|
||||||
$boostedCreature = BoostedCreature::latest();
|
$boostDB = $db->query("select * from " . $db->tableName('boosted_creature'))->fetchAll();
|
||||||
|
foreach ($boostDB as $Tableboost) {
|
||||||
die(json_encode([
|
die(json_encode([
|
||||||
'boostedcreature' => true,
|
'boostedcreature' => true,
|
||||||
'raceid' => $boostedCreature->raceid
|
'raceid' => intval($Tableboost['raceid'])
|
||||||
]));
|
]));
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'login':
|
case 'login':
|
||||||
@@ -116,32 +114,29 @@ switch ($action) {
|
|||||||
];
|
];
|
||||||
|
|
||||||
$characters = [];
|
$characters = [];
|
||||||
|
$account = new OTS_Account();
|
||||||
|
|
||||||
$inputEmail = $request->email ?? false;
|
$inputEmail = $request->email ?? false;
|
||||||
$inputAccountName = $request->accountname ?? false;
|
$inputAccountName = $request->accountname ?? false;
|
||||||
$inputToken = $request->token ?? false;
|
$inputToken = $request->token ?? false;
|
||||||
|
|
||||||
$account = Account::query();
|
|
||||||
if ($inputEmail != false) { // login by email
|
if ($inputEmail != false) { // login by email
|
||||||
$account->where('email', $inputEmail);
|
$account->findByEmail($request->email);
|
||||||
}
|
}
|
||||||
else if($inputAccountName != false) { // login by account name
|
else if($inputAccountName != false) { // login by account name
|
||||||
$account->where('name', $inputAccountName);
|
$account->find($inputAccountName);
|
||||||
}
|
}
|
||||||
|
|
||||||
$account = $account->first();
|
$current_password = encrypt((USE_ACCOUNT_SALT ? $account->getCustomField('salt') : '') . $request->password);
|
||||||
if (!$account) {
|
|
||||||
sendError(($inputEmail != false ? 'Email' : 'Account name') . ' or password is not correct.');
|
if (!$account->isLoaded() || $account->getPassword() != $current_password) {
|
||||||
}
|
|
||||||
|
|
||||||
$current_password = encrypt((USE_ACCOUNT_SALT ? $account->salt : '') . $request->password);
|
|
||||||
if (!$account || $account->password != $current_password) {
|
|
||||||
sendError(($inputEmail != false ? 'Email' : 'Account name') . ' or password is not correct.');
|
sendError(($inputEmail != false ? 'Email' : 'Account name') . ' or password is not correct.');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//log_append('test.log', var_export($account->getCustomField('secret'), true));
|
||||||
$accountHasSecret = false;
|
$accountHasSecret = false;
|
||||||
if (fieldExist('secret', 'accounts')) {
|
if (fieldExist('secret', 'accounts')) {
|
||||||
$accountSecret = $account->secret;
|
$accountSecret = $account->getCustomField('secret');
|
||||||
if ($accountSecret != null && $accountSecret != '') {
|
if ($accountSecret != null && $accountSecret != '') {
|
||||||
$accountHasSecret = true;
|
$accountHasSecret = true;
|
||||||
if ($inputToken === false) {
|
if ($inputToken === false) {
|
||||||
@@ -166,9 +161,18 @@ switch ($action) {
|
|||||||
$columns .= ', istutorial';
|
$columns .= ', istutorial';
|
||||||
}
|
}
|
||||||
|
|
||||||
$players = Player::where('account_id', $account->id)->notDeleted()->selectRaw($columns)->get();
|
$players = $db->query("select {$columns} from players where account_id = " . $account->getId() . " AND deletion = 0");
|
||||||
if($players && $players->count()) {
|
if($players && $players->rowCount() > 0) {
|
||||||
$highestLevelId = $players->sortByDesc('experience')->first()->getKey();
|
$players = $players->fetchAll();
|
||||||
|
|
||||||
|
$highestLevelId = 0;
|
||||||
|
$highestLevel = 0;
|
||||||
|
foreach ($players as $player) {
|
||||||
|
if ($player['level'] >= $highestLevel) {
|
||||||
|
$highestLevel = $player['level'];
|
||||||
|
$highestLevelId = $player['id'];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
foreach ($players as $player) {
|
foreach ($players as $player) {
|
||||||
$characters[] = create_char($player, $highestLevelId);
|
$characters[] = create_char($player, $highestLevelId);
|
||||||
@@ -178,10 +182,15 @@ switch ($action) {
|
|||||||
if (fieldExist('premdays', 'accounts') && fieldExist('lastday', 'accounts')) {
|
if (fieldExist('premdays', 'accounts') && fieldExist('lastday', 'accounts')) {
|
||||||
$save = false;
|
$save = false;
|
||||||
$timeNow = time();
|
$timeNow = time();
|
||||||
$premDays = $account->premdays;
|
$query = $db->query("select `premdays`, `lastday` from `accounts` where `id` = " . $account->getId());
|
||||||
$lastDay = $account->lastday;
|
if ($query->rowCount() > 0) {
|
||||||
$lastLogin = $lastDay;
|
$query = $query->fetch();
|
||||||
|
$premDays = (int)$query['premdays'];
|
||||||
|
$lastDay = (int)$query['lastday'];
|
||||||
|
$lastLogin = $lastDay;
|
||||||
|
} else {
|
||||||
|
sendError("Error while fetching your account data. Please contact admin.");
|
||||||
|
}
|
||||||
if ($premDays != 0 && $premDays != PHP_INT_MAX) {
|
if ($premDays != 0 && $premDays != PHP_INT_MAX) {
|
||||||
if ($lastDay == 0) {
|
if ($lastDay == 0) {
|
||||||
$lastDay = $timeNow;
|
$lastDay = $timeNow;
|
||||||
@@ -206,9 +215,7 @@ switch ($action) {
|
|||||||
$save = true;
|
$save = true;
|
||||||
}
|
}
|
||||||
if ($save) {
|
if ($save) {
|
||||||
$account->premdays = $premDays;
|
$db->query("update `accounts` set `premdays` = " . $premDays . ", `lastday` = " . $lastDay . " where `id` = " . $account->getId());
|
||||||
$account->lastday = $lastDay;
|
|
||||||
$account->save();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -230,11 +237,13 @@ switch ($action) {
|
|||||||
$sessionKey .= "\n".floor(time() / 30);
|
$sessionKey .= "\n".floor(time() / 30);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//log_append('slaw.log', $sessionKey);
|
||||||
|
|
||||||
$session = [
|
$session = [
|
||||||
'sessionkey' => $sessionKey,
|
'sessionkey' => $sessionKey,
|
||||||
'lastlogintime' => 0,
|
'lastlogintime' => 0,
|
||||||
'ispremium' => $account->is_premium,
|
'ispremium' => $config['lua']['freePremium'] || $account->isPremium(),
|
||||||
'premiumuntil' => ($account->premium_days) > 0 ? (time() + ($account->premium_days * 86400)) : 0,
|
'premiumuntil' => ($account->getPremDays()) > 0 ? (time() + ($account->getPremDays() * 86400)) : 0,
|
||||||
'status' => 'active', // active, frozen or suspended
|
'status' => 'active', // active, frozen or suspended
|
||||||
'returnernotification' => false,
|
'returnernotification' => false,
|
||||||
'showrewardnews' => true,
|
'showrewardnews' => true,
|
||||||
@@ -252,23 +261,24 @@ switch ($action) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function create_char($player, $highestLevelId) {
|
function create_char($player, $highestLevelId) {
|
||||||
|
global $config;
|
||||||
return [
|
return [
|
||||||
'worldid' => 0,
|
'worldid' => 0,
|
||||||
'name' => $player->name,
|
'name' => $player['name'],
|
||||||
'ismale' => $player->sex === 1,
|
'ismale' => intval($player['sex']) === 1,
|
||||||
'tutorial' => isset($player->istutorial) && $player->istutorial,
|
'tutorial' => isset($player['istutorial']) && $player['istutorial'],
|
||||||
'level' => $player->level,
|
'level' => intval($player['level']),
|
||||||
'vocation' => $player->vocation_name,
|
'vocation' => $config['vocations'][$player['vocation']],
|
||||||
'outfitid' => $player->looktype,
|
'outfitid' => intval($player['looktype']),
|
||||||
'headcolor' => $player->lookhead,
|
'headcolor' => intval($player['lookhead']),
|
||||||
'torsocolor' => $player->lookbody,
|
'torsocolor' => intval($player['lookbody']),
|
||||||
'legscolor' => $player->looklegs,
|
'legscolor' => intval($player['looklegs']),
|
||||||
'detailcolor' => $player->lookfeet,
|
'detailcolor' => intval($player['lookfeet']),
|
||||||
'addonsflags' => $player->lookaddons,
|
'addonsflags' => intval($player['lookaddons']),
|
||||||
'ishidden' => $player->is_deleted,
|
'ishidden' => isset($player['deletion']) && (int)$player['deletion'] === 1,
|
||||||
'istournamentparticipant' => false,
|
'istournamentparticipant' => false,
|
||||||
'ismaincharacter' => $highestLevelId === $player->getKey(),
|
'ismaincharacter' => $highestLevelId == $player['id'],
|
||||||
'dailyrewardstate' => $player->isreward ?? 0,
|
'dailyrewardstate' => isset($player['isreward']) ? intval($player['isreward']) : 0,
|
||||||
'remainingdailytournamentplaytime' => 0
|
'remainingdailytournamentplaytime' => 0
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
@@ -13,16 +13,9 @@ server {
|
|||||||
return 404;
|
return 404;
|
||||||
}
|
}
|
||||||
|
|
||||||
location /vendor {
|
# block .htaccess
|
||||||
|
location ~ /\.ht {
|
||||||
deny all;
|
deny all;
|
||||||
return 404;
|
|
||||||
}
|
|
||||||
|
|
||||||
# block .htaccess, CHANGELOG.md, composer.json etc.
|
|
||||||
# this is to prevent finding software versions
|
|
||||||
location ~\.(ht|md|json|dist)$ {
|
|
||||||
deny all;
|
|
||||||
return 404;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
# block git files and folders
|
# block git files and folders
|
||||||
@@ -32,7 +25,7 @@ server {
|
|||||||
}
|
}
|
||||||
|
|
||||||
location / {
|
location / {
|
||||||
try_files $uri $uri/ /index.php?$query_string;;
|
try_files $uri $uri/ /index.php;
|
||||||
}
|
}
|
||||||
|
|
||||||
location ~ \.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,
|
"requires": true,
|
||||||
"packages": {
|
"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": {
|
"devDependencies": {
|
||||||
"cypress": "^12.12.0"
|
"cypress": "^12.12.0"
|
||||||
}
|
}
|
||||||
@@ -28,9 +19,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@cypress/request": {
|
"node_modules/@cypress/request": {
|
||||||
"version": "2.88.12",
|
"version": "2.88.11",
|
||||||
"resolved": "https://registry.npmjs.org/@cypress/request/-/request-2.88.12.tgz",
|
"resolved": "https://registry.npmjs.org/@cypress/request/-/request-2.88.11.tgz",
|
||||||
"integrity": "sha512-tOn+0mDZxASFM+cuAP9szGUGPI1HwWVSvdzm7V4cCsPdFTx6qMj29CwaQmRAMIEhORIUBFBsYROYJcveK4uOjA==",
|
"integrity": "sha512-M83/wfQ1EkspjkE2lNWNV5ui2Cv7UCv1swW1DqljahbzLVWltcsexQh8jYtuS/vzFXP+HySntGM83ZXA9fn17w==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"aws-sign2": "~0.7.0",
|
"aws-sign2": "~0.7.0",
|
||||||
@@ -48,7 +39,7 @@
|
|||||||
"performance-now": "^2.1.0",
|
"performance-now": "^2.1.0",
|
||||||
"qs": "~6.10.3",
|
"qs": "~6.10.3",
|
||||||
"safe-buffer": "^5.1.2",
|
"safe-buffer": "^5.1.2",
|
||||||
"tough-cookie": "^4.1.3",
|
"tough-cookie": "~2.5.0",
|
||||||
"tunnel-agent": "^0.6.0",
|
"tunnel-agent": "^0.6.0",
|
||||||
"uuid": "^8.3.2"
|
"uuid": "^8.3.2"
|
||||||
},
|
},
|
||||||
@@ -75,15 +66,10 @@
|
|||||||
"ms": "^2.1.1"
|
"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": {
|
"node_modules/@types/node": {
|
||||||
"version": "16.18.82",
|
"version": "14.18.47",
|
||||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.82.tgz",
|
"resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.47.tgz",
|
||||||
"integrity": "sha512-pcDZtkx9z8XYV+ius2P3Ot2VVrcYOfXffBQUBuiszrlUzKSmoDYqo+mV+IoL8iIiIjjtOMvNSmH1hwJ+Q+f96Q==",
|
"integrity": "sha512-OuJi8bIng4wYHHA3YpKauL58dZrPxro3d0tabPHyiNF8rKfGKuVfr83oFlPLmKri1cX+Z3cJP39GXmnqkP11Gw==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"node_modules/@types/sinonjs__fake-timers": {
|
"node_modules/@types/sinonjs__fake-timers": {
|
||||||
@@ -93,15 +79,15 @@
|
|||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"node_modules/@types/sizzle": {
|
"node_modules/@types/sizzle": {
|
||||||
"version": "2.3.8",
|
"version": "2.3.3",
|
||||||
"resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.8.tgz",
|
"resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.3.tgz",
|
||||||
"integrity": "sha512-0vWLNK2D5MT9dg0iOo8GlKguPAU02QjmZitPEsXRuJXU/OGIOt9vT9Fc26wtYuavLxtO45v9PGleoL9Z0k1LHg==",
|
"integrity": "sha512-JYM8x9EGF163bEyhdJBpR2QX1R5naCJHC8ucJylJ3w9/CVBaskdQ8WqBf8MmQrd1kRvp/a4TS8HJ+bxzR7ZJYQ==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"node_modules/@types/yauzl": {
|
"node_modules/@types/yauzl": {
|
||||||
"version": "2.10.3",
|
"version": "2.10.0",
|
||||||
"resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz",
|
"resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.0.tgz",
|
||||||
"integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==",
|
"integrity": "sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"optional": true,
|
"optional": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
@@ -217,9 +203,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/async": {
|
"node_modules/async": {
|
||||||
"version": "3.2.5",
|
"version": "3.2.4",
|
||||||
"resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz",
|
"resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz",
|
||||||
"integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==",
|
"integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"node_modules/asynckit": {
|
"node_modules/asynckit": {
|
||||||
@@ -299,25 +285,6 @@
|
|||||||
"integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==",
|
"integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==",
|
||||||
"dev": true
|
"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": {
|
"node_modules/brace-expansion": {
|
||||||
"version": "1.1.11",
|
"version": "1.1.11",
|
||||||
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
|
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
|
||||||
@@ -362,28 +329,22 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/cachedir": {
|
"node_modules/cachedir": {
|
||||||
"version": "2.4.0",
|
"version": "2.3.0",
|
||||||
"resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.4.0.tgz",
|
"resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.3.0.tgz",
|
||||||
"integrity": "sha512-9EtFOZR8g22CL7BWjJ9BUx1+A/djkofnyW3aOXZORNW2kxoUpx2h+uN2cOqwPmFhnpVmxg+KW2OjOSgChTEvsQ==",
|
"integrity": "sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=6"
|
"node": ">=6"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/call-bind": {
|
"node_modules/call-bind": {
|
||||||
"version": "1.0.7",
|
"version": "1.0.2",
|
||||||
"resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz",
|
"resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
|
||||||
"integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==",
|
"integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"es-define-property": "^1.0.0",
|
"function-bind": "^1.1.1",
|
||||||
"es-errors": "^1.3.0",
|
"get-intrinsic": "^1.0.2"
|
||||||
"function-bind": "^1.1.2",
|
|
||||||
"get-intrinsic": "^1.2.4",
|
|
||||||
"set-function-length": "^1.2.1"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">= 0.4"
|
|
||||||
},
|
},
|
||||||
"funding": {
|
"funding": {
|
||||||
"url": "https://github.com/sponsors/ljharb"
|
"url": "https://github.com/sponsors/ljharb"
|
||||||
@@ -433,9 +394,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/ci-info": {
|
"node_modules/ci-info": {
|
||||||
"version": "3.9.0",
|
"version": "3.8.0",
|
||||||
"resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz",
|
"resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz",
|
||||||
"integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==",
|
"integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -580,15 +541,15 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/cypress": {
|
"node_modules/cypress": {
|
||||||
"version": "12.17.4",
|
"version": "12.12.0",
|
||||||
"resolved": "https://registry.npmjs.org/cypress/-/cypress-12.17.4.tgz",
|
"resolved": "https://registry.npmjs.org/cypress/-/cypress-12.12.0.tgz",
|
||||||
"integrity": "sha512-gAN8Pmns9MA5eCDFSDJXWKUpaL3IDd89N9TtIupjYnzLSmlpVr+ZR+vb4U/qaMp+lB6tBvAmt7504c3Z4RU5KQ==",
|
"integrity": "sha512-UU5wFQ7SMVCR/hyKok/KmzG6fpZgBHHfrXcHzDmPHWrT+UUetxFzQgt7cxCszlwfozckzwkd22dxMwl/vNkWRw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"hasInstallScript": true,
|
"hasInstallScript": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@cypress/request": "2.88.12",
|
"@cypress/request": "^2.88.10",
|
||||||
"@cypress/xvfb": "^1.2.4",
|
"@cypress/xvfb": "^1.2.4",
|
||||||
"@types/node": "^16.18.39",
|
"@types/node": "^14.14.31",
|
||||||
"@types/sinonjs__fake-timers": "8.1.1",
|
"@types/sinonjs__fake-timers": "8.1.1",
|
||||||
"@types/sizzle": "^2.3.2",
|
"@types/sizzle": "^2.3.2",
|
||||||
"arch": "^2.2.0",
|
"arch": "^2.2.0",
|
||||||
@@ -621,10 +582,9 @@
|
|||||||
"minimist": "^1.2.8",
|
"minimist": "^1.2.8",
|
||||||
"ospath": "^1.2.2",
|
"ospath": "^1.2.2",
|
||||||
"pretty-bytes": "^5.6.0",
|
"pretty-bytes": "^5.6.0",
|
||||||
"process": "^0.11.10",
|
|
||||||
"proxy-from-env": "1.0.0",
|
"proxy-from-env": "1.0.0",
|
||||||
"request-progress": "^3.0.0",
|
"request-progress": "^3.0.0",
|
||||||
"semver": "^7.5.3",
|
"semver": "^7.3.2",
|
||||||
"supports-color": "^8.1.1",
|
"supports-color": "^8.1.1",
|
||||||
"tmp": "~0.2.1",
|
"tmp": "~0.2.1",
|
||||||
"untildify": "^4.0.0",
|
"untildify": "^4.0.0",
|
||||||
@@ -637,21 +597,6 @@
|
|||||||
"node": "^14.0.0 || ^16.0.0 || >=18.0.0"
|
"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": {
|
"node_modules/dashdash": {
|
||||||
"version": "1.14.1",
|
"version": "1.14.1",
|
||||||
"resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
|
"resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
|
||||||
@@ -665,9 +610,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/dayjs": {
|
"node_modules/dayjs": {
|
||||||
"version": "1.11.10",
|
"version": "1.11.7",
|
||||||
"resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.10.tgz",
|
"resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.7.tgz",
|
||||||
"integrity": "sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==",
|
"integrity": "sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"node_modules/debug": {
|
"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": {
|
"node_modules/delayed-stream": {
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
|
||||||
@@ -739,39 +667,17 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/enquirer": {
|
"node_modules/enquirer": {
|
||||||
"version": "2.4.1",
|
"version": "2.3.6",
|
||||||
"resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz",
|
"resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz",
|
||||||
"integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==",
|
"integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"ansi-colors": "^4.1.1",
|
"ansi-colors": "^4.1.1"
|
||||||
"strip-ansi": "^6.0.1"
|
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=8.6"
|
"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": {
|
"node_modules/escape-string-regexp": {
|
||||||
"version": "1.0.5",
|
"version": "1.0.5",
|
||||||
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
|
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
|
||||||
@@ -905,16 +811,18 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/fs-extra": {
|
"node_modules/fs-extra": {
|
||||||
"version": "11.2.0",
|
"version": "9.1.0",
|
||||||
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz",
|
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
|
||||||
"integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==",
|
"integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
|
||||||
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
"at-least-node": "^1.0.0",
|
||||||
"graceful-fs": "^4.2.0",
|
"graceful-fs": "^4.2.0",
|
||||||
"jsonfile": "^6.0.1",
|
"jsonfile": "^6.0.1",
|
||||||
"universalify": "^2.0.0"
|
"universalify": "^2.0.0"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=14.14"
|
"node": ">=10"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/fs.realpath": {
|
"node_modules/fs.realpath": {
|
||||||
@@ -924,28 +832,21 @@
|
|||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"node_modules/function-bind": {
|
"node_modules/function-bind": {
|
||||||
"version": "1.1.2",
|
"version": "1.1.1",
|
||||||
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
|
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
|
||||||
"integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
|
"integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
|
||||||
"dev": true,
|
"dev": true
|
||||||
"funding": {
|
|
||||||
"url": "https://github.com/sponsors/ljharb"
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
"node_modules/get-intrinsic": {
|
"node_modules/get-intrinsic": {
|
||||||
"version": "1.2.4",
|
"version": "1.2.1",
|
||||||
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz",
|
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz",
|
||||||
"integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==",
|
"integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"es-errors": "^1.3.0",
|
"function-bind": "^1.1.1",
|
||||||
"function-bind": "^1.1.2",
|
"has": "^1.0.3",
|
||||||
"has-proto": "^1.0.1",
|
"has-proto": "^1.0.1",
|
||||||
"has-symbols": "^1.0.3",
|
"has-symbols": "^1.0.3"
|
||||||
"hasown": "^2.0.0"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">= 0.4"
|
|
||||||
},
|
},
|
||||||
"funding": {
|
"funding": {
|
||||||
"url": "https://github.com/sponsors/ljharb"
|
"url": "https://github.com/sponsors/ljharb"
|
||||||
@@ -1019,22 +920,23 @@
|
|||||||
"url": "https://github.com/sponsors/sindresorhus"
|
"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": {
|
"node_modules/graceful-fs": {
|
||||||
"version": "4.2.11",
|
"version": "4.2.11",
|
||||||
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
|
"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": {
|
"node_modules/has-flag": {
|
||||||
"version": "4.0.0",
|
"version": "4.0.0",
|
||||||
@@ -1045,18 +947,6 @@
|
|||||||
"node": ">=8"
|
"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": {
|
"node_modules/has-proto": {
|
||||||
"version": "1.0.1",
|
"version": "1.0.1",
|
||||||
"resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz",
|
||||||
@@ -1081,18 +971,6 @@
|
|||||||
"url": "https://github.com/sponsors/ljharb"
|
"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": {
|
"node_modules/http-signature": {
|
||||||
"version": "1.3.6",
|
"version": "1.3.6",
|
||||||
"resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.3.6.tgz",
|
"resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.3.6.tgz",
|
||||||
@@ -1258,19 +1136,6 @@
|
|||||||
"integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==",
|
"integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==",
|
||||||
"dev": true
|
"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": {
|
"node_modules/jsbn": {
|
||||||
"version": "0.1.1",
|
"version": "0.1.1",
|
||||||
"resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
|
"resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
|
||||||
@@ -1293,6 +1158,7 @@
|
|||||||
"version": "6.1.0",
|
"version": "6.1.0",
|
||||||
"resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
|
"resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
|
||||||
"integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
|
"integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
|
||||||
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"universalify": "^2.0.0"
|
"universalify": "^2.0.0"
|
||||||
},
|
},
|
||||||
@@ -1516,9 +1382,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/object-inspect": {
|
"node_modules/object-inspect": {
|
||||||
"version": "1.13.1",
|
"version": "1.12.3",
|
||||||
"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz",
|
"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz",
|
||||||
"integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==",
|
"integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"funding": {
|
"funding": {
|
||||||
"url": "https://github.com/sponsors/ljharb"
|
"url": "https://github.com/sponsors/ljharb"
|
||||||
@@ -1608,17 +1474,6 @@
|
|||||||
"node": ">=0.10.0"
|
"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": {
|
"node_modules/pretty-bytes": {
|
||||||
"version": "5.6.0",
|
"version": "5.6.0",
|
||||||
"resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz",
|
"resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz",
|
||||||
@@ -1631,15 +1486,6 @@
|
|||||||
"url": "https://github.com/sponsors/sindresorhus"
|
"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": {
|
"node_modules/proxy-from-env": {
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz",
|
||||||
@@ -1663,9 +1509,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/punycode": {
|
"node_modules/punycode": {
|
||||||
"version": "2.3.1",
|
"version": "2.3.0",
|
||||||
"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
|
"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz",
|
||||||
"integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
|
"integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=6"
|
"node": ">=6"
|
||||||
@@ -1686,12 +1532,6 @@
|
|||||||
"url": "https://github.com/sponsors/ljharb"
|
"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": {
|
"node_modules/request-progress": {
|
||||||
"version": "3.0.0",
|
"version": "3.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/request-progress/-/request-progress-3.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/request-progress/-/request-progress-3.0.0.tgz",
|
||||||
@@ -1701,12 +1541,6 @@
|
|||||||
"throttleit": "^1.0.0"
|
"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": {
|
"node_modules/restore-cursor": {
|
||||||
"version": "3.1.0",
|
"version": "3.1.0",
|
||||||
"resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz",
|
"resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz",
|
||||||
@@ -1721,9 +1555,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/rfdc": {
|
"node_modules/rfdc": {
|
||||||
"version": "1.3.1",
|
"version": "1.3.0",
|
||||||
"resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.1.tgz",
|
"resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz",
|
||||||
"integrity": "sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==",
|
"integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"node_modules/rimraf": {
|
"node_modules/rimraf": {
|
||||||
@@ -1777,9 +1611,9 @@
|
|||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"node_modules/semver": {
|
"node_modules/semver": {
|
||||||
"version": "7.6.0",
|
"version": "7.5.1",
|
||||||
"resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz",
|
"resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz",
|
||||||
"integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==",
|
"integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"lru-cache": "^6.0.0"
|
"lru-cache": "^6.0.0"
|
||||||
@@ -1791,23 +1625,6 @@
|
|||||||
"node": ">=10"
|
"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": {
|
"node_modules/shebang-command": {
|
||||||
"version": "2.0.0",
|
"version": "2.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
|
||||||
@@ -1830,18 +1647,14 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/side-channel": {
|
"node_modules/side-channel": {
|
||||||
"version": "1.0.5",
|
"version": "1.0.4",
|
||||||
"resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.5.tgz",
|
"resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
|
||||||
"integrity": "sha512-QcgiIWV4WV7qWExbN5llt6frQB/lBven9pqliLXfGPB+K9ZYXxDozp0wLkHS24kWCm+6YXH/f0HhnObZnZOBnQ==",
|
"integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"call-bind": "^1.0.6",
|
"call-bind": "^1.0.0",
|
||||||
"es-errors": "^1.3.0",
|
"get-intrinsic": "^1.0.2",
|
||||||
"get-intrinsic": "^1.2.4",
|
"object-inspect": "^1.9.0"
|
||||||
"object-inspect": "^1.13.1"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">= 0.4"
|
|
||||||
},
|
},
|
||||||
"funding": {
|
"funding": {
|
||||||
"url": "https://github.com/sponsors/ljharb"
|
"url": "https://github.com/sponsors/ljharb"
|
||||||
@@ -1868,9 +1681,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/sshpk": {
|
"node_modules/sshpk": {
|
||||||
"version": "1.18.0",
|
"version": "1.17.0",
|
||||||
"resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz",
|
"resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz",
|
||||||
"integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==",
|
"integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"asn1": "~0.2.3",
|
"asn1": "~0.2.3",
|
||||||
@@ -1943,13 +1756,10 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/throttleit": {
|
"node_modules/throttleit": {
|
||||||
"version": "1.0.1",
|
"version": "1.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz",
|
||||||
"integrity": "sha512-vDZpf9Chs9mAdfY046mcPt8fg5QSZr37hEH4TXYBnDF+izxgrbRGUAAaBvIk/fJm9aOFCGFd1EsNg5AZCbnQCQ==",
|
"integrity": "sha512-rkTVqu6IjfQ/6+uNuuc3sZek4CEYxTJom3IktzgdSxcZqdARuebbA/f4QmAxMQIxqq9ZLEUkSYqvuk1I6VKq4g==",
|
||||||
"dev": true,
|
"dev": true
|
||||||
"funding": {
|
|
||||||
"url": "https://github.com/sponsors/sindresorhus"
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
"node_modules/through": {
|
"node_modules/through": {
|
||||||
"version": "2.3.8",
|
"version": "2.3.8",
|
||||||
@@ -1957,11 +1767,6 @@
|
|||||||
"integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==",
|
"integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==",
|
||||||
"dev": true
|
"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": {
|
"node_modules/tmp": {
|
||||||
"version": "0.2.1",
|
"version": "0.2.1",
|
||||||
"resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz",
|
"resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz",
|
||||||
@@ -1975,33 +1780,22 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/tough-cookie": {
|
"node_modules/tough-cookie": {
|
||||||
"version": "4.1.3",
|
"version": "2.5.0",
|
||||||
"resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz",
|
"resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
|
||||||
"integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==",
|
"integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"psl": "^1.1.33",
|
"psl": "^1.1.28",
|
||||||
"punycode": "^2.1.1",
|
"punycode": "^2.1.1"
|
||||||
"universalify": "^0.2.0",
|
|
||||||
"url-parse": "^1.5.3"
|
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=6"
|
"node": ">=0.8"
|
||||||
}
|
|
||||||
},
|
|
||||||
"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_modules/tslib": {
|
"node_modules/tslib": {
|
||||||
"version": "2.6.2",
|
"version": "2.5.1",
|
||||||
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz",
|
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.1.tgz",
|
||||||
"integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==",
|
"integrity": "sha512-KaI6gPil5m9vF7DKaoXxx1ia9fxS4qG5YveErRRVknPDXXriu5M8h48YRjB6h5ZUOKuAKlSJYb0GaDe8I39fRw==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"node_modules/tunnel-agent": {
|
"node_modules/tunnel-agent": {
|
||||||
@@ -2035,9 +1829,10 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/universalify": {
|
"node_modules/universalify": {
|
||||||
"version": "2.0.1",
|
"version": "2.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz",
|
||||||
"integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
|
"integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==",
|
||||||
|
"dev": true,
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">= 10.0.0"
|
"node": ">= 10.0.0"
|
||||||
}
|
}
|
||||||
@@ -2051,16 +1846,6 @@
|
|||||||
"node": ">=8"
|
"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": {
|
"node_modules/uuid": {
|
||||||
"version": "8.3.2",
|
"version": "8.3.2",
|
||||||
"resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
|
"resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
|
||||||
|
11
package.json
11
package.json
@@ -1,17 +1,8 @@
|
|||||||
{
|
{
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"cypress:open": "cypress open",
|
"cypress:open": "cypress open"
|
||||||
"postinstall": "node ./npm-post-install.js"
|
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"cypress": "^12.12.0"
|
"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__));
|
|
38
phpstan.neon
38
phpstan.neon
@@ -1,38 +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\\_]+()#'
|
|
||||||
# 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,3 +1,3 @@
|
|||||||
To play on {{ config.lua.serverName }} you need an account.
|
To play on {{ config.lua.serverName }} you need an account.
|
||||||
All you have to do to create your new account is to enter an account {% if constant('USE_ACCOUNT_NAME') %}name{% else %}number{% endif %}, password{% if setting('core.account_country') %}, country{% endif %} and your email address.
|
All you have to do to create your new account is to enter an account {% if constant('USE_ACCOUNT_NAME') %}name{% else %}number{% endif %}, password{% if config.account_country %}, country{% endif %} and your email address.
|
||||||
Also you have to agree to the terms presented below. If you have done so, your account {% if constant('USE_ACCOUNT_NAME') %}name{% else %}number{% endif %} will be shown on the following page and your account password will be sent to your email address along with further instructions. If you do not receive the email with your password, please check your spam filter.<br/><br/>
|
Also you have to agree to the terms presented below. If you have done so, your account {% if constant('USE_ACCOUNT_NAME') %}name{% else %}number{% endif %} will be shown on the following page and your account password will be sent to your email address along with further instructions. If you do not receive the email with your password, please check your spam filter.<br/><br/>
|
||||||
|
@@ -1,37 +1,33 @@
|
|||||||
<?php
|
<?php
|
||||||
defined('MYAAC') or die('Direct access not allowed!');
|
defined('MYAAC') or die('Direct access not allowed!');
|
||||||
|
|
||||||
$reward = setting('core.account_mail_confirmed_reward');
|
$reward = config('account_mail_confirmed_reward');
|
||||||
|
|
||||||
$hasCoinsColumn = $db->hasColumn('accounts', 'coins');
|
$hasCoinsColumn = $db->hasColumn('accounts', 'coins');
|
||||||
$rewardCoins = setting('core.account_mail_confirmed_reward_coins');
|
if ($reward['coins'] > 0 && $hasCoinsColumn) {
|
||||||
if ($rewardCoins > 0 && !$hasCoinsColumn) {
|
log_append('email_confirm_error.log', 'accounts.coins column does not exist.');
|
||||||
log_append('error.log', 'email_confirm: accounts.coins column does not exist.');
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!isset($account) || !$account->isLoaded()) {
|
if (!isset($account) || !$account->isLoaded()) {
|
||||||
|
log_append('email_confirm_error.log', 'Account not loaded.');
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
$rewardMessage = 'You received %d %s for confirming your E-Mail address.';
|
if ($reward['premium_points'] > 0) {
|
||||||
|
$account->setCustomField('premium_points', (int)$account->getCustomField('premium_points') + $reward['premium_points']);
|
||||||
|
|
||||||
$rewardPremiumPoints = setting('core.account_mail_confirmed_reward_premium_points');
|
success(sprintf($reward['message'], $reward['premium_points'], 'premium points'));
|
||||||
if ($rewardPremiumPoints > 0) {
|
|
||||||
$account->setCustomField('premium_points', (int)$account->getCustomField('premium_points') + $rewardPremiumPoints);
|
|
||||||
|
|
||||||
success(sprintf($rewardMessage, $rewardPremiumPoints, 'premium points'));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($rewardCoins > 0 && $hasCoinsColumn) {
|
if ($reward['coins'] > 0 && $hasCoinsColumn) {
|
||||||
$account->setCustomField('coins', (int)$account->getCustomField('coins') + $rewardCoins);
|
$account->setCustomField('coins', (int)$account->getCustomField('coins') + $reward['coins']);
|
||||||
|
|
||||||
success(sprintf($rewardMessage, $rewardCoins, 'coins'));
|
success(sprintf($reward['message'], $reward['coins'], 'coins'));
|
||||||
}
|
}
|
||||||
|
|
||||||
$rewardPremiumDays = setting('core.account_mail_confirmed_reward_premium_days');
|
if ($reward['premium_days'] > 0) {
|
||||||
if ($rewardPremiumDays > 0) {
|
$account->setPremDays($account->getPremDays() + $reward['premium_days']);
|
||||||
$account->setPremDays($account->getPremDays() + $rewardPremiumDays);
|
|
||||||
$account->save();
|
$account->save();
|
||||||
|
|
||||||
success(sprintf($rewardMessage, $rewardPremiumDays, 'premium days'));
|
success(sprintf($reward['message'], $reward['premium_days'], 'premium days'));
|
||||||
}
|
}
|
||||||
|
@@ -39,6 +39,5 @@
|
|||||||
"redirect_from": "/redirectExample",
|
"redirect_from": "/redirectExample",
|
||||||
"redirect_to": "account/manage"
|
"redirect_to": "account/manage"
|
||||||
}
|
}
|
||||||
},
|
}
|
||||||
"settings": "plugins/your-plugin-folder/settings.php"
|
|
||||||
}
|
}
|
||||||
|
@@ -22,7 +22,7 @@ if [ $1 = "prepare" ]; then
|
|||||||
mkdir -p tmp
|
mkdir -p tmp
|
||||||
|
|
||||||
# get myaac from git archive
|
# get myaac from git archive
|
||||||
git archive --format zip --output tmp/myaac.zip develop
|
git archive --format zip --output tmp/myaac.zip 0.9
|
||||||
|
|
||||||
cd tmp/ || exit
|
cd tmp/ || exit
|
||||||
|
|
||||||
@@ -38,11 +38,7 @@ if [ $1 = "prepare" ]; then
|
|||||||
cd $dir || exit
|
cd $dir || exit
|
||||||
|
|
||||||
# dependencies
|
# dependencies
|
||||||
composer install --no-dev --prefer-dist --optimize-autoloader
|
composer install --no-dev
|
||||||
npm install
|
|
||||||
|
|
||||||
# node_modules is useless, we already have copy in tools/ext
|
|
||||||
rm -R node_modules
|
|
||||||
|
|
||||||
echo "Now you can make changes to $dir. When you are ready, type 'release.sh pack'"
|
echo "Now you can make changes to $dir. When you are ready, type 'release.sh pack'"
|
||||||
exit
|
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);
|
||||||
|
}
|
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;
|
@@ -9,12 +9,10 @@
|
|||||||
*/
|
*/
|
||||||
defined('MYAAC') or die('Direct access not allowed!');
|
defined('MYAAC') or die('Direct access not allowed!');
|
||||||
|
|
||||||
class Validator extends \MyAAC\Validator {}
|
|
||||||
|
|
||||||
function check_name($name, &$errors = '') {
|
function check_name($name, &$errors = '') {
|
||||||
if(Validator::characterName($name))
|
if(Validator::characterName($name))
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
$errors = Validator::getLastError();
|
$errors = Validator::getLastError();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -22,7 +20,7 @@ function check_name($name, &$errors = '') {
|
|||||||
function check_account_id($id, &$errors = '') {
|
function check_account_id($id, &$errors = '') {
|
||||||
if(Validator::accountId($id))
|
if(Validator::accountId($id))
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
$errors = Validator::getLastError();
|
$errors = Validator::getLastError();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -30,7 +28,7 @@ function check_account_id($id, &$errors = '') {
|
|||||||
function check_account_name($name, &$errors = '') {
|
function check_account_name($name, &$errors = '') {
|
||||||
if(Validator::accountName($name))
|
if(Validator::accountName($name))
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
$errors = Validator::getLastError();
|
$errors = Validator::getLastError();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -38,7 +36,7 @@ function check_account_name($name, &$errors = '') {
|
|||||||
function check_name_new_char($name, &$errors = '') {
|
function check_name_new_char($name, &$errors = '') {
|
||||||
if(Validator::newCharacterName($name))
|
if(Validator::newCharacterName($name))
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
$errors = Validator::getLastError();
|
$errors = Validator::getLastError();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -46,7 +44,7 @@ function check_name_new_char($name, &$errors = '') {
|
|||||||
function check_rank_name($name, &$errors = '') {
|
function check_rank_name($name, &$errors = '') {
|
||||||
if(Validator::rankName($name))
|
if(Validator::rankName($name))
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
$errors = Validator::getLastError();
|
$errors = Validator::getLastError();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -54,7 +52,7 @@ function check_rank_name($name, &$errors = '') {
|
|||||||
function check_guild_name($name, &$errors = '') {
|
function check_guild_name($name, &$errors = '') {
|
||||||
if(Validator::guildName($name))
|
if(Validator::guildName($name))
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
$errors = Validator::getLastError();
|
$errors = Validator::getLastError();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -74,7 +72,4 @@ function fieldExist($field, $table)
|
|||||||
global $db;
|
global $db;
|
||||||
return $db->hasColumn($table, $field);
|
return $db->hasColumn($table, $field);
|
||||||
}
|
}
|
||||||
|
?>
|
||||||
function getCreatureImgPath($creature): string {
|
|
||||||
return getMonsterImgPath($creature);
|
|
||||||
}
|
|
@@ -1,118 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
$deprecatedConfig = [
|
|
||||||
'date_timezone',
|
|
||||||
'genders',
|
|
||||||
'template',
|
|
||||||
'template_allow_change',
|
|
||||||
'vocations_amount',
|
|
||||||
'vocations',
|
|
||||||
'client',
|
|
||||||
'session_prefix',
|
|
||||||
'friendly_urls',
|
|
||||||
'backward_support',
|
|
||||||
'charset',
|
|
||||||
'meta_description',
|
|
||||||
'meta_keywords',
|
|
||||||
'footer',
|
|
||||||
'database_encryption' => 'database_hash',
|
|
||||||
//'language',
|
|
||||||
'visitors_counter',
|
|
||||||
'visitors_counter_ttl',
|
|
||||||
'views_counter',
|
|
||||||
'outfit_images_url',
|
|
||||||
'outfit_images_wrong_looktypes',
|
|
||||||
'item_images_url',
|
|
||||||
'account_country',
|
|
||||||
'towns',
|
|
||||||
'quests',
|
|
||||||
'character_samples',
|
|
||||||
'character_towns',
|
|
||||||
'characters_per_account',
|
|
||||||
'characters_search_limit',
|
|
||||||
'news_author',
|
|
||||||
'news_limit',
|
|
||||||
'news_ticker_limit',
|
|
||||||
'news_date_format',
|
|
||||||
'guild_management',
|
|
||||||
'guild_need_level',
|
|
||||||
'guild_need_premium',
|
|
||||||
'guild_image_size_kb',
|
|
||||||
'guild_description_default',
|
|
||||||
'guild_description_chars_limit',
|
|
||||||
'guild_motd_chars_limit',
|
|
||||||
'highscores_groups_hidden',
|
|
||||||
'highscores_ids_hidden',
|
|
||||||
'highscores_vocation_box',
|
|
||||||
'highscores_vocation',
|
|
||||||
'highscores_outfit',
|
|
||||||
'online_record',
|
|
||||||
'online_vocations',
|
|
||||||
'online_vocations_images',
|
|
||||||
'online_skulls',
|
|
||||||
'online_outfit',
|
|
||||||
'online_afk',
|
|
||||||
'team_display_outfit' => 'team_outfit',
|
|
||||||
'team_display_status' => 'team_status',
|
|
||||||
'team_display_world' => 'team_world',
|
|
||||||
'team_display_lastlogin' => 'team_lastlogin',
|
|
||||||
'last_kills_limit',
|
|
||||||
'multiworld',
|
|
||||||
'forum',
|
|
||||||
'signature_enabled',
|
|
||||||
'signature_type',
|
|
||||||
'signature_cache_time',
|
|
||||||
'signature_browser_cache',
|
|
||||||
'gifts_system',
|
|
||||||
'status_enabled',
|
|
||||||
'status_ip',
|
|
||||||
'status_port',
|
|
||||||
'mail_enabled',
|
|
||||||
'mail_address',
|
|
||||||
'account_login_by_email',
|
|
||||||
'account_login_by_email_fallback',
|
|
||||||
'account_mail_verify',
|
|
||||||
'account_mail_unique',
|
|
||||||
'account_mail_change',
|
|
||||||
'account_premium_days',
|
|
||||||
'account_premium_points',
|
|
||||||
'account_create_character_create',
|
|
||||||
'account_change_character_name',
|
|
||||||
'account_change_character_name_points' => 'account_change_character_name_price',
|
|
||||||
'account_change_character_sex',
|
|
||||||
'account_change_character_sex_points' => 'account_change_character_name_price',
|
|
||||||
];
|
|
||||||
|
|
||||||
foreach ($deprecatedConfig as $key => $value) {
|
|
||||||
config(
|
|
||||||
[
|
|
||||||
(is_string($key) ? $key : $value),
|
|
||||||
setting('core.'.$value)
|
|
||||||
]
|
|
||||||
);
|
|
||||||
|
|
||||||
//var_dump($settings['core.'.$value]['value']);
|
|
||||||
}
|
|
||||||
|
|
||||||
$deprecatedConfigCharacters = [
|
|
||||||
'level',
|
|
||||||
'experience',
|
|
||||||
'magic_level',
|
|
||||||
'balance',
|
|
||||||
'marriage_info' => 'marriage',
|
|
||||||
'outfit',
|
|
||||||
'creation_date',
|
|
||||||
'quests',
|
|
||||||
'skills',
|
|
||||||
'equipment',
|
|
||||||
'frags',
|
|
||||||
'deleted',
|
|
||||||
];
|
|
||||||
|
|
||||||
$tmp = [];
|
|
||||||
foreach ($deprecatedConfigCharacters as $key => $value) {
|
|
||||||
$tmp[(is_string($key) ? $key : $value)] = setting('core.characters_'.$value);
|
|
||||||
}
|
|
||||||
|
|
||||||
config(['characters', $tmp]);
|
|
||||||
unset($tmp);
|
|
@@ -44,7 +44,7 @@ switch($page)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case 'killstatistics':
|
case 'killstatistics':
|
||||||
$page = 'last-kills';
|
$page = 'lastkills';
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'buypoints':
|
case 'buypoints':
|
||||||
|
@@ -7,9 +7,6 @@
|
|||||||
* @copyright 2019 MyAAC
|
* @copyright 2019 MyAAC
|
||||||
* @link https://my-aac.org
|
* @link https://my-aac.org
|
||||||
*/
|
*/
|
||||||
|
|
||||||
use MyAAC\Cache\Cache;
|
|
||||||
|
|
||||||
defined('MYAAC') or die('Direct access not allowed!');
|
defined('MYAAC') or die('Direct access not allowed!');
|
||||||
define('COUNTER_SYNC', 10); // how often counter is synchronized with database (each x site refreshes)
|
define('COUNTER_SYNC', 10); // how often counter is synchronized with database (each x site refreshes)
|
||||||
|
|
||||||
|
@@ -7,16 +7,9 @@
|
|||||||
* @copyright 2019 MyAAC
|
* @copyright 2019 MyAAC
|
||||||
* @link https://my-aac.org
|
* @link https://my-aac.org
|
||||||
*/
|
*/
|
||||||
|
|
||||||
use Illuminate\Database\Capsule\Manager as Capsule;
|
|
||||||
|
|
||||||
defined('MYAAC') or die('Direct access not allowed!');
|
defined('MYAAC') or die('Direct access not allowed!');
|
||||||
|
|
||||||
if (!isset($config['database_overwrite'])) {
|
if(!isset($config['database_user'][0], $config['database_password'][0], $config['database_name'][0]))
|
||||||
$config['database_overwrite'] = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(!$config['database_overwrite'] && !isset($config['database_user'][0], $config['database_password'][0], $config['database_name'][0]))
|
|
||||||
{
|
{
|
||||||
if(isset($config['lua']['sqlType'])) {// tfs 0.3
|
if(isset($config['lua']['sqlType'])) {// tfs 0.3
|
||||||
if(isset($config['lua']['mysqlHost'])) {// tfs 0.2
|
if(isset($config['lua']['mysqlHost'])) {// tfs 0.2
|
||||||
@@ -94,34 +87,21 @@ if(!isset($config['database_socket'])) {
|
|||||||
$config['database_socket'] = '';
|
$config['database_socket'] = '';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
$ots->connect(array(
|
$ots->connect(array(
|
||||||
'host' => $config['database_host'],
|
'host' => $config['database_host'],
|
||||||
'user' => $config['database_user'],
|
'user' => $config['database_user'],
|
||||||
'password' => $config['database_password'],
|
'password' => $config['database_password'],
|
||||||
'database' => $config['database_name'],
|
'database' => $config['database_name'],
|
||||||
'log' => $config['database_log'],
|
'log' => $config['database_log'],
|
||||||
'socket' => @$config['database_socket'],
|
'socket' => @$config['database_socket'],
|
||||||
'persistent' => @$config['database_persistent']
|
'persistent' => @$config['database_persistent']
|
||||||
));
|
)
|
||||||
|
);
|
||||||
|
|
||||||
$db = POT::getInstance()->getDBHandle();
|
$db = POT::getInstance()->getDBHandle();
|
||||||
$capsule = new Capsule;
|
}
|
||||||
$capsule->addConnection([
|
catch(PDOException $error) {
|
||||||
'driver' => 'mysql',
|
|
||||||
'database' => $config['database_name'],
|
|
||||||
]);
|
|
||||||
|
|
||||||
$capsule->getConnection()->setPdo($db);
|
|
||||||
$capsule->getConnection()->setReadPdo($db);
|
|
||||||
|
|
||||||
$capsule->setAsGlobal();
|
|
||||||
$capsule->bootEloquent();
|
|
||||||
|
|
||||||
$eloquentConnection = $capsule->getConnection();
|
|
||||||
|
|
||||||
} catch (Exception $e) {
|
|
||||||
if(isset($cache) && $cache->enabled()) {
|
if(isset($cache) && $cache->enabled()) {
|
||||||
$cache->delete('config_lua');
|
$cache->delete('config_lua');
|
||||||
}
|
}
|
||||||
@@ -135,5 +115,5 @@ try {
|
|||||||
'<ul>' .
|
'<ul>' .
|
||||||
'<li>MySQL is not configured propertly in <i>config.lua</i>.</li>' .
|
'<li>MySQL is not configured propertly in <i>config.lua</i>.</li>' .
|
||||||
'<li>MySQL server is not running.</li>' .
|
'<li>MySQL server is not running.</li>' .
|
||||||
'</ul>' . $e->getMessage());
|
'</ul>' . $error->getMessage());
|
||||||
}
|
}
|
@@ -8,8 +8,6 @@
|
|||||||
* @link https://my-aac.org
|
* @link https://my-aac.org
|
||||||
*/
|
*/
|
||||||
|
|
||||||
use MyAAC\Exceptions\SensitiveException;
|
|
||||||
|
|
||||||
if (class_exists(\Whoops\Run::class)) {
|
if (class_exists(\Whoops\Run::class)) {
|
||||||
$whoops = new \Whoops\Run;
|
$whoops = new \Whoops\Run;
|
||||||
if(IS_CLI) {
|
if(IS_CLI) {
|
||||||
@@ -23,6 +21,8 @@ if (class_exists(\Whoops\Run::class)) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
require LIBS . 'SensitiveException.php';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param Exception $exception
|
* @param Exception $exception
|
||||||
*/
|
*/
|
||||||
|
File diff suppressed because it is too large
Load Diff
@@ -1,10 +1,15 @@
|
|||||||
<?php
|
<?php
|
||||||
|
/**
|
||||||
const SKILL_FRAGS = -1;
|
* Events system
|
||||||
const SKILL_BALANCE = -2;
|
*
|
||||||
|
* @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;
|
$i = 0;
|
||||||
|
|
||||||
define('HOOK_STARTUP', ++$i);
|
define('HOOK_STARTUP', ++$i);
|
||||||
define('HOOK_BEFORE_PAGE', ++$i);
|
define('HOOK_BEFORE_PAGE', ++$i);
|
||||||
define('HOOK_AFTER_PAGE', ++$i);
|
define('HOOK_AFTER_PAGE', ++$i);
|
||||||
@@ -53,7 +58,6 @@ define('HOOK_ACCOUNT_LOGIN_AFTER_PASSWORD', ++$i);
|
|||||||
define('HOOK_ACCOUNT_LOGIN_AFTER_REMEMBER_ME', ++$i);
|
define('HOOK_ACCOUNT_LOGIN_AFTER_REMEMBER_ME', ++$i);
|
||||||
define('HOOK_ACCOUNT_LOGIN_AFTER_PAGE', ++$i);
|
define('HOOK_ACCOUNT_LOGIN_AFTER_PAGE', ++$i);
|
||||||
define('HOOK_ACCOUNT_LOGIN_POST', ++$i);
|
define('HOOK_ACCOUNT_LOGIN_POST', ++$i);
|
||||||
define('HOOK_ACCOUNT_CREATE_CHARACTER_AFTER', ++$i);
|
|
||||||
define('HOOK_ADMIN_HEAD_END', ++$i);
|
define('HOOK_ADMIN_HEAD_END', ++$i);
|
||||||
define('HOOK_ADMIN_HEAD_START', ++$i);
|
define('HOOK_ADMIN_HEAD_START', ++$i);
|
||||||
define('HOOK_ADMIN_BODY_START', ++$i);
|
define('HOOK_ADMIN_BODY_START', ++$i);
|
||||||
@@ -64,44 +68,79 @@ define('HOOK_ADMIN_LOGIN_AFTER_ACCOUNT', ++$i);
|
|||||||
define('HOOK_ADMIN_LOGIN_AFTER_PASSWORD', ++$i);
|
define('HOOK_ADMIN_LOGIN_AFTER_PASSWORD', ++$i);
|
||||||
define('HOOK_ADMIN_LOGIN_AFTER_SIGN_IN', ++$i);
|
define('HOOK_ADMIN_LOGIN_AFTER_SIGN_IN', ++$i);
|
||||||
define('HOOK_ADMIN_ACCOUNTS_SAVE_POST', ++$i);
|
define('HOOK_ADMIN_ACCOUNTS_SAVE_POST', ++$i);
|
||||||
define('HOOK_ADMIN_SETTINGS_BEFORE_SAVE', ++$i);
|
|
||||||
define('HOOK_CRONJOB', ++$i);
|
|
||||||
define('HOOK_EMAIL_CONFIRMED', ++$i);
|
define('HOOK_EMAIL_CONFIRMED', ++$i);
|
||||||
define('HOOK_GUILDS_BEFORE_GUILD_HEADER', ++$i);
|
|
||||||
define('HOOK_GUILDS_AFTER_GUILD_HEADER', ++$i);
|
|
||||||
define('HOOK_GUILDS_AFTER_GUILD_INFORMATION', ++$i);
|
|
||||||
define('HOOK_GUILDS_AFTER_GUILD_MEMBERS', ++$i);
|
|
||||||
define('HOOK_GUILDS_AFTER_INVITED_CHARACTERS', ++$i);
|
define('HOOK_GUILDS_AFTER_INVITED_CHARACTERS', ++$i);
|
||||||
define('HOOK_TWIG', ++$i);
|
|
||||||
define('HOOK_CACHE_CLEAR', ++$i);
|
|
||||||
|
|
||||||
const HOOK_FIRST = HOOK_STARTUP;
|
const HOOK_FIRST = HOOK_STARTUP;
|
||||||
define('HOOK_LAST', $i);
|
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
|
private $_name, $_type, $_file;
|
||||||
$dir = dirname($path);
|
|
||||||
$folder = substr($path, strlen($dir));
|
|
||||||
|
|
||||||
//Check the base dir is valid
|
public function __construct($name, $type, $file) {
|
||||||
$dir = realpath($dir);
|
$this->_name = $name;
|
||||||
|
$this->_type = $type;
|
||||||
//Only allow valid filename characters
|
$this->_file = $file;
|
||||||
$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
|
public function execute($params)
|
||||||
$path = $dir. '/' . $folder;
|
{
|
||||||
|
extract($params);
|
||||||
|
/*if(is_callable($this->_callback))
|
||||||
|
{
|
||||||
|
$tmp = $this->_callback;
|
||||||
|
$ret = $tmp($params);
|
||||||
|
}*/
|
||||||
|
|
||||||
//If this path is higher than the parent folder
|
global $db, $config, $template_path, $ots, $content, $twig;
|
||||||
if( strcasecmp($path, $parent_folder) > 0 ) {
|
$ret = include BASE . $this->_file;
|
||||||
return $path;
|
|
||||||
|
return !isset($ret) || $ret == 1 || $ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
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();
|
||||||
|
}
|
||||||
}
|
}
|
142
system/init.php
142
system/init.php
@@ -7,16 +7,13 @@
|
|||||||
* @copyright 2019 MyAAC
|
* @copyright 2019 MyAAC
|
||||||
* @link https://my-aac.org
|
* @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!');
|
defined('MYAAC') or die('Direct access not allowed!');
|
||||||
|
|
||||||
|
// load configuration
|
||||||
|
require_once BASE . 'config.php';
|
||||||
|
if(file_exists(BASE . 'config.local.php')) // user customizations
|
||||||
|
require BASE . 'config.local.php';
|
||||||
|
|
||||||
if(!isset($config['installed']) || !$config['installed']) {
|
if(!isset($config['installed']) || !$config['installed']) {
|
||||||
throw new RuntimeException('MyAAC has not been installed yet or there was error during installation. Please install again.');
|
throw new RuntimeException('MyAAC has not been installed yet or there was error during installation. Please install again.');
|
||||||
}
|
}
|
||||||
@@ -25,29 +22,19 @@ if(config('env') === 'dev') {
|
|||||||
require SYSTEM . 'exception.php';
|
require SYSTEM . 'exception.php';
|
||||||
}
|
}
|
||||||
|
|
||||||
if (config('env') === 'dev' || getBoolean(config('enable_debugbar'))) {
|
date_default_timezone_set($config['date_timezone']);
|
||||||
$debugBar = new StandardDebugBar();
|
|
||||||
}
|
|
||||||
|
|
||||||
if(empty($config['server_path'])) {
|
|
||||||
throw new RuntimeException('Server Path has been not set. Go to config.php and set it.');
|
|
||||||
}
|
|
||||||
|
|
||||||
// take care of trailing slash at the end
|
// take care of trailing slash at the end
|
||||||
if($config['server_path'][strlen($config['server_path']) - 1] !== '/')
|
if($config['server_path'][strlen($config['server_path']) - 1] !== '/')
|
||||||
$config['server_path'] .= '/';
|
$config['server_path'] .= '/';
|
||||||
|
|
||||||
// enable gzip compression if supported by the browser
|
// enable gzip compression if supported by the browser
|
||||||
if(isset($config['gzip_output']) && $config['gzip_output'] && isset($_SERVER['HTTP_ACCEPT_ENCODING']) && strpos($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip') !== false && function_exists('ob_gzhandler'))
|
if($config['gzip_output'] && isset($_SERVER['HTTP_ACCEPT_ENCODING']) && strpos($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip') !== false && function_exists('ob_gzhandler'))
|
||||||
ob_start('ob_gzhandler');
|
ob_start('ob_gzhandler');
|
||||||
|
|
||||||
// cache
|
// cache
|
||||||
|
require_once SYSTEM . 'libs/cache.php';
|
||||||
$cache = Cache::getInstance();
|
$cache = Cache::getInstance();
|
||||||
|
|
||||||
// event system
|
|
||||||
$hooks = new Hooks();
|
|
||||||
$hooks->load();
|
|
||||||
|
|
||||||
// twig
|
// twig
|
||||||
require_once SYSTEM . 'twig.php';
|
require_once SYSTEM . 'twig.php';
|
||||||
|
|
||||||
@@ -55,24 +42,28 @@ require_once SYSTEM . 'twig.php';
|
|||||||
$action = $_REQUEST['action'] ?? '';
|
$action = $_REQUEST['action'] ?? '';
|
||||||
define('ACTION', $action);
|
define('ACTION', $action);
|
||||||
|
|
||||||
// errors, is also often used
|
|
||||||
$errors = [];
|
|
||||||
|
|
||||||
// trim values we receive
|
// trim values we receive
|
||||||
foreach($_POST as $var => $value) {
|
if(isset($_POST))
|
||||||
if(is_string($value)) {
|
{
|
||||||
$_POST[$var] = trim($value);
|
foreach($_POST as $var => $value) {
|
||||||
|
if(is_string($value)) {
|
||||||
|
$_POST[$var] = trim($value);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if(isset($_GET))
|
||||||
foreach($_GET as $var => $value) {
|
{
|
||||||
if(is_string($value))
|
foreach($_GET as $var => $value) {
|
||||||
$_GET[$var] = trim($value);
|
if(is_string($value))
|
||||||
|
$_GET[$var] = trim($value);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
if(isset($_REQUEST))
|
||||||
foreach($_REQUEST as $var => $value) {
|
{
|
||||||
if(is_string($value))
|
foreach($_REQUEST as $var => $value) {
|
||||||
$_REQUEST[$var] = trim($value);
|
if(is_string($value))
|
||||||
|
$_REQUEST[$var] = trim($value);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// load otserv config file
|
// load otserv config file
|
||||||
@@ -105,6 +96,9 @@ if(isset($config['lua']['servername']))
|
|||||||
if(isset($config['lua']['houserentperiod']))
|
if(isset($config['lua']['houserentperiod']))
|
||||||
$config['lua']['houseRentPeriod'] = $config['lua']['houserentperiod'];
|
$config['lua']['houseRentPeriod'] = $config['lua']['houserentperiod'];
|
||||||
|
|
||||||
|
if($config['item_images_url'][strlen($config['item_images_url']) - 1] !== '/')
|
||||||
|
$config['item_images_url'] .= '/';
|
||||||
|
|
||||||
// localize data/ directory based on data directory set in config.lua
|
// localize data/ directory based on data directory set in config.lua
|
||||||
foreach(array('dataDirectory', 'data_directory', 'datadir') as $key) {
|
foreach(array('dataDirectory', 'data_directory', 'datadir') as $key) {
|
||||||
if(!isset($config['lua'][$key][0])) {
|
if(!isset($config['lua'][$key][0])) {
|
||||||
@@ -128,53 +122,51 @@ if(!isset($foundValue)) {
|
|||||||
$config['data_path'] = $foundValue;
|
$config['data_path'] = $foundValue;
|
||||||
unset($foundValue);
|
unset($foundValue);
|
||||||
|
|
||||||
|
// new config values for compatibility
|
||||||
|
if(!isset($config['highscores_ids_hidden']) || count($config['highscores_ids_hidden']) == 0) {
|
||||||
|
$config['highscores_ids_hidden'] = array(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
$config['account_create_character_create'] = config('account_create_character_create') && (!config('mail_enabled') || !config('account_mail_verify'));
|
||||||
|
|
||||||
// POT
|
// POT
|
||||||
require_once SYSTEM . 'libs/pot/OTS.php';
|
require_once SYSTEM . 'libs/pot/OTS.php';
|
||||||
$ots = POT::getInstance();
|
$ots = POT::getInstance();
|
||||||
$eloquentConnection = null;
|
|
||||||
require_once SYSTEM . 'database.php';
|
require_once SYSTEM . 'database.php';
|
||||||
|
|
||||||
if ($config_lua_reload) {
|
|
||||||
clearCache();
|
|
||||||
}
|
|
||||||
|
|
||||||
// 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
|
|
||||||
$settings = Settings::getInstance();
|
|
||||||
$settings->load();
|
|
||||||
|
|
||||||
// csrf protection
|
|
||||||
$token = getSession('csrf_token');
|
|
||||||
if (!isset($token) || !$token) {
|
|
||||||
CsrfToken::generate();
|
|
||||||
}
|
|
||||||
|
|
||||||
// deprecated config values
|
|
||||||
require_once SYSTEM . 'compat/config.php';
|
|
||||||
|
|
||||||
date_default_timezone_set(setting('core.date_timezone'));
|
|
||||||
|
|
||||||
setting(
|
|
||||||
[
|
|
||||||
'core.account_create_character_create',
|
|
||||||
setting('core.account_create_character_create') && (!setting('core.mail_enabled') || !setting('core.account_mail_verify'))
|
|
||||||
]
|
|
||||||
);
|
|
||||||
|
|
||||||
$settingsItemImagesURL = setting('core.item_images_url');
|
|
||||||
if($settingsItemImagesURL[strlen($settingsItemImagesURL) - 1] !== '/') {
|
|
||||||
setting(['core.item_images_url', $settingsItemImagesURL . '/']);
|
|
||||||
}
|
|
||||||
|
|
||||||
define('USE_ACCOUNT_NAME', $db->hasColumn('accounts', 'name'));
|
define('USE_ACCOUNT_NAME', $db->hasColumn('accounts', 'name'));
|
||||||
define('USE_ACCOUNT_NUMBER', $db->hasColumn('accounts', 'number'));
|
define('USE_ACCOUNT_NUMBER', $db->hasColumn('accounts', 'number'));
|
||||||
define('USE_ACCOUNT_SALT', $db->hasColumn('accounts', 'salt'));
|
define('USE_ACCOUNT_SALT', $db->hasColumn('accounts', 'salt'));
|
||||||
|
|
||||||
|
// load vocation names
|
||||||
|
$tmp = '';
|
||||||
|
if($cache->enabled() && $cache->fetch('vocations', $tmp)) {
|
||||||
|
$config['vocations'] = unserialize($tmp);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if(!class_exists('DOMDocument')) {
|
||||||
|
throw new RuntimeException('Please install PHP xml extension. MyAAC will not work without it.');
|
||||||
|
}
|
||||||
|
|
||||||
|
$vocations = new DOMDocument();
|
||||||
|
$file = $config['data_path'] . 'XML/vocations.xml';
|
||||||
|
if(!@file_exists($file))
|
||||||
|
$file = $config['data_path'] . 'vocations.xml';
|
||||||
|
|
||||||
|
if(!$vocations->load($file))
|
||||||
|
throw new RuntimeException('ERROR: Cannot load <i>vocations.xml</i> - the file is malformed. Check the file with xml syntax validator.');
|
||||||
|
|
||||||
|
$config['vocations'] = array();
|
||||||
|
foreach($vocations->getElementsByTagName('vocation') as $vocation) {
|
||||||
|
$id = $vocation->getAttribute('id');
|
||||||
|
$config['vocations'][$id] = $vocation->getAttribute('name');
|
||||||
|
}
|
||||||
|
|
||||||
|
if($cache->enabled()) {
|
||||||
|
$cache->set('vocations', serialize($config['vocations']), 120);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
unset($tmp, $id, $vocation);
|
||||||
|
|
||||||
|
require LIBS . 'Towns.php';
|
||||||
Towns::load();
|
Towns::load();
|
||||||
|
60
system/item.php
Normal file
60
system/item.php
Normal file
@@ -0,0 +1,60 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Item parser
|
||||||
|
*
|
||||||
|
* @package MyAAC
|
||||||
|
* @author Slawkens <slawkens@gmail.com>
|
||||||
|
* @copyright 2019 MyAAC
|
||||||
|
* @link https://my-aac.org
|
||||||
|
*/
|
||||||
|
defined('MYAAC') or die('Direct access not allowed!');
|
||||||
|
require_once SYSTEM . 'libs/items_images.php';
|
||||||
|
|
||||||
|
Items_Images::$files = array(
|
||||||
|
'otb' => SYSTEM . 'data/items.otb',
|
||||||
|
'spr' => SYSTEM . 'data/Tibia.spr',
|
||||||
|
'dat' => SYSTEM . 'data/Tibia.dat'
|
||||||
|
);
|
||||||
|
Items_Images::$outputDir = BASE . 'images/items/';
|
||||||
|
|
||||||
|
function generateItem($id = 100, $count = 1) {
|
||||||
|
Items_Images::generate($id, $count);
|
||||||
|
}
|
||||||
|
|
||||||
|
function itemImageExists($id, $count = 1)
|
||||||
|
{
|
||||||
|
if(!isset($id))
|
||||||
|
throw new RuntimeException('ERROR - itemImageExists: id has been not set!');
|
||||||
|
|
||||||
|
$file_name = $id;
|
||||||
|
if($count > 1)
|
||||||
|
$file_name .= '-' . $count;
|
||||||
|
|
||||||
|
$file_name = Items_Images::$outputDir . $file_name . '.gif';
|
||||||
|
return file_exists($file_name);
|
||||||
|
}
|
||||||
|
|
||||||
|
function outputItem($id = 100, $count = 1)
|
||||||
|
{
|
||||||
|
if(!(int)$count)
|
||||||
|
$count = 1;
|
||||||
|
|
||||||
|
if(!itemImageExists($id, $count))
|
||||||
|
{
|
||||||
|
//echo 'plik istnieje';
|
||||||
|
Items_Images::generate($id, $count);
|
||||||
|
}
|
||||||
|
|
||||||
|
$expires = 60 * 60 * 24 * 30; // 30 days
|
||||||
|
header('Content-type: image/gif');
|
||||||
|
header('Cache-Control: public');
|
||||||
|
header('Cache-Control: maxage=' . $expires);
|
||||||
|
header('Expires: ' . gmdate('D, d M Y H:i:s', time() + $expires) . ' GMT');
|
||||||
|
|
||||||
|
$file_name = $id;
|
||||||
|
if($count > 1)
|
||||||
|
$file_name .= '-' . $count;
|
||||||
|
|
||||||
|
$file_name = Items_Images::$outputDir . $file_name . '.gif';
|
||||||
|
readfile($file_name);
|
||||||
|
}
|
@@ -1,9 +1,4 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
namespace MyAAC;
|
|
||||||
|
|
||||||
use MyAAC\Models\Player;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* CreateCharacter
|
* CreateCharacter
|
||||||
*
|
*
|
||||||
@@ -23,8 +18,8 @@ class CreateCharacter
|
|||||||
*/
|
*/
|
||||||
public function checkName($name, &$errors)
|
public function checkName($name, &$errors)
|
||||||
{
|
{
|
||||||
$minLength = setting('core.create_character_name_min_length');
|
$minLength = config('character_name_min_length');
|
||||||
$maxLength = setting('core.create_character_name_max_length');
|
$maxLength = config('character_name_max_length');
|
||||||
|
|
||||||
if(empty($name)) {
|
if(empty($name)) {
|
||||||
$errors['name'] = 'Please enter a name for your character!';
|
$errors['name'] = 'Please enter a name for your character!';
|
||||||
@@ -52,12 +47,14 @@ class CreateCharacter
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!admin() && !\Validator::newCharacterName($name)) {
|
if(!admin() && !Validator::newCharacterName($name)) {
|
||||||
$errors['name'] = \Validator::getLastError();
|
$errors['name'] = Validator::getLastError();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(Player::where('name', '=', $name)->exists()) {
|
$player = new OTS_Player();
|
||||||
|
$player->find($name);
|
||||||
|
if($player->isLoaded()) {
|
||||||
$errors['name'] = 'Character with this name already exist.';
|
$errors['name'] = 'Character with this name already exist.';
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -73,7 +70,7 @@ class CreateCharacter
|
|||||||
* @param array $errors
|
* @param array $errors
|
||||||
* @return bool
|
* @return bool
|
||||||
*/
|
*/
|
||||||
public function check($name, $sex, ?int &$vocation, ?int &$town, &$errors)
|
public function check($name, $sex, &$vocation, &$town, &$errors)
|
||||||
{
|
{
|
||||||
$this->checkName($name, $errors);
|
$this->checkName($name, $errors);
|
||||||
|
|
||||||
@@ -125,13 +122,13 @@ class CreateCharacter
|
|||||||
* @param int $sex
|
* @param int $sex
|
||||||
* @param int $vocation
|
* @param int $vocation
|
||||||
* @param int $town
|
* @param int $town
|
||||||
* @param \OTS_Account $account
|
* @param OTS_Account $account
|
||||||
* @param array $errors
|
* @param array $errors
|
||||||
* @return bool
|
* @return bool
|
||||||
* @throws \E_OTS_NotLoaded
|
* @throws E_OTS_NotLoaded
|
||||||
* @throws \Twig_Error_Loader
|
* @throws Twig_Error_Loader
|
||||||
* @throws \Twig_Error_Runtime
|
* @throws Twig_Error_Runtime
|
||||||
* @throws \Twig_Error_Syntax
|
* @throws Twig_Error_Syntax
|
||||||
*/
|
*/
|
||||||
public function doCreate($name, $sex, $vocation, $town, $account, &$errors)
|
public function doCreate($name, $sex, $vocation, $town, $account, &$errors)
|
||||||
{
|
{
|
||||||
@@ -142,17 +139,17 @@ class CreateCharacter
|
|||||||
if(empty($errors))
|
if(empty($errors))
|
||||||
{
|
{
|
||||||
$number_of_players_on_account = $account->getPlayersList(true)->count();
|
$number_of_players_on_account = $account->getPlayersList(true)->count();
|
||||||
if($number_of_players_on_account >= setting('core.characters_per_account'))
|
if($number_of_players_on_account >= config('characters_per_account'))
|
||||||
$errors[] = 'You have too many characters on your account <b>('.$number_of_players_on_account . '/' . setting('core.characters_per_account') . ')</b>!';
|
$errors[] = 'You have too many characters on your account <b>('.$number_of_players_on_account.'/'.config('characters_per_account').')</b>!';
|
||||||
}
|
}
|
||||||
|
|
||||||
if(empty($errors))
|
if(empty($errors))
|
||||||
{
|
{
|
||||||
$char_to_copy_name = config('character_samples')[$vocation];
|
$char_to_copy_name = config('character_samples')[$vocation];
|
||||||
$char_to_copy = new \OTS_Player();
|
$char_to_copy = new OTS_Player();
|
||||||
$char_to_copy->find($char_to_copy_name);
|
$char_to_copy->find($char_to_copy_name);
|
||||||
if(!$char_to_copy->isLoaded())
|
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.';
|
$errors[] = 'Wrong characters configuration. Try again or contact with admin. ADMIN: Edit file config.php and set valid characters to copy names. Character to copy: <b>'.$char_to_copy_name.'</b> doesn\'t exist.';
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!empty($errors)) {
|
if(!empty($errors)) {
|
||||||
@@ -164,7 +161,7 @@ class CreateCharacter
|
|||||||
if($sex == "0")
|
if($sex == "0")
|
||||||
$char_to_copy->setLookType(136);
|
$char_to_copy->setLookType(136);
|
||||||
|
|
||||||
$player = new \OTS_Player();
|
$player = new OTS_Player();
|
||||||
$player->setName($name);
|
$player->setName($name);
|
||||||
$player->setAccount($account);
|
$player->setAccount($account);
|
||||||
$player->setGroupId(1);
|
$player->setGroupId(1);
|
||||||
@@ -196,9 +193,9 @@ class CreateCharacter
|
|||||||
$player->setManaSpent($char_to_copy->getManaSpent());
|
$player->setManaSpent($char_to_copy->getManaSpent());
|
||||||
$player->setSoul($char_to_copy->getSoul());
|
$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;
|
$value = 10;
|
||||||
if (setting('core.use_character_sample_skills')) {
|
if (config('use_character_sample_skills')) {
|
||||||
$value = $char_to_copy->getSkill($skill);
|
$value = $char_to_copy->getSkill($skill);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -233,7 +230,7 @@ class CreateCharacter
|
|||||||
$player->save();
|
$player->save();
|
||||||
$player->setCustomField('created', time());
|
$player->setCustomField('created', time());
|
||||||
|
|
||||||
$player = new \OTS_Player();
|
$player = new OTS_Player();
|
||||||
$player->find($name);
|
$player->find($name);
|
||||||
|
|
||||||
if(!$player->isLoaded()) {
|
if(!$player->isLoaded()) {
|
||||||
@@ -242,14 +239,14 @@ class CreateCharacter
|
|||||||
}
|
}
|
||||||
|
|
||||||
if($db->hasTable('player_skills')) {
|
if($db->hasTable('player_skills')) {
|
||||||
for($skill = \POT::SKILL_FIRST; $skill <= \POT::SKILL_LAST; $skill++) {
|
for($i=0; $i<7; $i++) {
|
||||||
$value = 10;
|
$value = 10;
|
||||||
if (setting('core.use_character_sample_skills')) {
|
if (config('use_character_sample_skills')) {
|
||||||
$value = $char_to_copy->getSkill($skill);
|
$value = $char_to_copy->getSkill($i);
|
||||||
}
|
}
|
||||||
$skillExists = $db->query('SELECT `skillid` FROM `player_skills` WHERE `player_id` = ' . $player->getId() . ' AND `skillid` = ' . $skill);
|
$skillExists = $db->query('SELECT `skillid` FROM `player_skills` WHERE `player_id` = ' . $player->getId() . ' AND `skillid` = ' . $i);
|
||||||
if($skillExists->rowCount() <= 0) {
|
if($skillExists->rowCount() <= 0) {
|
||||||
$db->query('INSERT INTO `player_skills` (`player_id`, `skillid`, `value`, `count`) VALUES ('.$player->getId().', '.$skill.', ' . $value . ', 0)');
|
$db->query('INSERT INTO `player_skills` (`player_id`, `skillid`, `value`, `count`) VALUES ('.$player->getId().', '.$i.', ' . $value . ', 0)');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -262,20 +259,6 @@ class CreateCharacter
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
global $hooks;
|
|
||||||
if (!$hooks->trigger(HOOK_ACCOUNT_CREATE_CHARACTER_AFTER,
|
|
||||||
[
|
|
||||||
'account' => $account,
|
|
||||||
'player' => $player,
|
|
||||||
'name' => $name,
|
|
||||||
'sex' => $sex,
|
|
||||||
'vocation' => $vocation,
|
|
||||||
'town' => $town,
|
|
||||||
]
|
|
||||||
)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
global $twig;
|
global $twig;
|
||||||
$twig->display('success.html.twig', array(
|
$twig->display('success.html.twig', array(
|
||||||
'title' => 'Character Created',
|
'title' => 'Character Created',
|
@@ -23,8 +23,9 @@
|
|||||||
* @link https://my-aac.org
|
* @link https://my-aac.org
|
||||||
*/
|
*/
|
||||||
|
|
||||||
namespace MyAAC;
|
/**
|
||||||
|
* Class DataLoader
|
||||||
|
*/
|
||||||
class DataLoader
|
class DataLoader
|
||||||
{
|
{
|
||||||
private static $locale;
|
private static $locale;
|
||||||
@@ -37,6 +38,7 @@ class DataLoader
|
|||||||
{
|
{
|
||||||
self::$startTime = microtime(true);
|
self::$startTime = microtime(true);
|
||||||
|
|
||||||
|
require LIBS . 'items.php';
|
||||||
if(Items::loadFromXML()) {
|
if(Items::loadFromXML()) {
|
||||||
success(self::$locale['step_database_loaded_items'] . self::getLoadedTime());
|
success(self::$locale['step_database_loaded_items'] . self::getLoadedTime());
|
||||||
}
|
}
|
||||||
@@ -46,20 +48,22 @@ class DataLoader
|
|||||||
|
|
||||||
self::$startTime = microtime(true);
|
self::$startTime = microtime(true);
|
||||||
|
|
||||||
if(Monsters::loadFromXML()) {
|
require LIBS . 'creatures.php';
|
||||||
|
if(Creatures::loadFromXML()) {
|
||||||
success(self::$locale['step_database_loaded_monsters'] . self::getLoadedTime());
|
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']);
|
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']);
|
warning(self::$locale['step_database_error_monsters']);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
error(Monsters::getLastError());
|
error(Creatures::getLastError());
|
||||||
}
|
}
|
||||||
|
|
||||||
self::$startTime = microtime(true);
|
self::$startTime = microtime(true);
|
||||||
|
|
||||||
|
require_once LIBS . 'npc.php';
|
||||||
if(NPCs::loadFromXML()) {
|
if(NPCs::loadFromXML()) {
|
||||||
success(self::$locale['step_database_loaded_npcs'] . self::getLoadedTime());
|
success(self::$locale['step_database_loaded_npcs'] . self::getLoadedTime());
|
||||||
}
|
}
|
||||||
@@ -69,6 +73,7 @@ class DataLoader
|
|||||||
|
|
||||||
self::$startTime = microtime(true);
|
self::$startTime = microtime(true);
|
||||||
|
|
||||||
|
require LIBS . 'spells.php';
|
||||||
if(Spells::loadFromXML()) {
|
if(Spells::loadFromXML()) {
|
||||||
success(self::$locale['step_database_loaded_spells'] . self::getLoadedTime());
|
success(self::$locale['step_database_loaded_spells'] . self::getLoadedTime());
|
||||||
}
|
}
|
||||||
@@ -87,6 +92,7 @@ class DataLoader
|
|||||||
|
|
||||||
self::$startTime = microtime(true);
|
self::$startTime = microtime(true);
|
||||||
|
|
||||||
|
require LIBS . 'weapons.php';
|
||||||
if(Weapons::loadFromXML()) {
|
if(Weapons::loadFromXML()) {
|
||||||
success(self::$locale['step_database_loaded_weapons'] . self::getLoadedTime());
|
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 {}
|
@@ -23,16 +23,15 @@
|
|||||||
* @link https://my-aac.org
|
* @link https://my-aac.org
|
||||||
*/
|
*/
|
||||||
|
|
||||||
namespace MyAAC;
|
/**
|
||||||
|
* Class Towns
|
||||||
use MyAAC\Models\Town;
|
*/
|
||||||
|
|
||||||
class Towns
|
class Towns
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* @var string
|
* @var string
|
||||||
*/
|
*/
|
||||||
private static $filename = CACHE . 'persistent/' . 'towns.php';
|
private static $filename = CACHE . 'towns.php';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Determine towns
|
* Determine towns
|
||||||
@@ -108,6 +107,7 @@ class Towns
|
|||||||
if (file_exists($mapFile)) {
|
if (file_exists($mapFile)) {
|
||||||
ini_set('memory_limit', '-1');
|
ini_set('memory_limit', '-1');
|
||||||
|
|
||||||
|
require LIBS . 'TownsReader.php';
|
||||||
$townsReader = new TownsReader($mapFile);
|
$townsReader = new TownsReader($mapFile);
|
||||||
$townsReader->load();
|
$townsReader->load();
|
||||||
|
|
||||||
@@ -124,6 +124,15 @@ class Towns
|
|||||||
*/
|
*/
|
||||||
public static function getFromDatabase()
|
public static function getFromDatabase()
|
||||||
{
|
{
|
||||||
return Town::pluck('name', 'id')->toArray();
|
global $db;
|
||||||
|
|
||||||
|
$query = $db->query('SELECT `id`, `name` FROM `towns`;')->fetchAll(PDO::FETCH_ASSOC);
|
||||||
|
|
||||||
|
$towns = [];
|
||||||
|
foreach($query as $town) {
|
||||||
|
$towns[$town['id']] = $town['name'];
|
||||||
|
}
|
||||||
|
|
||||||
|
return $towns;
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -19,10 +19,8 @@
|
|||||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
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
|
class TownsReader
|
||||||
{
|
{
|
||||||
@@ -81,4 +79,4 @@ class TownsReader
|
|||||||
public function get() {
|
public function get() {
|
||||||
return $this->towns;
|
return $this->towns;
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -8,8 +8,7 @@
|
|||||||
* @copyright 2019 MyAAC
|
* @copyright 2019 MyAAC
|
||||||
* @link https://my-aac.org
|
* @link https://my-aac.org
|
||||||
*/
|
*/
|
||||||
|
defined('MYAAC') or die('Direct access not allowed!');
|
||||||
namespace MyAAC\Cache;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class Cache
|
* Class Cache
|
||||||
@@ -42,30 +41,40 @@ class Cache
|
|||||||
*/
|
*/
|
||||||
public static function generateInstance($engine = '', $prefix = '')
|
public static function generateInstance($engine = '', $prefix = '')
|
||||||
{
|
{
|
||||||
if (config('env') === 'dev') {
|
if(config('env') === 'dev') {
|
||||||
self::$instance = new self();
|
self::$instance = new self();
|
||||||
return self::$instance;
|
return self::$instance;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (strtolower($engine)) {
|
switch(strtolower($engine)) {
|
||||||
case 'apc':
|
case 'apc':
|
||||||
self::$instance = new APC($prefix);
|
require 'cache_apc.php';
|
||||||
|
self::$instance = new Cache_APC($prefix);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'apcu':
|
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;
|
break;
|
||||||
|
|
||||||
case 'xcache':
|
case 'xcache':
|
||||||
self::$instance = new XCache($prefix);
|
require 'cache_xcache.php';
|
||||||
|
self::$instance = new Cache_XCache($prefix);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'file':
|
case 'file':
|
||||||
self::$instance = new File($prefix, CACHE);
|
require 'cache_file.php';
|
||||||
|
self::$instance = new Cache_File($prefix, CACHE);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'php':
|
case 'php':
|
||||||
self::$instance = new PHP($prefix, CACHE);
|
require 'cache_php.php';
|
||||||
|
self::$instance = new Cache_PHP($prefix, CACHE);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'auto':
|
case 'auto':
|
||||||
@@ -85,11 +94,13 @@ class Cache
|
|||||||
*/
|
*/
|
||||||
public static function detect()
|
public static function detect()
|
||||||
{
|
{
|
||||||
if (function_exists('apc_fetch'))
|
if(function_exists('apc_fetch'))
|
||||||
return 'apc';
|
return 'apc';
|
||||||
else if (function_exists('apcu_fetch'))
|
else if(function_exists('apcu_fetch'))
|
||||||
return 'apcu';
|
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 'xcache';
|
||||||
|
|
||||||
return 'file';
|
return 'file';
|
||||||
@@ -98,15 +109,12 @@ class Cache
|
|||||||
/**
|
/**
|
||||||
* @return bool
|
* @return bool
|
||||||
*/
|
*/
|
||||||
public function enabled()
|
public function enabled() {return false;}
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static function remember($key, $ttl, $callback)
|
public static function remember($key, $ttl, $callback)
|
||||||
{
|
{
|
||||||
$cache = self::getInstance();
|
$cache = self::getInstance();
|
||||||
if (!$cache->enabled()) {
|
if(!$cache->enabled()) {
|
||||||
return $callback();
|
return $callback();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -116,7 +124,7 @@ class Cache
|
|||||||
}
|
}
|
||||||
|
|
||||||
$value = $callback();
|
$value = $callback();
|
||||||
$cache->set($key, serialize($value), $ttl);
|
$cache->set($key, serialize($value),$ttl);
|
||||||
return $value;
|
return $value;
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -8,10 +8,9 @@
|
|||||||
* @copyright 2019 MyAAC
|
* @copyright 2019 MyAAC
|
||||||
* @link https://my-aac.org
|
* @link https://my-aac.org
|
||||||
*/
|
*/
|
||||||
|
defined('MYAAC') or die('Direct access not allowed!');
|
||||||
|
|
||||||
namespace MyAAC\Cache;
|
class Cache_APC
|
||||||
|
|
||||||
class APC
|
|
||||||
{
|
{
|
||||||
private $prefix;
|
private $prefix;
|
||||||
private $enabled;
|
private $enabled;
|
||||||
@@ -32,25 +31,22 @@ class APC
|
|||||||
public function get($key)
|
public function get($key)
|
||||||
{
|
{
|
||||||
$tmp = '';
|
$tmp = '';
|
||||||
if ($this->fetch($this->prefix . $key, $tmp)) {
|
if($this->fetch($this->prefix . $key, $tmp)) {
|
||||||
return $tmp;
|
return $tmp;
|
||||||
}
|
}
|
||||||
|
|
||||||
return '';
|
return '';
|
||||||
}
|
}
|
||||||
|
|
||||||
public function fetch($key, &$var)
|
public function fetch($key, &$var) {
|
||||||
{
|
|
||||||
return ($var = apc_fetch($this->prefix . $key)) !== false;
|
return ($var = apc_fetch($this->prefix . $key)) !== false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function delete($key)
|
public function delete($key) {
|
||||||
{
|
|
||||||
apc_delete($this->prefix . $key);
|
apc_delete($this->prefix . $key);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function enabled()
|
public function enabled() {
|
||||||
{
|
|
||||||
return $this->enabled;
|
return $this->enabled;
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -8,10 +8,9 @@
|
|||||||
* @copyright 2019 MyAAC
|
* @copyright 2019 MyAAC
|
||||||
* @link https://my-aac.org
|
* @link https://my-aac.org
|
||||||
*/
|
*/
|
||||||
|
defined('MYAAC') or die('Direct access not allowed!');
|
||||||
|
|
||||||
namespace MyAAC\Cache;
|
class Cache_APCu
|
||||||
|
|
||||||
class APCu
|
|
||||||
{
|
{
|
||||||
private $prefix;
|
private $prefix;
|
||||||
private $enabled;
|
private $enabled;
|
||||||
@@ -32,25 +31,22 @@ class APCu
|
|||||||
public function get($key)
|
public function get($key)
|
||||||
{
|
{
|
||||||
$tmp = '';
|
$tmp = '';
|
||||||
if ($this->fetch($this->prefix . $key, $tmp)) {
|
if($this->fetch($this->prefix . $key, $tmp)) {
|
||||||
return $tmp;
|
return $tmp;
|
||||||
}
|
}
|
||||||
|
|
||||||
return '';
|
return '';
|
||||||
}
|
}
|
||||||
|
|
||||||
public function fetch($key, &$var)
|
public function fetch($key, &$var) {
|
||||||
{
|
|
||||||
return ($var = apcu_fetch($this->prefix . $key)) !== false;
|
return ($var = apcu_fetch($this->prefix . $key)) !== false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function delete($key)
|
public function delete($key) {
|
||||||
{
|
|
||||||
apcu_delete($this->prefix . $key);
|
apcu_delete($this->prefix . $key);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function enabled()
|
public function enabled() {
|
||||||
{
|
|
||||||
return $this->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
|
* @copyright 2019 MyAAC
|
||||||
* @link https://my-aac.org
|
* @link https://my-aac.org
|
||||||
*/
|
*/
|
||||||
|
defined('MYAAC') or die('Direct access not allowed!');
|
||||||
|
|
||||||
namespace MyAAC\Cache;
|
class Cache_File
|
||||||
|
|
||||||
class File
|
|
||||||
{
|
{
|
||||||
private $prefix;
|
private $prefix;
|
||||||
private $dir;
|
private $dir;
|
||||||
private $enabled;
|
private $enabled;
|
||||||
|
|
||||||
public function __construct($prefix = '', $dir = '')
|
public function __construct($prefix = '', $dir = '') {
|
||||||
{
|
|
||||||
$this->prefix = $prefix;
|
$this->prefix = $prefix;
|
||||||
$this->dir = $dir;
|
$this->dir = $dir;
|
||||||
$this->enabled = (file_exists($this->dir) && is_dir($this->dir) && is_writable($this->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)
|
public function get($key)
|
||||||
{
|
{
|
||||||
$tmp = '';
|
$tmp = '';
|
||||||
if ($this->fetch($key, $tmp)) {
|
if($this->fetch($key, $tmp)) {
|
||||||
return $tmp;
|
return $tmp;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -48,7 +46,7 @@ class File
|
|||||||
public function fetch($key, &$var)
|
public function fetch($key, &$var)
|
||||||
{
|
{
|
||||||
$file = $this->_name($key);
|
$file = $this->_name($key);
|
||||||
if (!file_exists($file) || filemtime($file) < time()) {
|
if(!file_exists($file) || filemtime($file) < time()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -59,18 +57,16 @@ class File
|
|||||||
public function delete($key)
|
public function delete($key)
|
||||||
{
|
{
|
||||||
$file = $this->_name($key);
|
$file = $this->_name($key);
|
||||||
if (file_exists($file)) {
|
if(file_exists($file)) {
|
||||||
unlink($file);
|
unlink($file);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public function enabled()
|
public function enabled() {
|
||||||
{
|
|
||||||
return $this->enabled;
|
return $this->enabled;
|
||||||
}
|
}
|
||||||
|
|
||||||
private function _name($key)
|
private function _name($key) {
|
||||||
{
|
|
||||||
return sprintf('%s%s%s', $this->dir, $this->prefix, sha1($key));
|
return sprintf('%s%s%s', $this->dir, $this->prefix, sha1($key));
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -7,17 +7,15 @@
|
|||||||
* @copyright 2019 MyAAC
|
* @copyright 2019 MyAAC
|
||||||
* @link https://my-aac.org
|
* @link https://my-aac.org
|
||||||
*/
|
*/
|
||||||
|
defined('MYAAC') or die('Direct access not allowed!');
|
||||||
|
|
||||||
namespace MyAAC\Cache;
|
class Cache_PHP
|
||||||
|
|
||||||
class PHP
|
|
||||||
{
|
{
|
||||||
private $prefix;
|
private $prefix;
|
||||||
private $dir;
|
private $dir;
|
||||||
private $enabled;
|
private $enabled;
|
||||||
|
|
||||||
public function __construct($prefix = '', $dir = '')
|
public function __construct($prefix = '', $dir = '') {
|
||||||
{
|
|
||||||
$this->prefix = $prefix;
|
$this->prefix = $prefix;
|
||||||
$this->dir = $dir;
|
$this->dir = $dir;
|
||||||
$this->enabled = (file_exists($this->dir) && is_dir($this->dir) && is_writable($this->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)
|
public function get($key)
|
||||||
{
|
{
|
||||||
$tmp = '';
|
$tmp = '';
|
||||||
if ($this->fetch($key, $tmp)) {
|
if($this->fetch($key, $tmp)) {
|
||||||
return $tmp;
|
return $tmp;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -54,7 +52,7 @@ class PHP
|
|||||||
public function fetch($key, &$var)
|
public function fetch($key, &$var)
|
||||||
{
|
{
|
||||||
$file = $this->_name($key);
|
$file = $this->_name($key);
|
||||||
if (!file_exists($file) || filemtime($file) < time()) {
|
if(!file_exists($file) || filemtime($file) < time()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -66,18 +64,16 @@ class PHP
|
|||||||
public function delete($key)
|
public function delete($key)
|
||||||
{
|
{
|
||||||
$file = $this->_name($key);
|
$file = $this->_name($key);
|
||||||
if (file_exists($file)) {
|
if(file_exists($file)) {
|
||||||
unlink($file);
|
unlink($file);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public function enabled()
|
public function enabled() {
|
||||||
{
|
|
||||||
return $this->enabled;
|
return $this->enabled;
|
||||||
}
|
}
|
||||||
|
|
||||||
private function _name($key)
|
private function _name($key) {
|
||||||
{
|
|
||||||
return sprintf('%s%s%s', $this->dir, $this->prefix, sha1($key) . '.php');
|
return sprintf('%s%s%s', $this->dir, $this->prefix, sha1($key) . '.php');
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -8,16 +8,14 @@
|
|||||||
* @copyright 2019 MyAAC
|
* @copyright 2019 MyAAC
|
||||||
* @link https://my-aac.org
|
* @link https://my-aac.org
|
||||||
*/
|
*/
|
||||||
|
defined('MYAAC') or die('Direct access not allowed!');
|
||||||
|
|
||||||
namespace MyAAC\Cache;
|
class Cache_XCache
|
||||||
|
|
||||||
class XCache
|
|
||||||
{
|
{
|
||||||
private $prefix;
|
private $prefix;
|
||||||
private $enabled;
|
private $enabled;
|
||||||
|
|
||||||
public function __construct($prefix = '')
|
public function __construct($prefix = '') {
|
||||||
{
|
|
||||||
$this->prefix = $prefix;
|
$this->prefix = $prefix;
|
||||||
$this->enabled = function_exists('xcache_get') && ini_get('xcache.var_size');
|
$this->enabled = function_exists('xcache_get') && ini_get('xcache.var_size');
|
||||||
}
|
}
|
||||||
@@ -32,7 +30,7 @@ class XCache
|
|||||||
public function get($key)
|
public function get($key)
|
||||||
{
|
{
|
||||||
$tmp = '';
|
$tmp = '';
|
||||||
if ($this->fetch($this->prefix . $key, $tmp)) {
|
if($this->fetch($this->prefix . $key, $tmp)) {
|
||||||
return $tmp;
|
return $tmp;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -42,7 +40,7 @@ class XCache
|
|||||||
public function fetch($key, &$var)
|
public function fetch($key, &$var)
|
||||||
{
|
{
|
||||||
$key = $this->prefix . $key;
|
$key = $this->prefix . $key;
|
||||||
if (!xcache_isset($key)) {
|
if(!xcache_isset($key)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -50,13 +48,11 @@ class XCache
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function delete($key)
|
public function delete($key) {
|
||||||
{
|
|
||||||
xcache_unset($this->prefix . $key);
|
xcache_unset($this->prefix . $key);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function enabled()
|
public function enabled() {
|
||||||
{
|
|
||||||
return $this->enabled;
|
return $this->enabled;
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -1,10 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
namespace MyAAC;
|
|
||||||
|
|
||||||
use MyAAC\Cache\Cache;
|
|
||||||
use MyAAC\Models\Changelog as ModelsChangelog;
|
|
||||||
|
|
||||||
class Changelog
|
class Changelog
|
||||||
{
|
{
|
||||||
static public function verify($body,$date, &$errors)
|
static public function verify($body,$date, &$errors)
|
||||||
@@ -24,61 +19,43 @@ class Changelog
|
|||||||
|
|
||||||
static public function add($body, $type, $where, $player_id, $cdate, &$errors)
|
static public function add($body, $type, $where, $player_id, $cdate, &$errors)
|
||||||
{
|
{
|
||||||
|
global $db;
|
||||||
if(!self::verify($body,$cdate, $errors))
|
if(!self::verify($body,$cdate, $errors))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
$row = new ModelsChangelog;
|
$db->insert(TABLE_PREFIX . 'changelog', array('body' => $body, 'type' => $type, 'date' => $cdate, 'where' => $where, 'player_id' => isset($player_id) ? $player_id : 0));
|
||||||
$row->body = $body;
|
self::clearCache();
|
||||||
$row->type = $type;
|
return true;
|
||||||
$row->date = $cdate;
|
|
||||||
$row->where = $where;
|
|
||||||
$row->player_id = $player_id ?? 0;
|
|
||||||
if ($row->save()) {
|
|
||||||
self::clearCache();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static public function get($id) {
|
static public function get($id) {
|
||||||
return ModelsChangelog::find($id);
|
global $db;
|
||||||
|
return $db->select(TABLE_PREFIX . 'changelog', array('id' => $id));
|
||||||
}
|
}
|
||||||
|
|
||||||
static public function update($id, $body, $type, $where, $player_id, $date, &$errors)
|
static public function update($id, $body, $type, $where, $player_id, $date, &$errors)
|
||||||
{
|
{
|
||||||
|
global $db;
|
||||||
if(!self::verify($body,$date, $errors))
|
if(!self::verify($body,$date, $errors))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (ModelsChangelog::where('id', '=', $id)->update([
|
$db->update(TABLE_PREFIX . 'changelog', array('body' => $body, 'type' => $type, 'where' => $where, 'player_id' => isset($player_id) ? $player_id : 0, 'date' => $date), array('id' => $id));
|
||||||
'body' => $body,
|
self::clearCache();
|
||||||
'type' => $type,
|
return true;
|
||||||
'where' => $where,
|
|
||||||
'player_id' => $player_id ?? 0,
|
|
||||||
'date' => $date
|
|
||||||
])) {
|
|
||||||
self::clearCache();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static public function delete($id, &$errors)
|
static public function delete($id, &$errors)
|
||||||
{
|
{
|
||||||
|
global $db;
|
||||||
if(isset($id))
|
if(isset($id))
|
||||||
{
|
{
|
||||||
$row = ModelsChangelog::find($id);
|
if($db->select(TABLE_PREFIX . 'changelog', array('id' => $id)) !== false)
|
||||||
if ($row) {
|
$db->delete(TABLE_PREFIX . 'changelog', array('id' => $id));
|
||||||
if (!$row->delete()) {
|
else
|
||||||
$errors[] = 'Fail during delete Changelog.';
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
$errors[] = 'Changelog with id ' . $id . ' does not exist.';
|
$errors[] = 'Changelog with id ' . $id . ' does not exist.';
|
||||||
}
|
|
||||||
} else {
|
|
||||||
$errors[] = 'Changelog id not set.';
|
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
$errors[] = 'Changelog id not set.';
|
||||||
|
|
||||||
if(count($errors)) {
|
if(count($errors)) {
|
||||||
return false;
|
return false;
|
||||||
@@ -88,21 +65,19 @@ class Changelog
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static public function toggleHide($id, &$errors, &$status)
|
static public function toggleHidden($id, &$errors, &$status)
|
||||||
{
|
{
|
||||||
|
global $db;
|
||||||
if(isset($id))
|
if(isset($id))
|
||||||
{
|
{
|
||||||
$row = ModelsChangelog::find($id);
|
$query = $db->select(TABLE_PREFIX . 'changelog', array('id' => $id));
|
||||||
if ($row) {
|
if($query !== false)
|
||||||
$row->hide = $row->hide == 1 ? 0 : 1;
|
{
|
||||||
if (!$row->save()) {
|
$db->update(TABLE_PREFIX . 'changelog', array('hidden' => ($query['hidden'] == 1 ? 0 : 1)), array('id' => $id));
|
||||||
$errors[] = 'Fail during toggle hide Changelog.';
|
$status = $query['hidden'];
|
||||||
}
|
|
||||||
$status = $row->hide;
|
|
||||||
} else {
|
|
||||||
$errors[] = 'Changelog with id ' . $id . ' does not exists.';
|
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
$errors[] = 'Changelog with id ' . $id . ' does not exists.';
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
$errors[] = 'Changelog id not set.';
|
$errors[] = 'Changelog id not set.';
|
@@ -8,22 +8,20 @@
|
|||||||
* @copyright 2019 MyAAC
|
* @copyright 2019 MyAAC
|
||||||
* @link https://my-aac.org
|
* @link https://my-aac.org
|
||||||
*/
|
*/
|
||||||
|
defined('MYAAC') or die('Direct access not allowed!');
|
||||||
|
|
||||||
namespace MyAAC;
|
require_once LIBS . 'items.php';
|
||||||
|
class Creatures {
|
||||||
use MyAAC\Models\Monster;
|
|
||||||
|
|
||||||
class Monsters {
|
|
||||||
/**
|
/**
|
||||||
* @var \OTS_MonstersList
|
* @var OTS_MonstersList
|
||||||
*/
|
*/
|
||||||
private static $monstersList;
|
private static $monstersList;
|
||||||
private static $lastError = '';
|
private static $lastError = '';
|
||||||
|
|
||||||
public static function loadFromXML($show = false) {
|
public static function loadFromXML($show = false) {
|
||||||
try {
|
global $db;
|
||||||
Monster::query()->delete();
|
|
||||||
} catch(\Exception $error) {}
|
try { $db->exec('DELETE FROM `' . TABLE_PREFIX . 'monsters`;'); } catch(PDOException $error) {}
|
||||||
|
|
||||||
if($show) {
|
if($show) {
|
||||||
echo '<h2>Reload monsters.</h2>';
|
echo '<h2>Reload monsters.</h2>';
|
||||||
@@ -31,9 +29,9 @@ class Monsters {
|
|||||||
}
|
}
|
||||||
|
|
||||||
try {
|
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();
|
self::$lastError = $e->getMessage();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -95,9 +93,9 @@ class Monsters {
|
|||||||
$flags['convinceable'] = '0';
|
$flags['convinceable'] = '0';
|
||||||
|
|
||||||
if(!isset($flags['pushable']))
|
if(!isset($flags['pushable']))
|
||||||
$flags['pushable'] = '0';
|
$flags['pushable'] = '0';
|
||||||
if(!isset($flags['canpushitems']))
|
if(!isset($flags['canpushitems']))
|
||||||
$flags['canpushitems'] = '0';
|
$flags['canpushitems'] = '0';
|
||||||
if(!isset($flags['canpushcreatures']))
|
if(!isset($flags['canpushcreatures']))
|
||||||
$flags['canpushcreatures'] = '0';
|
$flags['canpushcreatures'] = '0';
|
||||||
if(!isset($flags['runonhealth']))
|
if(!isset($flags['runonhealth']))
|
||||||
@@ -114,11 +112,11 @@ class Monsters {
|
|||||||
$flags['attackable'] = '0';
|
$flags['attackable'] = '0';
|
||||||
if(!isset($flags['rewardboss']))
|
if(!isset($flags['rewardboss']))
|
||||||
$flags['rewardboss'] = '0';
|
$flags['rewardboss'] = '0';
|
||||||
|
|
||||||
$summons = $monster->getSummons();
|
$summons = $monster->getSummons();
|
||||||
$loot = $monster->getLoot();
|
$loot = $monster->getLoot();
|
||||||
foreach($loot as &$item) {
|
foreach($loot as &$item) {
|
||||||
if(!\Validator::number($item['id'])) {
|
if(!Validator::number($item['id'])) {
|
||||||
if(isset($items[$item['id']])) {
|
if(isset($items[$item['id']])) {
|
||||||
$item['id'] = $items[$item['id']];
|
$item['id'] = $items[$item['id']];
|
||||||
}
|
}
|
||||||
@@ -126,7 +124,7 @@ class Monsters {
|
|||||||
}
|
}
|
||||||
if(!in_array($name, $names_added)) {
|
if(!in_array($name, $names_added)) {
|
||||||
try {
|
try {
|
||||||
Monster::create(array(
|
$db->insert(TABLE_PREFIX . 'monsters', array(
|
||||||
'name' => $name,
|
'name' => $name,
|
||||||
'mana' => empty($mana) ? 0 : $mana,
|
'mana' => empty($mana) ? 0 : $mana,
|
||||||
'exp' => $monster->getExperience(),
|
'exp' => $monster->getExperience(),
|
||||||
@@ -134,7 +132,7 @@ class Monsters {
|
|||||||
'speed_lvl' => $speed_lvl,
|
'speed_lvl' => $speed_lvl,
|
||||||
'use_haste' => $use_haste,
|
'use_haste' => $use_haste,
|
||||||
'voices' => json_encode($monster->getVoices()),
|
'voices' => json_encode($monster->getVoices()),
|
||||||
'immunities' => json_encode($monster->getImmunities()),
|
'immunities' => json_encode($monster->getImmunities()),
|
||||||
'elements' => json_encode($monster->getElements()),
|
'elements' => json_encode($monster->getElements()),
|
||||||
'summonable' => $flags['summonable'] > 0 ? 1 : 0,
|
'summonable' => $flags['summonable'] > 0 ? 1 : 0,
|
||||||
'convinceable' => $flags['convinceable'] > 0 ? 1 : 0,
|
'convinceable' => $flags['convinceable'] > 0 ? 1 : 0,
|
||||||
@@ -160,7 +158,7 @@ class Monsters {
|
|||||||
success('Added: ' . $name . '<br/>');
|
success('Added: ' . $name . '<br/>');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch(\Exception $error) {
|
catch(PDOException $error) {
|
||||||
if($show) {
|
if($show) {
|
||||||
warning('Error while adding monster (' . $name . '): ' . $error->getMessage());
|
warning('Error while adding monster (' . $name . '): ' . $error->getMessage());
|
||||||
}
|
}
|
@@ -7,8 +7,7 @@
|
|||||||
* @copyright 2019 MyAAC
|
* @copyright 2019 MyAAC
|
||||||
* @link https://my-aac.org
|
* @link https://my-aac.org
|
||||||
*/
|
*/
|
||||||
|
defined('MYAAC') or die('Direct access not allowed!');
|
||||||
namespace MyAAC;
|
|
||||||
|
|
||||||
class Data
|
class Data
|
||||||
{
|
{
|
@@ -8,16 +8,15 @@
|
|||||||
* @copyright 2019 MyAAC
|
* @copyright 2019 MyAAC
|
||||||
* @link https://my-aac.org
|
* @link https://my-aac.org
|
||||||
*/
|
*/
|
||||||
|
defined('MYAAC') or die('Direct access not allowed!');
|
||||||
|
|
||||||
namespace MyAAC;
|
$configForumTablePrefix = config('forum_table_prefix');
|
||||||
|
if(null !== $configForumTablePrefix && !empty(trim($configForumTablePrefix))) {
|
||||||
$settingForumTablePrefix = setting('core.forum_table_prefix');
|
if(!in_array($configForumTablePrefix, array('myaac_', 'z_'))) {
|
||||||
if(null !== $settingForumTablePrefix && !empty(trim($settingForumTablePrefix))) {
|
throw new RuntimeException('Invalid value for forum_table_prefix in config.php. Can be only: "myaac_" or "z_".');
|
||||||
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_".');
|
|
||||||
}
|
}
|
||||||
|
|
||||||
define('FORUM_TABLE_PREFIX', $settingForumTablePrefix);
|
define('FORUM_TABLE_PREFIX', $configForumTablePrefix);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if($db->hasTable('z_forum')) {
|
if($db->hasTable('z_forum')) {
|
||||||
@@ -31,9 +30,9 @@ else {
|
|||||||
class Forum
|
class Forum
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* @param \OTS_Account $account
|
* @param OTS_Account $account
|
||||||
* @return bool
|
* @return bool
|
||||||
* @throws \E_OTS_NotLoaded
|
* @throws E_OTS_NotLoaded
|
||||||
*/
|
*/
|
||||||
public static function canPost($account)
|
public static function canPost($account)
|
||||||
{
|
{
|
||||||
@@ -48,7 +47,7 @@ class Forum
|
|||||||
return
|
return
|
||||||
$db->query(
|
$db->query(
|
||||||
'SELECT `id` FROM `players` WHERE `account_id` = ' . $db->quote($account->getId()) .
|
'SELECT `id` FROM `players` WHERE `account_id` = ' . $db->quote($account->getId()) .
|
||||||
' AND `level` >= ' . $db->quote(setting('core.forum_level_required')) .
|
' AND `level` >= ' . $db->quote($config['forum_level_required']) .
|
||||||
' LIMIT 1')->rowCount() > 0;
|
' LIMIT 1')->rowCount() > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -155,14 +154,14 @@ class Forum
|
|||||||
return !count($errors);
|
return !count($errors);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static function toggleHide_board($id, &$errors)
|
public static function toggleHidden_board($id, &$errors)
|
||||||
{
|
{
|
||||||
global $db;
|
global $db;
|
||||||
if(isset($id))
|
if(isset($id))
|
||||||
{
|
{
|
||||||
$query = self::get_board($id);
|
$query = self::get_board($id);
|
||||||
if($query !== false)
|
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
|
else
|
||||||
$errors[] = 'Forum board with id ' . $id . ' does not exists.';
|
$errors[] = 'Forum board with id ' . $id . ' does not exists.';
|
||||||
}
|
}
|
||||||
@@ -295,7 +294,7 @@ class Forum
|
|||||||
$section = $sections[$board_id];
|
$section = $sections[$board_id];
|
||||||
if($section['guild'] > 0) {
|
if($section['guild'] > 0) {
|
||||||
if($logged) {
|
if($logged) {
|
||||||
$guild = new \OTS_Guild();
|
$guild = new OTS_Guild();
|
||||||
$guild->load($section['guild']);
|
$guild->load($section['guild']);
|
||||||
$status = false;
|
$status = false;
|
||||||
if($guild->isLoaded()) {
|
if($guild->isLoaded()) {
|
||||||
@@ -323,3 +322,4 @@ class Forum
|
|||||||
return $hasAccess;
|
return $hasAccess;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
?>
|
@@ -8,11 +8,7 @@
|
|||||||
* @copyright 2019 MyAAC
|
* @copyright 2019 MyAAC
|
||||||
* @link https://my-aac.org
|
* @link https://my-aac.org
|
||||||
*/
|
*/
|
||||||
|
defined('MYAAC') or die('Direct access not allowed!');
|
||||||
namespace MyAAC;
|
|
||||||
|
|
||||||
use MyAAC\Cache\PHP as CachePHP;
|
|
||||||
use MyAAC\Models\Spell;
|
|
||||||
|
|
||||||
class Items
|
class Items
|
||||||
{
|
{
|
||||||
@@ -27,7 +23,7 @@ class Items
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
$xml = new \DOMDocument;
|
$xml = new DOMDocument;
|
||||||
$xml->load($file_path);
|
$xml->load($file_path);
|
||||||
|
|
||||||
$items = array();
|
$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);
|
||||||
$cache_php->set('items', $items, 5 * 365 * 24 * 60 * 60);
|
$cache_php->set('items', $items, 5 * 365 * 24 * 60 * 60);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -70,7 +67,8 @@ class Items
|
|||||||
return;
|
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);
|
||||||
self::$items = $cache_php->get('items');
|
self::$items = $cache_php->get('items');
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -80,6 +78,8 @@ class Items
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static function getDescription($id, $count = 1) {
|
public static function getDescription($id, $count = 1) {
|
||||||
|
global $db;
|
||||||
|
|
||||||
$item = self::get($id);
|
$item = self::get($id);
|
||||||
|
|
||||||
$attr = $item['attributes'];
|
$attr = $item['attributes'];
|
||||||
@@ -112,15 +112,17 @@ class Items
|
|||||||
$s .= 'an item of type ' . $item['id'];
|
$s .= 'an item of type ' . $item['id'];
|
||||||
|
|
||||||
if(isset($attr['type']) && strtolower($attr['type']) == 'rune') {
|
if(isset($attr['type']) && strtolower($attr['type']) == 'rune') {
|
||||||
$item = Spell::where('item_id', $id)->first();
|
$query = $db->query('SELECT `level`, `maglevel`, `vocations` FROM `' . TABLE_PREFIX . 'spells` WHERE `item_id` = ' . $id);
|
||||||
if($item) {
|
if($query->rowCount() == 1) {
|
||||||
if($item->level > 0 && $item->maglevel > 0) {
|
$query = $query->fetch();
|
||||||
|
|
||||||
|
if($query['level'] > 0 && $query['maglevel'] > 0) {
|
||||||
$s .= '. ' . ($count > 1 ? "They" : "It") . ' can only be used by ';
|
$s .= '. ' . ($count > 1 ? "They" : "It") . ' can only be used by ';
|
||||||
}
|
}
|
||||||
|
|
||||||
$configVocations = config('vocations');
|
$configVocations = config('vocations');
|
||||||
if(!empty(trim($item->vocations))) {
|
if(!empty(trim($query['vocations']))) {
|
||||||
$vocations = json_decode($item->vocations);
|
$vocations = json_decode($query['vocations']);
|
||||||
if(count($vocations) > 0) {
|
if(count($vocations) > 0) {
|
||||||
foreach($vocations as $voc => $show) {
|
foreach($vocations as $voc => $show) {
|
||||||
$vocations[$configVocations[$voc]] = $show;
|
$vocations[$configVocations[$voc]] = $show;
|
265
system/libs/items_images.php
Normal file
265
system/libs/items_images.php
Normal file
@@ -0,0 +1,265 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Items_Images class
|
||||||
|
*
|
||||||
|
* @package MyAAC
|
||||||
|
* @author Slawkens <slawkens@gmail.com>
|
||||||
|
* @copyright 2019 MyAAC
|
||||||
|
* @link https://my-aac.org
|
||||||
|
*/
|
||||||
|
defined('MYAAC') or die('Direct access not allowed!');
|
||||||
|
|
||||||
|
if ( !function_exists( 'stackId' ) )
|
||||||
|
{
|
||||||
|
function stackId( $count )
|
||||||
|
{
|
||||||
|
if ( $count >= 50 )
|
||||||
|
$stack = 8;
|
||||||
|
elseif ( $count >= 25 )
|
||||||
|
$stack = 7;
|
||||||
|
elseif ( $count >= 10 )
|
||||||
|
$stack = 6;
|
||||||
|
elseif ( $count >= 5 )
|
||||||
|
$stack = 5;
|
||||||
|
elseif ( $count >= 4 )
|
||||||
|
$stack = 4;
|
||||||
|
elseif ( $count >= 3 )
|
||||||
|
$stack = 3;
|
||||||
|
elseif ( $count >= 2 )
|
||||||
|
$stack = 2;
|
||||||
|
else
|
||||||
|
$stack = 1;
|
||||||
|
|
||||||
|
return $stack;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class Items_Images
|
||||||
|
{
|
||||||
|
public static $outputDir = '';
|
||||||
|
public static $files = array();
|
||||||
|
|
||||||
|
private static $otb, $dat, $spr;
|
||||||
|
private static $lastItem;
|
||||||
|
private static $loaded = false;
|
||||||
|
|
||||||
|
public function __destruct()
|
||||||
|
{
|
||||||
|
if(self::$otb)
|
||||||
|
fclose(self::$otb);
|
||||||
|
if(self::$dat)
|
||||||
|
fclose(self::$dat);
|
||||||
|
if(self::$spr)
|
||||||
|
fclose(self::$spr);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function generate($id = 100, $count = 1)
|
||||||
|
{
|
||||||
|
if(!self::$loaded)
|
||||||
|
self::load();
|
||||||
|
|
||||||
|
$originalId = $id;
|
||||||
|
if($id < 100)
|
||||||
|
return false;
|
||||||
|
//die('ID cannot be lower than 100.');
|
||||||
|
|
||||||
|
rewind(self::$otb);
|
||||||
|
rewind(self::$dat);
|
||||||
|
rewind(self::$spr);
|
||||||
|
|
||||||
|
$nostand = false;
|
||||||
|
$init = false;
|
||||||
|
$originalId = $id;
|
||||||
|
|
||||||
|
// parse info from otb
|
||||||
|
while( false !== ( $char = fgetc( self::$otb ) ) )
|
||||||
|
{
|
||||||
|
$byte = HEX_PREFIX.bin2hex( $char );
|
||||||
|
|
||||||
|
if ( $byte == 0xFE )
|
||||||
|
$init = true;
|
||||||
|
elseif ( $byte == 0x10 and $init ) {
|
||||||
|
extract( unpack( 'x2/Ssid', fread( self::$otb, 4 ) ) );
|
||||||
|
|
||||||
|
if ( $id == $sid ) {
|
||||||
|
if ( HEX_PREFIX.bin2hex( fread( self::$otb, 1 ) ) == 0x11 ) {
|
||||||
|
extract( unpack( 'x2/Sid', fread( self::$otb, 4 ) ) );
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$init = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
self::$lastItem = array_sum( unpack( 'x4/S*', fread( self::$dat, 12 )));
|
||||||
|
if($id > self::$lastItem)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
//ini_set('max_execution_time', 300);
|
||||||
|
// parse info from dat
|
||||||
|
for( $i = 100; $i <= $id; $i++ ) {
|
||||||
|
while( ( $byte = HEX_PREFIX.bin2hex( fgetc( self::$dat ) ) ) != 0xFF ) {
|
||||||
|
$offset = 0;
|
||||||
|
switch( $byte ) {
|
||||||
|
case 0x00:
|
||||||
|
case 0x09:
|
||||||
|
case 0x0A:
|
||||||
|
case 0x1A:
|
||||||
|
case 0x1D:
|
||||||
|
case 0x1E:
|
||||||
|
$offset = 2;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 0x16:
|
||||||
|
case 0x19:
|
||||||
|
$offset = 4;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 0x01:
|
||||||
|
case 0x02:
|
||||||
|
case 0x03:
|
||||||
|
case 0x04:
|
||||||
|
case 0x05:
|
||||||
|
case 0x06:
|
||||||
|
case 0x07:
|
||||||
|
case 0x08:
|
||||||
|
case 0x0B:
|
||||||
|
case 0x0C:
|
||||||
|
case 0x0D:
|
||||||
|
case 0x0E:
|
||||||
|
case 0x0F:
|
||||||
|
case 0x10:
|
||||||
|
case 0x11:
|
||||||
|
case 0x12:
|
||||||
|
case 0x13:
|
||||||
|
case 0x14:
|
||||||
|
case 0x15:
|
||||||
|
case 0x17:
|
||||||
|
case 0x18:
|
||||||
|
case 0x1B:
|
||||||
|
case 0x1C:
|
||||||
|
case 0x1F:
|
||||||
|
case 0x20:
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
return false; #trigger_error( sprintf( 'Unknown .DAT byte %s (previous byte: %s; address %x)', $byte, $prev, ftell( $dat ), E_USER_ERROR ) );
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
$prev = $byte;
|
||||||
|
fseek( self::$dat, $offset, SEEK_CUR );
|
||||||
|
}
|
||||||
|
extract( unpack( 'Cwidth/Cheight', fread( self::$dat, 2 ) ) );
|
||||||
|
|
||||||
|
if ( $width > 1 or $height > 1 ) {
|
||||||
|
fseek( self::$dat, 1, SEEK_CUR );
|
||||||
|
$nostand = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
$sprites_c = array_product( unpack( 'C*', fread( self::$dat, 5 ) ) ) * $width * $height;
|
||||||
|
$sprites = unpack( 'S*', fread( self::$dat, 2 * $sprites_c ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( array_key_exists( stackId( $count ), $sprites ) ) {
|
||||||
|
$sprites = (array) $sprites[stackId( $count )];
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$sprites = (array) $sprites[array_rand( $sprites ) ];
|
||||||
|
}
|
||||||
|
|
||||||
|
fseek( self::$spr, 6 );
|
||||||
|
|
||||||
|
$sprite = imagecreatetruecolor( 32 * $width, 32 * $height );
|
||||||
|
imagecolortransparent( $sprite, imagecolorallocate( $sprite, 0, 0, 0 ) );
|
||||||
|
|
||||||
|
foreach( $sprites as $key => $value ) {
|
||||||
|
fseek( self::$spr, 6 + ( $value - 1 ) * 4 );
|
||||||
|
extract( unpack( 'Laddress', fread( self::$spr, 4 ) ) );
|
||||||
|
|
||||||
|
fseek( self::$spr, $address + 3 );
|
||||||
|
extract( unpack( 'Ssize', fread( self::$spr, 2 ) ) );
|
||||||
|
|
||||||
|
list( $num, $bit ) = array( 0, 0 );
|
||||||
|
|
||||||
|
while( $bit < $size ) {
|
||||||
|
$pixels = unpack( 'Strans/Scolored', fread( self::$spr, 4 ) );
|
||||||
|
$num += $pixels['trans'];
|
||||||
|
for( $i = 0; $i < $pixels['colored']; $i++ )
|
||||||
|
{
|
||||||
|
extract( unpack( 'Cred/Cgreen/Cblue', fread( self::$spr, 3 ) ) );
|
||||||
|
|
||||||
|
$red = ( $red == 0 ? ( $green == 0 ? ( $blue == 0 ? 1 : $red ) : $red ) : $red );
|
||||||
|
|
||||||
|
imagesetpixel( $sprite,
|
||||||
|
$num % 32 + ( $key % 2 == 1 ? 32 : 0 ),
|
||||||
|
$num / 32 + ( $key % 4 != 1 and $key % 4 != 0 ? 32 : 0 ),
|
||||||
|
imagecolorallocate( $sprite, $red, $green, $blue ) );
|
||||||
|
|
||||||
|
$num++;
|
||||||
|
}
|
||||||
|
|
||||||
|
$bit += 4 + 3 * $pixels['colored'];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( $count >= 2 ) {
|
||||||
|
if ( $count > 100 )
|
||||||
|
$count = 100;
|
||||||
|
|
||||||
|
$font = 3;
|
||||||
|
$length = imagefontwidth( $font ) * strlen( $count );
|
||||||
|
|
||||||
|
$pos = array(
|
||||||
|
'x' => ( 32 * $width ) - ( $length + 1 ),
|
||||||
|
'y' => ( 32 * $height ) - 13
|
||||||
|
);
|
||||||
|
imagestring( $sprite, $font, $pos['x'] - 1, $pos['y'] - 1, $count, imagecolorallocate( $sprite, 1, 1, 1 ) );
|
||||||
|
imagestring( $sprite, $font, $pos['x'], $pos['y'] - 1, $count, imagecolorallocate( $sprite, 1, 1, 1 ) );
|
||||||
|
imagestring( $sprite, $font, $pos['x'] - 1, $pos['y'], $count, imagecolorallocate( $sprite, 1, 1, 1 ) );
|
||||||
|
|
||||||
|
imagestring( $sprite, $font, $pos['x'], $pos['y'] + 1, $count, imagecolorallocate( $sprite, 1, 1, 1 ) );
|
||||||
|
imagestring( $sprite, $font, $pos['x'] + 1, $pos['y'], $count, imagecolorallocate( $sprite, 1, 1, 1 ) );
|
||||||
|
imagestring( $sprite, $font, $pos['x'] + 1, $pos['y'] + 1, $count, imagecolorallocate( $sprite, 1, 1, 1 ) );
|
||||||
|
|
||||||
|
imagestring( $sprite, $font, $pos['x'], $pos['y'], $count, imagecolorallocate( $sprite, 219, 219, 219 ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
$imagePath = self::$outputDir . ($count > 1 ? $originalId . '-' . $count : $originalId ) . '.gif';
|
||||||
|
|
||||||
|
// save image
|
||||||
|
imagegif($sprite, $imagePath);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function load()
|
||||||
|
{
|
||||||
|
if(!defined( 'HEX_PREFIX'))
|
||||||
|
define('HEX_PREFIX', '0x');
|
||||||
|
|
||||||
|
self::$otb = fopen(self::$files['otb'], 'rb');
|
||||||
|
self::$dat = fopen(self::$files['dat'], 'rb');
|
||||||
|
self::$spr = fopen(self::$files['spr'], 'rb');
|
||||||
|
|
||||||
|
if(!self::$otb || !self::$dat || !self::$spr)
|
||||||
|
throw new RuntimeException('ERROR: Cannot load data files.');
|
||||||
|
/*
|
||||||
|
if ( $nostand )
|
||||||
|
{
|
||||||
|
for( $i = 0; $i < count( $sprites ) / 4; $i++ )
|
||||||
|
{
|
||||||
|
$sprites = array_merge( (array) $sprites, array_reverse( array_slice( $sprites, $i * 4, 4 ) ) );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$sprites = (array) $sprites[array_rand( $sprites ) ];
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
self::$loaded = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function loaded() {
|
||||||
|
return self::$loaded;
|
||||||
|
}
|
||||||
|
}
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user