mirror of
https://github.com/slawkens/myaac.git
synced 2025-09-14 12:33:35 +02:00
Compare commits
3 Commits
feature/2f
...
feature/re
Author | SHA1 | Date | |
---|---|---|---|
![]() |
67f54eacbc | ||
![]() |
cde8891b9b | ||
![]() |
50a8b8169f |
10
.github/workflows/cypress.yml
vendored
10
.github/workflows/cypress.yml
vendored
@@ -1,9 +1,9 @@
|
|||||||
name: Cypress
|
name: Cypress
|
||||||
on:
|
on:
|
||||||
pull_request:
|
pull_request:
|
||||||
branches: [main]
|
branches: [develop]
|
||||||
push:
|
push:
|
||||||
branches: [main]
|
branches: [develop]
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
cypress:
|
cypress:
|
||||||
@@ -22,7 +22,7 @@ jobs:
|
|||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
php-versions: [ '8.1', '8.2', '8.3', '8.4' ]
|
php-versions: [ '8.1', '8.2', '8.3' ]
|
||||||
ots: ['tfs-1.4', 'canary-3.1.2'] # TODO: add 'tfs-master' (actually doesn't work cause AAC doesn't support reading .env configuration)
|
ots: ['tfs-1.4', 'canary-3.1.2'] # TODO: add 'tfs-master' (actually doesn't work cause AAC doesn't support reading .env configuration)
|
||||||
name: Cypress (PHP ${{ matrix.php-versions }}, ${{ matrix.ots }})
|
name: Cypress (PHP ${{ matrix.php-versions }}, ${{ matrix.ots }})
|
||||||
steps:
|
steps:
|
||||||
@@ -35,7 +35,7 @@ jobs:
|
|||||||
- name: Checkout MyAAC
|
- name: Checkout MyAAC
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
ref: main
|
ref: develop
|
||||||
|
|
||||||
- uses: actions/setup-node@v4
|
- uses: actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
@@ -146,7 +146,6 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
name: cypress-screenshots-${{ matrix.php-versions }}-${{ matrix.ots }}
|
name: cypress-screenshots-${{ matrix.php-versions }}-${{ matrix.ots }}
|
||||||
path: cypress/screenshots
|
path: cypress/screenshots
|
||||||
if-no-files-found: ignore
|
|
||||||
|
|
||||||
- name: Upload Cypress Videos
|
- name: Upload Cypress Videos
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v4
|
||||||
@@ -154,7 +153,6 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
name: cypress-videos-${{ matrix.php-versions }}-${{ matrix.ots }}
|
name: cypress-videos-${{ matrix.php-versions }}-${{ matrix.ots }}
|
||||||
path: cypress/videos
|
path: cypress/videos
|
||||||
if-no-files-found: ignore
|
|
||||||
|
|
||||||
- name: Upload PHP Logs
|
- name: Upload PHP Logs
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v4
|
||||||
|
4
.github/workflows/phplint.yml
vendored
4
.github/workflows/phplint.yml
vendored
@@ -1,9 +1,9 @@
|
|||||||
name: PHP Linting
|
name: PHP Linting
|
||||||
on:
|
on:
|
||||||
pull_request:
|
pull_request:
|
||||||
branches: [main]
|
branches: [develop]
|
||||||
push:
|
push:
|
||||||
branches: [main]
|
branches: [develop]
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
phplint:
|
phplint:
|
||||||
|
6
.github/workflows/phpstan.yml
vendored
6
.github/workflows/phpstan.yml
vendored
@@ -2,9 +2,9 @@ name: "PHPStan"
|
|||||||
|
|
||||||
on:
|
on:
|
||||||
pull_request:
|
pull_request:
|
||||||
branches: [main]
|
branches: [develop]
|
||||||
push:
|
push:
|
||||||
branches: [main]
|
branches: [develop]
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
tests:
|
tests:
|
||||||
@@ -14,7 +14,7 @@ jobs:
|
|||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
php-versions: [ '8.1', '8.2', '8.3', '8.4' ]
|
php-versions: [ '8.1', '8.2', '8.3' ]
|
||||||
steps:
|
steps:
|
||||||
- name: "Checkout"
|
- name: "Checkout"
|
||||||
uses: "actions/checkout@v4"
|
uses: "actions/checkout@v4"
|
||||||
|
4
.gitignore
vendored
4
.gitignore
vendored
@@ -4,7 +4,6 @@ Thumbs.db
|
|||||||
|
|
||||||
#
|
#
|
||||||
/.htaccess
|
/.htaccess
|
||||||
lua
|
|
||||||
|
|
||||||
# composer
|
# composer
|
||||||
composer.phar
|
composer.phar
|
||||||
@@ -76,3 +75,6 @@ landing
|
|||||||
|
|
||||||
# system
|
# system
|
||||||
system/functions_custom.php
|
system/functions_custom.php
|
||||||
|
|
||||||
|
# others/rest
|
||||||
|
system/pages/downloads.php
|
||||||
|
@@ -6,7 +6,7 @@
|
|||||||
Options -MultiViews
|
Options -MultiViews
|
||||||
</IfModule>
|
</IfModule>
|
||||||
|
|
||||||
<FilesMatch "^(.*\.md|.*\.json|.*\.dist|.*\.sql|CHANGELOG|README|composer\.lock)$">
|
<FilesMatch "^(CHANGELOG\.md|README\.md|composer\.json|composer\.lock|package\.json|package-lock\.json|cypress\.env\.json)$">
|
||||||
Require all denied
|
Require all denied
|
||||||
</FilesMatch>
|
</FilesMatch>
|
||||||
|
|
||||||
|
405
CHANGELOG-1.x.md
405
CHANGELOG-1.x.md
@@ -1,405 +0,0 @@
|
|||||||
# Changelog
|
|
||||||
|
|
||||||
## [1.8.1 - 05.09.2025]
|
|
||||||
|
|
||||||
### Added
|
|
||||||
* New Commands: plugin:enable/disable/uninstall {plugin-name} (https://github.com/slawkens/myaac/commit/7a08f91d3fc0897c1ff76089ef3c649a2c6d2003, https://github.com/slawkens/myaac/commit/fec773ba4b740f35c0a3ef92ca8444a4c7d02082)
|
|
||||||
* Gifts: Added Transferable Coins to the store dropdown menu in the admin area (by @andreoam, #321) (https://github.com/slawkens/myaac/commit/42671c5c199dd9e91c774d8c9d30da9e12f1b695)
|
|
||||||
|
|
||||||
### Changed
|
|
||||||
* Commands: Allow settings to be changed/reset by plugin name (https://github.com/slawkens/myaac/commit/f8c4332e03e838d285ea0afb4b72b7c23e324d45, https://github.com/slawkens/myaac/commit/4b948e9510f7ba69d00f84d7fdaea8b3bf05b630)
|
|
||||||
* Templates: Menus should be saved for each template separately (https://github.com/slawkens/myaac/commit/482f4067b2a2e7513d9ba214274a361ffaf123d8)
|
|
||||||
|
|
||||||
### Fixed
|
|
||||||
* Online: Fix skulls display (#320) (https://github.com/slawkens/myaac/commit/98073a110ae13f9592ec9d2c4d1d1aace87587a9)
|
|
||||||
* Online: Fix if there is no world_id in the server_record table (https://github.com/slawkens/myaac/commit/b6e1620f14c20eecfc9001a7d86dfb67942985c6) (Reported by @gesior in #318)
|
|
||||||
* tibiacom: some fixes to menus (https://github.com/slawkens/myaac/commit/20f99903ae80c74ad66c1cf5a5ea8d0b0fc2fd70, https://github.com/slawkens/myaac/commit/11dae90fa94fbbf47447017db5e5847c33d6aadf)
|
|
||||||
* Guilds: Fix for some servers that don't have guild_invites table (https://github.com/slawkens/myaac/commit/9725a3c2bdb7003f5cb48febb77604c31a9b805b)
|
|
||||||
|
|
||||||
## [1.8 - 02.08.2025]
|
|
||||||
|
|
||||||
### Added
|
|
||||||
* Templates - Kathrine: Possibility to add custom menu categories (https://github.com/slawkens/myaac/commit/ec11c1402417c25980582467546d1c1e9bb8267f)
|
|
||||||
* Admin Panel - Accounts Editor: Add Coins Transferable (https://github.com/slawkens/myaac/commit/45d6047031c9c3a0e7e512dc5d15c75629aec5a2, https://github.com/slawkens/myaac/commit/bb097b69ce106500a49686d6f4fe604348eaa310)
|
|
||||||
* Highscores:
|
|
||||||
* Revamped: (https://github.com/slawkens/myaac/commit/d8132d4d76e03d5aa0c042be426320655a601392)
|
|
||||||
* Show real rank, if 2 or more players have the same skill, show them with same rank
|
|
||||||
* New setting: highscores_online_status
|
|
||||||
* Additional fields passed to twig: updatedAt, totalResults, page, baseLink
|
|
||||||
* Add new Setting: Display Skills Box (https://github.com/slawkens/myaac/commit/36ca755243ef1c83f6ac87465b426d4d8d3b0bb9)
|
|
||||||
* Functions: Add getExperienceForLevel (level) (https://github.com/slawkens/myaac/commit/1566deb84a082176b8c683fda205d828bc38fbcc)
|
|
||||||
* Commands - cache:clear : Add warning about APCu clear in CLI (https://github.com/slawkens/myaac/commit/83f84172e02e8ea2ccb6dca29bc033e44c35aebc)
|
|
||||||
* Models - PlayerOnline: Add missing $fillable into model (https://github.com/slawkens/myaac/commit/43415cf35db1c1307f2684c1728693d65065ffff)
|
|
||||||
* Twig: add cache variable (https://github.com/slawkens/myaac/commit/0efe47ce71c4b364a9e96bc5a55b1655326ae6da)
|
|
||||||
|
|
||||||
### Changed
|
|
||||||
* pages/online: add cache, resulting in 20x performance boost
|
|
||||||
* (for an example server with 2k players) (https://github.com/slawkens/myaac/commit/c8363086015cbb6e8786c398c7b9ac3959a26ec4)
|
|
||||||
* Admin Bar: Move admin bar code into body_start place_holder (https://github.com/slawkens/myaac/commit/f17269e44ce9dd38447bd2e2a8e1bdb065d4161f)
|
|
||||||
* Cache::remember: $ttl = 0 means no cache (https://github.com/slawkens/myaac/commit/3b47e9df2f4051807c5ff87892f7fa3d348f9c55)
|
|
||||||
* Templates: Load config.ini with $process_sections set to true (https://github.com/slawkens/myaac/commit/a89f9a84847630eb75b4890fdcc8b7a7bfa6b8ac)
|
|
||||||
* Twig: Allow for timestamp as integer in the timeago twig function
|
|
||||||
(https://github.com/slawkens/myaac/commit/34fead906ea13b9f09d7a3c41ed88109d34d386c)
|
|
||||||
|
|
||||||
### Fixed
|
|
||||||
* Settings: Fixed two exceptions (https://github.com/slawkens/myaac/commit/6e5a4ff8c78ff5373aba091baa66cae029557643, https://github.com/slawkens/myaac/commit/20d69a641c0a933d14889a89da6d32f6a4bc6c7d)
|
|
||||||
* Models\Account + OTS_Account -> isPremium -> ignore config.freePremium (https://github.com/slawkens/myaac/commit/5271633bdbfbbfed0b1d59c403093ce6fc2b7d20)
|
|
||||||
* Admin Panel - Mailer:
|
|
||||||
* Fix send to email link redirecting from accounts page (https://github.com/slawkens/myaac/commit/080cc2781f034c844af658229e495e9a47fd2298)
|
|
||||||
* Option to send only to verified accounts - only if setting('core.account_mail_verify') enabled (https://github.com/slawkens/myaac/commit/cf7fd20452e863980045bb5d6012ec86c6e8e01f)
|
|
||||||
|
|
||||||
### Internal
|
|
||||||
* Rewrite to use constants (account transferable coins) (https://github.com/slawkens/myaac/commit/bccf8e056df985bbe1bab5f7ab5492f714d6b62b)
|
|
||||||
* Refactor to use HAS_ACCOUNT_COINS (https://github.com/slawkens/myaac/commit/caf326a6584a234775ebc6c8000ea02b3fecd160)
|
|
||||||
|
|
||||||
## [1.7.1 - 27.06.2025]
|
|
||||||
|
|
||||||
### Changed
|
|
||||||
* Rename plugin:install:install to plugin:setup, also add alias to previous command (https://github.com/slawkens/myaac/commit/13d33822b59df349199e885a78a3d6beb0863d0b)
|
|
||||||
|
|
||||||
### Fixed
|
|
||||||
* Fix commands: setup + cache:clear (https://github.com/slawkens/myaac/commit/0da524fefe93b3028392e9014550eea3324d3a22, https://github.com/slawkens/myaac/commit/fe8281594e989f00280ba1adc734a9198c6b5cc1)
|
|
||||||
* Fix polls link in tibiacom template (https://github.com/slawkens/myaac/commit/d90fa323d7c77d81768df60feeb1c374b1650a0c)
|
|
||||||
|
|
||||||
## [1.7 - 22.06.2025]
|
|
||||||
|
|
||||||
### Added
|
|
||||||
* Feature: plugins versions check (#310)
|
|
||||||
* New hooks: HOOK_ACCOUNT_MANAGE_AFTER_CHARACTERS, HOOK_GUILDS_AFTER_MANAGE_BUTTON (https://github.com/slawkens/myaac/commit/c074a48f245df55646b6705737f667b6a84149b2, https://github.com/slawkens/myaac/commit/e6100a1b72de8695bba1dae9ba4e28bfdce47b10)
|
|
||||||
* Add OTS_Toolbox::getVocationName(id, promotion) + OTS_Player->isNameLocked() (https://github.com/slawkens/myaac/commit/e222957893c4a1de0dc8dbba55bce1a43418d275, https://github.com/slawkens/myaac/commit/522f6c11d835afd36fd07a07074d96d7e219b488)
|
|
||||||
* Add missing csrf in more places, causing white page with error about Request (https://github.com/slawkens/myaac/commit/dca904e61d21d856bf809070e7652803a2df0f58, https://github.com/slawkens/myaac/commit/c720ccc451ff90ef40b2a1595468d061ffd7e1e4)
|
|
||||||
|
|
||||||
### Changed
|
|
||||||
* Revamped online page (https://github.com/slawkens/myaac/commit/9a90e4aae280e607430511c6727d9a714b11f4c5, https://github.com/slawkens/myaac/commit/4767120043b09141870383e249f3729638d53dc2)
|
|
||||||
* Better $title inventing (https://github.com/slawkens/myaac/commit/0c95bcfd06b68b21512e477646ef7bd3a0d4912b)
|
|
||||||
|
|
||||||
### Fixed
|
|
||||||
* Use apcu cache clear (https://github.com/slawkens/myaac/commit/b329da52aae9d0e21120a6444d3caf442420ce50, https://github.com/slawkens/myaac/commit/566c2a9151ab6392286f74e26853faa19a1b4f24)
|
|
||||||
* fix: boostedcreatures for 13.40 (by @GooseWithAKnife) (#307)
|
|
||||||
|
|
||||||
## [1.6.1 - 11.06.2025]
|
|
||||||
|
|
||||||
### Fixed
|
|
||||||
* Fixed "Request has been cancelled due to security reasons", cause of missing csrf() in twig files (https://github.com/slawkens/myaac/commit/10cd71a6630ffec91b43a26a6d685b66c5836a6a)
|
|
||||||
* Fix: Ignore duplicated route exception (https://github.com/slawkens/myaac/commit/9d8e9d27bd87167d8d4005942a6af62bfe4c0892)
|
|
||||||
|
|
||||||
### Changed
|
|
||||||
* Move counter & visitors code before router (In case someone wants to include that info on page) (https://github.com/slawkens/myaac/commit/f78285030708ad3c74ab048711f73bbf3ee5281e)
|
|
||||||
* Set TinyMCE license key to gpl (Avoid warning message in browser console) (https://github.com/slawkens/myaac/commit/8d29fdb98b92dbc3d2853ef88a185c67036b4a77)
|
|
||||||
|
|
||||||
### Removed
|
|
||||||
* Remove deprecated TinyMCE plugin - template (https://github.com/slawkens/myaac/commit/309c1fb715b882e67cb673b1544a03befbf64a22)
|
|
||||||
|
|
||||||
## [1.6 - 03.06.2025]
|
|
||||||
|
|
||||||
### Added
|
|
||||||
* Add new setting/configurable: site_url, prevents domain spoofing (https://github.com/slawkens/myaac/commit/d8a6090be382c35c19117cfef964b594ed02b8d4)
|
|
||||||
* Add new account coins setting (https://github.com/slawkens/myaac/commit/28886551e86fe562172c4c7f2afb89a2e7672c2e)
|
|
||||||
* autoload: settings/install/init.php (https://github.com/slawkens/myaac/commit/e5749437074c3b3556628a2aeb5bad2edf97bde0, https://github.com/slawkens/myaac/commit/7d213f479a7e40c6254069b5fc4e578dc32bf8d9, https://github.com/slawkens/myaac/commit/207d6bc69120aba1af2b51808f17e0059b571fed)
|
|
||||||
* Protect against csrf in more places (accounts & guilds & forums pages) (https://github.com/slawkens/myaac/commit/6eda38603c8ed7e99b92a78a4600b1245377f74d, https://github.com/slawkens/myaac/commit/e776bd52beb3064a9e694efd1b9021ec972ee2f6, https://github.com/slawkens/myaac/commit/84d502bf105f2a789481fba1acc820d236b4de66)
|
|
||||||
* Added two new hooks for pages loaded from database (custom pages): HOOK_BEFORE_PAGE_CUSTOM, HOOK_AFTER_PAGE_CUSTOM (https://github.com/slawkens/myaac/commit/c961a1ebf837f2ab1734a825ff2c57b4937610c9)
|
|
||||||
* Add global variables into $hooks->executeFilter (https://github.com/slawkens/myaac/commit/8fdea943768b20193eede99d60313ee84511a0be)
|
|
||||||
* Add getNPCsCount() to OTS_InfoRespond (https://github.com/slawkens/myaac/commit/7d435ff6433ef1fb2295ee79ed043ee10dc725e9)
|
|
||||||
|
|
||||||
### Fixed
|
|
||||||
* Allow [] in character name (https://github.com/slawkens/myaac/commit/de6603a51347b9e656c58637ed9971fffdd7cedd)
|
|
||||||
* Do not allow access to tools/ folder after install (https://github.com/slawkens/myaac/commit/6e0f5913831f8dba69fd2d1505be3e2a303c6324)
|
|
||||||
* Fix CHANGELOG-1.x.md loading in admin panel (https://github.com/slawkens/myaac/commit/4a30fb495dbfbe1d434e8d52419eaf44fe517aee)
|
|
||||||
* Fix links not working in admin dashboard modules (https://github.com/slawkens/myaac/commit/be7b27c31aa3bbd6c0289c34d1e61139a3fe015c)
|
|
||||||
* Fix twig variables: logged + account_logged being not set directly after login (https://github.com/slawkens/myaac/commit/1e9b10d6489c488cadf7f6ed17b42f1ea6c767a8)
|
|
||||||
|
|
||||||
### Changed
|
|
||||||
* OTS_ServerInfo -> move setTimeout out of class - Possibility to use the class without MyAAC (https://github.com/slawkens/myaac/commit/40d65a6613149fda51bdceb82c807e5301a3388b)
|
|
||||||
|
|
||||||
## [1.5 - 14.05.2025]
|
|
||||||
|
|
||||||
### Added
|
|
||||||
* Feature/twig hooks filters (#258)
|
|
||||||
* Add latest client versions (14.00 - 15.01) (https://github.com/slawkens/myaac/commit/5367df23812c6182863353c9a39fd7fb0b743f4b)
|
|
||||||
* db variable to twig (https://github.com/slawkens/myaac/commit/5ed1aec28e146b871a75597411d12e42a067f4e6)
|
|
||||||
* New filter: HOOK_FILTER_ROUTES (https://github.com/slawkens/myaac/commit/9b75011224f385db8b27e109bfeb28e75b9d779c)
|
|
||||||
* Allow optionally separate folder for views (thanks @Scrollog for idea) (https://github.com/slawkens/myaac/commit/03e275213901a89edb0ebb8974b776a992ab391f)
|
|
||||||
* Add float & double types to the Settings (https://github.com/slawkens/myaac/commit/67ab425bb9796d9d123296e3fda542fa8f7f05ee)
|
|
||||||
* Add optional param _page_only for single-page apps etc. (https://github.com/slawkens/myaac/commit/113473f2560aab6d364c301cc14a8b5ba8f309f4)
|
|
||||||
|
|
||||||
### Changed
|
|
||||||
* Change OTS_Account->getPremDays to not return -1 in case of freePremium (https://github.com/slawkens/myaac/commit/3befde2a1e4d24a011311e785f15185db57e19b8)
|
|
||||||
* Add note about highscores being updated x minutes + allow ttl 0 to disable cache (https://github.com/slawkens/myaac/commit/a161cff00329da6f970f3a70967fe8346fe92bbc)
|
|
||||||
* Better monster images (no image not found anymore) + use cache (https://github.com/slawkens/myaac/commit/73a5829974ceca3f02d7925d5cfbd5fa50b1bbd2)
|
|
||||||
* Rename server-info -> ots-info, changelog -> change-log (Due to conflict with apache2 server-info mod) (https://github.com/slawkens/myaac/commit/3949d84e5d7631f332111b6d00278bddbd0ad10a)
|
|
||||||
* Move rules page to admin panel (https://github.com/slawkens/myaac/commit/3949d84e5d7631f332111b6d00278bddbd0ad10a)
|
|
||||||
|
|
||||||
### Fixed
|
|
||||||
* php 8.4 warnings
|
|
||||||
* Visitors counter not working properly on dev mode (https://github.com/slawkens/myaac/commit/da151051186c913dd0dd091aabe893649c2b9ee7)
|
|
||||||
* Fix login.php boosted creature & boss (not sure exact version, but should be 14.12 or around) (https://github.com/slawkens/myaac/commit/c48b8006319f6c3b5f082befd16785420bb98110)
|
|
||||||
* Fix installMenus when theme/template was removed from disc (https://github.com/slawkens/myaac/commit/c24c580796bccd54bf9e95b864763f4642684d55)
|
|
||||||
* Fix if user removes the menu category (https://github.com/slawkens/myaac/commit/dbea69f31478391dacfbbc02c8353c39b4245daf)
|
|
||||||
|
|
||||||
### Updated:
|
|
||||||
* Update cypress from version ^13.17.0 to ^14.3.3 (https://github.com/slawkens/myaac/commit/629fd18ea166860d5898a822f44f9277da6ce43d)
|
|
||||||
|
|
||||||
## [1.4 - 22.04.2025]
|
|
||||||
|
|
||||||
### Added
|
|
||||||
* feat: admin-pages (can add admin pages through plugins) (https://github.com/slawkens/myaac/commit/ceaa0639e66d31e8177ff90791463470367aa45d)
|
|
||||||
* just place the page in admin-pages folder in the plugin
|
|
||||||
* Also, possibility to overwrite default myaac admin pages
|
|
||||||
* Add db->hasTableAndColumns(table, columns), credits to @opentibiabr Team (https://github.com/slawkens/myaac/commit/82a533d88c8a342076891d132b4b409ed9a1fe72)
|
|
||||||
* Add noSubmit option to buttons.base (https://github.com/slawkens/myaac/commit/64f6d3abcada3bf9fd7599f50d2fac0a1367f383)
|
|
||||||
|
|
||||||
### Fixed
|
|
||||||
* Fix: display 404 error instead of 500 when page has been removed from filesystem (https://github.com/slawkens/myaac/commit/c2bf94fb2370d2009a2eb907f818955132cf8611)
|
|
||||||
* Fix headline.php: change image format to .png cause of black background (https://github.com/slawkens/myaac/commit/b618084d50918539d9a70abd97e764137b966067)
|
|
||||||
* Clear cache on plugin enable/disable, fixes some issues with plugin pages being cached (https://github.com/slawkens/myaac/commit/1d0c173e7d000aecbd432800941fc3e38a0e50f2)
|
|
||||||
* Do not autoload sub-folders if autoload pages is disabled (https://github.com/slawkens/myaac/commit/d47195a7878095336f9c9edc6f96244257f67eec)
|
|
||||||
|
|
||||||
### Changed
|
|
||||||
* SQL Syntax Standardization (by @JoaozinhoBrasil, #298)
|
|
||||||
* Pages in theme/template folder will now have precedence over normal pages (https://github.com/slawkens/myaac/commit/6d8f4718a1d349fba8f0ebc39cfd3a1a84d104b0)
|
|
||||||
* Small changes in account.login.html.twig (https://github.com/slawkens/myaac/commit/f40b986b59d4c8fa89ab4745731bf366f8619976)
|
|
||||||
* Plugin name is required, version is optional (https://github.com/slawkens/myaac/commit/e6f05a2731c61d931be49e121c068e49c0ad5e01)
|
|
||||||
|
|
||||||
## [1.3.3 - 04.04.2025]
|
|
||||||
|
|
||||||
### Fixed
|
|
||||||
* Fix uninstall plugin when plugin is disabled (https://github.com/slawkens/myaac/commit/6c568fd36a271270684fc412ccd556b230273a6d)
|
|
||||||
|
|
||||||
### Changed
|
|
||||||
* Display more useful info when error parsing config.lua (https://github.com/slawkens/myaac/commit/fa6b6aa153ffc131e0d1631a4dcd9012a5850c2e)
|
|
||||||
|
|
||||||
### Other
|
|
||||||
* Small adjustments (https://github.com/slawkens/myaac/commit/35e2483de86e295bdf089cceffa25842eeb2e34c, https://github.com/slawkens/myaac/commit/ae639d65b0bfa491e747e907e2ebc77f83f47981)
|
|
||||||
|
|
||||||
## [1.3.2 - 01.04.2025]
|
|
||||||
|
|
||||||
### Fixed
|
|
||||||
* Fix debugBar/admin panel menu when using custom base_dir (https://github.com/slawkens/myaac/commit/65696f63e3aac02ff952ea81279e7cb2fa7570fb)
|
|
||||||
|
|
||||||
### Changed
|
|
||||||
* Settings: Show/hide IP Ban Protection options depending on the value (enabled/disabled) (https://github.com/slawkens/myaac/commit/dbf73d0b61b45601ae95e51b23c051c2704169c5)
|
|
||||||
* Do not require init.php in cache:clear command (https://github.com/slawkens/myaac/commit/d25c71857f767834239bbffacd00fdc671adb157)
|
|
||||||
|
|
||||||
## [1.3.1 - 19.03.2025]
|
|
||||||
|
|
||||||
### Fixed
|
|
||||||
* Fixed migrate:run command (https://github.com/slawkens/myaac/commit/1a5771ad51e595fe13368a0721b059c4ecefb17d)
|
|
||||||
|
|
||||||
### Changed
|
|
||||||
* Small adjustments (https://github.com/slawkens/myaac/commit/6fac883659f581baac1361826d046410156f1e58, https://github.com/slawkens/myaac/commit/4a6896b4469968b9904292734cf6c14ba5eeef14)
|
|
||||||
|
|
||||||
## [1.3 - 10.03.2025]
|
|
||||||
|
|
||||||
### Changed
|
|
||||||
* Use latest outfit-images host from @gesior (https://github.com/slawkens/myaac/commit/529bdcf016dd0f9dffbc34d81f99a046a9ddb70d)
|
|
||||||
* Change monster link to $_GET ?name= (https://github.com/slawkens/myaac/commit/4c5cc8b573b2b3e7ec00a22b7ede30a68083a924)
|
|
||||||
|
|
||||||
### Fixed
|
|
||||||
* Fixed house links (https://github.com/slawkens/myaac/commit/887b5068ad11c4cdab614afd34525caba785ce13)
|
|
||||||
* Fixed long title on headline.php (https://github.com/slawkens/myaac/commit/3e3f4bb5a514158ec8777684ca6c7f1c2a37bed5)
|
|
||||||
* Fixed menu colors once again, plus add !important tag (https://github.com/slawkens/myaac/commit/aa52df6e2ec92cafc25b655ae907bf2e1746d9cc)
|
|
||||||
* Fix: add possibility to remove all menu items in admin panel (https://github.com/slawkens/myaac/commit/00fe1adc15ea7646596d755f6e6e1f7854ffc1d5, https://github.com/slawkens/myaac/commit/9239a4f4198c3ad260802ac3b47e9c41b80b754e)
|
|
||||||
|
|
||||||
## [1.2 - 09.02.2025]
|
|
||||||
|
|
||||||
### Added
|
|
||||||
* Twig session(key) function + reworked session functions to accept multi-array like in Laravel (https://github.com/slawkens/myaac/commit/b46ddb43d03ef7e5fc34e555e92e856bdc905691)
|
|
||||||
* add template_name to twig variables (https://github.com/slawkens/myaac/commit/ae1161d77050bda181802b4496c9de920a7bb1bc)
|
|
||||||
* add HOOK_INIT, executed just after $hooks are loaded (https://github.com/slawkens/myaac/commit/19686725dc810f63a07f049f82c66cf336d90ca6)
|
|
||||||
|
|
||||||
### Changed
|
|
||||||
* settings: password input hide/show, enable Save button only if changes has been made, save settings in transaction (https://github.com/slawkens/myaac/commit/4fda4f643b60a151179e5dd4f04912fb2618d98f, https://github.com/slawkens/myaac/commit/28fef952f857b79d64bc7495ffa5e1999e68e192, https://github.com/slawkens/myaac/commit/4b6024dc451accadb6c469fa282a9a764c1c0a81)
|
|
||||||
* rework menus: Different categories can have different colors + Option to reset menus (https://github.com/slawkens/myaac/commit/73de93a561f6b13111e019075724357d8a617249, https://github.com/slawkens/myaac/commit/3da3e62c5b12390d75de9b3320729bcca6e0b458)
|
|
||||||
|
|
||||||
### Fixed
|
|
||||||
* highscores: Fix online status + vocation for TFS 0.x (https://github.com/slawkens/myaac/commit/ea51ad27c38be88d86514cb979bb394fcfbef1f0)
|
|
||||||
* clear cache button in admin bar needed to be clicked twice until it worked (https://github.com/slawkens/myaac/commit/ea51ad27c38be88d86514cb979bb394fcfbef1f0)
|
|
||||||
* HOOK_STARTUP location (https://github.com/slawkens/myaac/commit/a73fb1003ee3f812cf182d1834d65f08e6f60d1f)
|
|
||||||
* if vocation name has more words (https://github.com/slawkens/myaac/commit/9d7fc98e1e0a96b59ecc1a7c39800a64445db364)
|
|
||||||
|
|
||||||
### Updated
|
|
||||||
* Bump twig/twig from 3.18.0 to 3.19.0 (#284)
|
|
||||||
|
|
||||||
## [1.1 - 27.01.2025]
|
|
||||||
|
|
||||||
### Changed
|
|
||||||
* adjust mailer settings descriptions to latest gmail (https://github.com/slawkens/myaac/commit/c5d5bb80671db135e6b503f53684771c7272e05d)
|
|
||||||
* optimize $player->isOnline() function, thanks @gesior (https://github.com/slawkens/myaac/commit/10dd818b139d5e1bb1ca9ec81edfb083ba9316b4)
|
|
||||||
* make players.comment and guilds.description VARCHAR (https://github.com/slawkens/myaac/commit/a45ceab83a74bee2b89cdb72baceda75e577e3cf)
|
|
||||||
* add lua/ folder to .gitignore (https://github.com/slawkens/myaac/commit/07012f786b1114cb6ab2f064f82c645b136a375a)
|
|
||||||
|
|
||||||
### Fixed
|
|
||||||
* general fixes in the tibiacom template menus, better support for custom menus
|
|
||||||
* make functions_custom.php optional (https://github.com/slawkens/myaac/commit/dc2b5afd9980984e2b259c9fc99f2ade46f70a5a)
|
|
||||||
* error in CLI, where BASE_URL is not defined (https://github.com/slawkens/myaac/commit/4d749b881582f64b5a46196dbbb5ee8097127f03)
|
|
||||||
* hook ACCOUNT_LOGIN_BEFORE_ACCOUNT location (https://github.com/slawkens/myaac/commit/669c447fca8643ce56d9ef8c1374ec647c780998)
|
|
||||||
|
|
||||||
## [1.0.1 - 14.01.2025]
|
|
||||||
|
|
||||||
### Fixed
|
|
||||||
* tibiacom account & news menu links not auto expanding
|
|
||||||
|
|
||||||
### Updated (Thanks dependabot)
|
|
||||||
* twig from ^2.0 to ^3.11
|
|
||||||
* tinymce from ^6.8.3 to ^7.2.0
|
|
||||||
* cypress from ^12.12.0 to ^13.17.0
|
|
||||||
* nesbot/carbon from 2.72.5 to 2.72.6
|
|
||||||
|
|
||||||
## [1.0 - 12.01.2025]
|
|
||||||
|
|
||||||
First stable release in the v1.0 series.
|
|
||||||
|
|
||||||
Minimum PHP 8.1 is required.
|
|
||||||
|
|
||||||
Changes since RC.2:
|
|
||||||
|
|
||||||
### Added
|
|
||||||
* feature: migrations up/down. Allows to downgrade/upgrade database to specified version (https://github.com/slawkens/myaac/commit/3f6ff3a3326b0475d28d11ffd7fff51f362d799f)
|
|
||||||
* new hooks for news management (https://github.com/slawkens/myaac/commit/011a85d8ae34283ded6999882833f9d4797028ec, https://github.com/slawkens/myaac/commit/36bd3eb846e829b45313e10f7568dc4e95841143)
|
|
||||||
* None Vocation to highscores (can be changed to RookStayer in Admin Panel) (https://github.com/slawkens/myaac/commit/a4a248099521bb5b8b2aa5bd592138debd2f19d5)
|
|
||||||
* support for button_color (green, red, blue) (https://github.com/slawkens/myaac/commit/d8b6b749ee62e88b6af4a05d3d7557f90b94d94e)
|
|
||||||
* add $whoopsHandler as variable, can be used by plugins (https://github.com/slawkens/myaac/commit/b0c8cf2ecda23045d725aaf43cfb3852ed766a4b)
|
|
||||||
* PlayerModel->outfit_url attribute (https://github.com/slawkens/myaac/commit/3b5be1a8db5dceecaa388e2925a5536d13b38881)
|
|
||||||
* support for selecting plugin themes in Admin menus.php (https://github.com/slawkens/myaac/commit/77a2c1cec343ffe4be5c2c2503ee81bc32a14ca1)
|
|
||||||
|
|
||||||
### Changed
|
|
||||||
* schema: Change character set to utf8mb4 (support for Emojis in Menus/Pages/News/Forum etc.) (https://github.com/slawkens/myaac/commit/27c44f1bdfb6234cf0c9d5b4b491123bb205b08f)
|
|
||||||
* prefer get_browser_real_ip() over REMOTE_ADDR (https://github.com/slawkens/myaac/commit/941846605c00cee83168d2f916410b8ba8d4b7b9)
|
|
||||||
* automatically set selected current one on highscores filters (https://github.com/slawkens/myaac/commit/e96227fbe41ae281783b2d49edb169a603601813)
|
|
||||||
* rewrite towns loading code, removed OTBM loader (was too slow) (https://github.com/slawkens/myaac/commit/c980a0914632e7b27f718464f669a200707d217e)
|
|
||||||
* allow OTS_Player to be passed as object to getPlayerLink (https://github.com/slawkens/myaac/commit/84d37c5a8f2c4535a41c8aa8264752969d3f3a3d)
|
|
||||||
* do not clear menus by default on install (https://github.com/slawkens/myaac/commit/12d8faa3eda5e798f97b71e941c035187daad96e)
|
|
||||||
* display warning in admin panel - plugins - if zip extension is not installed (https://github.com/slawkens/myaac/commit/e3ffe5d9e11d78ab064a370d8541bac351c9bcd9)
|
|
||||||
* set default_socket_timeout for ipinfo.io checkup to 5 seconds (https://github.com/slawkens/myaac/commit/783d96fc6568a607d3198b832fed3a0dd06c4ebb)
|
|
||||||
* refactor getTopPlayers function (support for balance) (https://github.com/slawkens/myaac/commit/c769962e39fe8dfb72ecd5be1864e145696be794)
|
|
||||||
|
|
||||||
### Fixed
|
|
||||||
* XSS in forum (https://github.com/slawkens/myaac/commit/c2b7286d20d4b579171540f7a774e8a0995d5e8f, https://github.com/slawkens/myaac/commit/8fb643596f9586005976e7bdb484a541a9d8715e)
|
|
||||||
* price deducted when changing sex (https://github.com/slawkens/myaac/commit/16671ea40b72dcf74037c359ad572f9eb825edf9)
|
|
||||||
* move_thread by unauthorized user (https://github.com/slawkens/myaac/commit/d6c40c836a53cb1710f911f77f45f28b54ea1b54, thanks @anyeor)
|
|
||||||
* TFS 1.4.2 where conditions is NULL (https://github.com/slawkens/myaac/commit/b8396d4c8482e951da538b13f2296123732c4545)
|
|
||||||
* do not show forum new thread show button if not logged in (https://github.com/slawkens/myaac/commit/507402171ba3b6e7ee184bd7fa73e0d55e0cad7a, @anyeor)
|
|
||||||
* login if limiter is disabled (https://github.com/slawkens/myaac/commit/a0f1971583f0f790013e2145fb5ac573c59fbdef)
|
|
||||||
* fixes to installMenus function (https://github.com/slawkens/myaac/commit/a2fadc5945fe0a5e39f740827f6ffbda1bb501e2)
|
|
||||||
* many PHP exceptions in different places
|
|
||||||
* fixes to tibiacom menus ActiveSubmenuItem
|
|
||||||
|
|
||||||
### Removed
|
|
||||||
* bugtracker SQL table code as the page has been removed/moved to plugins (https://github.com/slawkens/myaac/commit/5782772b901b05fb814bc718d062f6e2cd71df8c)
|
|
||||||
|
|
||||||
## [1.0-RC.2 - 25.10.2024]
|
|
||||||
|
|
||||||
Still waiting for your reports about bugs found in this release. We are very close to stable release.
|
|
||||||
|
|
||||||
### Added
|
|
||||||
* feat: rate limit settings for blocking accounts login attempts (@gpedro, #266)
|
|
||||||
* search by email in accounts editor (https://github.com/slawkens/myaac/commit/c2ec46824621468f2a1cb4046805c485ed13fea5)
|
|
||||||
* New hooks in account manage + create (https://github.com/slawkens/myaac/commit/93641fc68ac9a5f1479329e2bd41380c19534d5d)
|
|
||||||
|
|
||||||
### Changed
|
|
||||||
* chore: drop raw queries + accounts - search by email + accounts - required min size for search by account number (@gpedro, #266)
|
|
||||||
* Use https for outfit & item images (https://github.com/slawkens/myaac/commit/71c00aa5e01fbdfd88802912e200dd1025976231)
|
|
||||||
* Do not require players & guilds tables on install (https://github.com/slawkens/myaac/commit/779aa152fa940261c9b161533946f44e288597a2)
|
|
||||||
* Do not create player if there is no players table in db (https://github.com/slawkens/myaac/commit/201f95caa8b70e88fa651eac8c3c3aa7cd765bd0)
|
|
||||||
|
|
||||||
### Fixed
|
|
||||||
* Highscore frags fixed for TFS 0.3 (@Scrollog, #263)
|
|
||||||
* Missing groups variable #262. thanks, @Scrollog for reporting (https://github.com/slawkens/myaac/commit/8d8bdb6dac6df21672ac77288fff2f2f8d6eb665)
|
|
||||||
* Verified email for login.php (@gpedro, #265)
|
|
||||||
* Warning if core.account_country is disabled (https://github.com/slawkens/myaac/commit/ab73d60c61e14a1cacdb6cfbf7f89f4bf3be0833)
|
|
||||||
|
|
||||||
|
|
||||||
## [1.0-RC.1 - 23.07.2024]
|
|
||||||
|
|
||||||
Changes since 1.0-beta:
|
|
||||||
|
|
||||||
### Added
|
|
||||||
* Feat: Hooks priority (https://github.com/slawkens/myaac/commit/dc17b701da053e04bfa64e21be9247a4f07505e1)
|
|
||||||
* Make autoload of pages, commands and themes configurable (https://github.com/slawkens/myaac/commit/c1d4b4f80cd6bb85507ee9471e47013955a26a91)
|
|
||||||
* Fraggers in characters page for TFS 1.x and canary (https://github.com/slawkens/myaac/commit/42f99c3edc8de39cccc5632cb42e88b24579c5a6)
|
|
||||||
* New hooks: HOOK_INSTALL_FINISH, HOOK_ACCOUNT_CREATE_CHARACTER_* (https://github.com/slawkens/myaac/commit/08ac8ebade106521a5c7396faa5ce7006e629f7c, https://github.com/slawkens/myaac/commit/45dda5e834ff2059faea6ef9be2efa76f1723cbd)
|
|
||||||
|
|
||||||
### Changed
|
|
||||||
* Allow account_create_character_create even if account_mail_verify is activated (https://github.com/slawkens/myaac/commit/203e411b626fe62401a4b74a48420769e512aa39)
|
|
||||||
* Create guild_rank entries, in case MySQL trigger not loaded (https://github.com/slawkens/myaac/commit/d9c1b2507c81f306970642b35e4bf5f7cc04a6f2, https://github.com/slawkens/myaac/commit/47a19e85dd84e9f3b39a1b29cfc2c04b004832b9)
|
|
||||||
* Set Admin Account verified by default (https://github.com/slawkens/myaac/commit/cd49dfc79942f3301ce9c0b8d899b9f39bda9a41)
|
|
||||||
* Refactor account routes into sub folders (https://github.com/slawkens/myaac/commit/bdc0c43d3fd3a51030c3e916bdb9f008468f5ecd)
|
|
||||||
* Order towns by id (https://github.com/slawkens/myaac/commit/9ea2a5067fc4b75de395f381577b18914132ad84)
|
|
||||||
* Do not create news about myaac, if any news already exist (on installation (https://github.com/slawkens/myaac/commit/504242fb846b73b56b87bc1e39d070687ad7f5b4)
|
|
||||||
|
|
||||||
### Fixed
|
|
||||||
* Not working google recaptcha plugin (https://github.com/slawkens/myaac/commit/a1bcb217ecf4e21fd58da4ba491da1852029898a)
|
|
||||||
* Not working account create if account_country is disabled (https://github.com/slawkens/myaac/commit/933b681a9fcdbb6283e0469b3806d2ded492d232)
|
|
||||||
* Account verify - do not allow login without verified email (Thanks @anyeor, https://github.com/slawkens/myaac/commit/fcb13f3c0fb8ceafda0bd614a229a26a269432bd)
|
|
||||||
* Detect tools/ext exists on install to prevent broken installs (https://github.com/slawkens/myaac/commit/10a739773c4f2911876bc802a0ee0537c3e00a92)
|
|
||||||
* Cache reloading each time page refreshes (https://github.com/slawkens/myaac/commit/ec96985872057340112f65073efc0c4bf86dddb0)
|
|
||||||
* Highscores frags for TFS 1.x and canary (https://github.com/slawkens/myaac/commit/a04d186c22912915f0a7873dfe677ef3b5a23c79)
|
|
||||||
* Monsters page: monster not found exception (https://github.com/slawkens/myaac/commit/ef79b99b8acc179f14b8475547347d9daca27512)
|
|
||||||
* Fixed bug if \<flags\> are not present in monster.xml (https://github.com/slawkens/myaac/commit/57b47ab7983f625c7c0ef4f5303a4d07ef172786)
|
|
||||||
* fastRoute duplicate errors (https://github.com/slawkens/myaac/commit/4c0739d3e93812dff0c33849ea3f38e4e49113ac)
|
|
||||||
* useGuildNick displaying (https://github.com/slawkens/myaac/commit/0db0ec1aa47e044c26bc403ff5078a2115d086f8)
|
|
||||||
|
|
||||||
## [1.0-beta - 18.05.2024]
|
|
||||||
|
|
||||||
Minimum PHP version for this release is 8.1.
|
|
||||||
|
|
||||||
### Added
|
|
||||||
* reworked Admin Panel (@Leesneaks, @gpedro, @slawkens)
|
|
||||||
* updated to Bootstrap v4
|
|
||||||
* new Menu
|
|
||||||
* new Dashboard: statistics, server status
|
|
||||||
* new Admin Bar showed on top when admin logged in
|
|
||||||
* new page: Server Data, to reload server data
|
|
||||||
* Towns, NPCs & Items are stored in permanent cache
|
|
||||||
* new pages: mass account & teleport tools
|
|
||||||
* changelogs editor
|
|
||||||
* revised Accounts & Players editors
|
|
||||||
* option to add/modify admin menus with plugins
|
|
||||||
* option to enable/disable plugins
|
|
||||||
* better, updated TinyMCE editor (v6.x)
|
|
||||||
* with option to upload images
|
|
||||||
* list of open source libraries used in project page
|
|
||||||
* auto-loading of themes, commands & pages from plugins/ folder. You need just to place them in correct folder and they will be loaded automatically - this allows better customization, without interfering with core AAC folders. This will allow in the future automatic updates for plugins as well the AAC as whole.
|
|
||||||
* config.php moved to Admin Panel -> Settings page
|
|
||||||
* new console script: aac - using symfony/console
|
|
||||||
* usage: `php aac` (will list all commands by default)
|
|
||||||
* example: `php aac cache:clear`
|
|
||||||
* example: `php aac plugin:install theme-example.zip`
|
|
||||||
* replace POT Query Builder to Eloquent ORM. Not 100% yet - in some places there is still old $db approach used (@gpedro) (https://github.com/slawkens/myaac/pull/230)
|
|
||||||
* brand new charming installation page (by @fernandomatos)
|
|
||||||
* using Bootstrap
|
|
||||||
* new pages router: nikic/fast-route, allowing for better customisation
|
|
||||||
* Plugin cronjobs: central control of the cronjobs
|
|
||||||
* Guild Wars support (available as plugin)
|
|
||||||
* support for login and create account only by email (configurable)
|
|
||||||
* with no need for account name
|
|
||||||
* Google ReCAPTCHA v3 support (available as plugin)
|
|
||||||
* support for Account Number
|
|
||||||
* suggest account number option
|
|
||||||
* many new functions, hooks and configurables
|
|
||||||
* better Exception Handler (Whoops - https://github.com/filp/whoops)
|
|
||||||
* automated website tests (using Cypress)
|
|
||||||
* csrf protection (https://github.com/slawkens/myaac/pull/235)
|
|
||||||
* option to restrict Page view to specified group of users (Not-Logged in, logged-in players, tutors, gamemasters etc.)
|
|
||||||
* phpdebug bar (http://phpdebugbar.com/). Activated if env == 'dev', can be also activated in production by enabling "enable_debugbar" in local config
|
|
||||||
|
|
||||||
### Changed
|
|
||||||
* Composer and NPM is now used for external libraries like: Twig, PHPMailer, fast-route, jQuery, Bootstrap etc.
|
|
||||||
* mail support is disabled on fresh install, can be manually enabled by user
|
|
||||||
* disable add php pages in admin panel for security. Option to disable plugins upload
|
|
||||||
* visitors counter shows now user browser, and also if its bot
|
|
||||||
* changes in required and optional PHP extensions
|
|
||||||
* reworked Pages:
|
|
||||||
* Bans
|
|
||||||
* works now for TFS 1.x
|
|
||||||
* Highscores
|
|
||||||
* frags works for TFS 1.x
|
|
||||||
* cached
|
|
||||||
* Monsters
|
|
||||||
* moved pages to Twig:
|
|
||||||
* experience stages
|
|
||||||
* update player_deaths entries on name change
|
|
||||||
* change_password email to be more informal
|
|
||||||
|
|
||||||
### Fixed
|
|
||||||
* hundreds of bug fixes, mostly patched from 0.8, so it makes no sense writing them again here
|
|
97
CHANGELOG.md
Normal file
97
CHANGELOG.md
Normal file
@@ -0,0 +1,97 @@
|
|||||||
|
# Changelog
|
||||||
|
|
||||||
|
## [1.0-RC -23.07.2024]
|
||||||
|
|
||||||
|
Changes since 1.0-beta:
|
||||||
|
|
||||||
|
### Added
|
||||||
|
* Feat: Hooks priority (https://github.com/slawkens/myaac/commit/dc17b701da053e04bfa64e21be9247a4f07505e1)
|
||||||
|
* Make autoload of pages, commands and themes configurable (https://github.com/slawkens/myaac/commit/c1d4b4f80cd6bb85507ee9471e47013955a26a91)
|
||||||
|
* Fraggers in characters page for TFS 1.x and canary (https://github.com/slawkens/myaac/commit/42f99c3edc8de39cccc5632cb42e88b24579c5a6)
|
||||||
|
* New hooks: HOOK_INSTALL_FINISH, HOOK_ACCOUNT_CREATE_CHARACTER_* (https://github.com/slawkens/myaac/commit/08ac8ebade106521a5c7396faa5ce7006e629f7c, https://github.com/slawkens/myaac/commit/45dda5e834ff2059faea6ef9be2efa76f1723cbd)
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
* Allow account_create_character_create even if account_mail_verify is activated (https://github.com/slawkens/myaac/commit/203e411b626fe62401a4b74a48420769e512aa39)
|
||||||
|
* Create guild_rank entries, in case MySQL trigger not loaded (https://github.com/slawkens/myaac/commit/d9c1b2507c81f306970642b35e4bf5f7cc04a6f2, https://github.com/slawkens/myaac/commit/47a19e85dd84e9f3b39a1b29cfc2c04b004832b9)
|
||||||
|
* Set Admin Account verified by default (https://github.com/slawkens/myaac/commit/cd49dfc79942f3301ce9c0b8d899b9f39bda9a41)
|
||||||
|
* Refactor account routes into sub folders (https://github.com/slawkens/myaac/commit/bdc0c43d3fd3a51030c3e916bdb9f008468f5ecd)
|
||||||
|
* Order towns by id (https://github.com/slawkens/myaac/commit/9ea2a5067fc4b75de395f381577b18914132ad84)
|
||||||
|
* Do not create news about myaac, if any news already exist (on installation (https://github.com/slawkens/myaac/commit/504242fb846b73b56b87bc1e39d070687ad7f5b4)
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
* Not working google recaptcha plugin (https://github.com/slawkens/myaac/commit/a1bcb217ecf4e21fd58da4ba491da1852029898a)
|
||||||
|
* Not working account create if account_country is disabled (https://github.com/slawkens/myaac/commit/933b681a9fcdbb6283e0469b3806d2ded492d232)
|
||||||
|
* Account verify - do not allow login without verified email (Thanks @anyeor, https://github.com/slawkens/myaac/commit/fcb13f3c0fb8ceafda0bd614a229a26a269432bd)
|
||||||
|
* Detect tools/ext exists on install to prevent broken installs (https://github.com/slawkens/myaac/commit/10a739773c4f2911876bc802a0ee0537c3e00a92)
|
||||||
|
* Cache reloading each time page refreshes (https://github.com/slawkens/myaac/commit/ec96985872057340112f65073efc0c4bf86dddb0)
|
||||||
|
* Highscores frags for TFS 1.x and canary (https://github.com/slawkens/myaac/commit/a04d186c22912915f0a7873dfe677ef3b5a23c79)
|
||||||
|
* Monsters page: monster not found exception (https://github.com/slawkens/myaac/commit/ef79b99b8acc179f14b8475547347d9daca27512)
|
||||||
|
* Fixed bug if \<flags\> are not present in monster.xml (https://github.com/slawkens/myaac/commit/57b47ab7983f625c7c0ef4f5303a4d07ef172786)
|
||||||
|
* fastRoute duplicate errors (https://github.com/slawkens/myaac/commit/4c0739d3e93812dff0c33849ea3f38e4e49113ac)
|
||||||
|
* useGuildNick displaying (https://github.com/slawkens/myaac/commit/0db0ec1aa47e044c26bc403ff5078a2115d086f8)
|
||||||
|
|
||||||
|
## [1.0-beta - 18.05.2024]
|
||||||
|
|
||||||
|
Minimum PHP version for this release is 8.1.
|
||||||
|
|
||||||
|
### Added
|
||||||
|
* reworked Admin Panel (@Leesneaks, @gpedro, @slawkens)
|
||||||
|
* updated to Bootstrap v4
|
||||||
|
* new Menu
|
||||||
|
* new Dashboard: statistics, server status
|
||||||
|
* new Admin Bar showed on top when admin logged in
|
||||||
|
* new page: Server Data, to reload server data
|
||||||
|
* Towns, NPCs & Items are stored in permanent cache
|
||||||
|
* new pages: mass account & teleport tools
|
||||||
|
* changelogs editor
|
||||||
|
* revised Accounts & Players editors
|
||||||
|
* option to add/modify admin menus with plugins
|
||||||
|
* option to enable/disable plugins
|
||||||
|
* better, updated TinyMCE editor (v6.x)
|
||||||
|
* with option to upload images
|
||||||
|
* list of open source libraries used in project page
|
||||||
|
* auto-loading of themes, commands & pages from plugins/ folder. You need just to place them in correct folder and they will be loaded automatically - this allows better customization, without interfering with core AAC folders. This will allow in the future automatic updates for plugins as well the AAC as whole.
|
||||||
|
* config.php moved to Admin Panel -> Settings page
|
||||||
|
* new console script: aac - using symfony/console
|
||||||
|
* usage: `php aac` (will list all commands by default)
|
||||||
|
* example: `php aac cache:clear`
|
||||||
|
* example: `php aac plugin:install theme-example.zip`
|
||||||
|
* replace POT Query Builder to Eloquent ORM. Not 100% yet - in some places there is still old $db approach used (@gpedro) (https://github.com/slawkens/myaac/pull/230)
|
||||||
|
* brand new charming installation page (by @fernandomatos)
|
||||||
|
* using Bootstrap
|
||||||
|
* new pages router: nikic/fast-route, allowing for better customisation
|
||||||
|
* Plugin cronjobs: central control of the cronjobs
|
||||||
|
* Guild Wars support (available as plugin)
|
||||||
|
* support for login and create account only by email (configurable)
|
||||||
|
* with no need for account name
|
||||||
|
* Google ReCAPTCHA v3 support (available as plugin)
|
||||||
|
* automatically load towns names from .OTBM file
|
||||||
|
* support for Account Number
|
||||||
|
* suggest account number option
|
||||||
|
* many new functions, hooks and configurables
|
||||||
|
* better Exception Handler (Whoops - https://github.com/filp/whoops)
|
||||||
|
* automated website tests (using Cypress)
|
||||||
|
* csrf protection (https://github.com/slawkens/myaac/pull/235)
|
||||||
|
* option to restrict Page view to specified group of users (Not-Logged in, logged-in players, tutors, gamemasters etc.)
|
||||||
|
* phpdebug bar (http://phpdebugbar.com/). Activated if env == 'dev', can be also activated in production by enabling "enable_debugbar" in local config
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
* Composer and NPM is now used for external libraries like: Twig, PHPMailer, fast-route, jQuery, Bootstrap etc.
|
||||||
|
* mail support is disabled on fresh install, can be manually enabled by user
|
||||||
|
* disable add php pages in admin panel for security. Option to disable plugins upload
|
||||||
|
* visitors counter shows now user browser, and also if its bot
|
||||||
|
* changes in required and optional PHP extensions
|
||||||
|
* reworked Pages:
|
||||||
|
* Bans
|
||||||
|
* works now for TFS 1.x
|
||||||
|
* Highscores
|
||||||
|
* frags works for TFS 1.x
|
||||||
|
* cached
|
||||||
|
* Monsters
|
||||||
|
* moved pages to Twig:
|
||||||
|
* experience stages
|
||||||
|
* update player_deaths entries on name change
|
||||||
|
* change_password email to be more informal
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
* hundrets of bug fixes, mostly patched from 0.8, so it makes no sense writing them again here
|
2
CREDITS
2
CREDITS
@@ -1,3 +1,3 @@
|
|||||||
* Gesior.pl (2007 - 2008)
|
* Gesior.pl (2007 - 2008)
|
||||||
* Slawkens (2009 - 2025)
|
* Slawkens (2009 - 2023)
|
||||||
* Contributors listed in CONTRIBUTORS.txt
|
* Contributors listed in CONTRIBUTORS.txt
|
||||||
|
27
README.md
27
README.md
@@ -1,6 +1,6 @@
|
|||||||
# [MyAAC](https://my-aac.org)
|
# [MyAAC](https://my-aac.org)
|
||||||
|
|
||||||
MyAAC is a free and open-source Automatic Account Creator (AAC) for Open Tibia Servers written in PHP. It is a fork of the [Gesior](https://github.com/gesior/Gesior2012) project. It supports only MySQL databases.
|
MyAAC is a free and open-source Automatic Account Creator (AAC) written in PHP. It is a fork of the [Gesior](https://github.com/gesior/Gesior2012) project. It supports only MySQL databases.
|
||||||
|
|
||||||
Official website: https://my-aac.org
|
Official website: https://my-aac.org
|
||||||
|
|
||||||
@@ -12,18 +12,11 @@ Official website: https://my-aac.org
|
|||||||
|
|
||||||
| Version | Status | Branch | Requirements |
|
| Version | Status | Branch | Requirements |
|
||||||
|:--------|:-----------------------|:--------|:---------------|
|
|:--------|:-----------------------|:--------|:---------------|
|
||||||
| 2.x | Experimental features | develop | PHP >= 8.1 |
|
| **1.x** | **Active development** | develop | **PHP >= 8.1** |
|
||||||
| **1.x** | **Active development** | main | **PHP >= 8.1** |
|
|
||||||
| 0.9.x | Not developed anymore | 0.9 | PHP >= 7.2.5 |
|
| 0.9.x | Not developed anymore | 0.9 | PHP >= 7.2.5 |
|
||||||
| 0.8.x | Active support | 0.8 | 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 |
|
||||||
|
|
||||||
The recommended version to install is 1.x, which can be found at releases page - [https://github.com/slawkens/myaac/releases](https://github.com/slawkens/myaac/releases).
|
|
||||||
|
|
||||||
### Documentation
|
|
||||||
* [docs.my-aac.org](https://docs.my-aac.org)
|
|
||||||
* [my-aac.org - FAQ](https://my-aac.org/faqs/)
|
|
||||||
|
|
||||||
### Requirements
|
### Requirements
|
||||||
|
|
||||||
- MySQL database
|
- MySQL database
|
||||||
@@ -54,23 +47,23 @@ The recommended version to install is 1.x, which can be found at releases page -
|
|||||||
|
|
||||||
### Configuration
|
### Configuration
|
||||||
|
|
||||||
Check *config.php* to get more information. (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. (Notice: MyAAC 1.0+ doesn't use config.php anymore, it has been moved to Admin Panel - Settings page).
|
||||||
|
|
||||||
Use *config.local.php* for your local configuration changes.
|
Use *config.local.php* for your local configuration changes.
|
||||||
|
|
||||||
### Branches
|
### Branches
|
||||||
|
|
||||||
This repository follows the Git Flow Workflow.
|
This repository follows the Git Flow Workflow.
|
||||||
Cheatsheet: [Git-Flow-Cheatsheet](https://danielkummer.github.io/git-flow-cheatsheet)
|
Cheatsheet: [Git-Flow-Cheetsheet](https://danielkummer.github.io/git-flow-cheatsheet)
|
||||||
|
|
||||||
That means, we use:
|
That means, we use:
|
||||||
* main branch, for current stable release
|
* master branch, for current stable release
|
||||||
* develop branch, for development version (next release)
|
* develop branch, for development version (next release)
|
||||||
* feature branches, for features etc.
|
* feature branches, for features etc.
|
||||||
|
|
||||||
### Known Problems
|
### Known Problems
|
||||||
|
|
||||||
- Some compatibility issues with some exotic distributions.
|
- Some compatibility issues with some exotical distibutions.
|
||||||
|
|
||||||
### Contributing
|
### Contributing
|
||||||
|
|
||||||
@@ -80,11 +73,11 @@ Pull requests should be made to the *develop* branch as that is the working bran
|
|||||||
|
|
||||||
Bug fixes to current release should be done to master branch.
|
Bug fixes to current release should be done to master branch.
|
||||||
|
|
||||||
Look: [Contributing](https://docs.my-aac.org/misc/contributing) in our wiki.
|
Look: [Contributing](https://github.com/otsoft/myaac/wiki/Contributing) in our wiki.
|
||||||
|
|
||||||
### Other Notes
|
### Other Notes
|
||||||
|
|
||||||
If you have a great idea or want to contribute to the project - visit our website at https://www.my-aac.org
|
If you have a great idea or want contribute to the project - visit our website at https://www.my-aac.org
|
||||||
|
|
||||||
## Project supported by JetBrains
|
## Project supported by JetBrains
|
||||||
|
|
||||||
@@ -95,4 +88,4 @@ Many thanks to Jetbrains for kindly providing a license for me to work on this a
|
|||||||
### License
|
### License
|
||||||
|
|
||||||
This program and all associated files are released under the GNU Public License.
|
This program and all associated files are released under the GNU Public License.
|
||||||
See [LICENSE](https://github.com/slawkens/myaac/blob/main/LICENSE) for details.
|
See [LICENSE](https://github.com/slawkens/myaac/blob/master/LICENSE) for details.
|
||||||
|
6
aac
6
aac
@@ -9,13 +9,14 @@ if(!IS_CLI) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
require_once SYSTEM . 'functions.php';
|
require_once SYSTEM . 'functions.php';
|
||||||
|
require_once SYSTEM . 'init.php';
|
||||||
|
|
||||||
define('SELF_NAME', basename(__FILE__));
|
define('SELF_NAME', basename(__FILE__));
|
||||||
|
|
||||||
use MyAAC\Plugins;
|
use MyAAC\Plugins;
|
||||||
use Symfony\Component\Console\Application;
|
use Symfony\Component\Console\Application;
|
||||||
|
|
||||||
$application = new Application('MyAAC', MYAAC_VERSION);
|
$application = new Application();
|
||||||
|
|
||||||
$commandsGlob = glob(SYSTEM . 'src/Commands/*.php');
|
$commandsGlob = glob(SYSTEM . 'src/Commands/*.php');
|
||||||
foreach ($commandsGlob as $item) {
|
foreach ($commandsGlob as $item) {
|
||||||
@@ -33,4 +34,7 @@ foreach ($pluginCommands as $item) {
|
|||||||
$application->add(require $item);
|
$application->add(require $item);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$application->setName('MyAAC');
|
||||||
|
$application->setVersion(MYAAC_VERSION);
|
||||||
|
|
||||||
$application->run();
|
$application->run();
|
||||||
|
@@ -7,7 +7,7 @@ $hooks->register('debugbar_admin_head_end', HOOK_ADMIN_HEAD_END, function ($para
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
$debugBarRenderer = $debugBar->getJavascriptRenderer(BASE_URL . 'vendor/maximebf/debugbar/src/DebugBar/Resources/');
|
$debugBarRenderer = $debugBar->getJavascriptRenderer();
|
||||||
echo $debugBarRenderer->renderHead();
|
echo $debugBarRenderer->renderHead();
|
||||||
});
|
});
|
||||||
$hooks->register('debugbar_admin_body_end', HOOK_ADMIN_BODY_END, function ($params) {
|
$hooks->register('debugbar_admin_body_end', HOOK_ADMIN_BODY_END, function ($params) {
|
||||||
@@ -17,6 +17,6 @@ $hooks->register('debugbar_admin_body_end', HOOK_ADMIN_BODY_END, function ($para
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
$debugBarRenderer = $debugBar->getJavascriptRenderer(BASE_URL . 'vendor/maximebf/debugbar/src/DebugBar/Resources/');
|
$debugBarRenderer = $debugBar->getJavascriptRenderer();
|
||||||
echo $debugBarRenderer->render();
|
echo $debugBarRenderer->render();
|
||||||
});
|
});
|
||||||
|
@@ -1,8 +1,6 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
// few things we'll need
|
// few things we'll need
|
||||||
use MyAAC\Plugins;
|
|
||||||
|
|
||||||
require '../common.php';
|
require '../common.php';
|
||||||
|
|
||||||
const ADMIN_PANEL = true;
|
const ADMIN_PANEL = true;
|
||||||
@@ -44,21 +42,15 @@ if(!$logged || !admin()) {
|
|||||||
$page = 'login';
|
$page = 'login';
|
||||||
}
|
}
|
||||||
|
|
||||||
$pluginsAdminPages = Plugins::getAdminPages();
|
// include our page
|
||||||
if(isset($pluginsAdminPages[$page]) && file_exists(BASE . $pluginsAdminPages[$page])) {
|
$file = __DIR__ . '/pages/' . $page . '.php';
|
||||||
$file = BASE . $pluginsAdminPages[$page];
|
if(!@file_exists($file)) {
|
||||||
}
|
if (str_contains($page, 'plugins/')) {
|
||||||
else {
|
$file = BASE . $page;
|
||||||
// include our page
|
}
|
||||||
$file = __DIR__ . '/pages/' . $page . '.php';
|
else {
|
||||||
if(!@file_exists($file)) {
|
$page = '404';
|
||||||
if (str_contains($page, 'plugins/')) {
|
$file = SYSTEM . 'pages/404.php';
|
||||||
$file = BASE . $page;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
$page = '404';
|
|
||||||
$file = SYSTEM . 'pages/404.php';
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -23,9 +23,13 @@ $use_datatable = true;
|
|||||||
if (setting('core.account_country'))
|
if (setting('core.account_country'))
|
||||||
require SYSTEM . 'countries.conf.php';
|
require SYSTEM . 'countries.conf.php';
|
||||||
|
|
||||||
$nameOrNumberColumn = getAccountIdentityColumn();
|
$nameOrNumberColumn = 'name';
|
||||||
|
if (USE_ACCOUNT_NUMBER) {
|
||||||
|
$nameOrNumberColumn = 'number';
|
||||||
|
}
|
||||||
|
|
||||||
$hasSecretColumn = $db->hasColumn('accounts', 'secret');
|
$hasSecretColumn = $db->hasColumn('accounts', 'secret');
|
||||||
|
$hasCoinsColumn = $db->hasColumn('accounts', 'coins');
|
||||||
$hasPointsColumn = $db->hasColumn('accounts', 'premium_points');
|
$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');
|
||||||
@@ -65,7 +69,7 @@ else if (isset($_REQUEST['search_email'])) {
|
|||||||
else if (isset($_REQUEST['search'])) {
|
else if (isset($_REQUEST['search'])) {
|
||||||
$search_account = $_REQUEST['search'];
|
$search_account = $_REQUEST['search'];
|
||||||
$min_size = 3;
|
$min_size = 3;
|
||||||
if (in_array($nameOrNumberColumn, ['id', 'number'])) {
|
if ($nameOrNumberColumn == 'number') {
|
||||||
$min_size = 1;
|
$min_size = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -135,18 +139,11 @@ else if (isset($_REQUEST['search'])) {
|
|||||||
if (!Validator::email($email))
|
if (!Validator::email($email))
|
||||||
$errors['email'] = Validator::getLastError();
|
$errors['email'] = Validator::getLastError();
|
||||||
|
|
||||||
// tibia coins
|
//tibia coins
|
||||||
if (HAS_ACCOUNT_COINS) {
|
if ($hasCoinsColumn) {
|
||||||
$t_coins = $_POST['t_coins'];
|
$t_coins = $_POST['t_coins'];
|
||||||
verify_number($t_coins, 'Tibia coins', 12);
|
verify_number($t_coins, 'Tibia coins', 12);
|
||||||
}
|
}
|
||||||
|
|
||||||
// transferable tibia coins
|
|
||||||
if (HAS_ACCOUNT_COINS_TRANSFERABLE || HAS_ACCOUNT_TRANSFERABLE_COINS) {
|
|
||||||
$t_coins_transferable = $_POST['t_coins_transferable'];
|
|
||||||
verify_number($t_coins_transferable, 'Transferable Tibia coins', 12);
|
|
||||||
}
|
|
||||||
|
|
||||||
// prem days
|
// prem days
|
||||||
$p_days = (int)$_POST['p_days'];
|
$p_days = (int)$_POST['p_days'];
|
||||||
verify_number($p_days, 'Prem days', 11);
|
verify_number($p_days, 'Prem days', 11);
|
||||||
@@ -191,18 +188,12 @@ else if (isset($_REQUEST['search'])) {
|
|||||||
if ($hasSecretColumn) {
|
if ($hasSecretColumn) {
|
||||||
$account->setCustomField('secret', $secret);
|
$account->setCustomField('secret', $secret);
|
||||||
}
|
}
|
||||||
|
|
||||||
$account->setCustomField('key', $key);
|
$account->setCustomField('key', $key);
|
||||||
$account->setEMail($email);
|
$account->setEMail($email);
|
||||||
|
if ($hasCoinsColumn) {
|
||||||
if (HAS_ACCOUNT_COINS) {
|
|
||||||
$account->setCustomField('coins', $t_coins);
|
$account->setCustomField('coins', $t_coins);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (HAS_ACCOUNT_COINS_TRANSFERABLE || HAS_ACCOUNT_TRANSFERABLE_COINS) {
|
|
||||||
$account->setCustomField(ACCOUNT_COINS_TRANSFERABLE_COLUMN, $t_coins_transferable);
|
|
||||||
}
|
|
||||||
|
|
||||||
$lastDay = 0;
|
$lastDay = 0;
|
||||||
if($p_days != 0 && $p_days != OTS_Account::GRATIS_PREMIUM_DAYS) {
|
if($p_days != 0 && $p_days != OTS_Account::GRATIS_PREMIUM_DAYS) {
|
||||||
$lastDay = time();
|
$lastDay = time();
|
||||||
@@ -221,7 +212,7 @@ else if (isset($_REQUEST['search'])) {
|
|||||||
if(setting('core.account_country')) {
|
if(setting('core.account_country')) {
|
||||||
$account->setCountry($rl_country);
|
$account->setCountry($rl_country);
|
||||||
}
|
}
|
||||||
|
|
||||||
$account->setCustomField('created', $created);
|
$account->setCustomField('created', $created);
|
||||||
$account->setWebFlags($web_flags);
|
$account->setWebFlags($web_flags);
|
||||||
$account->setCustomField('web_lastlogin', $web_lastlogin);
|
$account->setCustomField('web_lastlogin', $web_lastlogin);
|
||||||
@@ -235,6 +226,9 @@ else if (isset($_REQUEST['search'])) {
|
|||||||
|
|
||||||
$password = encrypt($password);
|
$password = encrypt($password);
|
||||||
$account->setPassword($password);
|
$account->setPassword($password);
|
||||||
|
|
||||||
|
if (USE_ACCOUNT_SALT)
|
||||||
|
$account->setCustomField('salt', $salt);
|
||||||
}
|
}
|
||||||
|
|
||||||
$account->save();
|
$account->save();
|
||||||
@@ -254,7 +248,7 @@ else if (isset($_REQUEST['search'])) {
|
|||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
<th>ID</th>
|
<th>ID</th>
|
||||||
<th><?= ($nameOrNumberColumn == 'name' ? 'Name' : 'Number'); ?></th>
|
<th><?= ($nameOrNumberColumn == 'number' ? 'Number' : 'Name'); ?></th>
|
||||||
<?php if($hasTypeColumn || $hasGroupColumn): ?>
|
<?php if($hasTypeColumn || $hasGroupColumn): ?>
|
||||||
<th>E-Mail</th>
|
<th>E-Mail</th>
|
||||||
<th>Position</th>
|
<th>Position</th>
|
||||||
@@ -404,18 +398,12 @@ else if (isset($_REQUEST['search'])) {
|
|||||||
<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 (setting('core.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 (HAS_ACCOUNT_COINS): ?>
|
<?php if ($hasCoinsColumn): ?>
|
||||||
<div class="col-12 col-sm-12 col-lg-6">
|
<div class="col-12 col-sm-12 col-lg-6">
|
||||||
<label for="t_coins">Tibia Coins:</label>
|
<label for="t_coins">Tibia Coins:</label>
|
||||||
<input type="text" class="form-control" id="t_coins" name="t_coins" autocomplete="off" maxlength="11" value="<?php echo $account->getCustomField('coins') ?>"/>
|
<input type="text" class="form-control" id="t_coins" name="t_coins" autocomplete="off" maxlength="11" value="<?php echo $account->getCustomField('coins') ?>"/>
|
||||||
</div>
|
</div>
|
||||||
<?php endif; ?>
|
<?php endif; ?>
|
||||||
<?php if (HAS_ACCOUNT_COINS_TRANSFERABLE || HAS_ACCOUNT_TRANSFERABLE_COINS): ?>
|
|
||||||
<div class="col-12 col-sm-12 col-lg-6">
|
|
||||||
<label for="t_coins_transferable">Transferable Tibia Coins:</label>
|
|
||||||
<input type="text" class="form-control" id="t_coins_transferable" name="t_coins_transferable" autocomplete="off" maxlength="11" value="<?php echo $account->getCustomField(ACCOUNT_COINS_TRANSFERABLE_COLUMN) ?>"/>
|
|
||||||
</div>
|
|
||||||
<?php endif; ?>
|
|
||||||
<div class="col-12 col-sm-12 col-lg-6">
|
<div class="col-12 col-sm-12 col-lg-6">
|
||||||
<label for="p_days">Premium Days:</label>
|
<label for="p_days">Premium Days:</label>
|
||||||
<input type="text" class="form-control" id="p_days" name="p_days" autocomplete="off" maxlength="11" value="<?php echo $account->getPremDays(); ?>"/>
|
<input type="text" class="form-control" id="p_days" name="p_days" autocomplete="off" maxlength="11" value="<?php echo $account->getPremDays(); ?>"/>
|
||||||
|
@@ -11,12 +11,12 @@
|
|||||||
defined('MYAAC') or die('Direct access not allowed!');
|
defined('MYAAC') or die('Direct access not allowed!');
|
||||||
$title = 'MyAAC Changelog';
|
$title = 'MyAAC Changelog';
|
||||||
|
|
||||||
if (!file_exists(BASE . 'CHANGELOG-1.x.md')) {
|
if (!file_exists(BASE . 'CHANGELOG.md')) {
|
||||||
echo 'File CHANGELOG.md doesn\'t exist.';
|
echo 'File CHANGELOG.md doesn\'t exist.';
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
$changelog = file_get_contents(BASE . 'CHANGELOG-1.x.md');
|
$changelog = file_get_contents(BASE . 'CHANGELOG.md');
|
||||||
|
|
||||||
$Parsedown = new Parsedown();
|
$Parsedown = new Parsedown();
|
||||||
|
|
||||||
|
@@ -25,10 +25,9 @@ if (!setting('core.mail_enabled')) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
$mail_to = isset($_REQUEST['mail_to']) ? stripslashes(trim($_REQUEST['mail_to'])) : null;
|
$mail_to = isset($_POST['mail_to']) ? stripslashes(trim($_POST['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;
|
||||||
$mail_verified_only = $_POST['mail_verified_only'] ?? false;
|
|
||||||
|
|
||||||
if (isset($_POST['submit'])) {
|
if (isset($_POST['submit'])) {
|
||||||
if (empty($mail_subject)) {
|
if (empty($mail_subject)) {
|
||||||
@@ -59,14 +58,14 @@ if (!empty($mail_content) && !empty($mail_subject) && empty($mail_to)) {
|
|||||||
$success = 0;
|
$success = 0;
|
||||||
$failed = 0;
|
$failed = 0;
|
||||||
|
|
||||||
$query = Account::where('email', '!=', '');
|
$add = '';
|
||||||
|
if (setting('core.account_mail_verify')) {
|
||||||
if ($mail_verified_only) {
|
note('Note: Sending only to users with verified E-Mail.');
|
||||||
info('Note: Sending only to users with verified E-Mail.');
|
$add = ' AND `email_verified` = 1';
|
||||||
$query->where('email_verified', 1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach ($query->get(['email']) as $email) {
|
$query = Account::where('email', '!=', '')->get(['email']);
|
||||||
|
foreach ($query as $email) {
|
||||||
if (_mail($email->email, $mail_subject, $mail_content)) {
|
if (_mail($email->email, $mail_subject, $mail_content)) {
|
||||||
$success++;
|
$success++;
|
||||||
}
|
}
|
||||||
@@ -85,6 +84,5 @@ if (!empty($mail_content) && !empty($mail_subject) && empty($mail_to)) {
|
|||||||
$twig->display('admin.mailer.html.twig', [
|
$twig->display('admin.mailer.html.twig', [
|
||||||
'mail_to' => $mail_to,
|
'mail_to' => $mail_to,
|
||||||
'mail_subject' => $mail_subject,
|
'mail_subject' => $mail_subject,
|
||||||
'mail_content' => $mail_content,
|
'mail_content' => $mail_content
|
||||||
'mail_verified_only' => $mail_verified_only,
|
|
||||||
]);
|
]);
|
||||||
|
@@ -18,6 +18,7 @@ $title = 'Mass Account Actions';
|
|||||||
|
|
||||||
csrfProtect();
|
csrfProtect();
|
||||||
|
|
||||||
|
$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'];
|
||||||
|
|
||||||
@@ -39,7 +40,9 @@ function admin_give_points($points)
|
|||||||
|
|
||||||
function admin_give_coins($coins)
|
function admin_give_coins($coins)
|
||||||
{
|
{
|
||||||
if (!HAS_ACCOUNT_COINS) {
|
global $hasCoinsColumn;
|
||||||
|
|
||||||
|
if (!$hasCoinsColumn) {
|
||||||
displayMessage('Coins not supported.');
|
displayMessage('Coins not supported.');
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -164,19 +167,19 @@ if (!empty(ACTION) && isRequestMethod('post')) {
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
$twig->display('admin.tools.account.html.twig', array(
|
$twig->display('admin.tools.account.html.twig', array(
|
||||||
'hasCoinsColumn' => HAS_ACCOUNT_COINS,
|
'hasCoinsColumn' => $hasCoinsColumn,
|
||||||
'hasPointsColumn' => $hasPointsColumn,
|
'hasPointsColumn' => $hasPointsColumn,
|
||||||
'freePremium' => $freePremium,
|
'freePremium' => $freePremium,
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
function displayMessage($message, $success = false) {
|
function displayMessage($message, $success = false) {
|
||||||
global $twig, $hasPointsColumn, $freePremium;
|
global $twig, $hasCoinsColumn, $hasPointsColumn, $freePremium;
|
||||||
|
|
||||||
$success ? success($message): error($message);
|
$success ? success($message): error($message);
|
||||||
|
|
||||||
$twig->display('admin.tools.account.html.twig', array(
|
$twig->display('admin.tools.account.html.twig', array(
|
||||||
'hasCoinsColumn' => HAS_ACCOUNT_COINS,
|
'hasCoinsColumn' => $hasCoinsColumn,
|
||||||
'hasPointsColumn' => $hasPointsColumn,
|
'hasPointsColumn' => $hasPointsColumn,
|
||||||
'freePremium' => $freePremium,
|
'freePremium' => $freePremium,
|
||||||
));
|
));
|
||||||
|
@@ -10,7 +10,6 @@
|
|||||||
|
|
||||||
use MyAAC\Cache\Cache;
|
use MyAAC\Cache\Cache;
|
||||||
use MyAAC\Models\Menu;
|
use MyAAC\Models\Menu;
|
||||||
use MyAAC\Plugins;
|
|
||||||
|
|
||||||
defined('MYAAC') or die('Direct access not allowed!');
|
defined('MYAAC') or die('Direct access not allowed!');
|
||||||
$title = 'Menus';
|
$title = 'Menus';
|
||||||
@@ -22,16 +21,14 @@ if (!hasFlag(FLAG_CONTENT_MENUS) && !superAdmin()) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
$pluginThemes = Plugins::getThemes();
|
|
||||||
|
|
||||||
if (isset($_POST['template'])) {
|
if (isset($_POST['template'])) {
|
||||||
$template = $_POST['template'];
|
$template = $_POST['template'];
|
||||||
|
|
||||||
if (isset($_POST['save'])) {
|
if (isset($_POST['menu'])) {
|
||||||
$post_menu = $_POST['menu'] ?? [];
|
$post_menu = $_POST['menu'];
|
||||||
$post_menu_link = $_POST['menu_link'] ?? [];
|
$post_menu_link = $_POST['menu_link'];
|
||||||
$post_menu_blank = $_POST['menu_blank'] ?? [];
|
$post_menu_blank = $_POST['menu_blank'];
|
||||||
$post_menu_color = $_POST['menu_color'] ?? [];
|
$post_menu_color = $_POST['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;
|
||||||
@@ -59,67 +56,54 @@ if (isset($_POST['template'])) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
onTemplateMenusChange();
|
$cache = Cache::getInstance();
|
||||||
|
if ($cache->enabled()) {
|
||||||
|
$cache->delete('template_menus');
|
||||||
|
}
|
||||||
|
|
||||||
success('Saved at ' . date('H:i'));
|
success('Saved at ' . date('H:i'));
|
||||||
}
|
}
|
||||||
|
|
||||||
$path = TEMPLATES . $template;
|
$file = TEMPLATES . $template . '/config.php';
|
||||||
|
if (file_exists($file)) {
|
||||||
if (isset($pluginThemes[$template])) {
|
require_once $file;
|
||||||
$path = BASE . $pluginThemes[$template];
|
|
||||||
}
|
|
||||||
|
|
||||||
$path .= '/config.php';
|
|
||||||
|
|
||||||
if (file_exists($path)) {
|
|
||||||
require_once $path;
|
|
||||||
} else {
|
} else {
|
||||||
echo 'Cannot find template config.php file.';
|
echo 'Cannot find template config.php file.';
|
||||||
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isset($_GET['reset_colors'])) {
|
|
||||||
foreach ($config['menu_categories'] as $id => $options) {
|
|
||||||
$color = $options['default_links_color'] ?? ($config['menu_default_links_color'] ?? ($config['menu_default_color'] ?? '#ffffff'));
|
|
||||||
Menu::where('template', $template)->where('category', $id)->update(['color' => str_replace('#', '', $color)]);
|
|
||||||
}
|
|
||||||
|
|
||||||
onTemplateMenusChange();
|
|
||||||
success('Colors has been reset at ' . date('H:i'));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (isset($_GET['reset_menus'])) {
|
|
||||||
$configMenus = config('menus');
|
|
||||||
if (isset($configMenus)) {
|
|
||||||
Plugins::installMenus($template, config('menus'), true);
|
|
||||||
|
|
||||||
onTemplateMenusChange();
|
|
||||||
success('Menus has been reset at ' . date('H:i'));
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
error("This template don't support reinstalling menus.");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$title = 'Menus - ' . $template;
|
$title = 'Menus - ' . $template;
|
||||||
|
|
||||||
$canResetColors = isset($config['menu_default_color']) || isset($config['menu_default_links_color']);
|
|
||||||
foreach ($config['menu_categories'] as $id => $options) {
|
|
||||||
if (isset($options['default_links_color'])) {
|
|
||||||
$canResetColors = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$twig->display('admin.menus.header.html.twig', [
|
|
||||||
'template' => $template,
|
|
||||||
'canResetColors' => $canResetColors
|
|
||||||
]);
|
|
||||||
?>
|
?>
|
||||||
|
<div align="center" class="text-center">
|
||||||
|
<p class="note">You are editing: <?= $template ?><br/><br/>
|
||||||
|
Hint: You can drag menu items.<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.
|
||||||
|
</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>
|
||||||
<?php
|
<?php
|
||||||
$menus = Menu::query()
|
$menus = Menu::query()
|
||||||
->select('name', 'link', 'blank', 'color', 'category', 'ordering')
|
->select('name', 'link', 'blank', 'color', 'category', 'ordering')
|
||||||
@@ -135,7 +119,7 @@ if (isset($_POST['template'])) {
|
|||||||
<form method="post" id="menus-form" action="?p=menus">
|
<form method="post" id="menus-form" action="?p=menus">
|
||||||
<?php csrf(); ?>
|
<?php csrf(); ?>
|
||||||
<input type="hidden" name="template" value="<?php echo $template ?>"/>
|
<input type="hidden" name="template" value="<?php echo $template ?>"/>
|
||||||
<button type="submit" name="save" class="btn btn-info">Save</button><br/><br/>
|
<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">
|
||||||
@@ -149,13 +133,12 @@ if (isset($_POST['template'])) {
|
|||||||
if (isset($menus[$id])) {
|
if (isset($menus[$id])) {
|
||||||
$i = 0;
|
$i = 0;
|
||||||
foreach ($menus[$id] as $menu):
|
foreach ($menus[$id] as $menu):
|
||||||
$color = (empty($menu['color']) ? ($cat['default_links_color'] ?? ($config['menu_default_links_color'] ?? ($config['menu_default_color'] ?? '#ffffff'))) : '#' . $menu['color']);
|
|
||||||
?>
|
?>
|
||||||
<li class="ui-state-default" id="list-<?php echo $id ?>-<?php echo $i ?>"><label>Name:</label> <input type="text" name="menu[<?php echo $id ?>][]" value="<?php echo escapeHtml($menu['name']); ?>"/>
|
<li class="ui-state-default" id="list-<?php echo $id ?>-<?php echo $i ?>"><label>Name:</label> <input type="text" name="menu[<?php echo $id ?>][]" value="<?php echo escapeHtml($menu['name']); ?>"/>
|
||||||
<label>Link:</label> <input type="text" name="menu_link[<?php echo $id ?>][]" value="<?php echo $menu['link'] ?>"/>
|
<label>Link:</label> <input type="text" name="menu_link[<?php echo $id ?>][]" value="<?php echo $menu['link'] ?>"/>
|
||||||
<input type="hidden" name="menu_blank[<?php echo $id ?>][]" value="0"/>
|
<input type="hidden" name="menu_blank[<?php echo $id ?>][]" value="0"/>
|
||||||
<label><input class="blank-checkbox" type="checkbox" <?php echo($menu['blank'] == 1 ? 'checked' : '') ?>/><span title="Open in New Window">New Window</span></label>
|
<label><input class="blank-checkbox" type="checkbox" <?php echo($menu['blank'] == 1 ? 'checked' : '') ?>/><span title="Open in New Window">New Window</span></label>
|
||||||
<input class="color-picker" type="text" name="menu_color[<?php echo $id ?>][]" value="<?php echo $color; ?>"/>
|
<input class="color-picker" type="text" name="menu_color[<?php echo $id ?>][]" value="<?php echo (empty($menu['color']) ? ($config['menu_default_color'] ?? '#ffffff') : $menu['color']); ?>"/>
|
||||||
<a class="remove-button" id="remove-button-<?php echo $id ?>-<?php echo $i ?>"><i class="fas fa-trash"></a></i></li>
|
<a class="remove-button" id="remove-button-<?php echo $id ?>-<?php echo $i ?>"><i class="fas fa-trash"></a></i></li>
|
||||||
<?php $i++; $last_id[$id] = $i;
|
<?php $i++; $last_id[$id] = $i;
|
||||||
endforeach;
|
endforeach;
|
||||||
@@ -168,7 +151,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" name="save" class="btn btn-info">Save</button>
|
<button type="submit" class="btn btn-info">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>';
|
||||||
?>
|
?>
|
||||||
@@ -179,19 +162,15 @@ if (isset($_POST['template'])) {
|
|||||||
$twig->display('admin.menus.js.html.twig', array(
|
$twig->display('admin.menus.js.html.twig', array(
|
||||||
'menus' => $menus,
|
'menus' => $menus,
|
||||||
'last_id' => $last_id,
|
'last_id' => $last_id,
|
||||||
|
'menu_default_color' => $config['menu_default_color'] ?? '#ffffff'
|
||||||
));
|
));
|
||||||
?>
|
?>
|
||||||
<?php
|
<?php
|
||||||
} else {
|
} else {
|
||||||
$templates = Menu::select('template')->distinct()->get()->toArray();
|
$templates = Menu::select('template')->distinct()->get()->toArray();
|
||||||
foreach ($templates as $key => $value) {
|
foreach ($templates as $key => $value) {
|
||||||
$path = TEMPLATES . $value['template'];
|
$file = TEMPLATES . $value['template'] . '/config.php';
|
||||||
|
if (!file_exists($file)) {
|
||||||
if (isset($pluginThemes[$value['template']])) {
|
|
||||||
$path = BASE . $pluginThemes[$value['template']];
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!file_exists($path . '/config.php')) {
|
|
||||||
unset($templates[$key]);
|
unset($templates[$key]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -200,11 +179,3 @@ if (isset($_POST['template'])) {
|
|||||||
'templates' => $templates
|
'templates' => $templates
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
function onTemplateMenusChange(): void
|
|
||||||
{
|
|
||||||
$cache = Cache::getInstance();
|
|
||||||
if ($cache->enabled()) {
|
|
||||||
$cache->delete('template_menus');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
@@ -7,7 +7,7 @@ defined('MYAAC') or die('Direct access not allowed!');
|
|||||||
$balance = 0;
|
$balance = 0;
|
||||||
|
|
||||||
if ($db->hasColumn('players', 'balance')) {
|
if ($db->hasColumn('players', 'balance')) {
|
||||||
$balance = Player::orderByDesc('balance')->limit(10)->get(['id', 'name', 'balance'])->toArray();
|
$balance = Player::orderByDesc('balance')->limit(10)->get(['balance', 'id','name', 'level'])->toArray();
|
||||||
}
|
}
|
||||||
|
|
||||||
$twig->display('balance.html.twig', array(
|
$twig->display('balance.html.twig', array(
|
||||||
|
@@ -6,13 +6,8 @@ defined('MYAAC') or die('Direct access not allowed!');
|
|||||||
|
|
||||||
$coins = 0;
|
$coins = 0;
|
||||||
|
|
||||||
if (HAS_ACCOUNT_COINS) {
|
if ($db->hasColumn('accounts', 'coins')) {
|
||||||
$whatToGet = ['id', 'coins'];
|
$coins = Account::orderByDesc('coins')->limit(10)->get(['coins', (USE_ACCOUNT_NAME ? 'name' : 'id')])->toArray();
|
||||||
if (USE_ACCOUNT_NAME) {
|
|
||||||
$whatToGet[] = 'name';
|
|
||||||
}
|
|
||||||
|
|
||||||
$coins = Account::orderByDesc('coins')->limit(10)->get($whatToGet)->toArray();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
$twig->display('coins.html.twig', array(
|
$twig->display('coins.html.twig', array(
|
||||||
|
@@ -7,7 +7,7 @@ defined('MYAAC') or die('Direct access not allowed!');
|
|||||||
$accounts = 0;
|
$accounts = 0;
|
||||||
|
|
||||||
if ($db->hasColumn('accounts', 'created')) {
|
if ($db->hasColumn('accounts', 'created')) {
|
||||||
$accounts = Account::orderByDesc('created')->limit(10)->get(['id', 'created'])->toArray();
|
$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(
|
||||||
|
@@ -7,7 +7,7 @@ defined('MYAAC') or die('Direct access not allowed!');
|
|||||||
$players = 0;
|
$players = 0;
|
||||||
|
|
||||||
if ($db->hasColumn('players', 'lastlogin')) {
|
if ($db->hasColumn('players', 'lastlogin')) {
|
||||||
$players = Player::orderByDesc('lastlogin')->limit(10)->get(['id', 'name', 'level', 'lastlogin'])->toArray();
|
$players = Player::orderByDesc('lastlogin')->limit(10)->get(['name', 'level', 'lastlogin'])->toArray();
|
||||||
}
|
}
|
||||||
|
|
||||||
$twig->display('lastlogin.html.twig', array(
|
$twig->display('lastlogin.html.twig', array(
|
||||||
|
@@ -19,7 +19,7 @@
|
|||||||
{% set i = i + 1 %}
|
{% set i = i + 1 %}
|
||||||
<tr>
|
<tr>
|
||||||
<th>{{ i }}</th>
|
<th>{{ i }}</th>
|
||||||
<td><a href="?p=players&id={{ result.id }}">{{ result.name }}</a></td>
|
<td><a href="?p=players&search_name={{ result.name }}">{{ result.name }}</a></td>
|
||||||
<td>{{ result.balance }}</td>
|
<td>{{ result.balance }}</td>
|
||||||
</tr>
|
</tr>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
@@ -19,7 +19,7 @@
|
|||||||
{% set i = i + 1 %}
|
{% set i = i + 1 %}
|
||||||
<tr>
|
<tr>
|
||||||
<th>{{ i }}</th>
|
<th>{{ i }}</th>
|
||||||
<td><a href="?p=accounts&id={{ result.id }}">{{ result.name ?? result.id }}</a></td>
|
<td><a href="?p=accounts&search_name={{ result.name }}">{{ result.name }}</a></td>
|
||||||
<td>{{ result.coins }}</td>
|
<td>{{ result.coins }}</td>
|
||||||
</tr>
|
</tr>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
@@ -19,7 +19,7 @@
|
|||||||
{% set i = i + 1 %}
|
{% set i = i + 1 %}
|
||||||
<tr>
|
<tr>
|
||||||
<th>{{ i }}</th>
|
<th>{{ i }}</th>
|
||||||
<td><a href="?p=accounts&id={{ result.id }}">{{ result.id }}</a></td>
|
<td><a href="?p=accounts&search_name={{ result.name }}">{{ result.name }}</a></td>
|
||||||
<td>{{ result.created|date("M d Y, H:i:s") }}</td>
|
<td>{{ result.created|date("M d Y, H:i:s") }}</td>
|
||||||
</tr>
|
</tr>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
@@ -19,7 +19,7 @@
|
|||||||
{% set i = i + 1 %}
|
{% set i = i + 1 %}
|
||||||
<tr>
|
<tr>
|
||||||
<th>{{ i }}</th>
|
<th>{{ i }}</th>
|
||||||
<td><a href="?p=players&id={{ result.id }}">{{ result.name }}</a></td>
|
<td><a href="?p=players&search_name={{ result.name }}">{{ result.name }}</a></td>
|
||||||
<td>{{ result.lastlogin|date("M d Y, H:i:s") }}</td>
|
<td>{{ result.lastlogin|date("M d Y, H:i:s") }}</td>
|
||||||
</tr>
|
</tr>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
@@ -19,7 +19,7 @@
|
|||||||
{% set i = i + 1 %}
|
{% set i = i + 1 %}
|
||||||
<tr>
|
<tr>
|
||||||
<th>{{ i }}</th>
|
<th>{{ i }}</th>
|
||||||
<td><a href="?p=accounts&id={{ result.id }}">{{ result.name }}</a></td>
|
<td><a href="?p=accounts&search_name={{ result.name }}">{{ result.name }}</a></td>
|
||||||
<td>{{ result.premium_points }}</td>
|
<td>{{ result.premium_points }}</td>
|
||||||
</tr>
|
</tr>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
@@ -26,7 +26,7 @@ if (!hasFlag(FLAG_CONTENT_PAGES) && !superAdmin()) {
|
|||||||
|
|
||||||
header('X-XSS-Protection:0');
|
header('X-XSS-Protection:0');
|
||||||
|
|
||||||
// some constants, used mainly by database (cannot be modified without schema changes)
|
// some constants, used mainly by database (cannot by modified without schema changes)
|
||||||
const NEWS_TITLE_LIMIT = 100;
|
const NEWS_TITLE_LIMIT = 100;
|
||||||
const NEWS_BODY_LIMIT = 65535; // maximum news body length
|
const NEWS_BODY_LIMIT = 65535; // maximum news body length
|
||||||
const ARTICLE_TEXT_LIMIT = 300;
|
const ARTICLE_TEXT_LIMIT = 300;
|
||||||
@@ -136,18 +136,9 @@ if($action == 'edit' || $action == 'new') {
|
|||||||
|
|
||||||
$query = $db->query('SELECT * FROM ' . $db->tableName(TABLE_PREFIX . 'news'));
|
$query = $db->query('SELECT * FROM ' . $db->tableName(TABLE_PREFIX . 'news'));
|
||||||
$newses = array();
|
$newses = array();
|
||||||
|
|
||||||
$cachePlayers = [];
|
|
||||||
foreach ($query as $_news) {
|
foreach ($query as $_news) {
|
||||||
$playerId = $_news['player_id'];
|
$_player = new OTS_Player();
|
||||||
if (isset($cachePlayers[$playerId])) {
|
$_player->load($_news['player_id']);
|
||||||
$_player = $cachePlayers[$playerId];
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
$_player = new OTS_Player();
|
|
||||||
$_player->load($playerId);
|
|
||||||
$cachePlayers[$playerId] = $_player;
|
|
||||||
}
|
|
||||||
|
|
||||||
$newses[$_news['type']][] = array(
|
$newses[$_news['type']][] = array(
|
||||||
'id' => $_news['id'],
|
'id' => $_news['id'],
|
||||||
@@ -156,7 +147,7 @@ foreach ($query as $_news) {
|
|||||||
'title' => $_news['title'],
|
'title' => $_news['title'],
|
||||||
'date' => $_news['date'],
|
'date' => $_news['date'],
|
||||||
'player_name' => $_player->isLoaded() ? $_player->getName() : '',
|
'player_name' => $_player->isLoaded() ? $_player->getName() : '',
|
||||||
'player_link' => $_player->isLoaded() ? getPlayerLink($_player, false) : '',
|
'player_link' => $_player->isLoaded() ? getPlayerLink($_player->getName(), false) : '',
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -17,17 +17,11 @@ csrfProtect();
|
|||||||
|
|
||||||
$use_datatable = true;
|
$use_datatable = true;
|
||||||
|
|
||||||
if (!setting('core.admin_plugins_manage_enable')) {
|
if (!getBoolean(setting('core.admin_plugins_manage_enable'))) {
|
||||||
warning('Plugin installation and management is disabled in Settings.<br/>If you wish to enable, go to Settings and enable <strong>Enable Plugins Manage</strong>.');
|
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>.');
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
$pluginUploadEnabled = true;
|
$twig->display('admin.plugins.form.html.twig');
|
||||||
if(!\class_exists('\ZipArchive')) {
|
|
||||||
error('Please install PHP zip extension. Plugins upload disabled until then.');
|
|
||||||
$pluginUploadEnabled = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
$twig->display('admin.plugins.form.html.twig', ['pluginUploadEnabled' => $pluginUploadEnabled]);
|
|
||||||
|
|
||||||
if (isset($_POST['uninstall'])) {
|
if (isset($_POST['uninstall'])) {
|
||||||
$uninstall = $_POST['uninstall'];
|
$uninstall = $_POST['uninstall'];
|
||||||
@@ -51,56 +45,6 @@ else {
|
|||||||
} else {
|
} else {
|
||||||
error('Error while disabling plugin ' . $disable . ': ' . Plugins::getError());
|
error('Error while disabling plugin ' . $disable . ': ' . Plugins::getError());
|
||||||
}
|
}
|
||||||
}
|
|
||||||
else if (isset($_GET['check-updates'])) {
|
|
||||||
$repoUri = $config['admin_plugins_api_uri'] ?? 'https://plugins.my-aac.org/api/';
|
|
||||||
success("Fetching latest info from $repoUri..");
|
|
||||||
|
|
||||||
$adminPlugins = new \MyAAC\Admin\Plugins();
|
|
||||||
|
|
||||||
$adminPlugins->setApiBaseUri($repoUri);
|
|
||||||
|
|
||||||
try {
|
|
||||||
$plugins = $adminPlugins->getLatestVersions();
|
|
||||||
}
|
|
||||||
catch (Exception $e) {
|
|
||||||
error($e->getMessage());
|
|
||||||
}
|
|
||||||
|
|
||||||
if (isset($plugins) && count($plugins) > 0) {
|
|
||||||
$outdated = [];
|
|
||||||
|
|
||||||
foreach (get_plugins(true) as $plugin) {
|
|
||||||
$string = file_get_contents(BASE . 'plugins/' . $plugin . '.json');
|
|
||||||
$plugin_info = json_decode($string, true);
|
|
||||||
|
|
||||||
if (!$plugin_info) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
$disabled = (str_contains($plugin, 'disabled.'));
|
|
||||||
$pluginOriginal = ($disabled ? str_replace('disabled.', '', $plugin) : $plugin);
|
|
||||||
|
|
||||||
$info = $plugins[$pluginOriginal] ?? false;
|
|
||||||
if ($info && version_compare($info['version'], $plugin_info['version'], '>')) {
|
|
||||||
$outdated[] = [
|
|
||||||
'name' => $pluginOriginal,
|
|
||||||
'yourVersion' => $plugin_info['version'],
|
|
||||||
'latestVersion' => $info['version'],
|
|
||||||
'link' => $info['link'] ?? 'Unknown',
|
|
||||||
'download_link' => $info['download_link'] ?? 'Unknown',
|
|
||||||
];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (count($outdated) > 0) {
|
|
||||||
info('Following updates have been found for your plugins:');
|
|
||||||
$twig->display('admin.plugins.outdated.html.twig', ['plugins' => $outdated]);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
success('All plugins up to date!');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if (isset($_FILES['plugin']['name'])) {
|
} else if (isset($_FILES['plugin']['name'])) {
|
||||||
$file = $_FILES['plugin'];
|
$file = $_FILES['plugin'];
|
||||||
$filename = $file['name'];
|
$filename = $file['name'];
|
||||||
|
@@ -19,7 +19,8 @@ $use_datatable = true;
|
|||||||
|
|
||||||
if (!setting('core.visitors_counter')): ?>
|
if (!setting('core.visitors_counter')): ?>
|
||||||
Visitors counter is disabled.<br/>
|
Visitors counter is disabled.<br/>
|
||||||
You can enable it in Settings -> General -> Visitors Counter.<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>
|
||||||
<?php
|
<?php
|
||||||
return;
|
return;
|
||||||
endif;
|
endif;
|
||||||
@@ -45,7 +46,7 @@ foreach ($tmp as &$visitor) {
|
|||||||
if ($dd->isBot()) {
|
if ($dd->isBot()) {
|
||||||
$bot = $dd->getBot();
|
$bot = $dd->getBot();
|
||||||
$message = '(Bot) %s, <a href="%s" target="_blank">%s</a>';
|
$message = '(Bot) %s, <a href="%s" target="_blank">%s</a>';
|
||||||
$browser = sprintf($message, $bot['category'] ?? 'Unknown', $bot['url'] ?? '', $bot['name'] ?? 'Unknown name');
|
$browser = sprintf($message, $bot['category'], $bot['url'], $bot['name']);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
$osFamily = OperatingSystem::getOsFamily($dd->getOs('name'));
|
$osFamily = OperatingSystem::getOsFamily($dd->getOs('name'));
|
||||||
|
@@ -1,5 +1,6 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
|
use MyAAC\Hooks;
|
||||||
use MyAAC\Settings;
|
use MyAAC\Settings;
|
||||||
|
|
||||||
const MYAAC_ADMIN = true;
|
const MYAAC_ADMIN = true;
|
||||||
|
46
common.php
46
common.php
@@ -26,8 +26,8 @@
|
|||||||
if (version_compare(phpversion(), '8.1', '<')) die('PHP version 8.1 or higher is required.');
|
if (version_compare(phpversion(), '8.1', '<')) die('PHP version 8.1 or higher is required.');
|
||||||
|
|
||||||
const MYAAC = true;
|
const MYAAC = true;
|
||||||
const MYAAC_VERSION = '1.8.2-dev';
|
const MYAAC_VERSION = '1.0-RC';
|
||||||
const DATABASE_VERSION = 46;
|
const DATABASE_VERSION = 40;
|
||||||
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'));
|
||||||
@@ -122,28 +122,36 @@ if (!IS_CLI) {
|
|||||||
session_start();
|
session_start();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (file_exists(BASE . 'config.local.php')) {
|
// basedir
|
||||||
require BASE . 'config.local.php';
|
$basedir = '';
|
||||||
}
|
$tmp = explode('/', $_SERVER['SCRIPT_NAME']);
|
||||||
|
$size = count($tmp) - 1;
|
||||||
|
for($i = 1; $i < $size; $i++)
|
||||||
|
$basedir .= '/' . $tmp[$i];
|
||||||
|
|
||||||
require SYSTEM . 'base.php';
|
$basedir = str_replace(['/' . ADMIN_PANEL_FOLDER, '/install', '/tools'], '', $basedir);
|
||||||
define('BASE_DIR', $baseDir);
|
define('BASE_DIR', $basedir);
|
||||||
|
|
||||||
if(!IS_CLI) {
|
if(!IS_CLI) {
|
||||||
if (isset($config['site_url'])) {
|
if (isset($_SERVER['HTTP_HOST'][0])) {
|
||||||
$hasSlashAtEnd = ($config['site_url'][strlen($config['site_url']) - 1] == '/');
|
$baseHost = $_SERVER['HTTP_HOST'];
|
||||||
|
} else {
|
||||||
define('SERVER_URL', $config['site_url']);
|
if (isset($_SERVER['SERVER_NAME'][0])) {
|
||||||
define('BASE_URL', SERVER_URL . ($hasSlashAtEnd ? '' : '/'));
|
$baseHost = $_SERVER['SERVER_NAME'];
|
||||||
define('ADMIN_URL', SERVER_URL . ($hasSlashAtEnd ? '' : '/') . ADMIN_PANEL_FOLDER . '/');
|
} else {
|
||||||
|
$baseHost = $_SERVER['SERVER_ADDR'];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else {
|
|
||||||
define('SERVER_URL', 'http' . (isHttps() ? 's' : '') . '://' . $baseHost);
|
|
||||||
define('BASE_URL', SERVER_URL . BASE_DIR . '/');
|
|
||||||
define('ADMIN_URL', SERVER_URL . BASE_DIR . '/' . ADMIN_PANEL_FOLDER . '/');
|
|
||||||
|
|
||||||
//define('CURRENT_URL', BASE_URL . $_SERVER['REQUEST_URI']);
|
define('SERVER_URL', 'http' . (isHttps() ? 's' : '') . '://' . $baseHost);
|
||||||
}
|
define('BASE_URL', SERVER_URL . BASE_DIR . '/');
|
||||||
|
define('ADMIN_URL', SERVER_URL . BASE_DIR . '/' . ADMIN_PANEL_FOLDER . '/');
|
||||||
|
|
||||||
|
//define('CURRENT_URL', BASE_URL . $_SERVER['REQUEST_URI']);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (file_exists(BASE . 'config.local.php')) {
|
||||||
|
require BASE . 'config.local.php';
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @var array $config */
|
/** @var array $config */
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"require": {
|
"require": {
|
||||||
"php": "^8.1",
|
"php": "^8.0",
|
||||||
"ext-pdo": "*",
|
"ext-pdo": "*",
|
||||||
"ext-pdo_mysql": "*",
|
"ext-pdo_mysql": "*",
|
||||||
"ext-json": "*",
|
"ext-json": "*",
|
||||||
@@ -8,7 +8,7 @@
|
|||||||
"ext-dom": "*",
|
"ext-dom": "*",
|
||||||
"phpmailer/phpmailer": "^6.1",
|
"phpmailer/phpmailer": "^6.1",
|
||||||
"composer/semver": "^3.2",
|
"composer/semver": "^3.2",
|
||||||
"twig/twig": "^3.11",
|
"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",
|
||||||
@@ -18,8 +18,7 @@
|
|||||||
"symfony/string": "^6.4",
|
"symfony/string": "^6.4",
|
||||||
"symfony/var-dumper": "^6.4",
|
"symfony/var-dumper": "^6.4",
|
||||||
"filp/whoops": "^2.15",
|
"filp/whoops": "^2.15",
|
||||||
"maximebf/debugbar": "1.*",
|
"maximebf/debugbar": "dev-master"
|
||||||
"guzzlehttp/guzzle": "7.9.3"
|
|
||||||
},
|
},
|
||||||
"require-dev": {
|
"require-dev": {
|
||||||
"phpstan/phpstan": "^1.10"
|
"phpstan/phpstan": "^1.10"
|
||||||
|
1141
composer.lock
generated
1141
composer.lock
generated
File diff suppressed because it is too large
Load Diff
@@ -17,7 +17,7 @@ describe('Check Public Pages', () => {
|
|||||||
|
|
||||||
it('Go to changelog page', () => {
|
it('Go to changelog page', () => {
|
||||||
cy.visit({
|
cy.visit({
|
||||||
url: Cypress.env('URL') + '/change-log',
|
url: Cypress.env('URL') + '/changelog',
|
||||||
method: 'GET',
|
method: 'GET',
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
@@ -116,9 +116,9 @@ describe('Check Public Pages', () => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
// library
|
// library
|
||||||
it('Go to monsters page', () => {
|
it('Go to creatures page', () => {
|
||||||
cy.visit({
|
cy.visit({
|
||||||
url: Cypress.env('URL') + '/monsters',
|
url: Cypress.env('URL') + '/creatures',
|
||||||
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') + '/ots-info',
|
url: Cypress.env('URL') + '/server-info',
|
||||||
method: 'GET',
|
method: 'GET',
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
@@ -4,7 +4,7 @@ const YOU_ARE_NOT_LOGGEDIN = 'You are not logged in.';
|
|||||||
describe('Check Protected Pages', () => {
|
describe('Check Protected Pages', () => {
|
||||||
|
|
||||||
// character actions
|
// character actions
|
||||||
it('Go to account character creation page', () => {
|
it('Go to accouht character creation page', () => {
|
||||||
cy.visit({
|
cy.visit({
|
||||||
url: Cypress.env('URL') + '/account/character/create',
|
url: Cypress.env('URL') + '/account/character/create',
|
||||||
method: 'GET',
|
method: 'GET',
|
||||||
@@ -12,7 +12,7 @@ describe('Check Protected Pages', () => {
|
|||||||
cy.contains(REQUIRED_LOGIN_MESSAGE)
|
cy.contains(REQUIRED_LOGIN_MESSAGE)
|
||||||
})
|
})
|
||||||
|
|
||||||
it('Go to account character deletion page', () => {
|
it('Go to accouht character deletion page', () => {
|
||||||
cy.visit({
|
cy.visit({
|
||||||
url: Cypress.env('URL') + '/account/character/delete',
|
url: Cypress.env('URL') + '/account/character/delete',
|
||||||
method: 'GET',
|
method: 'GET',
|
||||||
@@ -21,7 +21,7 @@ describe('Check Protected Pages', () => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
// account actions
|
// account actions
|
||||||
it('Go to account email change page', () => {
|
it('Go to accouht email change page', () => {
|
||||||
cy.visit({
|
cy.visit({
|
||||||
url: Cypress.env('URL') + '/account/email',
|
url: Cypress.env('URL') + '/account/email',
|
||||||
method: 'GET',
|
method: 'GET',
|
||||||
@@ -29,7 +29,7 @@ describe('Check Protected Pages', () => {
|
|||||||
cy.contains(REQUIRED_LOGIN_MESSAGE)
|
cy.contains(REQUIRED_LOGIN_MESSAGE)
|
||||||
})
|
})
|
||||||
|
|
||||||
it('Go to account password change page', () => {
|
it('Go to accouht password change page', () => {
|
||||||
cy.visit({
|
cy.visit({
|
||||||
url: Cypress.env('URL') + '/account/password',
|
url: Cypress.env('URL') + '/account/password',
|
||||||
method: 'GET',
|
method: 'GET',
|
||||||
@@ -37,7 +37,7 @@ describe('Check Protected Pages', () => {
|
|||||||
cy.contains(REQUIRED_LOGIN_MESSAGE)
|
cy.contains(REQUIRED_LOGIN_MESSAGE)
|
||||||
})
|
})
|
||||||
|
|
||||||
it('Go to account info change page', () => {
|
it('Go to accouht info change page', () => {
|
||||||
cy.visit({
|
cy.visit({
|
||||||
url: Cypress.env('URL') + '/account/info',
|
url: Cypress.env('URL') + '/account/info',
|
||||||
method: 'GET',
|
method: 'GET',
|
||||||
@@ -45,7 +45,7 @@ describe('Check Protected Pages', () => {
|
|||||||
cy.contains(REQUIRED_LOGIN_MESSAGE)
|
cy.contains(REQUIRED_LOGIN_MESSAGE)
|
||||||
})
|
})
|
||||||
|
|
||||||
it('Go to account logout change page', () => {
|
it('Go to accouht logout change page', () => {
|
||||||
cy.visit({
|
cy.visit({
|
||||||
url: Cypress.env('URL') + '/account/logout',
|
url: Cypress.env('URL') + '/account/logout',
|
||||||
method: 'GET',
|
method: 'GET',
|
||||||
|
Binary file not shown.
Before Width: | Height: | Size: 56 B |
Binary file not shown.
Before Width: | Height: | Size: 56 B |
36
index.php
36
index.php
@@ -31,11 +31,11 @@ require_once 'common.php';
|
|||||||
require_once SYSTEM . 'functions.php';
|
require_once SYSTEM . 'functions.php';
|
||||||
|
|
||||||
$uri = $_SERVER['REQUEST_URI'];
|
$uri = $_SERVER['REQUEST_URI'];
|
||||||
if(str_contains($uri, 'index.php')) {
|
if(false !== strpos($uri, 'index.php')) {
|
||||||
$uri = str_replace_first('/index.php', '', $uri);
|
$uri = str_replace_first('/index.php', '', $uri);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(str_starts_with($uri, '/')) {
|
if(0 === strpos($uri, '/')) {
|
||||||
$uri = str_replace_first('/', '', $uri);
|
$uri = str_replace_first('/', '', $uri);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -76,8 +76,6 @@ require_once SYSTEM . 'status.php';
|
|||||||
$twig->addGlobal('config', $config);
|
$twig->addGlobal('config', $config);
|
||||||
$twig->addGlobal('status', $status);
|
$twig->addGlobal('status', $status);
|
||||||
|
|
||||||
$hooks->trigger(HOOK_STARTUP);
|
|
||||||
|
|
||||||
// backward support for gesior
|
// backward support for gesior
|
||||||
if(setting('core.backward_support')) {
|
if(setting('core.backward_support')) {
|
||||||
define('INITIALIZED', true);
|
define('INITIALIZED', true);
|
||||||
@@ -93,7 +91,6 @@ if(setting('core.backward_support')) {
|
|||||||
if($logged && $account_logged)
|
if($logged && $account_logged)
|
||||||
$group_id_of_acc_logged = $account_logged->getGroupId();
|
$group_id_of_acc_logged = $account_logged->getGroupId();
|
||||||
|
|
||||||
$config['serverPath'] = $config['server_path'];
|
|
||||||
$config['site'] = &$config;
|
$config['site'] = &$config;
|
||||||
$config['server'] = &$config['lua'];
|
$config['server'] = &$config['lua'];
|
||||||
$config['site']['shop_system'] = setting('core.gifts_system');
|
$config['site']['shop_system'] = setting('core.gifts_system');
|
||||||
@@ -118,16 +115,10 @@ if(setting('core.backward_support')) {
|
|||||||
$config['status']['serverStatus_' . $key] = $value;
|
$config['status']['serverStatus_' . $key] = $value;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(setting('core.views_counter')) {
|
|
||||||
require_once SYSTEM . 'counter.php';
|
|
||||||
}
|
|
||||||
|
|
||||||
if(setting('core.visitors_counter')) {
|
|
||||||
$visitors = new Visitors(setting('core.visitors_counter_ttl'));
|
|
||||||
}
|
|
||||||
|
|
||||||
require_once SYSTEM . 'router.php';
|
require_once SYSTEM . 'router.php';
|
||||||
|
|
||||||
|
$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(setting('core.anonymous_usage_statistics')) {
|
||||||
@@ -143,7 +134,7 @@ if(setting('core.anonymous_usage_statistics')) {
|
|||||||
if(fetchDatabaseConfig('last_usage_report', $value)) {
|
if(fetchDatabaseConfig('last_usage_report', $value)) {
|
||||||
$should_report = time() > (int)$value + $report_time;
|
$should_report = time() > (int)$value + $report_time;
|
||||||
if($cache->enabled()) {
|
if($cache->enabled()) {
|
||||||
$cache->set('last_usage_report', $value, 60 * 60);
|
$cache->set('last_usage_report', $value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@@ -157,11 +148,26 @@ if(setting('core.anonymous_usage_statistics')) {
|
|||||||
|
|
||||||
updateDatabaseConfig('last_usage_report', time());
|
updateDatabaseConfig('last_usage_report', time());
|
||||||
if($cache->enabled()) {
|
if($cache->enabled()) {
|
||||||
$cache->set('last_usage_report', time(), 60 * 60);
|
$cache->set('last_usage_report', time());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(setting('core.views_counter'))
|
||||||
|
require_once SYSTEM . 'counter.php';
|
||||||
|
|
||||||
|
if(setting('core.visitors_counter')) {
|
||||||
|
$visitors = new Visitors(setting('core.visitors_counter_ttl'));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var OTS_Account $account_logged
|
||||||
|
*/
|
||||||
|
if ($logged && admin()) {
|
||||||
|
$content .= $twig->render('admin-bar.html.twig', [
|
||||||
|
'username' => USE_ACCOUNT_NAME ? $account_logged->getName() : $account_logged->getId()
|
||||||
|
]);
|
||||||
|
}
|
||||||
$title_full = (isset($title) ? $title . ' - ' : '') . $config['lua']['serverName'];
|
$title_full = (isset($title) ? $title . ' - ' : '') . $config['lua']['serverName'];
|
||||||
require $template_path . '/' . $template_index;
|
require $template_path . '/' . $template_index;
|
||||||
|
|
||||||
|
@@ -26,9 +26,6 @@ if(!isset($error) || !$error) {
|
|||||||
$config['database_type'] = $config['lua']['database_type'];
|
$config['database_type'] = $config['lua']['database_type'];
|
||||||
else if(isset($config['lua']['sql_type'])) // otserv
|
else if(isset($config['lua']['sql_type'])) // otserv
|
||||||
$config['database_type'] = $config['lua']['sql_type'];
|
$config['database_type'] = $config['lua']['sql_type'];
|
||||||
else {
|
|
||||||
$config['database_type'] = '';
|
|
||||||
}
|
|
||||||
|
|
||||||
$config['database_type'] = strtolower($config['database_type']);
|
$config['database_type'] = strtolower($config['database_type']);
|
||||||
if(empty($config['database_type'])) {
|
if(empty($config['database_type'])) {
|
||||||
|
@@ -1,82 +1,88 @@
|
|||||||
SET @myaac_database_version = 45;
|
SET @myaac_database_version = 40;
|
||||||
|
|
||||||
CREATE TABLE `myaac_account_actions`
|
CREATE TABLE `myaac_account_actions`
|
||||||
(
|
(
|
||||||
`account_id` int NOT NULL,
|
`account_id` INT(11) NOT NULL,
|
||||||
`ip` int unsigned NOT NULL DEFAULT 0,
|
`ip` INT(10) UNSIGNED NOT NULL DEFAULT 0,
|
||||||
`ipv6` binary(16) NOT NULL DEFAULT 0,
|
`ipv6` BINARY(16) NOT NULL DEFAULT 0,
|
||||||
`date` int NOT NULL DEFAULT 0,
|
`date` INT(11) NOT NULL DEFAULT 0,
|
||||||
`action` varchar(255) NOT NULL DEFAULT '',
|
`action` VARCHAR(255) NOT NULL DEFAULT '',
|
||||||
KEY (`account_id`)
|
KEY (`account_id`)
|
||||||
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8mb4;
|
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8;
|
||||||
|
|
||||||
CREATE TABLE `myaac_account_email_codes`
|
|
||||||
(
|
|
||||||
`id` int(11) NOT NULL AUTO_INCREMENT,
|
|
||||||
`account_id` int NOT NULL,
|
|
||||||
`code` varchar(6) NOT NULL,
|
|
||||||
`created_at` int NOT NULL,
|
|
||||||
PRIMARY KEY (`id`)
|
|
||||||
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8mb4;
|
|
||||||
|
|
||||||
CREATE TABLE `myaac_admin_menu`
|
CREATE TABLE `myaac_admin_menu`
|
||||||
(
|
(
|
||||||
`id` int NOT NULL AUTO_INCREMENT,
|
`id` INT(11) NOT NULL AUTO_INCREMENT,
|
||||||
`name` varchar(255) NOT NULL DEFAULT '',
|
`name` VARCHAR(255) NOT NULL DEFAULT '',
|
||||||
`page` varchar(255) NOT NULL DEFAULT '',
|
`page` VARCHAR(255) NOT NULL DEFAULT '',
|
||||||
`ordering` int NOT NULL DEFAULT 0,
|
`ordering` INT(11) NOT NULL DEFAULT 0,
|
||||||
`flags` int NOT NULL DEFAULT 0,
|
`flags` INT(11) NOT NULL DEFAULT 0,
|
||||||
`enabled` int NOT NULL DEFAULT 1,
|
`enabled` INT(1) NOT NULL DEFAULT 1,
|
||||||
PRIMARY KEY (`id`)
|
PRIMARY KEY (`id`)
|
||||||
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8mb4;
|
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8;
|
||||||
|
|
||||||
|
CREATE TABLE `myaac_bugtracker`
|
||||||
|
(
|
||||||
|
`account` VARCHAR(255) NOT NULL,
|
||||||
|
`type` INT(11) NOT NULL DEFAULT 0,
|
||||||
|
`status` INT(11) NOT NULL DEFAULT 0,
|
||||||
|
`text` text NOT NULL,
|
||||||
|
`id` INT(11) NOT NULL DEFAULT 0,
|
||||||
|
`subject` VARCHAR(255) NOT NULL DEFAULT '',
|
||||||
|
`reply` INT(11) NOT NULL DEFAULT 0,
|
||||||
|
`who` INT(11) NOT NULL DEFAULT 0,
|
||||||
|
`uid` INT(11) NOT NULL AUTO_INCREMENT,
|
||||||
|
`tag` INT(11) NOT NULL DEFAULT 0,
|
||||||
|
PRIMARY KEY (`uid`)
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8;
|
||||||
|
|
||||||
CREATE TABLE `myaac_changelog`
|
CREATE TABLE `myaac_changelog`
|
||||||
(
|
(
|
||||||
`id` int NOT NULL AUTO_INCREMENT,
|
`id` INT(11) NOT NULL AUTO_INCREMENT,
|
||||||
`body` varchar(500) NOT NULL DEFAULT '',
|
`body` VARCHAR(500) NOT NULL DEFAULT '',
|
||||||
`type` tinyint NOT NULL DEFAULT 0 COMMENT '1 - added, 2 - removed, 3 - changed, 4 - fixed',
|
`type` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '1 - added, 2 - removed, 3 - changed, 4 - fixed',
|
||||||
`where` tinyint NOT NULL DEFAULT 0 COMMENT '1 - server, 2 - site',
|
`where` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '1 - server, 2 - site',
|
||||||
`date` int NOT NULL DEFAULT 0,
|
`date` INT(11) NOT NULL DEFAULT 0,
|
||||||
`player_id` int NOT NULL DEFAULT 0,
|
`player_id` INT(11) NOT NULL DEFAULT 0,
|
||||||
`hide` tinyint NOT NULL DEFAULT 0,
|
`hide` TINYINT(1) NOT NULL DEFAULT 0,
|
||||||
PRIMARY KEY (`id`)
|
PRIMARY KEY (`id`)
|
||||||
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8mb4;
|
) 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`, `hide`) VALUES (1, 3, 2, UNIX_TIMESTAMP(), 'MyAAC installed. (:', 0);
|
||||||
|
|
||||||
CREATE TABLE `myaac_config`
|
CREATE TABLE `myaac_config`
|
||||||
(
|
(
|
||||||
`id` int NOT NULL AUTO_INCREMENT,
|
`id` INT(11) NOT NULL AUTO_INCREMENT,
|
||||||
`name` varchar(30) NOT NULL,
|
`name` VARCHAR(30) NOT NULL,
|
||||||
`value` varchar(1000) NOT NULL,
|
`value` VARCHAR(1000) NOT NULL,
|
||||||
PRIMARY KEY (`id`),
|
PRIMARY KEY (`id`),
|
||||||
UNIQUE (`name`)
|
UNIQUE (`name`)
|
||||||
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8mb4;
|
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8;
|
||||||
|
|
||||||
INSERT INTO `myaac_config` (`name`, `value`) VALUES ('database_version', @myaac_database_version);
|
INSERT INTO `myaac_config` (`name`, `value`) VALUES ('database_version', @myaac_database_version);
|
||||||
|
|
||||||
CREATE TABLE `myaac_faq`
|
CREATE TABLE `myaac_faq`
|
||||||
(
|
(
|
||||||
`id` int NOT NULL AUTO_INCREMENT,
|
`id` INT(11) NOT NULL AUTO_INCREMENT,
|
||||||
`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 NOT NULL DEFAULT 0,
|
`ordering` INT(11) NOT NULL DEFAULT 0,
|
||||||
`hide` tinyint NOT NULL DEFAULT 0,
|
`hide` TINYINT(1) NOT NULL DEFAULT 0,
|
||||||
PRIMARY KEY (`id`)
|
PRIMARY KEY (`id`)
|
||||||
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8mb4;
|
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8;
|
||||||
|
|
||||||
CREATE TABLE `myaac_forum_boards`
|
CREATE TABLE `myaac_forum_boards`
|
||||||
(
|
(
|
||||||
`id` int NOT NULL AUTO_INCREMENT,
|
`id` INT(11) NOT NULL AUTO_INCREMENT,
|
||||||
`name` varchar(32) NOT NULL,
|
`name` VARCHAR(32) NOT NULL,
|
||||||
`description` varchar(255) NOT NULL DEFAULT '',
|
`description` VARCHAR(255) NOT NULL DEFAULT '',
|
||||||
`ordering` int NOT NULL DEFAULT 0,
|
`ordering` INT(11) NOT NULL DEFAULT 0,
|
||||||
`guild` int NOT NULL DEFAULT 0,
|
`guild` INT(11) NOT NULL DEFAULT 0,
|
||||||
`access` int NOT NULL DEFAULT 0,
|
`access` INT(11) NOT NULL DEFAULT 0,
|
||||||
`closed` tinyint NOT NULL DEFAULT 0,
|
`closed` TINYINT(1) NOT NULL DEFAULT 0,
|
||||||
`hide` tinyint NOT NULL DEFAULT 0,
|
`hide` TINYINT(1) NOT NULL DEFAULT 0,
|
||||||
PRIMARY KEY (`id`)
|
PRIMARY KEY (`id`)
|
||||||
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8mb4;
|
) 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);
|
||||||
INSERT INTO `myaac_forum_boards` (`id`, `name`, `description`, `ordering`) VALUES (NULL, 'Trade', 'Trade offers.', 1);
|
INSERT INTO `myaac_forum_boards` (`id`, `name`, `description`, `ordering`) VALUES (NULL, 'Trade', 'Trade offers.', 1);
|
||||||
INSERT INTO `myaac_forum_boards` (`id`, `name`, `description`, `ordering`) VALUES (NULL, 'Quests', 'Quest making.', 2);
|
INSERT INTO `myaac_forum_boards` (`id`, `name`, `description`, `ordering`) VALUES (NULL, 'Quests', 'Quest making.', 2);
|
||||||
@@ -85,102 +91,102 @@ INSERT INTO `myaac_forum_boards` (`id`, `name`, `description`, `ordering`) VALUE
|
|||||||
|
|
||||||
CREATE TABLE `myaac_forum`
|
CREATE TABLE `myaac_forum`
|
||||||
(
|
(
|
||||||
`id` int NOT NULL AUTO_INCREMENT,
|
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||||
`first_post` int NOT NULL DEFAULT 0,
|
`first_post` int(11) NOT NULL default '0',
|
||||||
`last_post` int NOT NULL DEFAULT 0,
|
`last_post` int(11) NOT NULL default '0',
|
||||||
`section` int NOT NULL DEFAULT 0,
|
`section` int(3) NOT NULL default '0',
|
||||||
`replies` int NOT NULL DEFAULT 0,
|
`replies` int(20) NOT NULL default '0',
|
||||||
`views` int NOT NULL DEFAULT 0,
|
`views` int(20) NOT NULL default '0',
|
||||||
`author_aid` int NOT NULL DEFAULT 0,
|
`author_aid` int(20) NOT NULL default '0',
|
||||||
`author_guid` int NOT NULL DEFAULT 0,
|
`author_guid` int(20) NOT NULL default '0',
|
||||||
`post_text` text NOT NULL,
|
`post_text` text NOT NULL,
|
||||||
`post_topic` varchar(255) NOT NULL DEFAULT '',
|
`post_topic` varchar(255) NOT NULL DEFAULT '',
|
||||||
`post_smile` tinyint NOT NULL DEFAULT 0,
|
`post_smile` tinyint(1) NOT NULL default '0',
|
||||||
`post_html` tinyint NOT NULL DEFAULT 0,
|
`post_html` tinyint(1) NOT NULL default '0',
|
||||||
`post_date` int NOT NULL DEFAULT 0,
|
`post_date` int(20) NOT NULL default '0',
|
||||||
`last_edit_aid` int NOT NULL DEFAULT 0,
|
`last_edit_aid` int(20) NOT NULL default '0',
|
||||||
`edit_date` int NOT NULL DEFAULT 0,
|
`edit_date` int(20) NOT NULL default '0',
|
||||||
`post_ip` varchar(45) NOT NULL DEFAULT '0.0.0.0',
|
`post_ip` varchar(32) NOT NULL default '0.0.0.0',
|
||||||
`sticked` tinyint NOT NULL DEFAULT 0,
|
`sticked` tinyint(1) NOT NULL DEFAULT '0',
|
||||||
`closed` tinyint NOT NULL DEFAULT 0,
|
`closed` tinyint(1) NOT NULL DEFAULT '0',
|
||||||
PRIMARY KEY (`id`),
|
PRIMARY KEY (`id`),
|
||||||
KEY `section` (`section`)
|
KEY `section` (`section`)
|
||||||
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8mb4;
|
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8;
|
||||||
|
|
||||||
CREATE TABLE `myaac_menu`
|
CREATE TABLE `myaac_menu`
|
||||||
(
|
(
|
||||||
`id` int NOT NULL AUTO_INCREMENT,
|
`id` INT(11) NOT NULL AUTO_INCREMENT,
|
||||||
`template` varchar(255) NOT NULL,
|
`template` VARCHAR(255) NOT NULL,
|
||||||
`name` varchar(255) NOT NULL,
|
`name` VARCHAR(255) NOT NULL,
|
||||||
`link` varchar(255) NOT NULL,
|
`link` VARCHAR(255) NOT NULL,
|
||||||
`blank` tinyint NOT NULL DEFAULT 0,
|
`blank` TINYINT(1) NOT NULL DEFAULT 0,
|
||||||
`color` varchar(6) NOT NULL DEFAULT '',
|
`color` VARCHAR(6) NOT NULL DEFAULT '',
|
||||||
`category` int NOT NULL DEFAULT 1,
|
`category` INT(11) NOT NULL DEFAULT 1,
|
||||||
`ordering` int NOT NULL DEFAULT 0,
|
`ordering` INT(11) NOT NULL DEFAULT 0,
|
||||||
`enabled` int NOT NULL DEFAULT 1,
|
`enabled` INT(1) NOT NULL DEFAULT 1,
|
||||||
PRIMARY KEY (`id`)
|
PRIMARY KEY (`id`)
|
||||||
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8mb4;
|
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8;
|
||||||
|
|
||||||
CREATE TABLE `myaac_monsters` (
|
CREATE TABLE `myaac_monsters` (
|
||||||
`id` int NOT NULL AUTO_INCREMENT,
|
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||||
`hide` tinyint NOT NULL DEFAULT 0,
|
`hide` tinyint(1) NOT NULL default 0,
|
||||||
`name` varchar(255) NOT NULL,
|
`name` varchar(255) NOT NULL,
|
||||||
`mana` int NOT NULL DEFAULT 0,
|
`mana` int(11) NOT NULL DEFAULT 0,
|
||||||
`exp` int NOT NULL,
|
`exp` int(11) NOT NULL,
|
||||||
`health` int NOT NULL,
|
`health` int(11) NOT NULL,
|
||||||
`look` varchar(255) NOT NULL DEFAULT '',
|
`look` VARCHAR(255) NOT NULL DEFAULT '',
|
||||||
`speed_lvl` int NOT NULL DEFAULT 1,
|
`speed_lvl` int(11) NOT NULL default 1,
|
||||||
`use_haste` tinyint NOT NULL,
|
`use_haste` tinyint(1) NOT NULL,
|
||||||
`voices` text NOT NULL,
|
`voices` text NOT NULL,
|
||||||
`immunities` varchar(255) NOT NULL,
|
`immunities` varchar(255) NOT NULL,
|
||||||
`elements` text NOT NULL,
|
`elements` TEXT NOT NULL,
|
||||||
`summonable` tinyint NOT NULL,
|
`summonable` tinyint(1) NOT NULL,
|
||||||
`convinceable` tinyint NOT NULL,
|
`convinceable` tinyint(1) NOT NULL,
|
||||||
`pushable` tinyint NOT NULL DEFAULT 0,
|
`pushable` TINYINT(1) NOT NULL DEFAULT '0',
|
||||||
`canpushitems` tinyint NOT NULL DEFAULT 0,
|
`canpushitems` TINYINT(1) NOT NULL DEFAULT '0',
|
||||||
`canwalkonenergy` tinyint NOT NULL DEFAULT 0,
|
`canwalkonenergy` TINYINT(1) NOT NULL DEFAULT '0',
|
||||||
`canwalkonpoison` tinyint NOT NULL DEFAULT 0,
|
`canwalkonpoison` TINYINT(1) NOT NULL DEFAULT '0',
|
||||||
`canwalkonfire` tinyint NOT NULL DEFAULT 0,
|
`canwalkonfire` TINYINT(1) NOT NULL DEFAULT '0',
|
||||||
`runonhealth` tinyint NOT NULL DEFAULT 0,
|
`runonhealth` TINYINT(1) NOT NULL DEFAULT '0',
|
||||||
`hostile` tinyint NOT NULL DEFAULT 0,
|
`hostile` TINYINT(1) NOT NULL DEFAULT '0',
|
||||||
`attackable` tinyint NOT NULL DEFAULT 0,
|
`attackable` TINYINT(1) NOT NULL DEFAULT '0',
|
||||||
`rewardboss` tinyint NOT NULL DEFAULT 0,
|
`rewardboss` TINYINT(1) NOT NULL DEFAULT '0',
|
||||||
`defense` int NOT NULL DEFAULT 0,
|
`defense` INT(11) NOT NULL DEFAULT '0',
|
||||||
`armor` int NOT NULL DEFAULT 0,
|
`armor` INT(11) NOT NULL DEFAULT '0',
|
||||||
`canpushcreatures` tinyint NOT NULL DEFAULT 0,
|
`canpushcreatures` TINYINT(1) NOT NULL DEFAULT '0',
|
||||||
`race` varchar(255) NOT NULL,
|
`race` varchar(255) NOT NULL,
|
||||||
`loot` text NOT NULL,
|
`loot` text NOT NULL,
|
||||||
`summons` text NOT NULL,
|
`summons` TEXT NOT NULL,
|
||||||
PRIMARY KEY (`id`)
|
PRIMARY KEY (`id`)
|
||||||
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8mb4;
|
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8;
|
||||||
|
|
||||||
CREATE TABLE `myaac_news`
|
CREATE TABLE `myaac_news`
|
||||||
(
|
(
|
||||||
`id` int NOT NULL AUTO_INCREMENT,
|
`id` INT(11) NOT NULL AUTO_INCREMENT,
|
||||||
`title` varchar(100) NOT NULL,
|
`title` VARCHAR(100) NOT NULL,
|
||||||
`body` text NOT NULL,
|
`body` TEXT NOT NULL,
|
||||||
`type` tinyint NOT NULL DEFAULT 0 COMMENT '1 - news, 2 - ticker, 3 - article',
|
`type` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '1 - news, 2 - ticker, 3 - article',
|
||||||
`date` int NOT NULL DEFAULT 0,
|
`date` INT(11) NOT NULL DEFAULT 0,
|
||||||
`category` tinyint NOT NULL DEFAULT 0,
|
`category` TINYINT(1) NOT NULL DEFAULT 0,
|
||||||
`player_id` int NOT NULL DEFAULT 0,
|
`player_id` INT(11) NOT NULL DEFAULT 0,
|
||||||
`last_modified_by` int NOT NULL DEFAULT 0,
|
`last_modified_by` INT(11) NOT NULL DEFAULT 0,
|
||||||
`last_modified_date` int NOT NULL DEFAULT 0,
|
`last_modified_date` INT(11) NOT NULL DEFAULT 0,
|
||||||
`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 NOT NULL DEFAULT 0,
|
`hide` TINYINT(1) NOT NULL DEFAULT 0,
|
||||||
PRIMARY KEY (`id`)
|
PRIMARY KEY (`id`)
|
||||||
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8mb4;
|
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8;
|
||||||
|
|
||||||
CREATE TABLE `myaac_news_categories`
|
CREATE TABLE `myaac_news_categories`
|
||||||
(
|
(
|
||||||
`id` int NOT NULL AUTO_INCREMENT,
|
`id` INT(11) NOT NULL AUTO_INCREMENT,
|
||||||
`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 NOT NULL DEFAULT 0,
|
`icon_id` INT(2) NOT NULL DEFAULT 0,
|
||||||
`hide` tinyint NOT NULL DEFAULT 0,
|
`hide` TINYINT(1) NOT NULL DEFAULT 0,
|
||||||
PRIMARY KEY (`id`)
|
PRIMARY KEY (`id`)
|
||||||
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8mb4;
|
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8;
|
||||||
|
|
||||||
INSERT INTO `myaac_news_categories` (`id`, `icon_id`) VALUES (NULL, 0);
|
INSERT INTO `myaac_news_categories` (`id`, `icon_id`) VALUES (NULL, 0);
|
||||||
INSERT INTO `myaac_news_categories` (`id`, `icon_id`) VALUES (NULL, 1);
|
INSERT INTO `myaac_news_categories` (`id`, `icon_id`) VALUES (NULL, 1);
|
||||||
@@ -190,91 +196,91 @@ INSERT INTO `myaac_news_categories` (`id`, `icon_id`) VALUES (NULL, 4);
|
|||||||
|
|
||||||
CREATE TABLE `myaac_notepad`
|
CREATE TABLE `myaac_notepad`
|
||||||
(
|
(
|
||||||
`id` int NOT NULL AUTO_INCREMENT,
|
`id` INT(11) NOT NULL AUTO_INCREMENT,
|
||||||
`account_id` int NOT NULL,
|
`account_id` INT(11) NOT NULL,
|
||||||
/*`name` varchar(30) NOT NULL,*/
|
/*`name` VARCHAR(30) NOT NULL,*/
|
||||||
`content` text NOT NULL,
|
`content` TEXT NOT NULL,
|
||||||
/*`public` tinyint NOT NULL DEFAULT 0*/
|
/*`public` TINYINT(1) NOT NULL DEFAULT 0*/
|
||||||
PRIMARY KEY (`id`)
|
PRIMARY KEY (`id`)
|
||||||
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8mb4;
|
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8;
|
||||||
|
|
||||||
CREATE TABLE `myaac_pages`
|
CREATE TABLE `myaac_pages`
|
||||||
(
|
(
|
||||||
`id` INT NOT NULL AUTO_INCREMENT,
|
`id` INT NOT NULL AUTO_INCREMENT,
|
||||||
`name` varchar(30) NOT NULL,
|
`name` VARCHAR(30) NOT NULL,
|
||||||
`title` varchar(30) NOT NULL,
|
`title` VARCHAR(30) NOT NULL,
|
||||||
`body` text NOT NULL,
|
`body` TEXT NOT NULL,
|
||||||
`date` int NOT NULL DEFAULT 0,
|
`date` INT(11) NOT NULL DEFAULT 0,
|
||||||
`player_id` int NOT NULL DEFAULT 0,
|
`player_id` INT(11) NOT NULL DEFAULT 0,
|
||||||
`php` tinyint 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 NOT NULL DEFAULT 1 COMMENT '1 - enabled, 0 - disabled',
|
`enable_tinymce` TINYINT(1) NOT NULL DEFAULT 1 COMMENT '1 - enabled, 0 - disabled',
|
||||||
`access` tinyint NOT NULL DEFAULT 0,
|
`access` TINYINT(2) NOT NULL DEFAULT 0,
|
||||||
`hide` tinyint NOT NULL DEFAULT 0,
|
`hide` TINYINT(1) NOT NULL DEFAULT 0,
|
||||||
PRIMARY KEY (`id`),
|
PRIMARY KEY (`id`),
|
||||||
UNIQUE (`name`)
|
UNIQUE (`name`)
|
||||||
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8mb4;
|
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8;
|
||||||
|
|
||||||
CREATE TABLE `myaac_gallery`
|
CREATE TABLE `myaac_gallery`
|
||||||
(
|
(
|
||||||
`id` int NOT NULL AUTO_INCREMENT,
|
`id` INT(11) NOT NULL AUTO_INCREMENT,
|
||||||
`comment` varchar(255) NOT NULL DEFAULT '',
|
`comment` VARCHAR(255) NOT NULL DEFAULT '',
|
||||||
`image` varchar(255) NOT NULL,
|
`image` VARCHAR(255) NOT NULL,
|
||||||
`thumb` varchar(255) NOT NULL,
|
`thumb` VARCHAR(255) NOT NULL,
|
||||||
`author` varchar(50) NOT NULL DEFAULT '',
|
`author` VARCHAR(50) NOT NULL DEFAULT '',
|
||||||
`ordering` int NOT NULL DEFAULT 0,
|
`ordering` INT(11) NOT NULL DEFAULT 0,
|
||||||
`hide` tinyint NOT NULL DEFAULT 0,
|
`hide` TINYINT(1) NOT NULL DEFAULT 0,
|
||||||
PRIMARY KEY (`id`)
|
PRIMARY KEY (`id`)
|
||||||
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8mb4;
|
) 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`
|
CREATE TABLE `myaac_settings`
|
||||||
(
|
(
|
||||||
`id` int NOT NULL AUTO_INCREMENT,
|
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||||
`name` varchar(255) NOT NULL DEFAULT '',
|
`name` VARCHAR(255) NOT NULL DEFAULT '',
|
||||||
`key` varchar(255) NOT NULL DEFAULT '',
|
`key` VARCHAR(255) NOT NULL DEFAULT '',
|
||||||
`value` text NOT NULL,
|
`value` TEXT NOT NULL,
|
||||||
PRIMARY KEY (`id`),
|
PRIMARY KEY (`id`),
|
||||||
KEY `key` (`key`)
|
KEY `key` (`key`)
|
||||||
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8mb4;
|
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8;
|
||||||
|
|
||||||
CREATE TABLE `myaac_spells`
|
CREATE TABLE `myaac_spells`
|
||||||
(
|
(
|
||||||
`id` int NOT NULL AUTO_INCREMENT,
|
`id` INT(11) NOT NULL AUTO_INCREMENT,
|
||||||
`spell` varchar(255) NOT NULL DEFAULT '',
|
`spell` VARCHAR(255) NOT NULL DEFAULT '',
|
||||||
`name` varchar(255) NOT NULL,
|
`name` VARCHAR(255) NOT NULL,
|
||||||
`words` varchar(255) NOT NULL DEFAULT '',
|
`words` VARCHAR(255) NOT NULL DEFAULT '',
|
||||||
`category` tinyint NOT NULL DEFAULT 0 COMMENT '1 - attack, 2 - healing, 3 - summon, 4 - supply, 5 - support',
|
`category` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '1 - attack, 2 - healing, 3 - summon, 4 - supply, 5 - support',
|
||||||
`type` tinyint NOT NULL DEFAULT 0 COMMENT '1 - instant, 2 - conjure, 3 - rune',
|
`type` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '1 - instant, 2 - conjure, 3 - rune',
|
||||||
`level` int NOT NULL DEFAULT 0,
|
`level` INT(11) NOT NULL DEFAULT 0,
|
||||||
`maglevel` int NOT NULL DEFAULT 0,
|
`maglevel` INT(11) NOT NULL DEFAULT 0,
|
||||||
`mana` int NOT NULL DEFAULT 0,
|
`mana` INT(11) NOT NULL DEFAULT 0,
|
||||||
`soul` tinyint NOT NULL DEFAULT 0,
|
`soul` TINYINT(3) NOT NULL DEFAULT 0,
|
||||||
`conjure_id` int NOT NULL DEFAULT 0,
|
`conjure_id` INT(11) NOT NULL DEFAULT 0,
|
||||||
`conjure_count` tinyint NOT NULL DEFAULT 0,
|
`conjure_count` TINYINT(3) NOT NULL DEFAULT 0,
|
||||||
`reagent` int NOT NULL DEFAULT 0,
|
`reagent` INT(11) NOT NULL DEFAULT 0,
|
||||||
`item_id` int NOT NULL DEFAULT 0,
|
`item_id` INT(11) NOT NULL DEFAULT 0,
|
||||||
`premium` tinyint 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 NOT NULL DEFAULT 0,
|
`hide` TINYINT(1) NOT NULL DEFAULT 0,
|
||||||
PRIMARY KEY (`id`),
|
PRIMARY KEY (`id`),
|
||||||
UNIQUE (`name`)
|
UNIQUE (`name`)
|
||||||
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8mb4;
|
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8;
|
||||||
|
|
||||||
CREATE TABLE `myaac_visitors`
|
CREATE TABLE `myaac_visitors`
|
||||||
(
|
(
|
||||||
`ip` varchar(45) NOT NULL,
|
`ip` VARCHAR(45) NOT NULL,
|
||||||
`lastvisit` int NOT NULL DEFAULT 0,
|
`lastvisit` INT(11) NOT NULL DEFAULT 0,
|
||||||
`page` varchar(2048) NOT NULL,
|
`page` VARCHAR(2048) NOT NULL,
|
||||||
`user_agent` varchar(255) NOT NULL DEFAULT '',
|
`user_agent` VARCHAR(255) NOT NULL DEFAULT '',
|
||||||
UNIQUE (`ip`)
|
UNIQUE (`ip`)
|
||||||
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8mb4;
|
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8;
|
||||||
|
|
||||||
CREATE TABLE `myaac_weapons`
|
CREATE TABLE `myaac_weapons`
|
||||||
(
|
(
|
||||||
`id` int NOT NULL,
|
`id` INT(11) NOT NULL,
|
||||||
`level` int NOT NULL DEFAULT 0,
|
`level` INT(11) NOT NULL DEFAULT 0,
|
||||||
`maglevel` int NOT NULL DEFAULT 0,
|
`maglevel` INT(11) NOT NULL DEFAULT 0,
|
||||||
`vocations` varchar(100) NOT NULL DEFAULT '',
|
`vocations` VARCHAR(100) NOT NULL DEFAULT '',
|
||||||
PRIMARY KEY (`id`)
|
PRIMARY KEY (`id`)
|
||||||
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8mb4;
|
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8;
|
||||||
|
@@ -125,18 +125,7 @@ else if($step == 'finish') {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// account check
|
// account check
|
||||||
if(isset($_SESSION['var_account_id'])) {
|
if(isset($_SESSION['var_account'])) {
|
||||||
if(empty($_SESSION['var_account_id'])) {
|
|
||||||
$errors[] = $locale['step_admin_account_id_error_empty'];
|
|
||||||
}
|
|
||||||
else if(!Validator::accountId($_SESSION['var_account_id'])) {
|
|
||||||
$errors[] = $locale['step_admin_account_id_error_format'];
|
|
||||||
}
|
|
||||||
else if($_SESSION['var_account_id'] == $password) {
|
|
||||||
$errors[] = $locale['step_admin_account_id_error_same'];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if(isset($_SESSION['var_account'])) {
|
|
||||||
if(empty($_SESSION['var_account'])) {
|
if(empty($_SESSION['var_account'])) {
|
||||||
$errors[] = $locale['step_admin_account_error_empty'];
|
$errors[] = $locale['step_admin_account_error_empty'];
|
||||||
}
|
}
|
||||||
@@ -147,6 +136,17 @@ else if($step == 'finish') {
|
|||||||
$errors[] = $locale['step_admin_account_error_same'];
|
$errors[] = $locale['step_admin_account_error_same'];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if(isset($_SESSION['var_account_id'])) {
|
||||||
|
if(empty($_SESSION['var_account_id'])) {
|
||||||
|
$errors[] = $locale['step_admin_account_id_error_empty'];
|
||||||
|
}
|
||||||
|
else if(!Validator::accountId($_SESSION['var_account_id'])) {
|
||||||
|
$errors[] = $locale['step_admin_account_id_error_format'];
|
||||||
|
}
|
||||||
|
else if($_SESSION['var_account_id'] == $password) {
|
||||||
|
$errors[] = $locale['step_admin_account_id_error_same'];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// password check
|
// password check
|
||||||
if(empty($password)) {
|
if(empty($password)) {
|
||||||
@@ -183,14 +183,14 @@ clearstatcache();
|
|||||||
if(is_writable(CACHE) && (MYAAC_OS != 'WINDOWS' || win_is_writable(CACHE))) {
|
if(is_writable(CACHE) && (MYAAC_OS != 'WINDOWS' || win_is_writable(CACHE))) {
|
||||||
if(!file_exists(BASE . 'install/ip.txt')) {
|
if(!file_exists(BASE . 'install/ip.txt')) {
|
||||||
$content = warning('AAC installation is disabled. To enable it make file <b>ip.txt</b> in install/ directory and put there your IP.<br/>
|
$content = warning('AAC installation is disabled. To enable it make file <b>ip.txt</b> in install/ directory and put there your IP.<br/>
|
||||||
Your IP is:<br /><b>' . get_browser_real_ip() . '</b>', true);
|
Your IP is:<br /><b>' . $_SERVER['REMOTE_ADDR'] . '</b>', true);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
$file_content = trim(file_get_contents(BASE . 'install/ip.txt'));
|
$file_content = trim(file_get_contents(BASE . 'install/ip.txt'));
|
||||||
$allow = false;
|
$allow = false;
|
||||||
$listIP = preg_split('/\s+/', $file_content);
|
$listIP = preg_split('/\s+/', $file_content);
|
||||||
foreach($listIP as $ip) {
|
foreach($listIP as $ip) {
|
||||||
if(get_browser_real_ip() == $ip) {
|
if($_SERVER['REMOTE_ADDR'] == $ip) {
|
||||||
$allow = true;
|
$allow = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -199,7 +199,7 @@ if(is_writable(CACHE) && (MYAAC_OS != 'WINDOWS' || win_is_writable(CACHE))) {
|
|||||||
{
|
{
|
||||||
$content = warning('In file <b>install/ip.txt</b> must be your IP!<br/>
|
$content = warning('In file <b>install/ip.txt</b> must be your IP!<br/>
|
||||||
In file is:<br /><b>' . nl2br($file_content) . '</b><br/>
|
In file is:<br /><b>' . nl2br($file_content) . '</b><br/>
|
||||||
Your IP is:<br /><b>' . get_browser_real_ip() . '</b>', true);
|
Your IP is:<br /><b>' . $_SERVER['REMOTE_ADDR'] . '</b>', true);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
ob_start();
|
ob_start();
|
||||||
|
@@ -10,14 +10,6 @@ foreach($config['clients'] as $client) {
|
|||||||
$clients[$client] = $client_version;
|
$clients[$client] = $client_version;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (empty($_SESSION['var_site_url'])) {
|
|
||||||
//require SYSTEM . 'base.php';
|
|
||||||
$serverUrl = 'http' . (isHttps() ? 's' : '') . '://' . $baseHost;
|
|
||||||
$siteURL = $serverUrl . $baseDir;
|
|
||||||
|
|
||||||
$_SESSION['var_site_url'] = $siteURL;
|
|
||||||
}
|
|
||||||
|
|
||||||
$twig->display('install.config.html.twig', array(
|
$twig->display('install.config.html.twig', array(
|
||||||
'clients' => $clients,
|
'clients' => $clients,
|
||||||
'timezones' => DateTimeZone::listIdentifiers(),
|
'timezones' => DateTimeZone::listIdentifiers(),
|
||||||
|
@@ -40,46 +40,46 @@ if(!$error) {
|
|||||||
$configToSave['gzip_output'] = false;
|
$configToSave['gzip_output'] = false;
|
||||||
$configToSave['cache_engine'] = 'auto';
|
$configToSave['cache_engine'] = 'auto';
|
||||||
$configToSave['cache_prefix'] = 'myaac_' . generateRandomString(8, true, false, true);
|
$configToSave['cache_prefix'] = 'myaac_' . generateRandomString(8, true, false, true);
|
||||||
$configToSave['database_auto_migrate'] = true;
|
|
||||||
|
|
||||||
$content = '';
|
if(!$error) {
|
||||||
$saved = Settings::saveConfig($configToSave, BASE . 'config.local.php', $content);
|
$content = '';
|
||||||
if ($saved || file_exists(BASE . 'config.local.php')) {
|
$saved = Settings::saveConfig($configToSave, BASE . 'config.local.php', $content);
|
||||||
success($locale['step_database_config_saved']);
|
if ($saved) {
|
||||||
$_SESSION['saved'] = true;
|
success($locale['step_database_config_saved']);
|
||||||
|
$_SESSION['saved'] = true;
|
||||||
|
|
||||||
require BASE . 'config.local.php';
|
require BASE . 'config.local.php';
|
||||||
require BASE . 'install/includes/config.php';
|
require BASE . 'install/includes/config.php';
|
||||||
|
|
||||||
if (!$error) {
|
if (!$error) {
|
||||||
require BASE . 'install/includes/database.php';
|
require BASE . 'install/includes/database.php';
|
||||||
|
|
||||||
if (isset($database_error)) { // we failed connect to the database
|
if (isset($database_error)) { // we failed connect to the database
|
||||||
error($database_error);
|
error($database_error);
|
||||||
}
|
|
||||||
else {
|
|
||||||
if (!$db->hasTable('accounts')) {
|
|
||||||
$tmp = str_replace('$TABLE$', 'accounts', $locale['step_database_error_table']);
|
|
||||||
error($tmp);
|
|
||||||
$error = true;
|
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
if (!$db->hasTable('accounts')) {
|
||||||
|
$tmp = str_replace('$TABLE$', 'accounts', $locale['step_database_error_table']);
|
||||||
|
error($tmp);
|
||||||
|
$error = true;
|
||||||
|
}
|
||||||
|
|
||||||
if (!$error) {
|
if (!$error) {
|
||||||
$twig->display('install.installer.html.twig', array(
|
$twig->display('install.installer.html.twig', array(
|
||||||
'url' => 'tools/5-database.php',
|
'url' => 'tools/5-database.php',
|
||||||
'message' => $locale['loading_spinner']
|
'message' => $locale['loading_spinner']
|
||||||
));
|
));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
$_SESSION['config_content'] = $content;
|
||||||
|
unset($_SESSION['saved']);
|
||||||
|
|
||||||
|
$locale['step_database_error_file'] = str_replace('$FILE$', '<b>' . BASE . 'config.php</b>', $locale['step_database_error_file']);
|
||||||
|
error($locale['step_database_error_file'] . '<br/>
|
||||||
|
<textarea cols="70" rows="10">' . $content . '</textarea>');
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
$error = true;
|
|
||||||
$_SESSION['config_content'] = $content;
|
|
||||||
unset($_SESSION['saved']);
|
|
||||||
|
|
||||||
$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/>
|
|
||||||
<textarea cols="70" rows="10">' . $content . '</textarea>');
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
?>
|
?>
|
||||||
|
@@ -195,4 +195,13 @@ if(!isset($_SESSION['installed'])) {
|
|||||||
$_SESSION['installed'] = true;
|
$_SESSION['installed'] = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
foreach($_SESSION as $key => $value) {
|
||||||
|
if(strpos($key, 'var_') !== false)
|
||||||
|
unset($_SESSION[$key]);
|
||||||
|
}
|
||||||
|
unset($_SESSION['saved']);
|
||||||
|
if(file_exists(CACHE . 'install.txt')) {
|
||||||
|
unlink(CACHE . 'install.txt');
|
||||||
|
}
|
||||||
|
|
||||||
$hooks->trigger(HOOK_INSTALL_FINISH_END);
|
$hooks->trigger(HOOK_INSTALL_FINISH_END);
|
||||||
|
@@ -1,4 +1,3 @@
|
|||||||
<?php defined('MYAAC') or die('Direct access not allowed!'); ?>
|
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html dir="<?php echo $locale['direction']; ?>" lang="<?php echo $locale['lang']; ?>" xml:lang="<?php echo $locale['lang']; ?>">
|
<html dir="<?php echo $locale['direction']; ?>" lang="<?php echo $locale['lang']; ?>" xml:lang="<?php echo $locale['lang']; ?>">
|
||||||
<head>
|
<head>
|
||||||
|
@@ -7,11 +7,6 @@ require SYSTEM . 'functions.php';
|
|||||||
require BASE . 'install/includes/functions.php';
|
require BASE . 'install/includes/functions.php';
|
||||||
require BASE . 'install/includes/locale.php';
|
require BASE . 'install/includes/locale.php';
|
||||||
|
|
||||||
if(isset($config['installed']) && $config['installed'] && !isset($_SESSION['saved'])) {
|
|
||||||
warning($locale['already_installed']);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
$error = false;
|
$error = false;
|
||||||
require BASE . 'install/includes/config.php';
|
require BASE . 'install/includes/config.php';
|
||||||
|
|
||||||
@@ -161,14 +156,9 @@ if ($db->hasTable('guilds')) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!$db->hasColumn('guilds', 'description')) {
|
if (!$db->hasColumn('guilds', 'description')) {
|
||||||
if (query("ALTER TABLE `guilds` ADD `description` VARCHAR(5000) NOT NULL DEFAULT '';"))
|
if (query("ALTER TABLE `guilds` ADD `description` TEXT NOT NULL;"))
|
||||||
success($locale['step_database_adding_field'] . ' guilds.description...');
|
success($locale['step_database_adding_field'] . ' guilds.description...');
|
||||||
}
|
}
|
||||||
else {
|
|
||||||
if (query("ALTER TABLE `guilds` MODIFY `description` VARCHAR(5000) NOT NULL DEFAULT '';")) {
|
|
||||||
success($locale['step_database_modifying_field'] . ' guilds.description...');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($db->hasColumn('guilds', 'logo_gfx_name')) {
|
if ($db->hasColumn('guilds', 'logo_gfx_name')) {
|
||||||
if (query("ALTER TABLE `guilds` CHANGE `logo_gfx_name` `logo_name` VARCHAR( 255 ) NOT NULL DEFAULT 'default.gif';")) {
|
if (query("ALTER TABLE `guilds` CHANGE `logo_gfx_name` `logo_name` VARCHAR( 255 ) NOT NULL DEFAULT 'default.gif';")) {
|
||||||
@@ -207,14 +197,9 @@ if ($db->hasTable('players')) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!$db->hasColumn('players', 'comment')) {
|
if (!$db->hasColumn('players', 'comment')) {
|
||||||
if (query("ALTER TABLE `players` ADD `comment` VARCHAR(5000) NOT NULL DEFAULT '';"))
|
if (query("ALTER TABLE `players` ADD `comment` TEXT NOT NULL;"))
|
||||||
success($locale['step_database_adding_field'] . ' players.comment...');
|
success($locale['step_database_adding_field'] . ' players.comment...');
|
||||||
}
|
}
|
||||||
else {
|
|
||||||
if (query("ALTER TABLE `players` MODIFY `comment` VARCHAR(5000) NOT NULL DEFAULT '';")) {
|
|
||||||
success($locale['step_database_modifying_field'] . ' players.comment...');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($db->hasColumn('players', 'rank_id')) {
|
if ($db->hasColumn('players', 'rank_id')) {
|
||||||
if (query("ALTER TABLE players MODIFY `rank_id` INT(11) NOT NULL DEFAULT 0;"))
|
if (query("ALTER TABLE players MODIFY `rank_id` INT(11) NOT NULL DEFAULT 0;"))
|
||||||
|
@@ -17,11 +17,11 @@ ini_set('max_execution_time', 300);
|
|||||||
ob_implicit_flush();
|
ob_implicit_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';
|
||||||
|
|
||||||
@@ -54,34 +54,24 @@ if ($db->hasTable('players')) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Plugins::installMenus('kathrine', require TEMPLATES . 'kathrine/menus.php');
|
||||||
|
Plugins::installMenus('tibiacom', require TEMPLATES . 'tibiacom/menus.php');
|
||||||
|
|
||||||
DataLoader::setLocale($locale);
|
DataLoader::setLocale($locale);
|
||||||
DataLoader::load();
|
DataLoader::load();
|
||||||
|
|
||||||
// add menus entries
|
|
||||||
require_once SYSTEM . 'migrations/17.php';
|
|
||||||
$up();
|
|
||||||
|
|
||||||
// update config.highscores_ids_hidden
|
// update config.highscores_ids_hidden
|
||||||
require_once SYSTEM . 'migrations/20.php';
|
require_once SYSTEM . 'migrations/20.php';
|
||||||
$up();
|
|
||||||
|
|
||||||
// add z_polls tables
|
// add z_polls tables
|
||||||
require_once SYSTEM . 'migrations/22.php';
|
require_once SYSTEM . 'migrations/22.php';
|
||||||
$up();
|
|
||||||
|
|
||||||
// add myaac_pages pages
|
// add myaac_pages pages
|
||||||
require_once SYSTEM . 'migrations/27.php';
|
require_once SYSTEM . 'migrations/27.php';
|
||||||
$up();
|
|
||||||
require_once SYSTEM . 'migrations/30.php';
|
require_once SYSTEM . 'migrations/30.php';
|
||||||
$up();
|
|
||||||
|
|
||||||
// new monster columns
|
// new monster columns
|
||||||
require_once SYSTEM . 'migrations/31.php';
|
require_once SYSTEM . 'migrations/31.php';
|
||||||
$up();
|
|
||||||
|
|
||||||
// rules page
|
|
||||||
require_once SYSTEM . 'migrations/45.php';
|
|
||||||
$up();
|
|
||||||
|
|
||||||
if(ModelsFAQ::count() == 0) {
|
if(ModelsFAQ::count() == 0) {
|
||||||
ModelsFAQ::create([
|
ModelsFAQ::create([
|
||||||
@@ -94,17 +84,6 @@ $hooks->trigger(HOOK_INSTALL_FINISH);
|
|||||||
|
|
||||||
$db->setClearCacheAfter(true);
|
$db->setClearCacheAfter(true);
|
||||||
|
|
||||||
// cleanup
|
|
||||||
foreach($_SESSION as $key => $value) {
|
|
||||||
if(str_contains($key, 'var_')) {
|
|
||||||
unset($_SESSION[$key]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
unset($_SESSION['saved']);
|
|
||||||
if(file_exists(CACHE . 'install.txt')) {
|
|
||||||
unlink(CACHE . 'install.txt');
|
|
||||||
}
|
|
||||||
|
|
||||||
$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']);
|
||||||
|
19
login.php
19
login.php
@@ -86,25 +86,12 @@ switch ($action) {
|
|||||||
die(json_encode(['eventlist' => $eventlist, 'lastupdatetimestamp' => time()]));
|
die(json_encode(['eventlist' => $eventlist, 'lastupdatetimestamp' => time()]));
|
||||||
|
|
||||||
case 'boostedcreature':
|
case 'boostedcreature':
|
||||||
$clientVersion = (int)setting('core.client');
|
$boostedCreature = BoostedCreature::latest();
|
||||||
|
|
||||||
// 13.40 and up
|
|
||||||
if ($clientVersion >= 1340) {
|
|
||||||
$creatureBoost = $db->query("SELECT * FROM " . $db->tableName('boosted_creature'))->fetchAll();
|
|
||||||
$bossBoost = $db->query("SELECT * FROM " . $db->tableName('boosted_boss'))->fetchAll();
|
|
||||||
die(json_encode([
|
|
||||||
'boostedcreature' => true,
|
|
||||||
'creatureraceid' => intval($creatureBoost[0]['raceid']),
|
|
||||||
'bossraceid' => intval($bossBoost[0]['raceid'])
|
|
||||||
]));
|
|
||||||
}
|
|
||||||
|
|
||||||
// lower clients
|
|
||||||
$boostedCreature = BoostedCreature::first();
|
|
||||||
die(json_encode([
|
die(json_encode([
|
||||||
'boostedcreature' => true,
|
'boostedcreature' => true,
|
||||||
'raceid' => $boostedCreature->raceid
|
'raceid' => $boostedCreature->raceid
|
||||||
]));
|
]));
|
||||||
|
break;
|
||||||
|
|
||||||
case 'login':
|
case 'login':
|
||||||
|
|
||||||
@@ -156,7 +143,7 @@ switch ($action) {
|
|||||||
if ($limiter->exceeded($ip)) {
|
if ($limiter->exceeded($ip)) {
|
||||||
sendError($ban_msg);
|
sendError($ban_msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
sendError(($inputEmail != false ? 'Email' : 'Account name') . ' or password is not correct.');
|
sendError(($inputEmail != false ? 'Email' : 'Account name') . ' or password is not correct.');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
server {
|
server {
|
||||||
listen 80;
|
listen 80;
|
||||||
root /var/www/html;
|
root /home/otserv/www/public;
|
||||||
index index.php;
|
index index.php;
|
||||||
server_name your-domain.com;
|
server_name your-domain.com;
|
||||||
|
|
||||||
@@ -12,9 +12,13 @@ server {
|
|||||||
deny all;
|
deny all;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
location /vendor {
|
||||||
|
deny all;
|
||||||
|
}
|
||||||
|
|
||||||
# block .htaccess, CHANGELOG.md, composer.json etc.
|
# block .htaccess, CHANGELOG.md, composer.json etc.
|
||||||
# this is to prevent finding software versions
|
# this is to prevent finding software versions
|
||||||
location ~\.(ht|md|json|dist|sql)$ {
|
location ~\.(ht|md|json|dist)$ {
|
||||||
deny all;
|
deny all;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -24,7 +28,7 @@ server {
|
|||||||
}
|
}
|
||||||
|
|
||||||
location / {
|
location / {
|
||||||
try_files $uri $uri/ /index.php?$query_string;
|
try_files $uri $uri/ /index.php?$query_string;;
|
||||||
}
|
}
|
||||||
|
|
||||||
location ~ \.php$ {
|
location ~ \.php$ {
|
||||||
|
949
package-lock.json
generated
949
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -4,7 +4,7 @@
|
|||||||
"postinstall": "node ./npm-post-install.js"
|
"postinstall": "node ./npm-post-install.js"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"cypress": "^14.3.3"
|
"cypress": "^12.12.0"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@tinymce/tinymce-jquery": "^2.1.0",
|
"@tinymce/tinymce-jquery": "^2.1.0",
|
||||||
@@ -12,6 +12,6 @@
|
|||||||
"fs-extra": "^11.2.0",
|
"fs-extra": "^11.2.0",
|
||||||
"jquery": "^3.7.1",
|
"jquery": "^3.7.1",
|
||||||
"jquery-ui": "^1.13.2",
|
"jquery-ui": "^1.13.2",
|
||||||
"tinymce": "^7.2.0"
|
"tinymce": "^6.8.3"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -28,9 +28,10 @@ parameters:
|
|||||||
- '#Variable \$guild might not be defined#'
|
- '#Variable \$guild might not be defined#'
|
||||||
- '#Variable \$[a-zA-Z0-9\\_]+ might not be defined#'
|
- '#Variable \$[a-zA-Z0-9\\_]+ might not be defined#'
|
||||||
# Eloquent models
|
# Eloquent models
|
||||||
- '#Call to an undefined method [a-zA-Z0-9\\_]+::[a-zA-Z0-9\\_]+\(\)#'
|
|
||||||
- '#Call to an undefined static method [a-zA-Z0-9\\_]+::[a-zA-Z0-9\\_]+\(\)#'
|
- '#Call to an undefined static method [a-zA-Z0-9\\_]+::[a-zA-Z0-9\\_]+\(\)#'
|
||||||
|
- '#Call to an undefined method object::toArray\(\)#'
|
||||||
# system/pages/highscores.php
|
# 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::\$online_status#'
|
||||||
- '#Access to an undefined property Illuminate\\Database\\Eloquent\\Model::\$vocation_name#'
|
- '#Access to an undefined property Illuminate\\Database\\Eloquent\\Model::\$vocation_name#'
|
||||||
-
|
-
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "create-account-hint",
|
"name": "create-account-hint",
|
||||||
"description": "This plugin display text 'To play on Forgotten you need an account. All you have to do to create your new account is to enter an account name, password, country and your email address. Also you have to agree to the terms presented below. If you have done so, your account name 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.' on the create account page.",
|
"description": "This plugin display text 'To play on Forgotten you need an account. All you have to do to create your new account is to enter an account name, password, country and your email address. Also you have to agree to the terms presented below. If you have done so, your account name 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.' on the create account page. <strong>Be careful when uninstalling this!</strong>",
|
||||||
"version": "1.0",
|
"version": "1.0",
|
||||||
"author": "slawkens",
|
"author": "slawkens",
|
||||||
"contact": "slawkens@gmail.com",
|
"contact": "slawkens@gmail.com",
|
||||||
|
@@ -9,4 +9,7 @@
|
|||||||
*/
|
*/
|
||||||
defined('MYAAC') or die('Direct access not allowed!');
|
defined('MYAAC') or die('Direct access not allowed!');
|
||||||
|
|
||||||
$twig->display('account-create-hint/hint.html.twig');
|
global $twig_loader;
|
||||||
|
$twig_loader->prependPath(BASE . 'plugins/account-create-hint');
|
||||||
|
|
||||||
|
$twig->display('hint.html.twig');
|
||||||
|
@@ -46,13 +46,8 @@
|
|||||||
"settings": "plugins/your-plugin-folder/settings.php",
|
"settings": "plugins/your-plugin-folder/settings.php",
|
||||||
"autoload": {
|
"autoload": {
|
||||||
"pages": true,
|
"pages": true,
|
||||||
"pages-sub-folders": false,
|
"pagesSubFolders": false,
|
||||||
"commands": true,
|
"commands": true,
|
||||||
"themes": true,
|
"themes": true
|
||||||
"admin-pages": true,
|
|
||||||
"admin-pages-sub-folders": true,
|
|
||||||
"settings": true,
|
|
||||||
"install": true,
|
|
||||||
"init": false
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -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 main
|
git archive --format zip --output tmp/myaac.zip develop
|
||||||
|
|
||||||
cd tmp/ || exit
|
cd tmp/ || exit
|
||||||
|
|
||||||
|
@@ -1,21 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
$baseDir = '';
|
|
||||||
$tmp = explode('/', $_SERVER['SCRIPT_NAME']);
|
|
||||||
$size = count($tmp) - 1;
|
|
||||||
for($i = 1; $i < $size; $i++)
|
|
||||||
$baseDir .= '/' . $tmp[$i];
|
|
||||||
|
|
||||||
$baseDir = str_replace(['/' . ADMIN_PANEL_FOLDER, '/install', '/tools'], '', $baseDir);
|
|
||||||
|
|
||||||
if(!IS_CLI) {
|
|
||||||
if (isset($_SERVER['HTTP_HOST'][0])) {
|
|
||||||
$baseHost = $_SERVER['HTTP_HOST'];
|
|
||||||
} else {
|
|
||||||
if (isset($_SERVER['SERVER_NAME'][0])) {
|
|
||||||
$baseHost = $_SERVER['SERVER_NAME'];
|
|
||||||
} else {
|
|
||||||
$baseHost = $_SERVER['SERVER_ADDR'];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@@ -109,12 +109,4 @@ $config['clients'] = [
|
|||||||
1330,
|
1330,
|
||||||
1332,
|
1332,
|
||||||
1340,
|
1340,
|
||||||
|
|
||||||
1400,
|
|
||||||
1405,
|
|
||||||
1410,
|
|
||||||
1411,
|
|
||||||
1412,
|
|
||||||
1500,
|
|
||||||
1501,
|
|
||||||
];
|
];
|
||||||
|
@@ -74,3 +74,7 @@ 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);
|
||||||
|
}
|
||||||
|
@@ -36,5 +36,3 @@ class Guild extends OTS_Guild {
|
|||||||
}
|
}
|
||||||
class GuildRank extends OTS_GuildRank {}
|
class GuildRank extends OTS_GuildRank {}
|
||||||
class House extends OTS_House {}
|
class House extends OTS_House {}
|
||||||
|
|
||||||
class Cache extends \MyAAC\Cache\Cache {}
|
|
||||||
|
@@ -106,7 +106,6 @@ try {
|
|||||||
'persistent' => @$config['database_persistent']
|
'persistent' => @$config['database_persistent']
|
||||||
));
|
));
|
||||||
|
|
||||||
global $db;
|
|
||||||
$db = POT::getInstance()->getDBHandle();
|
$db = POT::getInstance()->getDBHandle();
|
||||||
$capsule = new Capsule;
|
$capsule = new Capsule;
|
||||||
$capsule->addConnection([
|
$capsule->addConnection([
|
||||||
@@ -122,10 +121,6 @@ try {
|
|||||||
|
|
||||||
$eloquentConnection = $capsule->getConnection();
|
$eloquentConnection = $capsule->getConnection();
|
||||||
|
|
||||||
if (isset($twig)) {
|
|
||||||
$twig->addGlobal('db', $db);
|
|
||||||
}
|
|
||||||
|
|
||||||
} catch (Exception $e) {
|
} catch (Exception $e) {
|
||||||
if(isset($cache) && $cache->enabled()) {
|
if(isset($cache) && $cache->enabled()) {
|
||||||
$cache->delete('config_lua');
|
$cache->delete('config_lua');
|
||||||
|
@@ -9,16 +9,16 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
use MyAAC\Exceptions\SensitiveException;
|
use MyAAC\Exceptions\SensitiveException;
|
||||||
use Whoops\Handler\PlainTextHandler;
|
|
||||||
use Whoops\Handler\PrettyPageHandler;
|
|
||||||
use Whoops\Run;
|
|
||||||
|
|
||||||
if (class_exists(Run::class)) {
|
if (class_exists(\Whoops\Run::class)) {
|
||||||
$whoops = new Run;
|
$whoops = new \Whoops\Run;
|
||||||
|
if(IS_CLI) {
|
||||||
|
$whoops->pushHandler(new \Whoops\Handler\PlainTextHandler);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$whoops->pushHandler(new \Whoops\Handler\PrettyPageHandler);
|
||||||
|
}
|
||||||
|
|
||||||
$whoopsHandler = IS_CLI ? (new PlainTextHandler()) : (new PrettyPageHandler());
|
|
||||||
|
|
||||||
$whoops->pushHandler($whoopsHandler);
|
|
||||||
$whoops->register();
|
$whoops->register();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@@ -49,7 +49,7 @@ function warning($message, $return = false) {
|
|||||||
return message($message, 'warning', $return);
|
return message($message, 'warning', $return);
|
||||||
}
|
}
|
||||||
function note($message, $return = false) {
|
function note($message, $return = false) {
|
||||||
return message($message, 'note', $return);
|
return info($message, $return);
|
||||||
}
|
}
|
||||||
function info($message, $return = false) {
|
function info($message, $return = false) {
|
||||||
return message($message, 'info', $return);
|
return message($message, 'info', $return);
|
||||||
@@ -89,18 +89,13 @@ function getForumBoardLink($board_id, $page = NULL): string {
|
|||||||
|
|
||||||
function getPlayerLink($name, $generate = true, bool $colored = false): string
|
function getPlayerLink($name, $generate = true, bool $colored = false): string
|
||||||
{
|
{
|
||||||
if (is_object($name) and $name instanceof OTS_Player) {
|
$player = new OTS_Player();
|
||||||
$player = $name;
|
|
||||||
|
if(is_numeric($name)) {
|
||||||
|
$player->load((int)$name);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
$player = new OTS_Player();
|
$player->find($name);
|
||||||
|
|
||||||
if(is_numeric($name)) {
|
|
||||||
$player->load((int)$name);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
$player->find($name);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!$player->isLoaded()) {
|
if (!$player->isLoaded()) {
|
||||||
@@ -121,7 +116,7 @@ function getPlayerLink($name, $generate = true, bool $colored = false): string
|
|||||||
|
|
||||||
function getMonsterLink($name, $generate = true): string
|
function getMonsterLink($name, $generate = true): string
|
||||||
{
|
{
|
||||||
$url = BASE_URL . (setting('core.friendly_urls') ? '' : 'index.php/') . 'monsters?name=' . urlencode($name);
|
$url = BASE_URL . (setting('core.friendly_urls') ? '' : 'index.php/') . 'monsters/' . urlencode($name);
|
||||||
|
|
||||||
if(!$generate) return $url;
|
if(!$generate) return $url;
|
||||||
return generateLink($url, $name);
|
return generateLink($url, $name);
|
||||||
@@ -129,14 +124,16 @@ function getMonsterLink($name, $generate = true): string
|
|||||||
|
|
||||||
function getHouseLink($name, $generate = true): string
|
function getHouseLink($name, $generate = true): string
|
||||||
{
|
{
|
||||||
if(is_numeric($name)) {
|
if(is_numeric($name))
|
||||||
|
{
|
||||||
$house = House::find(intval($name), ['name']);
|
$house = House::find(intval($name), ['name']);
|
||||||
if ($house) {
|
if ($house) {
|
||||||
$name = $house->name;
|
$name = $house->name;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$url = BASE_URL . (setting('core.friendly_urls') ? '' : 'index.php/') . 'houses?name=' . urlencode($name);
|
|
||||||
|
$url = BASE_URL . (setting('core.friendly_urls') ? '' : 'index.php/') . 'houses/' . urlencode($name);
|
||||||
|
|
||||||
if(!$generate) return $url;
|
if(!$generate) return $url;
|
||||||
return generateLink($url, $name);
|
return generateLink($url, $name);
|
||||||
@@ -512,13 +509,6 @@ function template_place_holder($type): string
|
|||||||
}
|
}
|
||||||
elseif ($type === 'body_start') {
|
elseif ($type === 'body_start') {
|
||||||
$ret .= $twig->render('browsehappy.html.twig');
|
$ret .= $twig->render('browsehappy.html.twig');
|
||||||
|
|
||||||
if (admin()) {
|
|
||||||
global $account_logged;
|
|
||||||
$ret .= $twig->render('admin-bar.html.twig', [
|
|
||||||
'username' => USE_ACCOUNT_NAME ? $account_logged->getName() : $account_logged->getId()
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
elseif($type === 'body_end') {
|
elseif($type === 'body_end') {
|
||||||
$ret .= template_ga_code();
|
$ret .= template_ga_code();
|
||||||
@@ -552,39 +542,33 @@ function template_header($is_admin = false): string
|
|||||||
*/
|
*/
|
||||||
function template_footer(): string
|
function template_footer(): string
|
||||||
{
|
{
|
||||||
$footer = [];
|
global $views_counter;
|
||||||
|
$ret = '';
|
||||||
if(admin()) {
|
if(admin()) {
|
||||||
$footer[] = generateLink(ADMIN_URL, 'Admin Panel', true);
|
$ret .= generateLink(ADMIN_URL, 'Admin Panel', true);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(setting('core.visitors_counter')) {
|
if(setting('core.visitors_counter')) {
|
||||||
global $visitors;
|
global $visitors;
|
||||||
$amount = $visitors->getAmountVisitors();
|
$amount = $visitors->getAmountVisitors();
|
||||||
$footer[] = 'Currently there ' . ($amount > 1 ? 'are' : 'is') . ' ' . $amount . ' visitor' . ($amount > 1 ? 's' : '') . '.';
|
$ret .= '<br/>Currently there ' . ($amount > 1 ? 'are' : 'is') . ' ' . $amount . ' visitor' . ($amount > 1 ? 's' : '') . '.';
|
||||||
}
|
}
|
||||||
|
|
||||||
if(setting('core.views_counter')) {
|
if(setting('core.views_counter')) {
|
||||||
global $views_counter;
|
$ret .= '<br/>Page has been viewed ' . $views_counter . ' times.';
|
||||||
$footer[] = 'Page has been viewed ' . $views_counter . ' times.';
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if(setting('core.footer_load_time')) {
|
if(setting('core.footer_load_time')) {
|
||||||
$footer[] = 'Load time: ' . round(microtime(true) - START_TIME, 4) . ' seconds.';
|
$ret .= '<br/>Load time: ' . round(microtime(true) - START_TIME, 4) . ' seconds.';
|
||||||
}
|
}
|
||||||
|
|
||||||
$settingFooter = setting('core.footer');
|
$settingFooter = setting('core.footer');
|
||||||
if(isset($settingFooter[0])) {
|
if(isset($settingFooter[0])) {
|
||||||
$footer[] = '' . $settingFooter;
|
$ret .= '<br/>' . $settingFooter;
|
||||||
}
|
}
|
||||||
|
|
||||||
// please respect my work and help spreading the word, thanks!
|
// please respect my work and help spreading the word, thanks!
|
||||||
$footer[] = base64_decode('UG93ZXJlZCBieSA8YSBocmVmPSJodHRwOi8vbXktYWFjLm9yZyIgdGFyZ2V0PSJfYmxhbmsiPk15QUFDLjwvYT4=');
|
return $ret . '<br/>' . base64_decode('UG93ZXJlZCBieSA8YSBocmVmPSJodHRwOi8vbXktYWFjLm9yZyIgdGFyZ2V0PSJfYmxhbmsiPk15QUFDLjwvYT4=');
|
||||||
|
|
||||||
global $hooks;
|
|
||||||
$hooks->triggerFilter(HOOK_FILTER_THEME_FOOTER, $footer);
|
|
||||||
|
|
||||||
return implode('<br/>', $footer);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function template_ga_code()
|
function template_ga_code()
|
||||||
@@ -600,12 +584,24 @@ function template_form()
|
|||||||
{
|
{
|
||||||
global $template_name;
|
global $template_name;
|
||||||
|
|
||||||
$templates = Cache::remember('templates', 5 * 60, function() {
|
$cache = Cache::getInstance();
|
||||||
return get_templates();
|
if($cache->enabled())
|
||||||
});
|
{
|
||||||
|
$tmp = '';
|
||||||
|
if($cache->fetch('templates', $tmp)) {
|
||||||
|
$templates = unserialize($tmp);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$templates = get_templates();
|
||||||
|
$cache->set('templates', serialize($templates), 30);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
$templates = get_templates();
|
||||||
|
|
||||||
$options = '';
|
$options = '';
|
||||||
foreach($templates as $value)
|
foreach($templates as $key => $value)
|
||||||
$options .= '<option ' . ($template_name == $value ? 'SELECTED' : '') . '>' . $value . '</option>';
|
$options .= '<option ' . ($template_name == $value ? 'SELECTED' : '') . '>' . $value . '</option>';
|
||||||
|
|
||||||
global $twig;
|
global $twig;
|
||||||
@@ -774,10 +770,6 @@ function formatExperience($exp, $color = true)
|
|||||||
return $ret;
|
return $ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
function getExperienceForLevel($level): float|int {
|
|
||||||
return ( 50 / 3 ) * pow( $level, 3 ) - ( 100 * pow( $level, 2 ) ) + ( ( 850 / 3 ) * $level ) - 200;
|
|
||||||
}
|
|
||||||
|
|
||||||
function get_locales()
|
function get_locales()
|
||||||
{
|
{
|
||||||
$ret = array();
|
$ret = array();
|
||||||
@@ -993,36 +985,37 @@ function load_config_lua($filename)
|
|||||||
foreach($lines as $ln => $line)
|
foreach($lines as $ln => $line)
|
||||||
{
|
{
|
||||||
$line = trim($line);
|
$line = trim($line);
|
||||||
if(isset($line[0]) && ($line[0] === '{' || $line[0] === '}')) {
|
if(@$line[0] === '{' || @$line[0] === '}') {
|
||||||
// arrays are not supported yet
|
// arrays are not supported yet
|
||||||
// just ignore the error
|
// just ignore the error
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
$tmp_exp = explode('=', $line, 2);
|
$tmp_exp = explode('=', $line, 2);
|
||||||
if(str_contains($line, 'dofile')) {
|
if(strpos($line, 'dofile') !== false)
|
||||||
|
{
|
||||||
$delimiter = '"';
|
$delimiter = '"';
|
||||||
if(!str_contains($line, $delimiter)) {
|
if(strpos($line, $delimiter) === false)
|
||||||
$delimiter = "'";
|
$delimiter = "'";
|
||||||
}
|
|
||||||
|
|
||||||
$tmp = explode($delimiter, $line);
|
$tmp = explode($delimiter, $line);
|
||||||
$result = array_merge($result, load_config_lua($config['server_path'] . $tmp[1]));
|
$result = array_merge($result, load_config_lua($config['server_path'] . $tmp[1]));
|
||||||
}
|
}
|
||||||
else if(count($tmp_exp) >= 2) {
|
else if(count($tmp_exp) >= 2)
|
||||||
|
{
|
||||||
$key = trim($tmp_exp[0]);
|
$key = trim($tmp_exp[0]);
|
||||||
if(!str_starts_with($key, '--')) {
|
if(0 !== strpos($key, '--'))
|
||||||
|
{
|
||||||
$value = trim($tmp_exp[1]);
|
$value = trim($tmp_exp[1]);
|
||||||
if(str_contains($value, '--')) {// found some deep comment
|
if(strpos($value, '--') !== false) {// found some deep comment
|
||||||
$value = preg_replace('/--.*$/i', '', $value);
|
$value = preg_replace('/--.*$/i', '', $value);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(is_numeric($value))
|
if(is_numeric($value))
|
||||||
$result[$key] = (float) $value;
|
$result[$key] = (float) $value;
|
||||||
elseif(in_array(@$value[0], array("'", '"')) && in_array(@$value[strlen($value) - 1], array("'", '"')))
|
elseif(in_array(@$value[0], array("'", '"')) && in_array(@$value[strlen($value) - 1], array("'", '"')))
|
||||||
$result[$key] = substr(substr($value, 1), 0, -1);
|
$result[$key] = (string) substr(substr($value, 1), 0, -1);
|
||||||
elseif(in_array($value, array('true', 'false')))
|
elseif(in_array($value, array('true', 'false')))
|
||||||
$result[$key] = $value === 'true';
|
$result[$key] = ($value === 'true') ? true : false;
|
||||||
elseif(@$value[0] === '{') {
|
elseif(@$value[0] === '{') {
|
||||||
// arrays are not supported yet
|
// arrays are not supported yet
|
||||||
// just ignore the error
|
// just ignore the error
|
||||||
@@ -1030,19 +1023,12 @@ function load_config_lua($filename)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
foreach($result as $tmp_key => $tmp_value) { // load values defined by other keys, like: dailyFragsToBlackSkull = dailyFragsToRedSkull
|
foreach($result as $tmp_key => $tmp_value) // load values definied by other keys, like: dailyFragsToBlackSkull = dailyFragsToRedSkull
|
||||||
$value = str_replace($tmp_key, $tmp_value, $value);
|
$value = str_replace($tmp_key, $tmp_value, $value);
|
||||||
}
|
$ret = @eval("return $value;");
|
||||||
|
if((string) $ret == '' && trim($value) !== '""') // = parser error
|
||||||
try {
|
{
|
||||||
$ret = eval("return $value;");
|
throw new RuntimeException('ERROR: Loading config.lua file. Line <b>' . ($ln + 1) . '</b> of LUA config file is not valid [key: <b>' . $key . '</b>]');
|
||||||
}
|
|
||||||
catch (Throwable $e) {
|
|
||||||
throw new RuntimeException('ERROR: Loading config.lua file. Line: ' . ($ln + 1) . ' - Unable to parse value "' . $value . '" - ' . $e->getMessage());
|
|
||||||
}
|
|
||||||
|
|
||||||
if((string) $ret == '' && trim($value) !== '""') {
|
|
||||||
throw new RuntimeException('ERROR: Loading config.lua file. Line ' . ($ln + 1) . ' is not valid [key: ' . $key . ']');
|
|
||||||
}
|
}
|
||||||
$result[$key] = $ret;
|
$result[$key] = $ret;
|
||||||
}
|
}
|
||||||
@@ -1051,7 +1037,8 @@ function load_config_lua($filename)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return array_merge($result, $config['lua'] ?? []);
|
$result = array_merge($result, isset($config['lua']) ? $config['lua'] : array());
|
||||||
|
return $result;
|
||||||
}
|
}
|
||||||
|
|
||||||
function str_replace_first($search,$replace, $subject) {
|
function str_replace_first($search,$replace, $subject) {
|
||||||
@@ -1077,36 +1064,17 @@ function get_browser_real_ip() {
|
|||||||
|
|
||||||
return '0';
|
return '0';
|
||||||
}
|
}
|
||||||
function setSession($key, $value = null): void {
|
function setSession($key, $data) {
|
||||||
if (!is_array($key)) {
|
$_SESSION[setting('core.session_prefix') . $key] = $data;
|
||||||
$key = [$key => $value];
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach ($key as $arrayKey => $arrayValue) {
|
|
||||||
if (is_null($arrayValue)) {
|
|
||||||
unsetSession($arrayKey);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
$_SESSION[setting('core.session_prefix') . $arrayKey] = $arrayValue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
function getSession($key) {
|
function getSession($key) {
|
||||||
return $_SESSION[setting('core.session_prefix') . $key] ?? null;
|
$key = setting('core.session_prefix') . $key;
|
||||||
|
return isset($_SESSION[$key]) ? $_SESSION[$key] : false;
|
||||||
}
|
}
|
||||||
function unsetSession($key): void {
|
function unsetSession($key) {
|
||||||
unset($_SESSION[setting('core.session_prefix') . $key]);
|
unset($_SESSION[setting('core.session_prefix') . $key]);
|
||||||
}
|
}
|
||||||
|
|
||||||
function session($key): mixed {
|
|
||||||
if (is_array($key)) {
|
|
||||||
setSession($key);
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
return getSession($key);
|
|
||||||
}
|
|
||||||
|
|
||||||
function csrf(bool $return = false): string {
|
function csrf(bool $return = false): string {
|
||||||
return CsrfToken::create($return);
|
return CsrfToken::create($return);
|
||||||
}
|
}
|
||||||
@@ -1129,16 +1097,20 @@ function csrfProtect(): void
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function getTopPlayers($limit = 5, $skill = 'level') {
|
function getTopPlayers($limit = 5) {
|
||||||
global $db;
|
global $db;
|
||||||
|
|
||||||
if ($skill === 'level') {
|
$cache = Cache::getInstance();
|
||||||
$skill = 'experience';
|
if($cache->enabled()) {
|
||||||
|
$tmp = '';
|
||||||
|
if($cache->fetch('top_' . $limit . '_level', $tmp)) {
|
||||||
|
$players = unserialize($tmp);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return Cache::remember("top_{$limit}_{$skill}", 2 * 60, function () use ($db, $limit, $skill) {
|
if (!isset($players)) {
|
||||||
$columns = [
|
$columns = [
|
||||||
'id', 'name', 'level', 'vocation', 'experience', 'balance',
|
'id', 'name', 'level', 'vocation', 'experience',
|
||||||
'looktype', 'lookhead', 'lookbody', 'looklegs', 'lookfeet'
|
'looktype', 'lookhead', 'lookbody', 'looklegs', 'lookfeet'
|
||||||
];
|
];
|
||||||
|
|
||||||
@@ -1146,27 +1118,36 @@ function getTopPlayers($limit = 5, $skill = 'level') {
|
|||||||
$columns[] = 'lookaddons';
|
$columns[] = 'lookaddons';
|
||||||
}
|
}
|
||||||
|
|
||||||
return Player::query()
|
if ($db->hasColumn('players', 'online')) {
|
||||||
|
$columns[] = 'online';
|
||||||
|
}
|
||||||
|
|
||||||
|
$players = Player::query()
|
||||||
->select($columns)
|
->select($columns)
|
||||||
->withOnlineStatus()
|
->withOnlineStatus()
|
||||||
->notDeleted()
|
->notDeleted()
|
||||||
->where('group_id', '<', setting('core.highscores_groups_hidden'))
|
->where('group_id', '<', setting('core.highscores_groups_hidden'))
|
||||||
->whereNotIn('id', setting('core.highscores_ids_hidden'))
|
->whereNotIn('id', setting('core.highscores_ids_hidden'))
|
||||||
->where('account_id', '!=', 1)
|
->where('account_id', '!=', 1)
|
||||||
->orderByDesc($skill)
|
->orderByDesc('experience')
|
||||||
->limit($limit)
|
->limit($limit)
|
||||||
->get()
|
->get()
|
||||||
->map(function ($e, $i) {
|
->map(function ($e, $i) {
|
||||||
$row = $e->toArray();
|
$row = $e->toArray();
|
||||||
$row['online'] = $e->online_status;
|
$row['online'] = $e->online_status;
|
||||||
$row['rank'] = $i + 1;
|
$row['rank'] = $i + 1;
|
||||||
$row['outfit_url'] = $e->outfit_url;
|
|
||||||
|
|
||||||
unset($row['online_table']);
|
unset($row['online_table']);
|
||||||
|
|
||||||
return $row;
|
return $row;
|
||||||
})->toArray();
|
})->toArray();
|
||||||
});
|
|
||||||
|
if($cache->enabled()) {
|
||||||
|
$cache->set('top_' . $limit . '_level', serialize($players), 120);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $players;
|
||||||
}
|
}
|
||||||
|
|
||||||
function deleteDirectory($dir, $ignore = array(), $contentOnly = false) {
|
function deleteDirectory($dir, $ignore = array(), $contentOnly = false) {
|
||||||
@@ -1228,8 +1209,7 @@ function setting($key)
|
|||||||
return $settings[$key[0]] = $key[1];
|
return $settings[$key[0]] = $key[1];
|
||||||
}
|
}
|
||||||
|
|
||||||
$ret = $settings[$key];
|
return $settings[$key]['value'];
|
||||||
return isset($ret) ? $ret['value'] : null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function clearCache()
|
function clearCache()
|
||||||
@@ -1278,15 +1258,14 @@ function clearCache()
|
|||||||
$db->setClearCacheAfter(true);
|
$db->setClearCacheAfter(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (function_exists('apcu_clear_cache')) {
|
|
||||||
apcu_clear_cache();
|
|
||||||
}
|
|
||||||
|
|
||||||
deleteDirectory(CACHE . 'signatures', ['index.html'], true);
|
deleteDirectory(CACHE . 'signatures', ['index.html'], true);
|
||||||
deleteDirectory(CACHE . 'twig', ['index.html'], true);
|
deleteDirectory(CACHE . 'twig', ['index.html'], true);
|
||||||
deleteDirectory(CACHE . 'plugins', ['index.html'], true);
|
deleteDirectory(CACHE . 'plugins', ['index.html'], true);
|
||||||
deleteDirectory(CACHE, ['signatures', 'twig', 'plugins', 'index.html', 'persistent'], true);
|
deleteDirectory(CACHE, ['signatures', 'twig', 'plugins', 'index.html', 'persistent'], true);
|
||||||
|
|
||||||
|
// routes cache
|
||||||
|
clearRouteCache();
|
||||||
|
|
||||||
global $hooks;
|
global $hooks;
|
||||||
$hooks->trigger(HOOK_CACHE_CLEAR, ['cache' => Cache::getInstance()]);
|
$hooks->trigger(HOOK_CACHE_CLEAR, ['cache' => Cache::getInstance()]);
|
||||||
|
|
||||||
@@ -1592,6 +1571,22 @@ function right($str, $length) {
|
|||||||
return substr($str, -$length);
|
return substr($str, -$length);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function getMonsterImgPath($monster): string
|
||||||
|
{
|
||||||
|
$monster_path = setting('core.monsters_images_url');
|
||||||
|
$monster_gfx_name = trim(strtolower($monster)) . setting('core.monsters_images_extension');
|
||||||
|
if (!file_exists($monster_path . $monster_gfx_name)) {
|
||||||
|
$monster_gfx_name = str_replace(" ", "", $monster_gfx_name);
|
||||||
|
if (file_exists($monster_path . $monster_gfx_name)) {
|
||||||
|
return $monster_path . $monster_gfx_name;
|
||||||
|
} else {
|
||||||
|
return $monster_path . 'nophoto.png';
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return $monster_path . $monster_gfx_name;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
function between($x, $lim1, $lim2) {
|
function between($x, $lim1, $lim2) {
|
||||||
if ($lim1 < $lim2) {
|
if ($lim1 < $lim2) {
|
||||||
$lower = $lim1; $upper = $lim2;
|
$lower = $lim1; $upper = $lim2;
|
||||||
@@ -1684,23 +1679,8 @@ function isRequestMethod(string $method): bool {
|
|||||||
return strtolower($_SERVER['REQUEST_METHOD']) == strtolower($method);
|
return strtolower($_SERVER['REQUEST_METHOD']) == strtolower($method);
|
||||||
}
|
}
|
||||||
|
|
||||||
function getAccountIdentityColumn(): string
|
|
||||||
{
|
|
||||||
if (USE_ACCOUNT_NAME) {
|
|
||||||
return 'name';
|
|
||||||
}
|
|
||||||
elseif (USE_ACCOUNT_NUMBER) {
|
|
||||||
return 'number';
|
|
||||||
}
|
|
||||||
|
|
||||||
return 'id';
|
|
||||||
}
|
|
||||||
|
|
||||||
// validator functions
|
// validator functions
|
||||||
require_once SYSTEM . 'compat/base.php';
|
require_once SYSTEM . 'compat/base.php';
|
||||||
|
|
||||||
// custom functions
|
// custom functions
|
||||||
$customFunctions = SYSTEM . 'functions_custom.php';
|
require SYSTEM . 'functions_custom.php';
|
||||||
if (is_file($customFunctions)) {
|
|
||||||
require $customFunctions;
|
|
||||||
}
|
|
||||||
|
@@ -12,13 +12,11 @@ use DebugBar\StandardDebugBar;
|
|||||||
use MyAAC\Cache\Cache;
|
use MyAAC\Cache\Cache;
|
||||||
use MyAAC\CsrfToken;
|
use MyAAC\CsrfToken;
|
||||||
use MyAAC\Hooks;
|
use MyAAC\Hooks;
|
||||||
use MyAAC\Plugins;
|
|
||||||
use MyAAC\Models\Town;
|
|
||||||
use MyAAC\Settings;
|
use MyAAC\Settings;
|
||||||
|
use MyAAC\Towns;
|
||||||
|
|
||||||
defined('MYAAC') or die('Direct access not allowed!');
|
defined('MYAAC') or die('Direct access not allowed!');
|
||||||
|
|
||||||
global $config;
|
|
||||||
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.');
|
||||||
}
|
}
|
||||||
@@ -40,23 +38,15 @@ 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']) && str_contains($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip') && function_exists('ob_gzhandler'))
|
if(isset($config['gzip_output']) && $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
|
||||||
global $cache;
|
|
||||||
$cache = Cache::getInstance();
|
$cache = Cache::getInstance();
|
||||||
|
|
||||||
// load plugins init.php
|
|
||||||
foreach (Plugins::getInits() as $init) {
|
|
||||||
require $init;
|
|
||||||
}
|
|
||||||
|
|
||||||
// event system
|
// event system
|
||||||
global $hooks;
|
|
||||||
$hooks = new Hooks();
|
$hooks = new Hooks();
|
||||||
$hooks->load();
|
$hooks->load();
|
||||||
$hooks->trigger(HOOK_INIT);
|
|
||||||
|
|
||||||
// twig
|
// twig
|
||||||
require_once SYSTEM . 'twig.php';
|
require_once SYSTEM . 'twig.php';
|
||||||
@@ -103,8 +93,8 @@ if($config_lua_reload) {
|
|||||||
|
|
||||||
// cache config
|
// cache config
|
||||||
if($cache->enabled()) {
|
if($cache->enabled()) {
|
||||||
$cache->set('config_lua', serialize($config['lua']), 2 * 60);
|
$cache->set('config_lua', serialize($config['lua']), 120);
|
||||||
$cache->set('server_path', $config['server_path'], 10 * 60);
|
$cache->set('server_path', $config['server_path']);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
unset($tmp);
|
unset($tmp);
|
||||||
@@ -144,28 +134,13 @@ $ots = POT::getInstance();
|
|||||||
$eloquentConnection = null;
|
$eloquentConnection = null;
|
||||||
require_once SYSTEM . 'database.php';
|
require_once SYSTEM . 'database.php';
|
||||||
|
|
||||||
define('USE_ACCOUNT_NAME', $db->hasColumn('accounts', 'name'));
|
|
||||||
define('USE_ACCOUNT_NUMBER', $db->hasColumn('accounts', 'number'));
|
|
||||||
define('USE_ACCOUNT_SALT', $db->hasColumn('accounts', 'salt'));
|
|
||||||
|
|
||||||
define('HAS_ACCOUNT_COINS', $db->hasColumn('accounts', 'coins'));
|
|
||||||
define('HAS_ACCOUNT_COINS_TRANSFERABLE', $db->hasColumn('accounts', 'coins_transferable'));
|
|
||||||
define('HAS_ACCOUNT_TRANSFERABLE_COINS', $db->hasColumn('accounts', 'transferable_coins'));
|
|
||||||
const ACCOUNT_COINS_TRANSFERABLE_COLUMN = (HAS_ACCOUNT_COINS_TRANSFERABLE ? 'coins_transferable' : 'transferable_coins');
|
|
||||||
|
|
||||||
$twig->addGlobal('logged', false);
|
|
||||||
$twig->addGlobal('account_logged', new \OTS_Account());
|
|
||||||
|
|
||||||
// verify myaac tables exists in database
|
// verify myaac tables exists in database
|
||||||
if(!defined('MYAAC_INSTALL') && !$db->hasTable('myaac_account_actions')) {
|
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 ' . (IS_CLI ? 'http://your-ip.com/' : BASE_URL) . 'install');
|
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
|
// execute migrations
|
||||||
$configDatabaseAutoMigrate = config('database_auto_migrate');
|
require SYSTEM . 'migrate.php';
|
||||||
if (!isset($configDatabaseAutoMigrate) || $configDatabaseAutoMigrate) {
|
|
||||||
require SYSTEM . 'migrate.php';
|
|
||||||
}
|
|
||||||
|
|
||||||
// settings
|
// settings
|
||||||
$settings = Settings::getInstance();
|
$settings = Settings::getInstance();
|
||||||
@@ -180,9 +155,6 @@ if (!isset($token) || !$token) {
|
|||||||
// deprecated config values
|
// deprecated config values
|
||||||
require_once SYSTEM . 'compat/config.php';
|
require_once SYSTEM . 'compat/config.php';
|
||||||
|
|
||||||
// deprecated classes
|
|
||||||
require_once SYSTEM . 'compat/classes.php';
|
|
||||||
|
|
||||||
date_default_timezone_set(setting('core.date_timezone'));
|
date_default_timezone_set(setting('core.date_timezone'));
|
||||||
|
|
||||||
setting(
|
setting(
|
||||||
@@ -197,17 +169,8 @@ if($settingsItemImagesURL[strlen($settingsItemImagesURL) - 1] !== '/') {
|
|||||||
setting(['core.item_images_url', $settingsItemImagesURL . '/']);
|
setting(['core.item_images_url', $settingsItemImagesURL . '/']);
|
||||||
}
|
}
|
||||||
|
|
||||||
$towns = Cache::remember('towns', 10 * 60, function () use ($db) {
|
define('USE_ACCOUNT_NAME', $db->hasColumn('accounts', 'name'));
|
||||||
if ($db->hasTable('towns') && Town::count() > 0) {
|
define('USE_ACCOUNT_NUMBER', $db->hasColumn('accounts', 'number'));
|
||||||
return Town::orderBy('id', 'ASC')->pluck('name', 'id')->toArray();
|
define('USE_ACCOUNT_SALT', $db->hasColumn('accounts', 'salt'));
|
||||||
}
|
|
||||||
|
|
||||||
return [];
|
Towns::load();
|
||||||
});
|
|
||||||
|
|
||||||
if (count($towns) <= 0) {
|
|
||||||
$towns = setting('core.towns');
|
|
||||||
}
|
|
||||||
|
|
||||||
config(['towns', $towns]);
|
|
||||||
unset($towns);
|
|
||||||
|
File diff suppressed because it is too large
Load Diff
@@ -446,13 +446,16 @@ class OTS_Account extends OTS_Row_DAO implements IteratorAggregate, Countable
|
|||||||
if(isset($this->data['premium_ends_at']) || isset($this->data['premend'])) {
|
if(isset($this->data['premium_ends_at']) || isset($this->data['premend'])) {
|
||||||
$col = isset($this->data['premium_ends_at']) ? 'premium_ends_at' : 'premend';
|
$col = isset($this->data['premium_ends_at']) ? 'premium_ends_at' : 'premend';
|
||||||
$ret = ceil(($this->data[$col] - time()) / (24 * 60 * 60));
|
$ret = ceil(($this->data[$col] - time()) / (24 * 60 * 60));
|
||||||
return max($ret, 0);
|
return $ret > 0 ? $ret : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if($this->data['premdays'] == 0) {
|
if($this->data['premdays'] == 0) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
global $config;
|
||||||
|
if(isset($config['lua']['freePremium']) && getBoolean($config['lua']['freePremium'])) return -1;
|
||||||
|
|
||||||
if($this->data['premdays'] == self::GRATIS_PREMIUM_DAYS){
|
if($this->data['premdays'] == self::GRATIS_PREMIUM_DAYS){
|
||||||
return self::GRATIS_PREMIUM_DAYS;
|
return self::GRATIS_PREMIUM_DAYS;
|
||||||
}
|
}
|
||||||
@@ -473,9 +476,12 @@ class OTS_Account extends OTS_Row_DAO implements IteratorAggregate, Countable
|
|||||||
|
|
||||||
public function isPremium()
|
public function isPremium()
|
||||||
{
|
{
|
||||||
if(isset($this->data['premium_ends_at'])) {
|
global $config;
|
||||||
return $this->data['premium_ends_at'] > time();
|
if(isset($config['lua']['freePremium']) && getBoolean($config['lua']['freePremium'])) return true;
|
||||||
}
|
|
||||||
|
if(isset($this->data['premium_ends_at'])) {
|
||||||
|
return $this->data['premium_ends_at'] > time();
|
||||||
|
}
|
||||||
|
|
||||||
if(isset($this->data['premend'])) {
|
if(isset($this->data['premend'])) {
|
||||||
return $this->data['premend'] > time();
|
return $this->data['premend'] > time();
|
||||||
@@ -1005,7 +1011,7 @@ class OTS_Account extends OTS_Row_DAO implements IteratorAggregate, Countable
|
|||||||
public function logAction($action)
|
public function logAction($action)
|
||||||
{
|
{
|
||||||
$ip = get_browser_real_ip();
|
$ip = get_browser_real_ip();
|
||||||
if(!str_contains($ip, ":")) {
|
if(strpos($ip, ":") === false) {
|
||||||
$ipv6 = '0';
|
$ipv6 = '0';
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@@ -235,30 +235,6 @@ abstract class OTS_Base_DB extends PDO implements IOTS_DB
|
|||||||
$this->exec($query);
|
$this->exec($query);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function addColumn($table, $column, $definition): void {
|
|
||||||
$this->exec('ALTER TABLE ' . $this->tableName($table) . ' ADD ' . $this->fieldName($column) . ' ' . $definition . ';');
|
|
||||||
}
|
|
||||||
|
|
||||||
public function modifyColumn($table, $column, $definition): void {
|
|
||||||
$this->exec('ALTER TABLE ' . $this->tableName($table) . ' MODIFY ' . $this->fieldName($column) . ' ' . $definition . ';');
|
|
||||||
}
|
|
||||||
|
|
||||||
public function changeColumn($table, $from, $to, $definition): void {
|
|
||||||
$this->exec('ALTER TABLE ' . $this->tableName($table) . ' CHANGE ' . $this->fieldName($from) . ' ' . $this->fieldName($to) . ' ' . $definition . ';');
|
|
||||||
}
|
|
||||||
|
|
||||||
public function dropColumn($table, $column): void {
|
|
||||||
$this->exec('ALTER TABLE ' . $this->tableName($table) . ' DROP COLUMN ' . $this->fieldName($column) . ';');
|
|
||||||
}
|
|
||||||
|
|
||||||
public function renameTable($from, $to): void {
|
|
||||||
$this->exec('RENAME TABLE ' . $this->tableName($from) . ' TO ' . $this->tableName($to) . ';');
|
|
||||||
}
|
|
||||||
|
|
||||||
public function dropTable($table, $ifExists = true): void {
|
|
||||||
$this->exec('DROP TABLE ' . ($ifExists ? 'IF EXISTS' : '') . ' ' . $this->tableName($table) . ';');
|
|
||||||
}
|
|
||||||
/**
|
/**
|
||||||
* LIMIT/OFFSET clause for queries.
|
* LIMIT/OFFSET clause for queries.
|
||||||
*
|
*
|
||||||
|
@@ -53,49 +53,49 @@ class OTS_DB_MySQL extends OTS_Base_DB
|
|||||||
* @param array $params Connection parameters.
|
* @param array $params Connection parameters.
|
||||||
* @throws PDOException On PDO operation error.
|
* @throws PDOException On PDO operation error.
|
||||||
*/
|
*/
|
||||||
public function __construct($params)
|
public function __construct($params)
|
||||||
{
|
{
|
||||||
$user = null;
|
$user = null;
|
||||||
$password = null;
|
$password = null;
|
||||||
$dns = array();
|
$dns = array();
|
||||||
|
|
||||||
// host:port support
|
// host:port support
|
||||||
if( strpos(':', $params['host']) !== false)
|
if( strpos(':', $params['host']) !== false)
|
||||||
{
|
{
|
||||||
$host = explode(':', $params['host'], 2);
|
$host = explode(':', $params['host'], 2);
|
||||||
|
|
||||||
$params['host'] = $host[0];
|
$params['host'] = $host[0];
|
||||||
$params['port'] = $host[1];
|
$params['port'] = $host[1];
|
||||||
}
|
}
|
||||||
|
|
||||||
if( isset($params['database']) )
|
if( isset($params['database']) )
|
||||||
{
|
{
|
||||||
$dns[] = 'dbname=' . $params['database'];
|
$dns[] = 'dbname=' . $params['database'];
|
||||||
}
|
}
|
||||||
|
|
||||||
if( isset($params['user']) )
|
if( isset($params['user']) )
|
||||||
{
|
{
|
||||||
$user = $params['user'];
|
$user = $params['user'];
|
||||||
}
|
}
|
||||||
|
|
||||||
if( isset($params['password']) )
|
if( isset($params['password']) )
|
||||||
{
|
{
|
||||||
$password = $params['password'];
|
$password = $params['password'];
|
||||||
}
|
}
|
||||||
|
|
||||||
if( isset($params['prefix']) )
|
if( isset($params['prefix']) )
|
||||||
{
|
{
|
||||||
$this->prefix = $params['prefix'];
|
$this->prefix = $params['prefix'];
|
||||||
}
|
}
|
||||||
|
|
||||||
if( isset($params['log']) && $params['log'] )
|
if( isset($params['log']) && $params['log'] )
|
||||||
{
|
{
|
||||||
$this->logged = true;
|
$this->logged = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( !isset($params['persistent']) ) {
|
if( !isset($params['persistent']) ) {
|
||||||
$params['persistent'] = false;
|
$params['persistent'] = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
global $config;
|
global $config;
|
||||||
$cache = Cache::getInstance();
|
$cache = Cache::getInstance();
|
||||||
@@ -144,10 +144,10 @@ class OTS_DB_MySQL extends OTS_Base_DB
|
|||||||
}
|
}
|
||||||
|
|
||||||
parent::__construct('mysql:' . implode(';', $dns), $user, $password, $driverAttributes);
|
parent::__construct('mysql:' . implode(';', $dns), $user, $password, $driverAttributes);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function __destruct()
|
public function __destruct()
|
||||||
{
|
{
|
||||||
global $config;
|
global $config;
|
||||||
|
|
||||||
$cache = Cache::getInstance();
|
$cache = Cache::getInstance();
|
||||||
@@ -165,8 +165,7 @@ class OTS_DB_MySQL extends OTS_Base_DB
|
|||||||
}
|
}
|
||||||
|
|
||||||
if($this->logged) {
|
if($this->logged) {
|
||||||
$currentScript = $_SERVER['REQUEST_URI'] ?? $_SERVER['SCRIPT_FILENAME'];
|
log_append('database.log', $_SERVER['REQUEST_URI'] . PHP_EOL . $this->getLog());
|
||||||
log_append('database.log', $currentScript . PHP_EOL . $this->getLog());
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -176,10 +175,10 @@ class OTS_DB_MySQL extends OTS_Base_DB
|
|||||||
* @param string $name Field name.
|
* @param string $name Field name.
|
||||||
* @return string Quoted name.
|
* @return string Quoted name.
|
||||||
*/
|
*/
|
||||||
public function fieldName($name)
|
public function fieldName($name)
|
||||||
{
|
{
|
||||||
return '`' . $name . '`';
|
return '`' . $name . '`';
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* LIMIT/OFFSET clause for queries.
|
* LIMIT/OFFSET clause for queries.
|
||||||
@@ -188,26 +187,26 @@ class OTS_DB_MySQL extends OTS_Base_DB
|
|||||||
* @param int|bool $offset Number of rows to be skipped before applying query effects (false if no offset).
|
* @param int|bool $offset Number of rows to be skipped before applying query effects (false if no offset).
|
||||||
* @return string LIMIT/OFFSET SQL clause for query.
|
* @return string LIMIT/OFFSET SQL clause for query.
|
||||||
*/
|
*/
|
||||||
public function limit($limit = false, $offset = false)
|
public function limit($limit = false, $offset = false)
|
||||||
{
|
{
|
||||||
// by default this is empty part
|
// by default this is empty part
|
||||||
$sql = '';
|
$sql = '';
|
||||||
|
|
||||||
if($limit !== false)
|
if($limit !== false)
|
||||||
{
|
{
|
||||||
$sql = ' LIMIT ';
|
$sql = ' LIMIT ';
|
||||||
|
|
||||||
// OFFSET has no effect if there is no LIMIT
|
// OFFSET has no effect if there is no LIMIT
|
||||||
if($offset !== false)
|
if($offset !== false)
|
||||||
{
|
{
|
||||||
$sql .= $offset . ', ';
|
$sql .= $offset . ', ';
|
||||||
}
|
}
|
||||||
|
|
||||||
$sql .= $limit;
|
$sql .= $limit;
|
||||||
}
|
}
|
||||||
|
|
||||||
return $sql;
|
return $sql;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function hasTable($name) {
|
public function hasTable($name) {
|
||||||
if(isset($this->has_table_cache[$name])) {
|
if(isset($this->has_table_cache[$name])) {
|
||||||
@@ -234,19 +233,6 @@ class OTS_DB_MySQL extends OTS_Base_DB
|
|||||||
return $this->hasTable($table) && ($this->has_column_cache[$table . '.' . $column] = count($this->query('SHOW COLUMNS FROM `' . $table . "` LIKE '" . $column . "'")->fetchAll()) > 0);
|
return $this->hasTable($table) && ($this->has_column_cache[$table . '.' . $column] = count($this->query('SHOW COLUMNS FROM `' . $table . "` LIKE '" . $column . "'")->fetchAll()) > 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function hasTableAndColumns(string $table, array $columns = []): bool
|
|
||||||
{
|
|
||||||
if (!$this->hasTable($table)) return false;
|
|
||||||
|
|
||||||
foreach ($columns as $column) {
|
|
||||||
if (!$this->hasColumn($table, $column)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function revalidateCache() {
|
public function revalidateCache() {
|
||||||
foreach($this->has_table_cache as $key => $value) {
|
foreach($this->has_table_cache as $key => $value) {
|
||||||
$this->hasTableInternal($key);
|
$this->hasTableInternal($key);
|
||||||
|
@@ -97,7 +97,7 @@ class OTS_Guild extends OTS_Row_DAO implements IteratorAggregate, Countable
|
|||||||
*
|
*
|
||||||
* @param IOTS_GuildAction $invites Invites driver (don't pass it to clear driver).
|
* @param IOTS_GuildAction $invites Invites driver (don't pass it to clear driver).
|
||||||
*/
|
*/
|
||||||
public function setInvitesDriver(?IOTS_GuildAction $invites = null)
|
public function setInvitesDriver(IOTS_GuildAction $invites = null)
|
||||||
{
|
{
|
||||||
$this->invites = $invites;
|
$this->invites = $invites;
|
||||||
}
|
}
|
||||||
@@ -107,7 +107,7 @@ class OTS_Guild extends OTS_Row_DAO implements IteratorAggregate, Countable
|
|||||||
*
|
*
|
||||||
* @param IOTS_GuildAction $requests Membership requests driver (don't pass it to clear driver).
|
* @param IOTS_GuildAction $requests Membership requests driver (don't pass it to clear driver).
|
||||||
*/
|
*/
|
||||||
public function setRequestsDriver(?IOTS_GuildAction $requests = null)
|
public function setRequestsDriver(IOTS_GuildAction $requests = null)
|
||||||
{
|
{
|
||||||
$this->requests = $requests;
|
$this->requests = $requests;
|
||||||
}
|
}
|
||||||
|
@@ -60,7 +60,7 @@ class OTS_GuildRank extends OTS_Row_DAO implements IteratorAggregate, Countable
|
|||||||
* @throws PDOException On PDO operation error.
|
* @throws PDOException On PDO operation error.
|
||||||
* @throws E_OTS_NotLoaded If given <var>$guild</var> object is not loaded.
|
* @throws E_OTS_NotLoaded If given <var>$guild</var> object is not loaded.
|
||||||
*/
|
*/
|
||||||
public function find($name, ?OTS_Guild $guild = null)
|
public function find($name, OTS_Guild $guild = null)
|
||||||
{
|
{
|
||||||
$where = '';
|
$where = '';
|
||||||
|
|
||||||
|
@@ -15,11 +15,11 @@
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Wrapper for 'info' respond's DOMDocument.
|
* Wrapper for 'info' respond's DOMDocument.
|
||||||
*
|
*
|
||||||
* <p>
|
* <p>
|
||||||
* Note: as this class extends DOMDocument class and contains exacly respond XML tree you can work on it as on normal DOM tree.
|
* Note: as this class extends DOMDocument class and contains exacly respond XML tree you can work on it as on normal DOM tree.
|
||||||
* </p>
|
* </p>
|
||||||
*
|
*
|
||||||
* @package POT
|
* @package POT
|
||||||
* @version 0.1.0
|
* @version 0.1.0
|
||||||
* @property-read string $tspqVersion Root element version.
|
* @property-read string $tspqVersion Root element version.
|
||||||
@@ -48,257 +48,252 @@ class OTS_InfoRespond extends DOMDocument
|
|||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* Returns version of root element.
|
* Returns version of root element.
|
||||||
*
|
*
|
||||||
* @return string TSPQ version.
|
* @return string TSPQ version.
|
||||||
* @throws DOMException On DOM operation error.
|
* @throws DOMException On DOM operation error.
|
||||||
*/
|
*/
|
||||||
public function getTSPQVersion()
|
public function getTSPQVersion()
|
||||||
{
|
{
|
||||||
return $this->documentElement->getAttribute('version');
|
return $this->documentElement->getAttribute('version');
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns server uptime.
|
* Returns server uptime.
|
||||||
*
|
*
|
||||||
* @return int Uptime.
|
* @return int Uptime.
|
||||||
* @throws DOMException On DOM operation error.
|
* @throws DOMException On DOM operation error.
|
||||||
*/
|
*/
|
||||||
public function getUptime()
|
public function getUptime()
|
||||||
{
|
{
|
||||||
return (int) $this->documentElement->getElementsByTagName('serverinfo')->item(0)->getAttribute('uptime');
|
return (int) $this->documentElement->getElementsByTagName('serverinfo')->item(0)->getAttribute('uptime');
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns server IP.
|
* Returns server IP.
|
||||||
*
|
*
|
||||||
* @return string IP.
|
* @return string IP.
|
||||||
* @throws DOMException On DOM operation error.
|
* @throws DOMException On DOM operation error.
|
||||||
*/
|
*/
|
||||||
public function getIP()
|
public function getIP()
|
||||||
{
|
{
|
||||||
return $this->documentElement->getElementsByTagName('serverinfo')->item(0)->getAttribute('ip');
|
return $this->documentElement->getElementsByTagName('serverinfo')->item(0)->getAttribute('ip');
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns server name.
|
* Returns server name.
|
||||||
*
|
*
|
||||||
* @return string Name.
|
* @return string Name.
|
||||||
* @throws DOMException On DOM operation error.
|
* @throws DOMException On DOM operation error.
|
||||||
*/
|
*/
|
||||||
public function getName()
|
public function getName()
|
||||||
{
|
{
|
||||||
return $this->documentElement->getElementsByTagName('serverinfo')->item(0)->getAttribute('servername');
|
return $this->documentElement->getElementsByTagName('serverinfo')->item(0)->getAttribute('servername');
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns server port.
|
* Returns server port.
|
||||||
*
|
*
|
||||||
* @return int Port.
|
* @return int Port.
|
||||||
* @throws DOMException On DOM operation error.
|
* @throws DOMException On DOM operation error.
|
||||||
*/
|
*/
|
||||||
public function getPort()
|
public function getPort()
|
||||||
{
|
{
|
||||||
return (int) $this->documentElement->getElementsByTagName('serverinfo')->item(0)->getAttribute('port');
|
return (int) $this->documentElement->getElementsByTagName('serverinfo')->item(0)->getAttribute('port');
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns server location.
|
* Returns server location.
|
||||||
*
|
*
|
||||||
* @return string Location.
|
* @return string Location.
|
||||||
* @throws DOMException On DOM operation error.
|
* @throws DOMException On DOM operation error.
|
||||||
*/
|
*/
|
||||||
public function getLocation()
|
public function getLocation()
|
||||||
{
|
{
|
||||||
return $this->documentElement->getElementsByTagName('serverinfo')->item(0)->getAttribute('location');
|
return $this->documentElement->getElementsByTagName('serverinfo')->item(0)->getAttribute('location');
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns server website.
|
* Returns server website.
|
||||||
*
|
*
|
||||||
* @return string Website URL.
|
* @return string Website URL.
|
||||||
* @throws DOMException On DOM operation error.
|
* @throws DOMException On DOM operation error.
|
||||||
*/
|
*/
|
||||||
public function getURL()
|
public function getURL()
|
||||||
{
|
{
|
||||||
return $this->documentElement->getElementsByTagName('serverinfo')->item(0)->getAttribute('url');
|
return $this->documentElement->getElementsByTagName('serverinfo')->item(0)->getAttribute('url');
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns server attribute.
|
* Returns server attribute.
|
||||||
*
|
*
|
||||||
* I have no idea what the hell is it representing :P.
|
* I have no idea what the hell is it representing :P.
|
||||||
*
|
*
|
||||||
* @return string Attribute value.
|
* @return string Attribute value.
|
||||||
* @throws DOMException On DOM operation error.
|
* @throws DOMException On DOM operation error.
|
||||||
*/
|
*/
|
||||||
public function getServer()
|
public function getServer()
|
||||||
{
|
{
|
||||||
return $this->documentElement->getElementsByTagName('serverinfo')->item(0)->getAttribute('server');
|
return $this->documentElement->getElementsByTagName('serverinfo')->item(0)->getAttribute('server');
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns server version.
|
* Returns server version.
|
||||||
*
|
*
|
||||||
* @return string Version.
|
* @return string Version.
|
||||||
* @throws DOMException On DOM operation error.
|
* @throws DOMException On DOM operation error.
|
||||||
*/
|
*/
|
||||||
public function getServerVersion()
|
public function getServerVersion()
|
||||||
{
|
{
|
||||||
return $this->documentElement->getElementsByTagName('serverinfo')->item(0)->getAttribute('version');
|
return $this->documentElement->getElementsByTagName('serverinfo')->item(0)->getAttribute('version');
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns dedicated version of client.
|
* Returns dedicated version of client.
|
||||||
*
|
*
|
||||||
* @return string Version.
|
* @return string Version.
|
||||||
* @throws DOMException On DOM operation error.
|
* @throws DOMException On DOM operation error.
|
||||||
*/
|
*/
|
||||||
public function getClientVersion()
|
public function getClientVersion()
|
||||||
{
|
{
|
||||||
return $this->documentElement->getElementsByTagName('serverinfo')->item(0)->getAttribute('client');
|
return $this->documentElement->getElementsByTagName('serverinfo')->item(0)->getAttribute('client');
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns owner name.
|
* Returns owner name.
|
||||||
*
|
*
|
||||||
* @return string Owner name.
|
* @return string Owner name.
|
||||||
* @throws DOMException On DOM operation error.
|
* @throws DOMException On DOM operation error.
|
||||||
*/
|
*/
|
||||||
public function getOwner()
|
public function getOwner()
|
||||||
{
|
{
|
||||||
return $this->documentElement->getElementsByTagName('owner')->item(0)->getAttribute('name');
|
return $this->documentElement->getElementsByTagName('owner')->item(0)->getAttribute('name');
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns owner e-mail.
|
* Returns owner e-mail.
|
||||||
*
|
*
|
||||||
* @return string Owner e-mail.
|
* @return string Owner e-mail.
|
||||||
* @throws DOMException On DOM operation error.
|
* @throws DOMException On DOM operation error.
|
||||||
*/
|
*/
|
||||||
public function getEMail()
|
public function getEMail()
|
||||||
{
|
{
|
||||||
return $this->documentElement->getElementsByTagName('owner')->item(0)->getAttribute('email');
|
return $this->documentElement->getElementsByTagName('owner')->item(0)->getAttribute('email');
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns current amount of players online.
|
* Returns current amount of players online.
|
||||||
*
|
*
|
||||||
* @return int Count of players.
|
* @return int Count of players.
|
||||||
* @throws DOMException On DOM operation error.
|
* @throws DOMException On DOM operation error.
|
||||||
*/
|
*/
|
||||||
public function getOnlinePlayers()
|
public function getOnlinePlayers()
|
||||||
{
|
{
|
||||||
return (int) $this->documentElement->getElementsByTagName('players')->item(0)->getAttribute('online');
|
return (int) $this->documentElement->getElementsByTagName('players')->item(0)->getAttribute('online');
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns maximum amount of players online.
|
* Returns maximum amount of players online.
|
||||||
*
|
*
|
||||||
* @return int Maximum allowed count of players.
|
* @return int Maximum allowed count of players.
|
||||||
* @throws DOMException On DOM operation error.
|
* @throws DOMException On DOM operation error.
|
||||||
*/
|
*/
|
||||||
public function getMaxPlayers()
|
public function getMaxPlayers()
|
||||||
{
|
{
|
||||||
return (int) $this->documentElement->getElementsByTagName('players')->item(0)->getAttribute('max');
|
return (int) $this->documentElement->getElementsByTagName('players')->item(0)->getAttribute('max');
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns record of online players.
|
* Returns record of online players.
|
||||||
*
|
*
|
||||||
* @return int Players online record.
|
* @return int Players online record.
|
||||||
* @throws DOMException On DOM operation error.
|
* @throws DOMException On DOM operation error.
|
||||||
*/
|
*/
|
||||||
public function getPlayersPeak()
|
public function getPlayersPeak()
|
||||||
{
|
{
|
||||||
return (int) $this->documentElement->getElementsByTagName('players')->item(0)->getAttribute('peak');
|
return (int) $this->documentElement->getElementsByTagName('players')->item(0)->getAttribute('peak');
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns number of all monsters on map.
|
* Returns number of all monsters on map.
|
||||||
*
|
*
|
||||||
* @return int Count of monsters.
|
* @return int Count of monsters.
|
||||||
* @throws DOMException On DOM operation error.
|
* @throws DOMException On DOM operation error.
|
||||||
*/
|
*/
|
||||||
public function getMonstersCount(): int
|
public function getMonstersCount()
|
||||||
{
|
{
|
||||||
return (int) $this->documentElement->getElementsByTagName('monsters')->item(0)->getAttribute('total');
|
return (int) $this->documentElement->getElementsByTagName('monsters')->item(0)->getAttribute('total');
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getNPCsCount(): int
|
|
||||||
{
|
|
||||||
return (int) $this->documentElement->getElementsByTagName('npcs')->item(0)->getAttribute('total');
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns map name.
|
* Returns map name.
|
||||||
*
|
*
|
||||||
* @return string Map name.
|
* @return string Map name.
|
||||||
* @throws DOMException On DOM operation error.
|
* @throws DOMException On DOM operation error.
|
||||||
*/
|
*/
|
||||||
public function getMapName()
|
public function getMapName()
|
||||||
{
|
{
|
||||||
return $this->documentElement->getElementsByTagName('map')->item(0)->getAttribute('name');
|
return $this->documentElement->getElementsByTagName('map')->item(0)->getAttribute('name');
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns map author.
|
* Returns map author.
|
||||||
*
|
*
|
||||||
* @return string Mapper name.
|
* @return string Mapper name.
|
||||||
* @throws DOMException On DOM operation error.
|
* @throws DOMException On DOM operation error.
|
||||||
*/
|
*/
|
||||||
public function getMapAuthor()
|
public function getMapAuthor()
|
||||||
{
|
{
|
||||||
return $this->documentElement->getElementsByTagName('map')->item(0)->getAttribute('author');
|
return $this->documentElement->getElementsByTagName('map')->item(0)->getAttribute('author');
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns map width.
|
* Returns map width.
|
||||||
*
|
*
|
||||||
* @return int Map width.
|
* @return int Map width.
|
||||||
* @throws DOMException On DOM operation error.
|
* @throws DOMException On DOM operation error.
|
||||||
*/
|
*/
|
||||||
public function getMapWidth()
|
public function getMapWidth()
|
||||||
{
|
{
|
||||||
return (int) $this->documentElement->getElementsByTagName('map')->item(0)->getAttribute('width');
|
return (int) $this->documentElement->getElementsByTagName('map')->item(0)->getAttribute('width');
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns map height.
|
* Returns map height.
|
||||||
*
|
*
|
||||||
* @return int Map height.
|
* @return int Map height.
|
||||||
* @throws DOMException On DOM operation error.
|
* @throws DOMException On DOM operation error.
|
||||||
*/
|
*/
|
||||||
public function getMapHeight()
|
public function getMapHeight()
|
||||||
{
|
{
|
||||||
return (int) $this->documentElement->getElementsByTagName('map')->item(0)->getAttribute('height');
|
return (int) $this->documentElement->getElementsByTagName('map')->item(0)->getAttribute('height');
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns server's Message Of The Day
|
* Returns server's Message Of The Day
|
||||||
*
|
*
|
||||||
* @version 0.1.0
|
* @version 0.1.0
|
||||||
* @return string Server MOTD.
|
* @return string Server MOTD.
|
||||||
* @throws DOMException On DOM operation error.
|
* @throws DOMException On DOM operation error.
|
||||||
*/
|
*/
|
||||||
public function getMOTD()
|
public function getMOTD()
|
||||||
{
|
{
|
||||||
// look for text node child
|
// look for text node child
|
||||||
foreach( $this->documentElement->getElementsByTagName('motd')->item(0)->childNodes as $child)
|
foreach( $this->documentElement->getElementsByTagName('motd')->item(0)->childNodes as $child)
|
||||||
{
|
{
|
||||||
if($child->nodeType == XML_TEXT_NODE)
|
if($child->nodeType == XML_TEXT_NODE)
|
||||||
{
|
{
|
||||||
// found
|
// found
|
||||||
return $child->nodeValue;
|
return $child->nodeValue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// strange...
|
// strange...
|
||||||
return '';
|
return '';
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Magic PHP5 method.
|
* Magic PHP5 method.
|
||||||
*
|
*
|
||||||
* @version 0.1.0
|
* @version 0.1.0
|
||||||
* @since 0.1.0
|
* @since 0.1.0
|
||||||
* @param string $name Property name.
|
* @param string $name Property name.
|
||||||
@@ -306,89 +301,89 @@ class OTS_InfoRespond extends DOMDocument
|
|||||||
* @throws OutOfBoundsException For non-supported properties.
|
* @throws OutOfBoundsException For non-supported properties.
|
||||||
* @throws DOMException On DOM operation error.
|
* @throws DOMException On DOM operation error.
|
||||||
*/
|
*/
|
||||||
public function __get($name)
|
public function __get($name)
|
||||||
{
|
{
|
||||||
switch($name)
|
switch($name)
|
||||||
{
|
{
|
||||||
case 'tspqVersion':
|
case 'tspqVersion':
|
||||||
return $this->getTSPQVersion();
|
return $this->getTSPQVersion();
|
||||||
|
|
||||||
case 'uptime':
|
case 'uptime':
|
||||||
return $this->getUptime();
|
return $this->getUptime();
|
||||||
|
|
||||||
case 'ip':
|
case 'ip':
|
||||||
return $this->getIP();
|
return $this->getIP();
|
||||||
|
|
||||||
case 'name':
|
case 'name':
|
||||||
return $this->getName();
|
return $this->getName();
|
||||||
|
|
||||||
case 'port':
|
case 'port':
|
||||||
return $this->getPort();
|
return $this->getPort();
|
||||||
|
|
||||||
case 'location':
|
case 'location':
|
||||||
return $this->getLocation();
|
return $this->getLocation();
|
||||||
|
|
||||||
case 'url':
|
case 'url':
|
||||||
return $this->getURL();
|
return $this->getURL();
|
||||||
|
|
||||||
case 'server':
|
case 'server':
|
||||||
return $this->getServer();
|
return $this->getServer();
|
||||||
|
|
||||||
case 'serverVersion':
|
case 'serverVersion':
|
||||||
return $this->getServerVersion();
|
return $this->getServerVersion();
|
||||||
|
|
||||||
case 'clientVersion':
|
case 'clientVersion':
|
||||||
return $this->getClientVersion();
|
return $this->getClientVersion();
|
||||||
|
|
||||||
case 'owner':
|
case 'owner':
|
||||||
return $this->getOwner();
|
return $this->getOwner();
|
||||||
|
|
||||||
case 'eMail':
|
case 'eMail':
|
||||||
return $this->getEMail();
|
return $this->getEMail();
|
||||||
|
|
||||||
case 'onlinePlayers':
|
case 'onlinePlayers':
|
||||||
return $this->getOnlinePlayers();
|
return $this->getOnlinePlayers();
|
||||||
|
|
||||||
case 'maxPlayers':
|
case 'maxPlayers':
|
||||||
return $this->getMaxPlayers();
|
return $this->getMaxPlayers();
|
||||||
|
|
||||||
case 'playersPeak':
|
case 'playersPeak':
|
||||||
return $this->getPlayersPeak();
|
return $this->getPlayersPeak();
|
||||||
|
|
||||||
case 'monstersCount':
|
case 'monstersCount':
|
||||||
return $this->getMonstersCount();
|
return $this->getMonstersCount();
|
||||||
|
|
||||||
case 'mapName':
|
case 'mapName':
|
||||||
return $this->getMapName();
|
return $this->getMapName();
|
||||||
|
|
||||||
case 'mapAuthor':
|
case 'mapAuthor':
|
||||||
return $this->getMapAuthor();
|
return $this->getMapAuthor();
|
||||||
|
|
||||||
case 'mapWidth':
|
case 'mapWidth':
|
||||||
return $this->getMapWidth();
|
return $this->getMapWidth();
|
||||||
|
|
||||||
case 'mapHeight':
|
case 'mapHeight':
|
||||||
return $this->getMapHeight();
|
return $this->getMapHeight();
|
||||||
|
|
||||||
case 'motd':
|
case 'motd':
|
||||||
return $this->getMOTD();
|
return $this->getMOTD();
|
||||||
|
|
||||||
default:
|
default:
|
||||||
throw new OutOfBoundsException();
|
throw new OutOfBoundsException();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns string representation of XML.
|
* Returns string representation of XML.
|
||||||
*
|
*
|
||||||
* @version 0.1.0
|
* @version 0.1.0
|
||||||
* @since 0.1.0
|
* @since 0.1.0
|
||||||
* @return string String representation of object.
|
* @return string String representation of object.
|
||||||
*/
|
*/
|
||||||
public function __toString()
|
public function __toString()
|
||||||
{
|
{
|
||||||
return $this->saveXML();
|
return $this->saveXML();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**#@-*/
|
/**#@-*/
|
||||||
|
@@ -284,7 +284,7 @@ class OTS_Monster extends DOMDocument
|
|||||||
*/
|
*/
|
||||||
public function getLook()
|
public function getLook()
|
||||||
{
|
{
|
||||||
$look = [];
|
$look = array();
|
||||||
|
|
||||||
$element = $this->documentElement->getElementsByTagName('look')->item(0);
|
$element = $this->documentElement->getElementsByTagName('look')->item(0);
|
||||||
|
|
||||||
@@ -292,30 +292,14 @@ class OTS_Monster extends DOMDocument
|
|||||||
return $look;
|
return $look;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($element->hasAttribute('typeex')) {
|
$look['type'] = $element->getAttribute('type');
|
||||||
$look['typeEx'] = (int) $element->getAttribute('typeex');
|
$look['typeex'] = $element->getAttribute('typeex');
|
||||||
}
|
$look['head'] = $element->getAttribute('head');
|
||||||
if ($element->hasAttribute('type')) {
|
$look['body'] = $element->getAttribute('body');
|
||||||
$look['type'] = (int) $element->getAttribute('type');
|
$look['legs'] = $element->getAttribute('legs');
|
||||||
}
|
$look['feet'] = $element->getAttribute('feet');
|
||||||
if ($element->hasAttribute('head')) {
|
$look['addons'] = $element->getAttribute('addons');
|
||||||
$look['head'] = (int) $element->getAttribute('head');
|
$look['corpse'] = $element->getAttribute('corpse');
|
||||||
}
|
|
||||||
if ($element->hasAttribute('body')) {
|
|
||||||
$look['body'] = (int) $element->getAttribute('body');
|
|
||||||
}
|
|
||||||
if ($element->hasAttribute('legs')) {
|
|
||||||
$look['legs'] = (int) $element->getAttribute('legs');
|
|
||||||
}
|
|
||||||
if ($element->hasAttribute('feet')) {
|
|
||||||
$look['feet'] = (int) $element->getAttribute('feet');
|
|
||||||
}
|
|
||||||
if ($element->hasAttribute('addons')) {
|
|
||||||
$look['addons'] = (int) $element->getAttribute('addons');
|
|
||||||
}
|
|
||||||
if ($element->hasAttribute('corpse')) {
|
|
||||||
$look['corpse'] = (int) $element->getAttribute('corpse');
|
|
||||||
}
|
|
||||||
|
|
||||||
return $look;
|
return $look;
|
||||||
}
|
}
|
||||||
|
File diff suppressed because it is too large
Load Diff
@@ -26,19 +26,14 @@ class OTS_ServerInfo
|
|||||||
*
|
*
|
||||||
* @var string
|
* @var string
|
||||||
*/
|
*/
|
||||||
private string $server;
|
private $server;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Connection port.
|
* Connection port.
|
||||||
*
|
*
|
||||||
* @var int
|
* @var int
|
||||||
*/
|
*/
|
||||||
private int $port;
|
private $port;
|
||||||
|
|
||||||
/**
|
|
||||||
* Status timeout
|
|
||||||
*/
|
|
||||||
private float $timeout = 2.0;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates handler for new server.
|
* Creates handler for new server.
|
||||||
@@ -46,11 +41,11 @@ class OTS_ServerInfo
|
|||||||
* @param string $server Server IP/domain.
|
* @param string $server Server IP/domain.
|
||||||
* @param int $port OTServ port.
|
* @param int $port OTServ port.
|
||||||
*/
|
*/
|
||||||
public function __construct($server, $port)
|
public function __construct($server, $port)
|
||||||
{
|
{
|
||||||
$this->server = $server;
|
$this->server = $server;
|
||||||
$this->port = $port;
|
$this->port = $port;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sends packet to server.
|
* Sends packet to server.
|
||||||
@@ -59,46 +54,46 @@ class OTS_ServerInfo
|
|||||||
* @return OTS_Buffer|null Respond buffer (null if server is offline).
|
* @return OTS_Buffer|null Respond buffer (null if server is offline).
|
||||||
* @throws E_OTS_OutOfBuffer When there is read attemp after end of packet stream.
|
* @throws E_OTS_OutOfBuffer When there is read attemp after end of packet stream.
|
||||||
*/
|
*/
|
||||||
private function send(OTS_Buffer $packet)
|
private function send(OTS_Buffer $packet)
|
||||||
{
|
{
|
||||||
// connects to server
|
// connects to server
|
||||||
$socket = @fsockopen($this->server, $this->port, $error, $message, $this->timeout);
|
$socket = @fsockopen($this->server, $this->port, $error, $message, setting('core.status_timeout'));
|
||||||
|
|
||||||
// if connected then checking statistics
|
// if connected then checking statistics
|
||||||
if($socket)
|
if($socket)
|
||||||
{
|
{
|
||||||
// sets 5 second timeout for reading and writing
|
// sets 5 second timeout for reading and writing
|
||||||
stream_set_timeout($socket, 5);
|
stream_set_timeout($socket, 5);
|
||||||
|
|
||||||
// creates real packet
|
// creates real packet
|
||||||
$packet = $packet->getBuffer();
|
$packet = $packet->getBuffer();
|
||||||
$packet = pack('v', strlen($packet) ) . $packet;
|
$packet = pack('v', strlen($packet) ) . $packet;
|
||||||
|
|
||||||
// sends packet with request
|
// sends packet with request
|
||||||
// 06 - length of packet, 255, 255 is the comamnd identifier, 'info' is a request
|
// 06 - length of packet, 255, 255 is the comamnd identifier, 'info' is a request
|
||||||
fwrite($socket, $packet);
|
fwrite($socket, $packet);
|
||||||
|
|
||||||
// reads respond
|
// reads respond
|
||||||
//$data = stream_get_contents($socket);
|
//$data = stream_get_contents($socket);
|
||||||
$data = '';
|
$data = '';
|
||||||
while (!feof($socket))
|
while (!feof($socket))
|
||||||
$data .= fgets($socket, 1024);
|
$data .= fgets($socket, 1024);
|
||||||
|
|
||||||
// closing connection to current server
|
// closing connection to current server
|
||||||
fclose($socket);
|
fclose($socket);
|
||||||
|
|
||||||
// sometimes server returns empty info
|
// sometimes server returns empty info
|
||||||
if( empty($data) )
|
if( empty($data) )
|
||||||
{
|
{
|
||||||
// returns offline state
|
// returns offline state
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
return new OTS_Buffer($data);
|
return new OTS_Buffer($data);
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Queries server status.
|
* Queries server status.
|
||||||
@@ -113,30 +108,30 @@ class OTS_ServerInfo
|
|||||||
* @example examples/info.php info.php
|
* @example examples/info.php info.php
|
||||||
* @tutorial POT/Server_status.pkg
|
* @tutorial POT/Server_status.pkg
|
||||||
*/
|
*/
|
||||||
public function status()
|
public function status()
|
||||||
{
|
{
|
||||||
// request packet
|
// request packet
|
||||||
$request = new OTS_Buffer();
|
$request = new OTS_Buffer();
|
||||||
$request->putChar(255);
|
$request->putChar(255);
|
||||||
$request->putChar(255);
|
$request->putChar(255);
|
||||||
$request->putString('info', false);
|
$request->putString('info', false);
|
||||||
|
|
||||||
$status = $this->send($request);
|
$status = $this->send($request);
|
||||||
|
|
||||||
// checks if server is online
|
// checks if server is online
|
||||||
if($status)
|
if($status)
|
||||||
{
|
{
|
||||||
// loads respond XML
|
// loads respond XML
|
||||||
$info = new OTS_InfoRespond();
|
$info = new OTS_InfoRespond();
|
||||||
if(!$info->loadXML( $status->getBuffer()))
|
if(!$info->loadXML( $status->getBuffer()))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
return $info;
|
return $info;
|
||||||
}
|
}
|
||||||
|
|
||||||
// offline
|
// offline
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Queries server information.
|
* Queries server information.
|
||||||
@@ -151,26 +146,26 @@ class OTS_ServerInfo
|
|||||||
* @example examples/server.php info.php
|
* @example examples/server.php info.php
|
||||||
* @tutorial POT/Server_status.pkg
|
* @tutorial POT/Server_status.pkg
|
||||||
*/
|
*/
|
||||||
public function info($flags)
|
public function info($flags)
|
||||||
{
|
{
|
||||||
// request packet
|
// request packet
|
||||||
$request = new OTS_Buffer();
|
$request = new OTS_Buffer();
|
||||||
$request->putChar(255);
|
$request->putChar(255);
|
||||||
$request->putChar(1);
|
$request->putChar(1);
|
||||||
$request->putShort($flags);
|
$request->putShort($flags);
|
||||||
|
|
||||||
$status = $this->send($request);
|
$status = $this->send($request);
|
||||||
|
|
||||||
// checks if server is online
|
// checks if server is online
|
||||||
if($status)
|
if($status)
|
||||||
{
|
{
|
||||||
// loads respond
|
// loads respond
|
||||||
return new OTS_ServerStatus($status);
|
return new OTS_ServerStatus($status);
|
||||||
}
|
}
|
||||||
|
|
||||||
// offline
|
// offline
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Checks player online status.
|
* Checks player online status.
|
||||||
@@ -185,27 +180,27 @@ class OTS_ServerInfo
|
|||||||
* @example examples/server.php info.php
|
* @example examples/server.php info.php
|
||||||
* @tutorial POT/Server_status.pkg
|
* @tutorial POT/Server_status.pkg
|
||||||
*/
|
*/
|
||||||
public function playerStatus($name)
|
public function playerStatus($name)
|
||||||
{
|
{
|
||||||
// request packet
|
// request packet
|
||||||
$request = new OTS_Buffer();
|
$request = new OTS_Buffer();
|
||||||
$request->putChar(255);
|
$request->putChar(255);
|
||||||
$request->putChar(1);
|
$request->putChar(1);
|
||||||
$request->putShort(OTS_ServerStatus::REQUEST_PLAYER_STATUS_INFO);
|
$request->putShort(OTS_ServerStatus::REQUEST_PLAYER_STATUS_INFO);
|
||||||
$request->putString($name);
|
$request->putString($name);
|
||||||
|
|
||||||
$status = $this->send($request);
|
$status = $this->send($request);
|
||||||
|
|
||||||
// checks if server is online
|
// checks if server is online
|
||||||
if($status)
|
if($status)
|
||||||
{
|
{
|
||||||
$status->getChar();
|
$status->getChar();
|
||||||
return (bool) $status->getChar();
|
return (bool) $status->getChar();
|
||||||
}
|
}
|
||||||
|
|
||||||
// offline
|
// offline
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Magic PHP5 method.
|
* Magic PHP5 method.
|
||||||
@@ -215,24 +210,20 @@ class OTS_ServerInfo
|
|||||||
* @throws OutOfBoundsException For non-supported properties.
|
* @throws OutOfBoundsException For non-supported properties.
|
||||||
* @throws E_OTS_OutOfBuffer When there is read attemp after end of packet stream.
|
* @throws E_OTS_OutOfBuffer When there is read attemp after end of packet stream.
|
||||||
*/
|
*/
|
||||||
public function __get($name)
|
public function __get($name)
|
||||||
{
|
{
|
||||||
switch($name)
|
switch($name)
|
||||||
{
|
{
|
||||||
case 'status':
|
case 'status':
|
||||||
return $this->status();
|
return $this->status();
|
||||||
|
|
||||||
case 'info':
|
case 'info':
|
||||||
return $this->info(OTS_ServerStatus::REQUEST_BASIC_SERVER_INFO | OTS_ServerStatus::REQUEST_OWNER_SERVER_INFO | OTS_ServerStatus::REQUEST_MISC_SERVER_INFO | OTS_ServerStatus::REQUEST_PLAYERS_INFO | OTS_ServerStatus::REQUEST_MAP_INFO | OTS_ServerStatus::REQUEST_PLAYER_STATUS_INFO);
|
return $this->info(OTS_ServerStatus::REQUEST_BASIC_SERVER_INFO | OTS_ServerStatus::REQUEST_OWNER_SERVER_INFO | OTS_ServerStatus::REQUEST_MISC_SERVER_INFO | OTS_ServerStatus::REQUEST_PLAYERS_INFO | OTS_ServerStatus::REQUEST_MAP_INFO | OTS_ServerStatus::REQUEST_PLAYER_STATUS_INFO);
|
||||||
|
|
||||||
default:
|
default:
|
||||||
throw new OutOfBoundsException();
|
throw new OutOfBoundsException();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public function setTimeout($timeout) {
|
|
||||||
$this->timeout = $timeout;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**#@-*/
|
/**#@-*/
|
||||||
|
@@ -40,175 +40,175 @@ class OTS_ServerStatus
|
|||||||
/**
|
/**
|
||||||
* Basic server info.
|
* Basic server info.
|
||||||
*/
|
*/
|
||||||
const REQUEST_BASIC_SERVER_INFO = 1;
|
const REQUEST_BASIC_SERVER_INFO = 1;
|
||||||
/**
|
/**
|
||||||
* Server owner info.
|
* Server owner info.
|
||||||
*/
|
*/
|
||||||
const REQUEST_OWNER_SERVER_INFO = 2;
|
const REQUEST_OWNER_SERVER_INFO = 2;
|
||||||
/**
|
/**
|
||||||
* Server extra info.
|
* Server extra info.
|
||||||
*/
|
*/
|
||||||
const REQUEST_MISC_SERVER_INFO = 4;
|
const REQUEST_MISC_SERVER_INFO = 4;
|
||||||
/**
|
/**
|
||||||
* Players stats info.
|
* Players stats info.
|
||||||
*/
|
*/
|
||||||
const REQUEST_PLAYERS_INFO = 8;
|
const REQUEST_PLAYERS_INFO = 8;
|
||||||
/**
|
/**
|
||||||
* Map info.
|
* Map info.
|
||||||
*/
|
*/
|
||||||
const REQUEST_MAP_INFO = 16;
|
const REQUEST_MAP_INFO = 16;
|
||||||
/**
|
/**
|
||||||
* Extended players info.
|
* Extended players info.
|
||||||
*/
|
*/
|
||||||
const REQUEST_EXT_PLAYERS_INFO = 32;
|
const REQUEST_EXT_PLAYERS_INFO = 32;
|
||||||
/**
|
/**
|
||||||
* Player status info.
|
* Player status info.
|
||||||
*/
|
*/
|
||||||
const REQUEST_PLAYER_STATUS_INFO = 64;
|
const REQUEST_PLAYER_STATUS_INFO = 64;
|
||||||
/**
|
/**
|
||||||
* Server software info.
|
* Server software info.
|
||||||
*/
|
*/
|
||||||
const REQUEST_SERVER_SOFTWARE_INFO = 128;
|
const REQUEST_SERVER_SOFTWARE_INFO = 128;
|
||||||
/**
|
/**
|
||||||
* Basic server respond.
|
* Basic server respond.
|
||||||
*/
|
*/
|
||||||
const RESPOND_BASIC_SERVER_INFO = 0x10;
|
const RESPOND_BASIC_SERVER_INFO = 0x10;
|
||||||
/**
|
/**
|
||||||
* Server owner respond.
|
* Server owner respond.
|
||||||
*/
|
*/
|
||||||
const RESPOND_OWNER_SERVER_INFO = 0x11;
|
const RESPOND_OWNER_SERVER_INFO = 0x11;
|
||||||
/**
|
/**
|
||||||
* Server extra respond.
|
* Server extra respond.
|
||||||
*/
|
*/
|
||||||
const RESPOND_MISC_SERVER_INFO = 0x12;
|
const RESPOND_MISC_SERVER_INFO = 0x12;
|
||||||
/**
|
/**
|
||||||
* Players stats respond.
|
* Players stats respond.
|
||||||
*/
|
*/
|
||||||
const RESPOND_PLAYERS_INFO = 0x20;
|
const RESPOND_PLAYERS_INFO = 0x20;
|
||||||
/**
|
/**
|
||||||
* Map respond.
|
* Map respond.
|
||||||
*/
|
*/
|
||||||
const RESPOND_MAP_INFO = 0x30;
|
const RESPOND_MAP_INFO = 0x30;
|
||||||
/**
|
/**
|
||||||
* Extended players info.
|
* Extended players info.
|
||||||
*/
|
*/
|
||||||
const RESPOND_EXT_PLAYERS_INFO = 0x21;
|
const RESPOND_EXT_PLAYERS_INFO = 0x21;
|
||||||
/**
|
/**
|
||||||
* Player status info.
|
* Player status info.
|
||||||
*/
|
*/
|
||||||
const RESPOND_PLAYER_STATUS_INFO = 0x22;
|
const RESPOND_PLAYER_STATUS_INFO = 0x22;
|
||||||
/**
|
/**
|
||||||
* Server software info.
|
* Server software info.
|
||||||
*/
|
*/
|
||||||
const RESPOND_SERVER_SOFTWARE_INFO = 0x23;
|
const RESPOND_SERVER_SOFTWARE_INFO = 0x23;
|
||||||
/**
|
/**
|
||||||
* Server name.
|
* Server name.
|
||||||
*
|
*
|
||||||
* @var string
|
* @var string
|
||||||
*/
|
*/
|
||||||
private $name;
|
private $name;
|
||||||
/**
|
/**
|
||||||
* Server IP.
|
* Server IP.
|
||||||
*
|
*
|
||||||
* @var string
|
* @var string
|
||||||
*/
|
*/
|
||||||
private $ip;
|
private $ip;
|
||||||
/**
|
/**
|
||||||
* Server port.
|
* Server port.
|
||||||
*
|
*
|
||||||
* @var string
|
* @var string
|
||||||
*/
|
*/
|
||||||
private $port;
|
private $port;
|
||||||
/**
|
/**
|
||||||
* Owner name.
|
* Owner name.
|
||||||
*
|
*
|
||||||
* @var string
|
* @var string
|
||||||
*/
|
*/
|
||||||
private $owner;
|
private $owner;
|
||||||
/**
|
/**
|
||||||
* Owner's e-mail.
|
* Owner's e-mail.
|
||||||
*
|
*
|
||||||
* @var string
|
* @var string
|
||||||
*/
|
*/
|
||||||
private $eMail;
|
private $eMail;
|
||||||
/**
|
/**
|
||||||
* Message of the day.
|
* Message of the day.
|
||||||
*
|
*
|
||||||
* @var string
|
* @var string
|
||||||
*/
|
*/
|
||||||
private $motd;
|
private $motd;
|
||||||
/**
|
/**
|
||||||
* Server location.
|
* Server location.
|
||||||
*
|
*
|
||||||
* @var string
|
* @var string
|
||||||
*/
|
*/
|
||||||
private $location;
|
private $location;
|
||||||
/**
|
/**
|
||||||
* Website URL.
|
* Website URL.
|
||||||
*
|
*
|
||||||
* @var string
|
* @var string
|
||||||
*/
|
*/
|
||||||
private $url;
|
private $url;
|
||||||
/**
|
/**
|
||||||
* Uptime.
|
* Uptime.
|
||||||
*
|
*
|
||||||
* @var int
|
* @var int
|
||||||
*/
|
*/
|
||||||
private $uptime;
|
private $uptime;
|
||||||
/**
|
/**
|
||||||
* Status version.
|
* Status version.
|
||||||
*
|
*
|
||||||
* @var string
|
* @var string
|
||||||
*/
|
*/
|
||||||
private $version;
|
private $version;
|
||||||
/**
|
/**
|
||||||
* Players online.
|
* Players online.
|
||||||
*
|
*
|
||||||
* @var int
|
* @var int
|
||||||
*/
|
*/
|
||||||
private $online;
|
private $online;
|
||||||
/**
|
/**
|
||||||
* Maximum players.
|
* Maximum players.
|
||||||
*
|
*
|
||||||
* @var int
|
* @var int
|
||||||
*/
|
*/
|
||||||
private $max;
|
private $max;
|
||||||
/**
|
/**
|
||||||
* Players peak.
|
* Players peak.
|
||||||
*
|
*
|
||||||
* @var int
|
* @var int
|
||||||
*/
|
*/
|
||||||
private $peak;
|
private $peak;
|
||||||
/**
|
/**
|
||||||
* Map name.
|
* Map name.
|
||||||
*
|
*
|
||||||
* @var string
|
* @var string
|
||||||
*/
|
*/
|
||||||
private $map;
|
private $map;
|
||||||
/**
|
/**
|
||||||
* Map author.
|
* Map author.
|
||||||
*
|
*
|
||||||
* @var string
|
* @var string
|
||||||
*/
|
*/
|
||||||
private $author;
|
private $author;
|
||||||
/**
|
/**
|
||||||
* Map width.
|
* Map width.
|
||||||
*
|
*
|
||||||
* @var int
|
* @var int
|
||||||
*/
|
*/
|
||||||
private $width;
|
private $width;
|
||||||
/**
|
/**
|
||||||
* Map height.
|
* Map height.
|
||||||
*
|
*
|
||||||
* @var int
|
* @var int
|
||||||
*/
|
*/
|
||||||
private $height;
|
private $height;
|
||||||
/**
|
/**
|
||||||
* Players online list.
|
* Players online list.
|
||||||
*
|
*
|
||||||
* @var array
|
* @var array
|
||||||
*/
|
*/
|
||||||
private $players = array();
|
private $players = array();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Server software.
|
* Server software.
|
||||||
@@ -224,277 +224,277 @@ class OTS_ServerStatus
|
|||||||
*
|
*
|
||||||
* @param OTS_Buffer $info Information packet.
|
* @param OTS_Buffer $info Information packet.
|
||||||
*/
|
*/
|
||||||
public function __construct(OTS_Buffer $info)
|
public function __construct(OTS_Buffer $info)
|
||||||
{
|
{
|
||||||
// skips packet length
|
// skips packet length
|
||||||
$info->getShort();
|
$info->getShort();
|
||||||
|
|
||||||
while( $info->isValid() )
|
while( $info->isValid() )
|
||||||
{
|
{
|
||||||
switch( $info->getChar() )
|
switch( $info->getChar() )
|
||||||
{
|
{
|
||||||
case self::RESPOND_BASIC_SERVER_INFO:
|
case self::RESPOND_BASIC_SERVER_INFO:
|
||||||
$this->name = $info->getString();
|
$this->name = $info->getString();
|
||||||
$this->ip = $info->getString();
|
$this->ip = $info->getString();
|
||||||
$this->port = (int) $info->getString();
|
$this->port = (int) $info->getString();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case self::RESPOND_OWNER_SERVER_INFO:
|
case self::RESPOND_OWNER_SERVER_INFO:
|
||||||
$this->owner = $info->getString();
|
$this->owner = $info->getString();
|
||||||
$this->eMail = $info->getString();
|
$this->eMail = $info->getString();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case self::RESPOND_MISC_SERVER_INFO:
|
case self::RESPOND_MISC_SERVER_INFO:
|
||||||
$this->motd = $info->getString();
|
$this->motd = $info->getString();
|
||||||
$this->location = $info->getString();
|
$this->location = $info->getString();
|
||||||
$this->url = $info->getString();
|
$this->url = $info->getString();
|
||||||
|
|
||||||
$uptime = $info->getLong() << 32;
|
$uptime = $info->getLong() << 32;
|
||||||
|
|
||||||
$this->uptime += $info->getLong() + $uptime;
|
$this->uptime += $info->getLong() + $uptime;
|
||||||
$this->version = $info->getString();
|
$this->version = $info->getString();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case self::RESPOND_PLAYERS_INFO:
|
case self::RESPOND_PLAYERS_INFO:
|
||||||
$this->online = $info->getLong();
|
$this->online = $info->getLong();
|
||||||
$this->max = $info->getLong();
|
$this->max = $info->getLong();
|
||||||
$this->peak = $info->getLong();
|
$this->peak = $info->getLong();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case self::RESPOND_MAP_INFO:
|
case self::RESPOND_MAP_INFO:
|
||||||
$this->map = $info->getString();
|
$this->map = $info->getString();
|
||||||
$this->author = $info->getString();
|
$this->author = $info->getString();
|
||||||
$this->width = $info->getShort();
|
$this->width = $info->getShort();
|
||||||
$this->height = $info->getShort();
|
$this->height = $info->getShort();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case self::RESPOND_EXT_PLAYERS_INFO:
|
case self::RESPOND_EXT_PLAYERS_INFO:
|
||||||
$count = $info->getLong();
|
$count = $info->getLong();
|
||||||
|
|
||||||
for($i = 0; $i < $count; $i++)
|
for($i = 0; $i < $count; $i++)
|
||||||
{
|
{
|
||||||
$name = $info->getString();
|
$name = $info->getString();
|
||||||
$this->players[$name] = $info->getLong();
|
$this->players[$name] = $info->getLong();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case self::RESPOND_SERVER_SOFTWARE_INFO:
|
case self::RESPOND_SERVER_SOFTWARE_INFO:
|
||||||
$this->softwareName = $info->getString();
|
$this->softwareName = $info->getString();
|
||||||
$this->softwareVersion = $info->getString();
|
$this->softwareVersion = $info->getString();
|
||||||
$this->softwareProtocol = $info->getString();
|
$this->softwareProtocol = $info->getString();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns server uptime.
|
* Returns server uptime.
|
||||||
*
|
*
|
||||||
* @return int Uptime.
|
* @return int Uptime.
|
||||||
*/
|
*/
|
||||||
public function getUptime()
|
public function getUptime()
|
||||||
{
|
{
|
||||||
return $this->uptime;
|
return $this->uptime;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns server IP.
|
* Returns server IP.
|
||||||
*
|
*
|
||||||
* @return string IP.
|
* @return string IP.
|
||||||
*/
|
*/
|
||||||
public function getIP()
|
public function getIP()
|
||||||
{
|
{
|
||||||
return $this->ip;
|
return $this->ip;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns server name.
|
* Returns server name.
|
||||||
*
|
*
|
||||||
* @return string Name.
|
* @return string Name.
|
||||||
*/
|
*/
|
||||||
public function getName()
|
public function getName()
|
||||||
{
|
{
|
||||||
return $this->name;
|
return $this->name;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns server port.
|
* Returns server port.
|
||||||
*
|
*
|
||||||
* @return int Port.
|
* @return int Port.
|
||||||
*/
|
*/
|
||||||
public function getPort()
|
public function getPort()
|
||||||
{
|
{
|
||||||
return $this->port;
|
return $this->port;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns server location.
|
* Returns server location.
|
||||||
*
|
*
|
||||||
* @return string Location.
|
* @return string Location.
|
||||||
*/
|
*/
|
||||||
public function getLocation()
|
public function getLocation()
|
||||||
{
|
{
|
||||||
return $this->location;
|
return $this->location;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns server website.
|
* Returns server website.
|
||||||
*
|
*
|
||||||
* @return string Website URL.
|
* @return string Website URL.
|
||||||
*/
|
*/
|
||||||
public function getURL()
|
public function getURL()
|
||||||
{
|
{
|
||||||
return $this->url;
|
return $this->url;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns server version.
|
* Returns server version.
|
||||||
*
|
*
|
||||||
* @return string Version.
|
* @return string Version.
|
||||||
*/
|
*/
|
||||||
public function getServerVersion()
|
public function getServerVersion()
|
||||||
{
|
{
|
||||||
return $this->version;
|
return $this->version;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns owner name.
|
* Returns owner name.
|
||||||
*
|
*
|
||||||
* @return string Owner name.
|
* @return string Owner name.
|
||||||
*/
|
*/
|
||||||
public function getOwner()
|
public function getOwner()
|
||||||
{
|
{
|
||||||
return $this->owner;
|
return $this->owner;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns owner e-mail.
|
* Returns owner e-mail.
|
||||||
*
|
*
|
||||||
* @return string Owner e-mail.
|
* @return string Owner e-mail.
|
||||||
*/
|
*/
|
||||||
public function getEMail()
|
public function getEMail()
|
||||||
{
|
{
|
||||||
return $this->eMail;
|
return $this->eMail;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns current amount of players online.
|
* Returns current amount of players online.
|
||||||
*
|
*
|
||||||
* @return int Count of players.
|
* @return int Count of players.
|
||||||
*/
|
*/
|
||||||
public function getOnlinePlayers()
|
public function getOnlinePlayers()
|
||||||
{
|
{
|
||||||
return $this->online;
|
return $this->online;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns maximum amount of players online.
|
* Returns maximum amount of players online.
|
||||||
*
|
*
|
||||||
* @return int Maximum allowed count of players.
|
* @return int Maximum allowed count of players.
|
||||||
*/
|
*/
|
||||||
public function getMaxPlayers()
|
public function getMaxPlayers()
|
||||||
{
|
{
|
||||||
return $this->max;
|
return $this->max;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns record of online players.
|
* Returns record of online players.
|
||||||
*
|
*
|
||||||
* @return int Players online record.
|
* @return int Players online record.
|
||||||
*/
|
*/
|
||||||
public function getPlayersPeak()
|
public function getPlayersPeak()
|
||||||
{
|
{
|
||||||
return $this->peak;
|
return $this->peak;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns map name.
|
* Returns map name.
|
||||||
*
|
*
|
||||||
* @return string Map name.
|
* @return string Map name.
|
||||||
*/
|
*/
|
||||||
public function getMapName()
|
public function getMapName()
|
||||||
{
|
{
|
||||||
return $this->map;
|
return $this->map;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns map author.
|
* Returns map author.
|
||||||
*
|
*
|
||||||
* @return string Mapper name.
|
* @return string Mapper name.
|
||||||
*/
|
*/
|
||||||
public function getMapAuthor()
|
public function getMapAuthor()
|
||||||
{
|
{
|
||||||
return $this->author;
|
return $this->author;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns map width.
|
* Returns map width.
|
||||||
*
|
*
|
||||||
* @return int Map width.
|
* @return int Map width.
|
||||||
*/
|
*/
|
||||||
public function getMapWidth()
|
public function getMapWidth()
|
||||||
{
|
{
|
||||||
return $this->width;
|
return $this->width;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns map height.
|
* Returns map height.
|
||||||
*
|
*
|
||||||
* @return int Map height.
|
* @return int Map height.
|
||||||
*/
|
*/
|
||||||
public function getMapHeight()
|
public function getMapHeight()
|
||||||
{
|
{
|
||||||
return $this->height;
|
return $this->height;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns server's Message Of The Day
|
* Returns server's Message Of The Day
|
||||||
*
|
*
|
||||||
* @return string Server MOTD.
|
* @return string Server MOTD.
|
||||||
*/
|
*/
|
||||||
public function getMOTD()
|
public function getMOTD()
|
||||||
{
|
{
|
||||||
return $this->motd;
|
return $this->motd;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns list of players currently online.
|
* Returns list of players currently online.
|
||||||
*
|
*
|
||||||
* @return array List of players in format 'name' => level.
|
* @return array List of players in format 'name' => level.
|
||||||
*/
|
*/
|
||||||
public function getPlayers()
|
public function getPlayers()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns software name.
|
* Returns software name.
|
||||||
*
|
*
|
||||||
* @return string Software name.
|
* @return string Software name.
|
||||||
*/
|
*/
|
||||||
public function getSoftwareName()
|
public function getSoftwareName()
|
||||||
{
|
{
|
||||||
return $this->softwareName;
|
return $this->softwareName;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns software version.
|
* Returns software version.
|
||||||
*
|
*
|
||||||
* @return string Software version.
|
* @return string Software version.
|
||||||
*/
|
*/
|
||||||
public function getSoftwareVersion()
|
public function getSoftwareVersion()
|
||||||
{
|
{
|
||||||
return $this->softwareVersion;
|
return $this->softwareVersion;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns software protocol.
|
* Returns software protocol.
|
||||||
*
|
*
|
||||||
* @return string Software protocol.
|
* @return string Software protocol.
|
||||||
*/
|
*/
|
||||||
public function getSoftwareProtocol()
|
public function getSoftwareProtocol()
|
||||||
{
|
{
|
||||||
return $this->softwareProtocol;
|
return $this->softwareProtocol;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Magic PHP5 method.
|
* Magic PHP5 method.
|
||||||
@@ -503,68 +503,68 @@ class OTS_ServerStatus
|
|||||||
* @return mixed Property value.
|
* @return mixed Property value.
|
||||||
* @throws OutOfBoundsException For non-supported properties.
|
* @throws OutOfBoundsException For non-supported properties.
|
||||||
*/
|
*/
|
||||||
public function __get($name)
|
public function __get($name)
|
||||||
{
|
{
|
||||||
switch($name)
|
switch($name)
|
||||||
{
|
{
|
||||||
case 'uptime':
|
case 'uptime':
|
||||||
return $this->getUptime();
|
return $this->getUptime();
|
||||||
|
|
||||||
case 'ip':
|
case 'ip':
|
||||||
return $this->getIP();
|
return $this->getIP();
|
||||||
|
|
||||||
case 'name':
|
case 'name':
|
||||||
return $this->getName();
|
return $this->getName();
|
||||||
|
|
||||||
case 'port':
|
case 'port':
|
||||||
return $this->getPort();
|
return $this->getPort();
|
||||||
|
|
||||||
case 'location':
|
case 'location':
|
||||||
return $this->getLocation();
|
return $this->getLocation();
|
||||||
|
|
||||||
case 'url':
|
case 'url':
|
||||||
return $this->getURL();
|
return $this->getURL();
|
||||||
|
|
||||||
case 'serverVersion':
|
case 'serverVersion':
|
||||||
return $this->getServerVersion();
|
return $this->getServerVersion();
|
||||||
|
|
||||||
case 'owner':
|
case 'owner':
|
||||||
return $this->getOwner();
|
return $this->getOwner();
|
||||||
|
|
||||||
case 'eMail':
|
case 'eMail':
|
||||||
return $this->getEMail();
|
return $this->getEMail();
|
||||||
|
|
||||||
case 'onlinePlayers':
|
case 'onlinePlayers':
|
||||||
return $this->getOnlinePlayers();
|
return $this->getOnlinePlayers();
|
||||||
|
|
||||||
case 'maxPlayers':
|
case 'maxPlayers':
|
||||||
return $this->getMaxPlayers();
|
return $this->getMaxPlayers();
|
||||||
|
|
||||||
case 'playersPeak':
|
case 'playersPeak':
|
||||||
return $this->getPlayersPeak();
|
return $this->getPlayersPeak();
|
||||||
|
|
||||||
case 'mapName':
|
case 'mapName':
|
||||||
return $this->getMapName();
|
return $this->getMapName();
|
||||||
|
|
||||||
case 'mapAuthor':
|
case 'mapAuthor':
|
||||||
return $this->getMapAuthor();
|
return $this->getMapAuthor();
|
||||||
|
|
||||||
case 'mapWidth':
|
case 'mapWidth':
|
||||||
return $this->getMapWidth();
|
return $this->getMapWidth();
|
||||||
|
|
||||||
case 'mapHeight':
|
case 'mapHeight':
|
||||||
return $this->getMapHeight();
|
return $this->getMapHeight();
|
||||||
|
|
||||||
case 'motd':
|
case 'motd':
|
||||||
return $this->getMOTD();
|
return $this->getMOTD();
|
||||||
|
|
||||||
case 'players':
|
case 'players':
|
||||||
return $this->getPlayers();
|
return $this->getPlayers();
|
||||||
|
|
||||||
default:
|
default:
|
||||||
throw new OutOfBoundsException();
|
throw new OutOfBoundsException();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**#@-*/
|
/**#@-*/
|
||||||
|
@@ -15,7 +15,7 @@
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Toolbox for common operations.
|
* Toolbox for common operations.
|
||||||
*
|
*
|
||||||
* @package POT
|
* @package POT
|
||||||
* @version 0.1.5
|
* @version 0.1.5
|
||||||
*/
|
*/
|
||||||
@@ -23,41 +23,41 @@ class OTS_Toolbox
|
|||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* Calculates experience points needed for given level.
|
* Calculates experience points needed for given level.
|
||||||
*
|
*
|
||||||
* @param int $level Level for which experience should be calculated.
|
* @param int $level Level for which experience should be calculated.
|
||||||
* @param int $experience Current experience points.
|
* @param int $experience Current experience points.
|
||||||
* @return int Experience points for level.
|
* @return int Experience points for level.
|
||||||
*/
|
*/
|
||||||
public static function experienceForLevel($level, $experience = 0)
|
public static function experienceForLevel($level, $experience = 0)
|
||||||
{
|
{
|
||||||
//return 50 * ($level - 1) * ($level * $level - 5 * $level + 12) / 3 - $experience;
|
//return 50 * ($level - 1) * ($level * $level - 5 * $level + 12) / 3 - $experience;
|
||||||
$level = $level - 1;
|
$level = $level - 1;
|
||||||
return ((50 * $level * $level * $level) - (150 * $level * $level) + (400 * $level)) / 3;
|
return ((50 * $level * $level * $level) - (150 * $level * $level) + (400 * $level)) / 3;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Finds out which level user have basing on his/her experience.
|
* Finds out which level user have basing on his/her experience.
|
||||||
*
|
*
|
||||||
* <p>
|
* <p>
|
||||||
* PHP doesn't support complex numbers natively so solving third-level polynomials would be quite hard. Rather then doing this, this method iterates calculating experience for next levels until it finds one which requires enought experience we have. Because of that, for high experience values this function can take relatively long time to be executed.
|
* PHP doesn't support complex numbers natively so solving third-level polynomials would be quite hard. Rather then doing this, this method iterates calculating experience for next levels until it finds one which requires enought experience we have. Because of that, for high experience values this function can take relatively long time to be executed.
|
||||||
* </p>
|
* </p>
|
||||||
*
|
*
|
||||||
* @param int $experience Current experience points.
|
* @param int $experience Current experience points.
|
||||||
* @return int Experience level.
|
* @return int Experience level.
|
||||||
*/
|
*/
|
||||||
public static function levelForExperience($experience)
|
public static function levelForExperience($experience)
|
||||||
{
|
{
|
||||||
// default level
|
// default level
|
||||||
$level = 1;
|
$level = 1;
|
||||||
|
|
||||||
// until we will find level which requires more experience then we have we will step to next
|
// until we will find level which requires more experience then we have we will step to next
|
||||||
while( self::experienceForLevel($level + 1) <= $experience)
|
while( self::experienceForLevel($level + 1) <= $experience)
|
||||||
{
|
{
|
||||||
$level++;
|
$level++;
|
||||||
}
|
}
|
||||||
|
|
||||||
return $level;
|
return $level;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @version 0.1.5
|
* @version 0.1.5
|
||||||
@@ -65,25 +65,25 @@ class OTS_Toolbox
|
|||||||
* @return OTS_Players_List Filtered list.
|
* @return OTS_Players_List Filtered list.
|
||||||
* @deprecated 0.1.5 Use OTS_PlayerBans_List.
|
* @deprecated 0.1.5 Use OTS_PlayerBans_List.
|
||||||
*/
|
*/
|
||||||
public static function bannedPlayers()
|
public static function bannedPlayers()
|
||||||
{
|
{
|
||||||
// creates filter
|
// creates filter
|
||||||
$filter = new OTS_SQLFilter();
|
$filter = new OTS_SQLFilter();
|
||||||
$filter->addFilter( new OTS_SQLField('type', 'bans'), POT::BAN_PLAYER);
|
$filter->addFilter( new OTS_SQLField('type', 'bans'), POT::BAN_PLAYER);
|
||||||
$filter->addFilter( new OTS_SQLField('active', 'bans'), 1);
|
$filter->addFilter( new OTS_SQLField('active', 'bans'), 1);
|
||||||
$filter->addFilter( new OTS_SQLField('value', 'bans'), new OTS_SQLField('id', 'players') );
|
$filter->addFilter( new OTS_SQLField('value', 'bans'), new OTS_SQLField('id', 'players') );
|
||||||
|
|
||||||
// selects only active bans
|
// selects only active bans
|
||||||
$actives = new OTS_SQLFilter();
|
$actives = new OTS_SQLFilter();
|
||||||
$actives->addFilter( new OTS_SQLField('expires', 'bans'), 0);
|
$actives->addFilter( new OTS_SQLField('expires', 'bans'), 0);
|
||||||
$actives->addFilter( new OTS_SQLField('time', 'bans'), time(), OTS_SQLFilter::OPERATOR_GREATER, OTS_SQLFilter::CRITERIUM_OR);
|
$actives->addFilter( new OTS_SQLField('time', 'bans'), time(), OTS_SQLFilter::OPERATOR_GREATER, OTS_SQLFilter::CRITERIUM_OR);
|
||||||
$filter->addFilter($actives);
|
$filter->addFilter($actives);
|
||||||
|
|
||||||
// creates list and aplies filter
|
// creates list and aplies filter
|
||||||
$list = new OTS_Players_List();
|
$list = new OTS_Players_List();
|
||||||
$list->setFilter($filter);
|
$list->setFilter($filter);
|
||||||
return $list;
|
return $list;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @version 0.1.5
|
* @version 0.1.5
|
||||||
@@ -91,34 +91,25 @@ class OTS_Toolbox
|
|||||||
* @return OTS_Accounts_List Filtered list.
|
* @return OTS_Accounts_List Filtered list.
|
||||||
* @deprecated 0.1.5 Use OTS_AccountBans_List.
|
* @deprecated 0.1.5 Use OTS_AccountBans_List.
|
||||||
*/
|
*/
|
||||||
public static function bannedAccounts()
|
public static function bannedAccounts()
|
||||||
{
|
{
|
||||||
// creates filter
|
// creates filter
|
||||||
$filter = new OTS_SQLFilter();
|
$filter = new OTS_SQLFilter();
|
||||||
$filter->addFilter( new OTS_SQLField('type', 'bans'), POT::BAN_ACCOUNT);
|
$filter->addFilter( new OTS_SQLField('type', 'bans'), POT::BAN_ACCOUNT);
|
||||||
$filter->addFilter( new OTS_SQLField('active', 'bans'), 1);
|
$filter->addFilter( new OTS_SQLField('active', 'bans'), 1);
|
||||||
$filter->addFilter( new OTS_SQLField('value', 'bans'), new OTS_SQLField('id', 'accounts') );
|
$filter->addFilter( new OTS_SQLField('value', 'bans'), new OTS_SQLField('id', 'accounts') );
|
||||||
|
|
||||||
// selects only active bans
|
// selects only active bans
|
||||||
$actives = new OTS_SQLFilter();
|
$actives = new OTS_SQLFilter();
|
||||||
$actives->addFilter( new OTS_SQLField('expires', 'bans'), 0);
|
$actives->addFilter( new OTS_SQLField('expires', 'bans'), 0);
|
||||||
$actives->addFilter( new OTS_SQLField('time', 'bans'), time(), OTS_SQLFilter::OPERATOR_GREATER, OTS_SQLFilter::CRITERIUM_OR);
|
$actives->addFilter( new OTS_SQLField('time', 'bans'), time(), OTS_SQLFilter::OPERATOR_GREATER, OTS_SQLFilter::CRITERIUM_OR);
|
||||||
$filter->addFilter($actives);
|
$filter->addFilter($actives);
|
||||||
|
|
||||||
// creates list and aplies filter
|
// creates list and aplies filter
|
||||||
$list = new OTS_Accounts_List();
|
$list = new OTS_Accounts_List();
|
||||||
$list->setFilter($filter);
|
$list->setFilter($filter);
|
||||||
return $list;
|
return $list;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static function getVocationName($id, $promotion = 0): string
|
|
||||||
{
|
|
||||||
if($promotion > 0) {
|
|
||||||
$id = ($id + ($promotion * config('vocations_amount')));
|
|
||||||
}
|
|
||||||
|
|
||||||
return config('vocations')[$id] ?? 'Unknown';
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**#@-*/
|
/**#@-*/
|
||||||
|
@@ -48,8 +48,6 @@ $locale['step_config'] = 'Konfiguration';
|
|||||||
$locale['step_config_title'] = 'Grundkonfiguration';
|
$locale['step_config_title'] = 'Grundkonfiguration';
|
||||||
$locale['step_config_server_path'] = 'Serverpfad';
|
$locale['step_config_server_path'] = 'Serverpfad';
|
||||||
$locale['step_config_server_path_desc'] = 'Pfad zu Ihrem TFS-Hauptverzeichnis, in dem sich die config.lua befinden.';
|
$locale['step_config_server_path_desc'] = 'Pfad zu Ihrem TFS-Hauptverzeichnis, in dem sich die config.lua befinden.';
|
||||||
$locale['step_config_site_url'] = 'Website URL';
|
|
||||||
$locale['step_config_site_url_desc'] = 'Ihre Website-Adresse.';
|
|
||||||
$locale['step_config_mail_admin'] = 'Admin E-Mail';
|
$locale['step_config_mail_admin'] = 'Admin E-Mail';
|
||||||
$locale['step_config_mail_admin_desc'] = 'Adresse, an die E-Mails aus dem Kontaktformular gesendet werden, z. B. admin@gmail.com';
|
$locale['step_config_mail_admin_desc'] = 'Adresse, an die E-Mails aus dem Kontaktformular gesendet werden, z. B. admin@gmail.com';
|
||||||
$locale['step_config_mail_admin_error'] = 'Admin E-Mail ist nicht korrekt.';
|
$locale['step_config_mail_admin_error'] = 'Admin E-Mail ist nicht korrekt.';
|
||||||
|
@@ -52,8 +52,6 @@ $locale['step_config'] = 'Configuration';
|
|||||||
$locale['step_config_title'] = 'Basic configuration';
|
$locale['step_config_title'] = 'Basic configuration';
|
||||||
$locale['step_config_server_path'] = 'Server path';
|
$locale['step_config_server_path'] = 'Server path';
|
||||||
$locale['step_config_server_path_desc'] = 'Path to your TFS main directory, where you have config.lua located.';
|
$locale['step_config_server_path_desc'] = 'Path to your TFS main directory, where you have config.lua located.';
|
||||||
$locale['step_config_site_url'] = 'Website URL';
|
|
||||||
$locale['step_config_site_url_desc'] = 'Your website address.';
|
|
||||||
$locale['step_config_mail_admin'] = 'Admin Email';
|
$locale['step_config_mail_admin'] = 'Admin Email';
|
||||||
$locale['step_config_mail_admin_desc'] = 'Address where emails from contact form will be delivered, for example admin@gmail.com';
|
$locale['step_config_mail_admin_desc'] = 'Address where emails from contact form will be delivered, for example admin@gmail.com';
|
||||||
$locale['step_config_mail_admin_error'] = 'Admin Email is not correct.';
|
$locale['step_config_mail_admin_error'] = 'Admin Email is not correct.';
|
||||||
@@ -96,7 +94,7 @@ $locale['step_database_loaded_npcs'] = 'NPCs has been loaded...';
|
|||||||
$locale['step_database_error_npcs'] = 'There were some problems loading your NPCs';
|
$locale['step_database_error_npcs'] = 'There were some problems loading your NPCs';
|
||||||
$locale['step_database_loaded_spells'] = 'Spells has been loaded...';
|
$locale['step_database_loaded_spells'] = 'Spells has been loaded...';
|
||||||
$locale['step_database_loaded_towns'] = 'Towns has been loaded...';
|
$locale['step_database_loaded_towns'] = 'Towns has been loaded...';
|
||||||
$locale['step_database_error_towns'] = 'There were some problems loading your towns. You will need to configure them manually in Settings.';
|
$locale['step_database_error_towns'] = 'There were some problems loading your towns. You will need to configure them manually in config.';
|
||||||
$locale['step_database_created_account'] = 'Created admin account...';
|
$locale['step_database_created_account'] = 'Created admin account...';
|
||||||
$locale['step_database_created_news'] = 'Newses has been created...';
|
$locale['step_database_created_news'] = 'Newses has been created...';
|
||||||
|
|
||||||
|
@@ -52,8 +52,6 @@ $locale['step_config'] = 'Konfiguracja';
|
|||||||
$locale['step_config_title'] = 'Podstawowa konfiguracja';
|
$locale['step_config_title'] = 'Podstawowa konfiguracja';
|
||||||
$locale['step_config_server_path'] = 'Ścieżka do serwera';
|
$locale['step_config_server_path'] = 'Ścieżka do serwera';
|
||||||
$locale['step_config_server_path_desc'] = 'Ścieżka do Twojego folderu z TFS, gdzie znajduje się plik config.lua.';
|
$locale['step_config_server_path_desc'] = 'Ścieżka do Twojego folderu z TFS, gdzie znajduje się plik config.lua.';
|
||||||
$locale['step_config_server_url'] = 'Adres strony';
|
|
||||||
$locale['step_config_server_url_desc'] = 'Adres tej strony www.';
|
|
||||||
$locale['step_config_mail_admin'] = 'E-Mail admina';
|
$locale['step_config_mail_admin'] = 'E-Mail admina';
|
||||||
$locale['step_config_mail_admin_desc'] = 'Na ten adres będą dostarczane E-Maile z formularza kontaktowego, przykładowo admin@gmail.com';
|
$locale['step_config_mail_admin_desc'] = 'Na ten adres będą dostarczane E-Maile z formularza kontaktowego, przykładowo admin@gmail.com';
|
||||||
$locale['step_config_mail_admin_error'] = 'E-Mail admina jest niepoprawny.';
|
$locale['step_config_mail_admin_error'] = 'E-Mail admina jest niepoprawny.';
|
||||||
@@ -95,7 +93,7 @@ $locale['step_database_loaded_npcs'] = 'Załadowano NPCs...';
|
|||||||
$locale['step_database_error_npcs'] = 'Wystąpił problem podczas ładowania NPCs';
|
$locale['step_database_error_npcs'] = 'Wystąpił problem podczas ładowania NPCs';
|
||||||
$locale['step_database_loaded_spells'] = 'Załadowano czary (spells)...';
|
$locale['step_database_loaded_spells'] = 'Załadowano czary (spells)...';
|
||||||
$locale['step_database_loaded_towns'] = 'Załadowano miasta (towns)...';
|
$locale['step_database_loaded_towns'] = 'Załadowano miasta (towns)...';
|
||||||
$locale['step_database_error_towns'] = 'Wystąpił problem podczas ładowania miast. Trzeba będzie je skonfigurować manualnie w ustawieniach.';
|
$locale['step_database_error_towns'] = 'Wystąpił problem podczas ładowania miast. Trzeba będzie je skonfigurować manualnie.';
|
||||||
$locale['step_database_created_account'] = 'Utworzono konto admina...';
|
$locale['step_database_created_account'] = 'Utworzono konto admina...';
|
||||||
$locale['step_database_created_news'] = 'Utworzono newsy...';
|
$locale['step_database_created_news'] = 'Utworzono newsy...';
|
||||||
|
|
||||||
|
@@ -14,12 +14,12 @@ $account_logged = new OTS_Account();
|
|||||||
|
|
||||||
// stay-logged with sessions
|
// stay-logged with sessions
|
||||||
$current_session = getSession('account');
|
$current_session = getSession('account');
|
||||||
if($current_session)
|
if($current_session !== false)
|
||||||
{
|
{
|
||||||
$account_logged->load($current_session);
|
$account_logged->load($current_session);
|
||||||
if($account_logged->isLoaded() && $account_logged->getPassword() == getSession('password')
|
if($account_logged->isLoaded() && $account_logged->getPassword() == getSession('password')
|
||||||
//&& (!isset($_SESSION['admin']) || admin())
|
//&& (!isset($_SESSION['admin']) || admin())
|
||||||
&& (getSession('remember_me') || getSession('last_visit') > time() - 15 * 60)) { // login for 15 minutes if "remember me" is not used
|
&& (getSession('remember_me') !== false || getSession('last_visit') > time() - 15 * 60)) { // login for 15 minutes if "remember me" is not used
|
||||||
$logged = true;
|
$logged = true;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@@ -17,12 +17,6 @@ if(fetchDatabaseConfig('database_version', $tmp)) { // we got version
|
|||||||
$db->revalidateCache();
|
$db->revalidateCache();
|
||||||
for($i = $tmp + 1; $i <= DATABASE_VERSION; $i++) {
|
for($i = $tmp + 1; $i <= DATABASE_VERSION; $i++) {
|
||||||
require SYSTEM . 'migrations/' . $i . '.php';
|
require SYSTEM . 'migrations/' . $i . '.php';
|
||||||
|
|
||||||
if (isset($up)) {
|
|
||||||
$up();
|
|
||||||
unset($up);
|
|
||||||
}
|
|
||||||
|
|
||||||
updateDatabaseConfig('database_version', $i);
|
updateDatabaseConfig('database_version', $i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -32,12 +26,6 @@ else { // register first version
|
|||||||
$db->revalidateCache();
|
$db->revalidateCache();
|
||||||
for($i = 1; $i <= DATABASE_VERSION; $i++) {
|
for($i = 1; $i <= DATABASE_VERSION; $i++) {
|
||||||
require SYSTEM . 'migrations/' . $i . '.php';
|
require SYSTEM . 'migrations/' . $i . '.php';
|
||||||
|
|
||||||
if (isset($up)) {
|
|
||||||
$up();
|
|
||||||
unset($up);
|
|
||||||
}
|
|
||||||
|
|
||||||
updateDatabaseConfig('database_version', $i);
|
updateDatabaseConfig('database_version', $i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,8 +0,0 @@
|
|||||||
CREATE TABLE `myaac_hooks`
|
|
||||||
(
|
|
||||||
`id` INT(11) NOT NULL AUTO_INCREMENT,
|
|
||||||
`name` VARCHAR(30) NOT NULL DEFAULT '',
|
|
||||||
`type` INT(2) NOT NULL DEFAULT 0,
|
|
||||||
`file` VARCHAR(100) NOT NULL,
|
|
||||||
PRIMARY KEY (`id`)
|
|
||||||
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8;
|
|
@@ -1,16 +1,16 @@
|
|||||||
<?php
|
<?php
|
||||||
/**
|
$db->query("ALTER TABLE `" . TABLE_PREFIX . "account_actions` MODIFY `ip` INT(11) NOT NULL DEFAULT 0;");
|
||||||
* @var OTS_DB_MySQL $db
|
$db->query("ALTER TABLE `" . TABLE_PREFIX . "account_actions` MODIFY `date` INT(11) NOT NULL DEFAULT 0;");
|
||||||
*/
|
$db->query("ALTER TABLE `" . TABLE_PREFIX . "account_actions` MODIFY `action` VARCHAR(255) NOT NULL DEFAULT '';");
|
||||||
|
$db->query("
|
||||||
|
CREATE TABLE `myaac_hooks`
|
||||||
|
(
|
||||||
|
`id` INT(11) NOT NULL AUTO_INCREMENT,
|
||||||
|
`name` VARCHAR(30) NOT NULL DEFAULT '',
|
||||||
|
`type` INT(2) NOT NULL DEFAULT 0,
|
||||||
|
`file` VARCHAR(100) NOT NULL,
|
||||||
|
PRIMARY KEY (`id`)
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8;
|
||||||
|
");
|
||||||
|
|
||||||
$up = function () use ($db) {
|
?>
|
||||||
$db->modifyColumn(TABLE_PREFIX . 'account_actions', 'ip', "INT(11) NOT NULL DEFAULT 0");
|
|
||||||
$db->modifyColumn(TABLE_PREFIX . 'account_actions', 'date', "INT(11) NOT NULL DEFAULT 0");
|
|
||||||
$db->modifyColumn(TABLE_PREFIX . 'account_actions', 'action', "VARCHAR(255) NOT NULL DEFAULT ''");
|
|
||||||
|
|
||||||
$db->query(file_get_contents(__DIR__ . '/1-hooks.sql'));
|
|
||||||
};
|
|
||||||
|
|
||||||
$down = function () use ($db) {
|
|
||||||
$db->dropTable(TABLE_PREFIX . 'hooks');
|
|
||||||
};
|
|
||||||
|
@@ -1,10 +0,0 @@
|
|||||||
CREATE TABLE `myaac_admin_menu`
|
|
||||||
(
|
|
||||||
`id` INT(11) NOT NULL AUTO_INCREMENT,
|
|
||||||
`name` VARCHAR(255) NOT NULL DEFAULT '',
|
|
||||||
`page` VARCHAR(255) NOT NULL DEFAULT '',
|
|
||||||
`ordering` INT(11) NOT NULL DEFAULT 0,
|
|
||||||
`flags` INT(11) NOT NULL DEFAULT 0,
|
|
||||||
`enabled` INT(1) NOT NULL DEFAULT 1,
|
|
||||||
PRIMARY KEY (`id`)
|
|
||||||
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8;
|
|
@@ -1,24 +1,17 @@
|
|||||||
<?php
|
<?php
|
||||||
/**
|
if(!$db->hasColumn(TABLE_PREFIX . 'hooks', 'ordering'))
|
||||||
* @var OTS_DB_MySQL $db
|
$db->query("ALTER TABLE `" . TABLE_PREFIX . "hooks` ADD `ordering` INT(11) NOT NULL DEFAULT 0 AFTER `file`;");
|
||||||
*/
|
|
||||||
|
|
||||||
$up = function () use ($db) {
|
if(!$db->hasTable(TABLE_PREFIX . 'admin_menu'))
|
||||||
if (!$db->hasColumn(TABLE_PREFIX . 'hooks', 'ordering')) {
|
$db->query("
|
||||||
$db->addColumn(TABLE_PREFIX . 'hooks', 'ordering', "INT(11) NOT NULL DEFAULT 0 AFTER `file`");
|
CREATE TABLE `myaac_admin_menu`
|
||||||
}
|
(
|
||||||
|
`id` INT(11) NOT NULL AUTO_INCREMENT,
|
||||||
if (!$db->hasTable(TABLE_PREFIX . 'admin_menu')) {
|
`name` VARCHAR(255) NOT NULL DEFAULT '',
|
||||||
$db->query(file_get_contents(__DIR__ . '/10-admin_menu.sql'));
|
`page` VARCHAR(255) NOT NULL DEFAULT '',
|
||||||
}
|
`ordering` INT(11) NOT NULL DEFAULT 0,
|
||||||
};
|
`flags` INT(11) NOT NULL DEFAULT 0,
|
||||||
|
`enabled` INT(1) NOT NULL DEFAULT 1,
|
||||||
$down = function () use ($db) {
|
PRIMARY KEY (`id`)
|
||||||
if ($db->hasColumn(TABLE_PREFIX . 'hooks', 'ordering')) {
|
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8;
|
||||||
$db->dropColumn(TABLE_PREFIX . 'hooks', 'ordering');
|
");
|
||||||
}
|
|
||||||
|
|
||||||
if ($db->hasTable(TABLE_PREFIX . 'admin_menu')) {
|
|
||||||
$db->dropTable(TABLE_PREFIX . 'admin_menu');
|
|
||||||
}
|
|
||||||
};
|
|
@@ -1,44 +1,19 @@
|
|||||||
<?php
|
<?php
|
||||||
/**
|
|
||||||
* @var OTS_DB_MySQL $db
|
|
||||||
*/
|
|
||||||
|
|
||||||
$up = function () use ($db) {
|
|
||||||
// rename database tables
|
// rename database tables
|
||||||
$db->renameTable(TABLE_PREFIX . 'screenshots', TABLE_PREFIX . 'gallery');
|
$db->query("RENAME TABLE
|
||||||
$db->renameTable(TABLE_PREFIX . 'movies', TABLE_PREFIX . 'videos');
|
" . TABLE_PREFIX . "screenshots TO " . TABLE_PREFIX . "gallery,
|
||||||
|
" . TABLE_PREFIX . "movies TO " . TABLE_PREFIX . "videos;");
|
||||||
|
|
||||||
// rename images dir
|
// rename images dir
|
||||||
if (file_exists(BASE . 'images/screenshots') && !file_exists(BASE . GALLERY_DIR)) {
|
if(file_exists(BASE . 'images/screenshots') && !file_exists(BASE . GALLERY_DIR)) {
|
||||||
rename(BASE . 'images/screenshots', BASE . GALLERY_DIR);
|
rename(BASE . 'images/screenshots', BASE . GALLERY_DIR);
|
||||||
}
|
}
|
||||||
|
|
||||||
// convert old database screenshots images to gallery
|
// convert old database screenshots images to gallery
|
||||||
$query = $db->query('SELECT `id`, `image`, `thumb` FROM `' . TABLE_PREFIX . 'gallery`;');
|
$query = $db->query('SELECT `id`, `image`, `thumb` FROM `' . TABLE_PREFIX . 'gallery`;');
|
||||||
foreach ($query->fetchAll() as $item) {
|
foreach($query->fetchAll() as $item) {
|
||||||
$db->update(TABLE_PREFIX . 'gallery', array(
|
$db->update(TABLE_PREFIX . 'gallery', array(
|
||||||
'image' => str_replace('/screenshots/', '/gallery/', $item['image']),
|
'image' => str_replace('/screenshots/', '/gallery/', $item['image']),
|
||||||
'thumb' => str_replace('/screenshots/', '/gallery/', $item['thumb']),
|
'thumb' => str_replace('/screenshots/', '/gallery/', $item['thumb']),
|
||||||
), array('id' => $item['id']));
|
), array('id' => $item['id']));
|
||||||
}
|
}
|
||||||
};
|
|
||||||
|
|
||||||
$down = function () use ($db) {
|
|
||||||
// rename database tables
|
|
||||||
$db->renameTable(TABLE_PREFIX . 'gallery', TABLE_PREFIX . 'screenshots');
|
|
||||||
$db->renameTable(TABLE_PREFIX . 'videos', TABLE_PREFIX . 'movies');
|
|
||||||
|
|
||||||
// rename images dir
|
|
||||||
if (file_exists(BASE . GALLERY_DIR) && !file_exists(BASE . 'images/screenshots')) {
|
|
||||||
rename(BASE . GALLERY_DIR, BASE . 'images/screenshots');
|
|
||||||
}
|
|
||||||
|
|
||||||
// convert new database gallery images to screenshots
|
|
||||||
$query = $db->query('SELECT `id`, `image`, `thumb` FROM `' . TABLE_PREFIX . 'screenshots`;');
|
|
||||||
foreach ($query->fetchAll() as $item) {
|
|
||||||
$db->update(TABLE_PREFIX . 'screenshots', [
|
|
||||||
'image' => str_replace('/gallery/', '/screenshots/', $item['image']),
|
|
||||||
'thumb' => str_replace('/gallery/', '/screenshots/', $item['thumb']),
|
|
||||||
], ['id' => $item['id']]);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
@@ -1,9 +0,0 @@
|
|||||||
CREATE TABLE `myaac_items`
|
|
||||||
(
|
|
||||||
`id` INT(11) NOT NULL,
|
|
||||||
`article` VARCHAR(5) NOT NULL DEFAULT '',
|
|
||||||
`name` VARCHAR(50) NOT NULL DEFAULT '',
|
|
||||||
`plural` VARCHAR(50) NOT NULL DEFAULT '',
|
|
||||||
`attributes` VARCHAR(500) NOT NULL DEFAULT '',
|
|
||||||
PRIMARY KEY (`id`)
|
|
||||||
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8;
|
|
@@ -1,8 +0,0 @@
|
|||||||
CREATE TABLE `myaac_weapons`
|
|
||||||
(
|
|
||||||
`id` INT(11) NOT NULL,
|
|
||||||
`level` INT(11) NOT NULL DEFAULT 0,
|
|
||||||
`maglevel` INT(11) NOT NULL DEFAULT 0,
|
|
||||||
`vocations` VARCHAR(100) NOT NULL DEFAULT '',
|
|
||||||
PRIMARY KEY (`id`)
|
|
||||||
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8;
|
|
@@ -1,65 +1,51 @@
|
|||||||
<?php
|
<?php
|
||||||
/**
|
|
||||||
* @var OTS_DB_MySQL $db
|
|
||||||
*/
|
|
||||||
|
|
||||||
use MyAAC\Models\Spell;
|
// add new item_id field for runes
|
||||||
|
if(!$db->hasColumn(TABLE_PREFIX . 'spells', 'item_id'))
|
||||||
|
$db->query("ALTER TABLE `" . TABLE_PREFIX . "spells` ADD `item_id` INT(11) NOT NULL DEFAULT 0 AFTER `conjure_count`;");
|
||||||
|
|
||||||
$up = function () use ($db) {
|
// change unique index from spell to name
|
||||||
// add new item_id field for runes
|
$db->query("ALTER TABLE `" . TABLE_PREFIX . "spells` DROP INDEX `spell`;");
|
||||||
if (!$db->hasColumn(TABLE_PREFIX . 'spells', 'item_id')) {
|
$db->query("ALTER TABLE `" . TABLE_PREFIX . "spells` ADD UNIQUE INDEX (`name`);");
|
||||||
$db->addColumn(TABLE_PREFIX . 'spells', 'item_id', 'INT(11) NOT NULL DEFAULT 0 AFTER `conjure_count`');
|
|
||||||
|
// change comment of spells.type
|
||||||
|
$db->query("ALTER TABLE `" . TABLE_PREFIX . "spells` MODIFY `type` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '1 - instant, 2 - conjure, 3 - rune';");
|
||||||
|
|
||||||
|
// new items table
|
||||||
|
if(!$db->hasTable(TABLE_PREFIX . 'items'))
|
||||||
|
$db->query("
|
||||||
|
CREATE TABLE `" . TABLE_PREFIX . "items`
|
||||||
|
(
|
||||||
|
`id` INT(11) NOT NULL,
|
||||||
|
`article` VARCHAR(5) NOT NULL DEFAULT '',
|
||||||
|
`name` VARCHAR(50) NOT NULL DEFAULT '',
|
||||||
|
`plural` VARCHAR(50) NOT NULL DEFAULT '',
|
||||||
|
`attributes` VARCHAR(500) NOT NULL DEFAULT '',
|
||||||
|
PRIMARY KEY (`id`)
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8;
|
||||||
|
");
|
||||||
|
|
||||||
|
// new weapons table
|
||||||
|
if(!$db->hasTable(TABLE_PREFIX . 'weapons'))
|
||||||
|
$db->query("
|
||||||
|
CREATE TABLE `" . TABLE_PREFIX . "weapons`
|
||||||
|
(
|
||||||
|
`id` INT(11) NOT NULL,
|
||||||
|
`level` INT(11) NOT NULL DEFAULT 0,
|
||||||
|
`maglevel` INT(11) NOT NULL DEFAULT 0,
|
||||||
|
`vocations` VARCHAR(100) NOT NULL DEFAULT '',
|
||||||
|
PRIMARY KEY (`id`)
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8;
|
||||||
|
");
|
||||||
|
|
||||||
|
// modify vocations to support json data
|
||||||
|
$db->query("ALTER TABLE `" . TABLE_PREFIX . "spells` MODIFY `vocations` VARCHAR(100) NOT NULL DEFAULT '';");
|
||||||
|
$query = $db->query('SELECT `id`, `vocations` FROM `' . TABLE_PREFIX . 'spells`');
|
||||||
|
foreach($query->fetchAll() as $spell) {
|
||||||
|
$tmp = explode(',', $spell['vocations']);
|
||||||
|
foreach($tmp as &$v) {
|
||||||
|
$v = (int)$v;
|
||||||
}
|
}
|
||||||
|
$db->update(TABLE_PREFIX . 'spells', array('vocations' => json_encode($tmp)), array('id' => $spell['id']));
|
||||||
// change unique index from spell to name
|
}
|
||||||
$db->query("ALTER TABLE `" . TABLE_PREFIX . "spells` DROP INDEX `spell`;");
|
?>
|
||||||
$db->query("ALTER TABLE `" . TABLE_PREFIX . "spells` ADD UNIQUE INDEX (`name`);");
|
|
||||||
|
|
||||||
// change comment of spells.type
|
|
||||||
$db->modifyColumn(TABLE_PREFIX . 'spells', 'type', "TINYINT(1) NOT NULL DEFAULT 0 COMMENT '1 - instant, 2 - conjure, 3 - rune'");
|
|
||||||
|
|
||||||
// new items table
|
|
||||||
if (!$db->hasTable(TABLE_PREFIX . 'items')) {
|
|
||||||
$db->query(file_get_contents(__DIR__ . '/12-items.sql'));
|
|
||||||
}
|
|
||||||
|
|
||||||
// new weapons table
|
|
||||||
if (!$db->hasTable(TABLE_PREFIX . 'weapons')) {
|
|
||||||
$db->query(file_get_contents(__DIR__ . '/12-weapons.sql'));
|
|
||||||
}
|
|
||||||
|
|
||||||
// modify vocations to support json data
|
|
||||||
$db->modifyColumn(TABLE_PREFIX . 'spells', 'vocations', "VARCHAR(100) NOT NULL DEFAULT ''");
|
|
||||||
|
|
||||||
$spells = Spell::select('id', 'vocations')->get();
|
|
||||||
foreach ($spells as $spell) {
|
|
||||||
$tmp = explode(',', $spell->vocations);
|
|
||||||
foreach ($tmp as &$v) {
|
|
||||||
$v = (int)$v;
|
|
||||||
}
|
|
||||||
|
|
||||||
Spell::where('id', $spell->id)->update(['vocations' => json_encode($tmp)]);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
$down = function () use ($db) {
|
|
||||||
// remove item_id field for runes
|
|
||||||
if ($db->hasColumn(TABLE_PREFIX . 'spells', 'item_id')) {
|
|
||||||
$db->dropColumn(TABLE_PREFIX . 'spells', 'item_id');
|
|
||||||
}
|
|
||||||
|
|
||||||
// change unique index from spell to name
|
|
||||||
$db->query("ALTER TABLE `" . TABLE_PREFIX . "spells` DROP INDEX `name`;");
|
|
||||||
$db->query("ALTER TABLE `" . TABLE_PREFIX . "spells` ADD INDEX (`spell`);");
|
|
||||||
|
|
||||||
$db->dropTable(TABLE_PREFIX . 'items');
|
|
||||||
$db->dropTable(TABLE_PREFIX . 'weapons');
|
|
||||||
|
|
||||||
$spells = Spell::select('id', 'vocations')->get();
|
|
||||||
// modify vocations to use vocation separated by comma
|
|
||||||
foreach ($spells as $spell) {
|
|
||||||
$vocations = empty($spell->vocations) ? [] : json_decode($spell->vocations);
|
|
||||||
|
|
||||||
Spell::where('id', $spell->id)->update(['vocations' => implode(',', $vocations)]);
|
|
||||||
}
|
|
||||||
};
|
|
@@ -1,16 +1,3 @@
|
|||||||
<?php
|
<?php
|
||||||
/**
|
if($db->hasColumn(TABLE_PREFIX . 'spells', 'spell'))
|
||||||
* @var OTS_DB_MySQL $db
|
$db->query("ALTER TABLE `" . TABLE_PREFIX . "spells` DROP COLUMN `spell`;");
|
||||||
*/
|
|
||||||
|
|
||||||
$up = function () use ($db) {
|
|
||||||
if ($db->hasColumn(TABLE_PREFIX . 'spells', 'spell')) {
|
|
||||||
$db->dropColumn(TABLE_PREFIX . 'spells', 'spell');
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
$down = function () use ($db) {
|
|
||||||
if (!$db->hasColumn(TABLE_PREFIX . 'spells', 'spell')) {
|
|
||||||
$db->addColumn(TABLE_PREFIX . 'spells', 'spell', "VARCHAR(255) NOT NULL DEFAULT ''");
|
|
||||||
}
|
|
||||||
};
|
|
@@ -1,39 +1,18 @@
|
|||||||
<?php
|
<?php
|
||||||
/**
|
|
||||||
* @var OTS_DB_MySQL $db
|
|
||||||
*/
|
|
||||||
|
|
||||||
$up = function () use ($db) {
|
// change monsters.file_path field to loot
|
||||||
// change monsters.file_path field to loot
|
if($db->hasColumn(TABLE_PREFIX . 'monsters', 'file_path')) {
|
||||||
if ($db->hasColumn(TABLE_PREFIX . 'monsters', 'file_path')) {
|
$db->query("ALTER TABLE `" . TABLE_PREFIX . "monsters` CHANGE `file_path` `loot` VARCHAR(5000);");
|
||||||
$db->changeColumn(TABLE_PREFIX . 'monsters', 'file_path', 'loot', 'VARCHAR(5000)');
|
}
|
||||||
}
|
|
||||||
|
|
||||||
// update loot to empty string
|
// update loot to empty string
|
||||||
$db->query("UPDATE `" . TABLE_PREFIX . "monsters` SET `loot` = '';");
|
$db->query("UPDATE `" . TABLE_PREFIX . "monsters` SET `loot` = '';");
|
||||||
|
|
||||||
// drop monsters.gfx_name field
|
// drop monsters.gfx_name field
|
||||||
$db->dropColumn(TABLE_PREFIX . 'monsters', 'gfx_name');
|
$db->query("ALTER TABLE `" . TABLE_PREFIX . "monsters` DROP COLUMN `gfx_name`;");
|
||||||
|
|
||||||
// rename hide_creature to hidden
|
// rename hide_creature to hidden
|
||||||
if ($db->hasColumn(TABLE_PREFIX . 'monsters', 'hide_creature')) {
|
if($db->hasColumn(TABLE_PREFIX . 'monsters', 'hide_creature')) {
|
||||||
$db->changeColumn(TABLE_PREFIX . 'monsters', 'hide_creature', 'hidden', "TINYINT(1) NOT NULL DEFAULT 0");
|
$db->query("ALTER TABLE `" . TABLE_PREFIX . "monsters` CHANGE `hide_creature` `hidden` TINYINT(1) NOT NULL DEFAULT 0;");
|
||||||
}
|
}
|
||||||
};
|
?>
|
||||||
|
|
||||||
$down = function () use ($db) {
|
|
||||||
if ($db->hasColumn(TABLE_PREFIX . 'monsters', 'loot')) {
|
|
||||||
$db->changeColumn(TABLE_PREFIX . 'monsters', 'loot', 'file_path', 'VARCHAR(5000)');
|
|
||||||
}
|
|
||||||
|
|
||||||
// update file_path to empty string
|
|
||||||
$db->query("UPDATE `" . TABLE_PREFIX . "monsters` SET `file_path` = '';");
|
|
||||||
|
|
||||||
// add monsters.gfx_name field
|
|
||||||
$db->addColumn(TABLE_PREFIX . 'monsters', 'gfx_name', 'varchar(255) NOT NULL AFTER `race`');
|
|
||||||
|
|
||||||
// rename hidden to hide_creature
|
|
||||||
if ($db->hasColumn(TABLE_PREFIX . 'monsters', 'hidden')) {
|
|
||||||
$db->changeColumn(TABLE_PREFIX . 'monsters', 'hidden', 'hide_creature', 'TINYINT(1) NOT NULL DEFAULT 0');
|
|
||||||
}
|
|
||||||
};
|
|
@@ -1,26 +1,10 @@
|
|||||||
<?php
|
<?php
|
||||||
/**
|
|
||||||
* @var OTS_DB_MySQL $db
|
|
||||||
*/
|
|
||||||
|
|
||||||
// add new forum.guild and forum.access fields
|
// add new forum.guild and forum.access fields
|
||||||
|
if(!$db->hasColumn(TABLE_PREFIX . 'forum_boards', 'guild')) {
|
||||||
|
$db->query("ALTER TABLE `" . TABLE_PREFIX . "forum_boards` ADD `guild` TINYINT(1) NOT NULL DEFAULT 0 AFTER `closed`;");
|
||||||
|
}
|
||||||
|
|
||||||
$up = function () use ($db) {
|
if(!$db->hasColumn(TABLE_PREFIX . 'forum_boards', 'access')) {
|
||||||
if (!$db->hasColumn(TABLE_PREFIX . 'forum_boards', 'guild')) {
|
$db->query("ALTER TABLE `" . TABLE_PREFIX . "forum_boards` ADD `access` TINYINT(1) NOT NULL DEFAULT 0 AFTER `guild`;");
|
||||||
$db->addColumn(TABLE_PREFIX . 'forum_boards', 'guild', 'TINYINT(1) NOT NULL DEFAULT 0 AFTER `closed`');
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if (!$db->hasColumn(TABLE_PREFIX . 'forum_boards', 'access')) {
|
|
||||||
$db->addColumn(TABLE_PREFIX . 'forum_boards', 'access', 'TINYINT(1) NOT NULL DEFAULT 0 AFTER `guild`');
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
$down = function () use ($db) {
|
|
||||||
if ($db->hasColumn(TABLE_PREFIX . 'forum_boards', 'guild')) {
|
|
||||||
$db->dropColumn(TABLE_PREFIX . 'forum_boards', 'guild');
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($db->hasColumn(TABLE_PREFIX . 'forum_boards', 'access')) {
|
|
||||||
$db->dropColumn(TABLE_PREFIX . 'forum_boards', 'access');
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
@@ -1,14 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
/**
|
|
||||||
* @var OTS_DB_MySQL $db
|
|
||||||
*/
|
|
||||||
|
|
||||||
// change size of spells.vocations
|
// change size of spells.vocations
|
||||||
|
$db->query("ALTER TABLE `" . TABLE_PREFIX . "spells` MODIFY `vocations` VARCHAR(300) NOT NULL DEFAULT '';");
|
||||||
$up = function () use ($db) {
|
?>
|
||||||
$db->modifyColumn(TABLE_PREFIX . 'spells', 'vocations', "VARCHAR(300) NOT NULL DEFAULT ''");
|
|
||||||
};
|
|
||||||
|
|
||||||
$down = function () {
|
|
||||||
// nothing to do here
|
|
||||||
};
|
|
@@ -1,11 +0,0 @@
|
|||||||
CREATE TABLE `myaac_menu`
|
|
||||||
(
|
|
||||||
`id` INT(11) NOT NULL AUTO_INCREMENT,
|
|
||||||
`template` VARCHAR(255) NOT NULL,
|
|
||||||
`name` VARCHAR(255) NOT NULL,
|
|
||||||
`link` VARCHAR(255) NOT NULL,
|
|
||||||
`category` INT(11) NOT NULL DEFAULT 1,
|
|
||||||
`ordering` INT(11) NOT NULL DEFAULT 0,
|
|
||||||
`enabled` INT(1) NOT NULL DEFAULT 1,
|
|
||||||
PRIMARY KEY (`id`)
|
|
||||||
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8;
|
|
@@ -1,25 +1,23 @@
|
|||||||
<?php
|
<?php
|
||||||
/**
|
|
||||||
* @var OTS_DB_MySQL $db
|
|
||||||
*/
|
|
||||||
|
|
||||||
use MyAAC\Plugins;
|
use MyAAC\Plugins;
|
||||||
|
|
||||||
$up = function () use ($db) {
|
if(!$db->hasTable('myaac_menu')) {
|
||||||
if (!$db->hasTable(TABLE_PREFIX . 'menu')) {
|
$db->query("
|
||||||
$db->exec(file_get_contents(__DIR__ . '/17-menu.sql'));
|
CREATE TABLE `myaac_menu`
|
||||||
}
|
(
|
||||||
|
`id` INT(11) NOT NULL AUTO_INCREMENT,
|
||||||
|
`template` VARCHAR(255) NOT NULL,
|
||||||
|
`name` VARCHAR(255) NOT NULL,
|
||||||
|
`link` VARCHAR(255) NOT NULL,
|
||||||
|
`category` INT(11) NOT NULL DEFAULT 1,
|
||||||
|
`ordering` INT(11) NOT NULL DEFAULT 0,
|
||||||
|
`enabled` INT(1) NOT NULL DEFAULT 1,
|
||||||
|
PRIMARY KEY (`id`)
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8;
|
||||||
|
");
|
||||||
|
}
|
||||||
|
|
||||||
$themes = ['kathrine', 'tibiacom',];
|
Plugins::installMenus('kathrine', require TEMPLATES . 'kathrine/menus.php');
|
||||||
foreach ($themes as $theme) {
|
Plugins::installMenus('tibiacom', require TEMPLATES . 'tibiacom/menus.php');
|
||||||
$file = TEMPLATES . $theme . '/menus.php';
|
|
||||||
if (is_file($file)) {
|
|
||||||
Plugins::installMenus($theme, require $file);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
$down = function () use ($db) {
|
|
||||||
$db->dropTable(TABLE_PREFIX . 'menu');
|
|
||||||
};
|
|
||||||
|
|
||||||
|
@@ -1,24 +1,6 @@
|
|||||||
<?php
|
<?php
|
||||||
/**
|
|
||||||
* @var OTS_DB_MySQL $db
|
|
||||||
*/
|
|
||||||
|
|
||||||
$up = function () use ($db) {
|
$db->query("ALTER TABLE `" . TABLE_PREFIX . "news` ADD `article_text` VARCHAR(300) NOT NULL DEFAULT '' AFTER `comments`;");
|
||||||
if (!$db->hasColumn(TABLE_PREFIX . 'news', 'article_text')) {
|
$db->query("ALTER TABLE `" . TABLE_PREFIX . "news` ADD `article_image` VARCHAR(100) NOT NULL DEFAULT '' AFTER `article_text`;");
|
||||||
$db->addColumn(TABLE_PREFIX . 'news', 'article_text', "VARCHAR(300) NOT NULL DEFAULT '' AFTER `comments`");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!$db->hasColumn(TABLE_PREFIX . 'news', 'article_image')) {
|
?>
|
||||||
$db->addColumn(TABLE_PREFIX . 'news', 'article_image', "VARCHAR(100) NOT NULL DEFAULT '' AFTER `article_text`");
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
$down = function () use ($db) {
|
|
||||||
if ($db->hasColumn(TABLE_PREFIX . 'news', 'article_text')) {
|
|
||||||
$db->dropColumn(TABLE_PREFIX . 'news', 'article_text');
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($db->hasColumn(TABLE_PREFIX . 'news', 'article_image')) {
|
|
||||||
$db->dropColumn(TABLE_PREFIX . 'news', 'article_image');
|
|
||||||
}
|
|
||||||
};
|
|
@@ -1,11 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
/**
|
$db->query("ALTER TABLE `" . TABLE_PREFIX . "faq` MODIFY `answer` VARCHAR(1020) NOT NULL DEFAULT '';");
|
||||||
* @var OTS_DB_MySQL $db
|
$db->query("ALTER TABLE `" . TABLE_PREFIX . "movies` MODIFY `title` VARCHAR(100) NOT NULL DEFAULT '';");
|
||||||
*/
|
$db->query("ALTER TABLE `" . TABLE_PREFIX . "news` MODIFY `title` VARCHAR(100) NOT NULL DEFAULT '';");
|
||||||
|
$db->query("ALTER TABLE `" . TABLE_PREFIX . "news` MODIFY `body` TEXT NOT NULL DEFAULT '';");
|
||||||
$up = function () use ($db) {
|
|
||||||
$db->modifyColumn(TABLE_PREFIX . 'faq', 'answer', "VARCHAR(1020) NOT NULL DEFAULT ''");
|
|
||||||
$db->modifyColumn(TABLE_PREFIX . 'movies', 'title', "VARCHAR(100) NOT NULL DEFAULT ''");
|
|
||||||
$db->modifyColumn(TABLE_PREFIX . 'news', 'title', "VARCHAR(100) NOT NULL DEFAULT ''");
|
|
||||||
$db->modifyColumn(TABLE_PREFIX . 'news', 'body', "TEXT NOT NULL");
|
|
||||||
};
|
|
||||||
|
@@ -2,33 +2,20 @@
|
|||||||
|
|
||||||
use MyAAC\Settings;
|
use MyAAC\Settings;
|
||||||
|
|
||||||
function updateHighscoresIdsHidden(): void
|
if (!$db->hasTable('players')) {
|
||||||
{
|
return;
|
||||||
global $db;
|
|
||||||
|
|
||||||
if (!$db->hasTable('players')) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
$query = $db->query("SELECT `id` FROM `players` WHERE (`name` = " . $db->quote("Rook Sample") . " OR `name` = " . $db->quote("Sorcerer Sample") . " OR `name` = " . $db->quote("Druid Sample") . " OR `name` = " . $db->quote("Paladin Sample") . " OR `name` = " . $db->quote("Knight Sample") . " OR `name` = " . $db->quote("Account Manager") . ") ORDER BY `id`;");
|
|
||||||
|
|
||||||
$highscores_ignored_ids = array();
|
|
||||||
if ($query->rowCount() > 0) {
|
|
||||||
foreach ($query->fetchAll() as $result)
|
|
||||||
$highscores_ignored_ids[] = $result['id'];
|
|
||||||
} else {
|
|
||||||
$highscores_ignored_ids[] = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
$settings = Settings::getInstance();
|
|
||||||
$settings->updateInDatabase('core', 'highscores_ids_hidden', implode(', ', $highscores_ignored_ids));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
$up = function () {
|
$query = $db->query("SELECT `id` FROM `players` WHERE (`name` = " . $db->quote("Rook Sample") . " OR `name` = " . $db->quote("Sorcerer Sample") . " OR `name` = " . $db->quote("Druid Sample") . " OR `name` = " . $db->quote("Paladin Sample") . " OR `name` = " . $db->quote("Knight Sample") . " OR `name` = " . $db->quote("Account Manager") . ") ORDER BY `id`;");
|
||||||
updateHighscoresIdsHidden();
|
|
||||||
};
|
|
||||||
|
|
||||||
$down = function () {
|
$highscores_ignored_ids = array();
|
||||||
$settings = Settings::getInstance();
|
if($query->rowCount() > 0) {
|
||||||
$settings->updateInDatabase('core', 'highscores_ids_hidden', '0');
|
foreach($query->fetchAll() as $result)
|
||||||
};
|
$highscores_ignored_ids[] = $result['id'];
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$highscores_ignored_ids[] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
$settings = Settings::getInstance();
|
||||||
|
$settings->updateInDatabase('core', 'highscores_ids_hidden', implode(', ', $highscores_ignored_ids));
|
||||||
|
@@ -1,23 +1,14 @@
|
|||||||
<?php
|
<?php
|
||||||
/**
|
|
||||||
* @var OTS_DB_MySQL $db
|
|
||||||
*/
|
|
||||||
|
|
||||||
$up = function () use ($db) {
|
$db->exec("ALTER TABLE `" . TABLE_PREFIX . "forum` ADD `post_html` TINYINT(1) NOT NULL DEFAULT 0 AFTER `post_smile`;");
|
||||||
$db->addColumn(TABLE_PREFIX . 'forum', 'post_html', 'TINYINT(1) NOT NULL DEFAULT 0 AFTER `post_smile`');
|
|
||||||
|
|
||||||
$query = $db->query("SELECT `id` FROM `" . TABLE_PREFIX . "forum_boards` WHERE `name` LIKE " . $db->quote('News') . " LIMIT 1;");
|
$query = $db->query("SELECT `id` FROM `" . TABLE_PREFIX . "forum_boards` WHERE `name` LIKE " . $db->quote('News') . " LIMIT 1;");
|
||||||
if ($query->rowCount() == 0) {
|
if($query->rowCount() == 0) {
|
||||||
return; // don't make anything
|
return; // don't make anything
|
||||||
}
|
}
|
||||||
|
|
||||||
$query = $query->fetch();
|
$query = $query->fetch();
|
||||||
$id = $query['id'];
|
$id = $query['id'];
|
||||||
|
|
||||||
// update all forum threads with is_html = 1
|
// update all forum threads with is_html = 1
|
||||||
$db->exec("UPDATE `" . TABLE_PREFIX . "forum` SET `post_html` = 1 WHERE `section` = " . $id . " AND `id` = `first_post`;");
|
$db->exec("UPDATE `" . TABLE_PREFIX . "forum` SET `post_html` = 1 WHERE `section` = " . $id . " AND `id` = `first_post`;");
|
||||||
};
|
|
||||||
|
|
||||||
$down = function () use ($db) {
|
|
||||||
$db->dropColumn(TABLE_PREFIX . 'forum', 'post_html');
|
|
||||||
};
|
|
@@ -1,10 +0,0 @@
|
|||||||
CREATE TABLE `z_polls` (
|
|
||||||
`id` int(11) NOT NULL auto_increment,
|
|
||||||
`question` varchar(255) NOT NULL,
|
|
||||||
`description` varchar(255) NOT NULL,
|
|
||||||
`end` int(11) NOT NULL DEFAULT 0,
|
|
||||||
`start` int(11) NOT NULL DEFAULT 0,
|
|
||||||
`answers` int(11) NOT NULL DEFAULT 0,
|
|
||||||
`votes_all` int(11) NOT NULL DEFAULT 0,
|
|
||||||
PRIMARY KEY (`id`)
|
|
||||||
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8;
|
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user