Compare commits

..

105 Commits

Author SHA1 Message Date
slawkens
c92148d467 Revert delete clearRouteCache, is used somewhere else 2025-06-27 07:23:22 +02:00
slawkens
b4b62442fe Release v1.7.1 2025-06-27 07:21:19 +02:00
slawkens
047742848b Delete clearRouteCache, was useless
Directory is cleaned already
2025-06-27 07:15:13 +02:00
slawkens
fe8281594e Fix cache:clear command (missing init) 2025-06-27 07:13:33 +02:00
slawkens
0bff910a05 adjust command email:send + mail:send (alias) 2025-06-25 19:43:40 +02:00
slawkens
6d43fc181f In case the script don't have install option, inform the user 2025-06-25 17:36:43 +02:00
slawkens
13d33822b5 Rename to plugin:setup, also add alias to previous command 2025-06-25 17:36:02 +02:00
slawkens
f78ebad136 Remove error number from 404 & 405 pages 2025-06-24 14:57:01 +02:00
slawkens
d90fa323d7 Fix polls link 2025-06-24 12:44:43 +02:00
slawkens
181131f7f3 Use __DIR__ instead of template path 2025-06-24 12:44:34 +02:00
slawkens
0da524fefe Fix plugin install:install command 2025-06-23 00:21:41 +02:00
slawkens
6cf4b9dac5 Fix xdebug warnings in load_config_lua 2025-06-22 18:51:20 +02:00
slawkens
5cfa3a697f Start v1.7.1-dev 2025-06-22 11:25:45 +02:00
slawkens
bb830bce44 Release v1.7 2025-06-22 08:55:29 +02:00
slawkens
566c2a9151 Move out of $cache->enabled 2025-06-22 08:48:24 +02:00
slawkens
0f48f12e2e Update admin.plugins.outdated.html.twig 2025-06-19 18:53:11 +02:00
Slawomir Boczek
0ea247ce7e Feature/plugins versions check (#310)
* Check plugins versions from plugins.my-aac.org/api

* Improve plugin update check messaging

Updated the success message when checking for plugin updates to clarify the source. Added an informational message when outdated plugins are found to improve user feedback.

* Use configurable API URI for plugin updates

Replaces hardcoded plugin API URI with a configurable value from config, defaulting to the official API. Also fixes a typo in the success message.
2025-06-19 16:46:22 +02:00
slawkens
b329da52aa Use apcu_clear_cache 2025-06-17 17:52:23 +02:00
slawkens
c720ccc451 Add missing csrf() 2025-06-15 19:35:12 +02:00
slawkens
8dc42b6544 Nothing important: just formatting 2025-06-15 19:05:47 +02:00
slawkens
dca904e61d Add missing csrf() 2025-06-15 19:05:19 +02:00
slawkens
29faa4f695 Add missing csrf() in success.html.twig 2025-06-15 19:03:03 +02:00
slawkens
4767120043 Update online.html.twig 2025-06-14 21:19:52 +02:00
slawkens
9a90e4aae2 Revamped online page 2025-06-14 21:12:47 +02:00
slawkens
ba4ed6a04b Add LabelV120, LabelV150, LabelV200 2025-06-14 20:52:38 +02:00
slawkens
a7efacdbac Delete online.form, use revamped characters.form 2025-06-14 20:50:54 +02:00
Goosey
577037becc fix: boostedcreatures for 13.40 (#307)
* boostedcreatures fix for 13.40

Fixes the boosted boss/creature display on the login page for 13.40 running the default cipsoft client.

* Adjust version

---------

Co-authored-by: slawkens <slawkens@gmail.com>
2025-06-14 15:58:08 +02:00
slawkens
b8abc11b96 Update list.php 2025-06-14 11:33:47 +02:00
slawkens
4def6a6cae Style 2025-06-14 10:39:45 +02:00
slawkens
e6100a1b72 New hook: HOOK_GUILDS_AFTER_MANAGE_BUTTON 2025-06-14 10:36:38 +02:00
slawkens
522f6c11d8 Add OTS_Player->isNameLocked() 2025-06-14 08:26:43 +02:00
slawkens
00c3635c5f Add $config['site']['serverPath'] for better compatibility with Gesior 2025-06-14 00:59:10 +02:00
slawkens
c074a48f24 New hook: HOOK_ACCOUNT_MANAGE_AFTER_CHARACTERS 2025-06-14 00:44:00 +02:00
slawkens
e222957893 OTS_Toolbox::getVocationName($id, $promotion); 2025-06-13 22:25:36 +02:00
slawkens
d423ddd07a Nothing important: convert to tabs 2025-06-13 22:14:20 +02:00
slawkens
4d4f7759d3 Update visitors.php 2025-06-13 21:31:04 +02:00
slawkens
9510640ba9 Ignore empty values 2025-06-13 21:25:13 +02:00
slawkens
98b13c91a4 Update notice about how to enable Visitors Counter 2025-06-13 21:24:52 +02:00
slawkens
0c95bcfd06 Better $title inventing 2025-06-13 21:03:09 +02:00
slawkens
524e982a0e Release v1.6.1 2025-06-11 05:51:39 +02:00
slawkens
fffb427eae Update account.generate_recovery_key.html.twig 2025-06-09 21:18:45 +02:00
slawkens
10cd71a663 Add missing csrf() into account manage actions 2025-06-09 21:18:42 +02:00
slawkens
0812fe025d Update settings_save.php 2025-06-09 21:14:44 +02:00
slawkens
309c1fb715 Remove deprecated TinyMCE plugin - template 2025-06-09 14:24:36 +02:00
slawkens
8d29fdb98b Set TinyMCE license key to gpl (Avoid warning message in browser console) 2025-06-09 14:24:22 +02:00
slawkens
f782850307 Move counter & visitors code before router
In case someone wants to include that info on page
2025-06-06 22:10:13 +02:00
slawkens
835dda9659 Remove duplicated code - account redirect, already in account/manage 2025-06-05 19:08:53 +02:00
slawkens
dcc703b1eb Remove optional param, make it required for few routes 2025-06-05 18:11:44 +02:00
slawkens
9d8e9d27bd Ignore duplicated route exception 2025-06-05 18:11:31 +02:00
slawkens
db09980de1 Start v1.6.1-dev 2025-06-03 22:57:33 +02:00
slawkens
2dba778167 Update example.json 2025-06-03 18:38:02 +02:00
slawkens
ce2af2bb7a Update CHANGELOG-1.x.md 2025-06-03 17:33:17 +02:00
slawkens
dc839abfbb Release v1.6 2025-06-03 16:59:55 +02:00
slawkens
01d49692ed Update CHANGELOG-1.x.md 2025-06-03 16:59:20 +02:00
slawkens
de6603a513 Allow [] in character name (again), example: [God] Test 2025-06-03 16:49:45 +02:00
slawkens
dd731fd49b Revert previous commit partially 2025-06-03 16:43:43 +02:00
slawkens
064b929841 Allow [] in character name (for :string) 2025-06-03 16:39:02 +02:00
slawkens
c61747dc75 Update coins.html.twig 2025-06-03 10:17:08 +02:00
slawkens
207d6bc691 feat: AutoLoad plugins init.php, by default disabled 2025-06-03 08:52:33 +02:00
slawkens
8fdea94376 Add globals into $hooks->executeFIlter 2025-06-03 08:39:48 +02:00
slawkens
c961a1ebf8 Two new hooks for pages loaded from database (custom pages)
HOOK_BEFORE_PAGE_CUSTOM,
HOOK_AFTER_PAGE_CUSTOM
2025-06-03 06:21:44 +02:00
slawkens
770ffcfc52 Fix warnings in CLI (part 2) 2025-05-29 16:10:46 +02:00
slawkens
756d94bb3e Fix warning from CLI 2025-05-29 16:08:23 +02:00
slawkens
6e0f591383 Do not allow access to tools/ folder after install 2025-05-29 12:22:16 +02:00
slawkens
fb91281140 Fix phpstan workflow 2025-05-29 09:35:20 +02:00
slawkens
d8a6090be3 Add new setting/configurable: site_url, prevents domain spoofing 2025-05-29 09:27:29 +02:00
slawkens
52109f5cca Another solution 2025-05-28 14:13:04 +02:00
slawkens
4b7b121550 Try fix workflow 2025-05-28 14:08:50 +02:00
slawkens
28886551e8 feat: Add new account coins setting 2025-05-28 13:33:36 +02:00
slawkens
7d435ff643 Add getNPCsCount 2025-05-24 11:54:00 +02:00
slawkens
ae847ff9a6 Nothing important: tabs 2025-05-24 11:51:06 +02:00
slawkens
45ef390829 Nothing important 2025-05-24 11:42:59 +02:00
slawkens
84d502bf10 Fixes regarding csrf + refactor some parts of AAC (guilds + forum)
Replace $account_logged->getPlayers() with getPlayersList()
$_REQUEST['todo'] -> $_REQUEST['post']
$guild_errors -> $errors
2025-05-24 11:42:42 +02:00
slawkens
e776bd52be Forum boards admin links: csrf + refactor 2025-05-24 11:28:56 +02:00
slawkens
6e793390c6 Remove unneeded enctype="multipart/form-data" 2025-05-24 11:20:36 +02:00
slawkens
6eda38603c Protect against csrf in more places (accounts & guilds pages) 2025-05-24 09:52:56 +02:00
slawkens
72cdd290da Fix link to Contributing 2025-05-23 17:38:14 +02:00
slawkens
40d65a6613 OTS_ServerInfo -> set timeout out of class
Possibility to use the class without MyAAC
2025-05-23 16:11:57 +02:00
slawkens
43153b2b0c Nothing important: tabs 2025-05-23 16:08:02 +02:00
slawkens
2ea549002a Nothing important: tabs 2025-05-23 15:58:23 +02:00
slawkens
4a30fb495d Fix CHANGELOG-1.x.md loading 2025-05-23 09:13:20 +02:00
slawkens
4d8f5f31ae Update Plugins.php 2025-05-23 09:04:48 +02:00
slawkens
be7b27c31a Fix links not working in admin dashboard modules 2025-05-23 09:04:45 +02:00
slawkens
7d213f479a feat: autoload install.php 2025-05-23 08:50:38 +02:00
slawkens
e574943707 feat: autoload settings.php 2025-05-23 08:39:09 +02:00
slawkens
1e9b10d648 Fix twig variables: logged + account_logged being not set directly after login 2025-05-15 19:11:20 +02:00
slawkens
7c92d1c197 Start v1.5.1-dev 2025-05-14 15:11:20 +02:00
slawkens
3111d66df9 Fix install, where $twig is not present in tools 2025-05-14 14:09:28 +02:00
slawkens
e45dd88a93 Release v1.5 2025-05-14 14:03:03 +02:00
slawkens
5ed1aec28e Add db variable to twig 2025-05-14 13:37:23 +02:00
slawkens
7e4d28c648 Fix more php 8.4 warnings 2025-05-14 13:23:34 +02:00
slawkens
3b2669fb3b Update tables.headline.html.twig 2025-05-14 13:23:25 +02:00
slawkens
6fe3bff163 Update 45.php 2025-05-14 10:56:12 +02:00
slawkens
ae5be41e11 Separate migration 44 with 45 2025-05-14 10:52:06 +02:00
slawkens
83a6f4b61d Add php 8.4 to phpstan 2025-05-14 10:42:18 +02:00
slawkens
ee360386d8 Addition to previous commit 2025-05-14 10:39:11 +02:00
slawkens
bf06bed385 Update schema.sql 2025-05-14 10:22:42 +02:00
slawkens
3949d84e5d Rename server-info -> ots-info, changelog -> change-log + move rules to admin panel
Due to conflict with apache2 server-info mod
2025-05-14 10:22:25 +02:00
slawkens
a161cff003 Add note about highscores being updated x minutes + allow ttl 0 to disable 2025-05-14 10:00:27 +02:00
slawkens
3befde2a1e Do not return -1 in case of freePremium, makes things harder 2025-05-14 09:18:55 +02:00
slawkens
5367df2381 Add latest client versions (14.00 - 15.01) 2025-05-13 16:29:40 +02:00
slawkens
c48b800631 Fix login.php boosted creature & boss (not sure exact version, but should be 14.12 or around)
Thanks @opentibiabr team
2025-05-13 16:29:19 +02:00
slawkens
ef6549c17c nothing important: tabs & spaces 2025-05-13 15:20:25 +02:00
slawkens
629fd18ea1 Update cypress version to ^14.3.3 2025-05-12 17:36:50 +02:00
slawkens
da15105118 Fix typo, @gpedro I hate you! :PPP 2025-05-12 17:36:34 +02:00
162 changed files with 3206 additions and 1999 deletions

View File

@@ -14,7 +14,7 @@ jobs:
strategy: strategy:
fail-fast: false fail-fast: false
matrix: matrix:
php-versions: [ '8.1', '8.2', '8.3' ] php-versions: [ '8.1', '8.2', '8.3', '8.4' ]
steps: steps:
- name: "Checkout" - name: "Checkout"
uses: "actions/checkout@v4" uses: "actions/checkout@v4"

View File

@@ -1,5 +1,92 @@
# Changelog # Changelog
## [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] ## [1.4 - 22.04.2025]
### Added ### Added

View File

@@ -80,7 +80,7 @@ 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://github.com/otsoft/myaac/wiki/Contributing) in our wiki. Look: [Contributing](https://docs.my-aac.org/misc/contributing) in our wiki.
### Other Notes ### Other Notes
@@ -95,4 +95,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/master/LICENSE) for details. See [LICENSE](https://github.com/slawkens/myaac/blob/main/LICENSE) for details.

View File

@@ -9,7 +9,6 @@
*/ */
use MyAAC\Models\Account as AccountModel; use MyAAC\Models\Account as AccountModel;
use MyAAC\Models\AccountAction;
use MyAAC\Models\Player; use MyAAC\Models\Player;
defined('MYAAC') or die('Direct access not allowed!'); defined('MYAAC') or die('Direct access not allowed!');
@@ -467,8 +466,9 @@ else if (isset($_REQUEST['search'])) {
</thead> </thead>
<tbody> <tbody>
<?php <?php
$accountActions = AccountAction::where('account_id', $account->getId())->orderByDesc('date')->get(); $accountActions = \MyAAC\Models\AccountAction::where('account_id', $account->getId())->orderByDesc('date')->get();
foreach ($accountActions as $i => $log): foreach ($accountActions as $i => $log):
$log->ip = ($log->ip != 0 ? long2ip($log->ip) : inet_ntop($log->ipv6));
?> ?>
<tr> <tr>
<td><?php echo $i + 1; ?></td> <td><?php echo $i + 1; ?></td>

View File

@@ -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.md')) { if (!file_exists(BASE . 'CHANGELOG-1.x.md')) {
echo 'File CHANGELOG.md doesn\'t exist.'; echo 'File CHANGELOG.md doesn\'t exist.';
return; return;
} }
$changelog = file_get_contents(BASE . 'CHANGELOG.md'); $changelog = file_get_contents(BASE . 'CHANGELOG-1.x.md');
$Parsedown = new Parsedown(); $Parsedown = new Parsedown();

View File

@@ -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(['balance', 'id','name', 'level'])->toArray(); $balance = Player::orderByDesc('balance')->limit(10)->get(['id', 'name', 'balance'])->toArray();
} }
$twig->display('balance.html.twig', array( $twig->display('balance.html.twig', array(

View File

@@ -7,7 +7,12 @@ defined('MYAAC') or die('Direct access not allowed!');
$coins = 0; $coins = 0;
if ($db->hasColumn('accounts', 'coins')) { if ($db->hasColumn('accounts', 'coins')) {
$coins = Account::orderByDesc('coins')->limit(10)->get(['coins', (USE_ACCOUNT_NAME ? 'name' : 'id')])->toArray(); $whatToGet = ['id', 'coins'];
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(

View File

@@ -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(['name', 'level', 'lastlogin'])->toArray(); $players = Player::orderByDesc('lastlogin')->limit(10)->get(['id', 'name', 'level', 'lastlogin'])->toArray();
} }
$twig->display('lastlogin.html.twig', array( $twig->display('lastlogin.html.twig', array(

View File

@@ -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&search_name={{ result.name }}">{{ result.name }}</a></td> <td><a href="?p=players&id={{ result.id }}">{{ result.name }}</a></td>
<td>{{ result.balance }}</td> <td>{{ result.balance }}</td>
</tr> </tr>
{% endfor %} {% endfor %}

View File

@@ -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&search_name={{ result.name }}">{{ result.name }}</a></td> <td><a href="?p=accounts&id={{ result.id }}">{{ result.name ?? result.id }}</a></td>
<td>{{ result.coins }}</td> <td>{{ result.coins }}</td>
</tr> </tr>
{% endfor %} {% endfor %}

View File

@@ -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&search_name={{ result.name }}">{{ result.name }}</a></td> <td><a href="?p=players&id={{ result.id }}">{{ 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 %}

View File

@@ -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&search_name={{ result.name }}">{{ result.name }}</a></td> <td><a href="?p=accounts&id={{ result.id }}">{{ result.name }}</a></td>
<td>{{ result.premium_points }}</td> <td>{{ result.premium_points }}</td>
</tr> </tr>
{% endfor %} {% endfor %}

View File

@@ -51,6 +51,56 @@ 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'];

View File

@@ -19,8 +19,7 @@ $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 by editing this configurable in <b>config.local.php</b> file:<br/> You can enable it in Settings -> General -> Visitors Counter.<br/>
<p style="margin-left: 3em;"><b>$config['visitors_counter'] = true;</b></p>
<?php <?php
return; return;
endif; endif;
@@ -46,7 +45,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'], $bot['url'], $bot['name']); $browser = sprintf($message, $bot['category'] ?? 'Unknown', $bot['url'] ?? '', $bot['name'] ?? 'Unknown name');
} }
else { else {
$osFamily = OperatingSystem::getOsFamily($dd->getOs('name')); $osFamily = OperatingSystem::getOsFamily($dd->getOs('name'));

View File

@@ -1,6 +1,5 @@
<?php <?php
use MyAAC\Hooks;
use MyAAC\Settings; use MyAAC\Settings;
const MYAAC_ADMIN = true; const MYAAC_ADMIN = true;

View File

@@ -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 = '2.0-dev'; const MYAAC_VERSION = '1.7.1';
const DATABASE_VERSION = 44; const DATABASE_VERSION = 45;
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,38 +122,30 @@ if (!IS_CLI) {
session_start(); session_start();
} }
// basedir
$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);
define('BASE_DIR', $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'];
}
}
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')) { if (file_exists(BASE . 'config.local.php')) {
require BASE . 'config.local.php'; require BASE . 'config.local.php';
} }
require SYSTEM . 'base.php';
define('BASE_DIR', $baseDir);
if(!IS_CLI) {
if (isset($config['site_url'])) {
$hasSlashAtEnd = ($config['site_url'][strlen($config['site_url']) - 1] == '/');
define('SERVER_URL', $config['site_url']);
define('BASE_URL', SERVER_URL . ($hasSlashAtEnd ? '' : '/'));
define('ADMIN_URL', SERVER_URL . ($hasSlashAtEnd ? '' : '/') . ADMIN_PANEL_FOLDER . '/');
}
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']);
}
}
/** @var array $config */ /** @var array $config */
ini_set('log_errors', 1); ini_set('log_errors', 1);
if(@$config['env'] === 'dev' || defined('MYAAC_INSTALL')) { if(@$config['env'] === 'dev' || defined('MYAAC_INSTALL')) {

View File

@@ -18,7 +18,8 @@
"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": "1.*",
"guzzlehttp/guzzle": "7.9.3"
}, },
"require-dev": { "require-dev": {
"phpstan/phpstan": "^1.10" "phpstan/phpstan": "^1.10"

537
composer.lock generated
View File

@@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically" "This file is @generated automatically"
], ],
"content-hash": "be4d1489a53a9cd8eec6bcaa7a096f30", "content-hash": "5317e97a5025ebc2a977214bd3fa964c",
"packages": [ "packages": [
{ {
"name": "brick/math", "name": "brick/math",
@@ -493,6 +493,331 @@
], ],
"time": "2024-09-25T12:00:00+00:00" "time": "2024-09-25T12:00:00+00:00"
}, },
{
"name": "guzzlehttp/guzzle",
"version": "7.9.3",
"source": {
"type": "git",
"url": "https://github.com/guzzle/guzzle.git",
"reference": "7b2f29fe81dc4da0ca0ea7d42107a0845946ea77"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/guzzle/guzzle/zipball/7b2f29fe81dc4da0ca0ea7d42107a0845946ea77",
"reference": "7b2f29fe81dc4da0ca0ea7d42107a0845946ea77",
"shasum": ""
},
"require": {
"ext-json": "*",
"guzzlehttp/promises": "^1.5.3 || ^2.0.3",
"guzzlehttp/psr7": "^2.7.0",
"php": "^7.2.5 || ^8.0",
"psr/http-client": "^1.0",
"symfony/deprecation-contracts": "^2.2 || ^3.0"
},
"provide": {
"psr/http-client-implementation": "1.0"
},
"require-dev": {
"bamarni/composer-bin-plugin": "^1.8.2",
"ext-curl": "*",
"guzzle/client-integration-tests": "3.0.2",
"php-http/message-factory": "^1.1",
"phpunit/phpunit": "^8.5.39 || ^9.6.20",
"psr/log": "^1.1 || ^2.0 || ^3.0"
},
"suggest": {
"ext-curl": "Required for CURL handler support",
"ext-intl": "Required for Internationalized Domain Name (IDN) support",
"psr/log": "Required for using the Log middleware"
},
"type": "library",
"extra": {
"bamarni-bin": {
"bin-links": true,
"forward-command": false
}
},
"autoload": {
"files": [
"src/functions_include.php"
],
"psr-4": {
"GuzzleHttp\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Graham Campbell",
"email": "hello@gjcampbell.co.uk",
"homepage": "https://github.com/GrahamCampbell"
},
{
"name": "Michael Dowling",
"email": "mtdowling@gmail.com",
"homepage": "https://github.com/mtdowling"
},
{
"name": "Jeremy Lindblom",
"email": "jeremeamia@gmail.com",
"homepage": "https://github.com/jeremeamia"
},
{
"name": "George Mponos",
"email": "gmponos@gmail.com",
"homepage": "https://github.com/gmponos"
},
{
"name": "Tobias Nyholm",
"email": "tobias.nyholm@gmail.com",
"homepage": "https://github.com/Nyholm"
},
{
"name": "Márk Sági-Kazár",
"email": "mark.sagikazar@gmail.com",
"homepage": "https://github.com/sagikazarmark"
},
{
"name": "Tobias Schultze",
"email": "webmaster@tubo-world.de",
"homepage": "https://github.com/Tobion"
}
],
"description": "Guzzle is a PHP HTTP client library",
"keywords": [
"client",
"curl",
"framework",
"http",
"http client",
"psr-18",
"psr-7",
"rest",
"web service"
],
"support": {
"issues": "https://github.com/guzzle/guzzle/issues",
"source": "https://github.com/guzzle/guzzle/tree/7.9.3"
},
"funding": [
{
"url": "https://github.com/GrahamCampbell",
"type": "github"
},
{
"url": "https://github.com/Nyholm",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/guzzlehttp/guzzle",
"type": "tidelift"
}
],
"time": "2025-03-27T13:37:11+00:00"
},
{
"name": "guzzlehttp/promises",
"version": "2.2.0",
"source": {
"type": "git",
"url": "https://github.com/guzzle/promises.git",
"reference": "7c69f28996b0a6920945dd20b3857e499d9ca96c"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/guzzle/promises/zipball/7c69f28996b0a6920945dd20b3857e499d9ca96c",
"reference": "7c69f28996b0a6920945dd20b3857e499d9ca96c",
"shasum": ""
},
"require": {
"php": "^7.2.5 || ^8.0"
},
"require-dev": {
"bamarni/composer-bin-plugin": "^1.8.2",
"phpunit/phpunit": "^8.5.39 || ^9.6.20"
},
"type": "library",
"extra": {
"bamarni-bin": {
"bin-links": true,
"forward-command": false
}
},
"autoload": {
"psr-4": {
"GuzzleHttp\\Promise\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Graham Campbell",
"email": "hello@gjcampbell.co.uk",
"homepage": "https://github.com/GrahamCampbell"
},
{
"name": "Michael Dowling",
"email": "mtdowling@gmail.com",
"homepage": "https://github.com/mtdowling"
},
{
"name": "Tobias Nyholm",
"email": "tobias.nyholm@gmail.com",
"homepage": "https://github.com/Nyholm"
},
{
"name": "Tobias Schultze",
"email": "webmaster@tubo-world.de",
"homepage": "https://github.com/Tobion"
}
],
"description": "Guzzle promises library",
"keywords": [
"promise"
],
"support": {
"issues": "https://github.com/guzzle/promises/issues",
"source": "https://github.com/guzzle/promises/tree/2.2.0"
},
"funding": [
{
"url": "https://github.com/GrahamCampbell",
"type": "github"
},
{
"url": "https://github.com/Nyholm",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/guzzlehttp/promises",
"type": "tidelift"
}
],
"time": "2025-03-27T13:27:01+00:00"
},
{
"name": "guzzlehttp/psr7",
"version": "2.7.1",
"source": {
"type": "git",
"url": "https://github.com/guzzle/psr7.git",
"reference": "c2270caaabe631b3b44c85f99e5a04bbb8060d16"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/guzzle/psr7/zipball/c2270caaabe631b3b44c85f99e5a04bbb8060d16",
"reference": "c2270caaabe631b3b44c85f99e5a04bbb8060d16",
"shasum": ""
},
"require": {
"php": "^7.2.5 || ^8.0",
"psr/http-factory": "^1.0",
"psr/http-message": "^1.1 || ^2.0",
"ralouphie/getallheaders": "^3.0"
},
"provide": {
"psr/http-factory-implementation": "1.0",
"psr/http-message-implementation": "1.0"
},
"require-dev": {
"bamarni/composer-bin-plugin": "^1.8.2",
"http-interop/http-factory-tests": "0.9.0",
"phpunit/phpunit": "^8.5.39 || ^9.6.20"
},
"suggest": {
"laminas/laminas-httphandlerrunner": "Emit PSR-7 responses"
},
"type": "library",
"extra": {
"bamarni-bin": {
"bin-links": true,
"forward-command": false
}
},
"autoload": {
"psr-4": {
"GuzzleHttp\\Psr7\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Graham Campbell",
"email": "hello@gjcampbell.co.uk",
"homepage": "https://github.com/GrahamCampbell"
},
{
"name": "Michael Dowling",
"email": "mtdowling@gmail.com",
"homepage": "https://github.com/mtdowling"
},
{
"name": "George Mponos",
"email": "gmponos@gmail.com",
"homepage": "https://github.com/gmponos"
},
{
"name": "Tobias Nyholm",
"email": "tobias.nyholm@gmail.com",
"homepage": "https://github.com/Nyholm"
},
{
"name": "Márk Sági-Kazár",
"email": "mark.sagikazar@gmail.com",
"homepage": "https://github.com/sagikazarmark"
},
{
"name": "Tobias Schultze",
"email": "webmaster@tubo-world.de",
"homepage": "https://github.com/Tobion"
},
{
"name": "Márk Sági-Kazár",
"email": "mark.sagikazar@gmail.com",
"homepage": "https://sagikazarmark.hu"
}
],
"description": "PSR-7 message implementation that also provides common utility methods",
"keywords": [
"http",
"message",
"psr-7",
"request",
"response",
"stream",
"uri",
"url"
],
"support": {
"issues": "https://github.com/guzzle/psr7/issues",
"source": "https://github.com/guzzle/psr7/tree/2.7.1"
},
"funding": [
{
"url": "https://github.com/GrahamCampbell",
"type": "github"
},
{
"url": "https://github.com/Nyholm",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7",
"type": "tidelift"
}
],
"time": "2025-03-27T12:30:47+00:00"
},
{ {
"name": "illuminate/collections", "name": "illuminate/collections",
"version": "v10.48.25", "version": "v10.48.25",
@@ -1472,6 +1797,166 @@
}, },
"time": "2021-11-05T16:47:00+00:00" "time": "2021-11-05T16:47:00+00:00"
}, },
{
"name": "psr/http-client",
"version": "1.0.3",
"source": {
"type": "git",
"url": "https://github.com/php-fig/http-client.git",
"reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/php-fig/http-client/zipball/bb5906edc1c324c9a05aa0873d40117941e5fa90",
"reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90",
"shasum": ""
},
"require": {
"php": "^7.0 || ^8.0",
"psr/http-message": "^1.0 || ^2.0"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "1.0.x-dev"
}
},
"autoload": {
"psr-4": {
"Psr\\Http\\Client\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "PHP-FIG",
"homepage": "https://www.php-fig.org/"
}
],
"description": "Common interface for HTTP clients",
"homepage": "https://github.com/php-fig/http-client",
"keywords": [
"http",
"http-client",
"psr",
"psr-18"
],
"support": {
"source": "https://github.com/php-fig/http-client"
},
"time": "2023-09-23T14:17:50+00:00"
},
{
"name": "psr/http-factory",
"version": "1.1.0",
"source": {
"type": "git",
"url": "https://github.com/php-fig/http-factory.git",
"reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/php-fig/http-factory/zipball/2b4765fddfe3b508ac62f829e852b1501d3f6e8a",
"reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a",
"shasum": ""
},
"require": {
"php": ">=7.1",
"psr/http-message": "^1.0 || ^2.0"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "1.0.x-dev"
}
},
"autoload": {
"psr-4": {
"Psr\\Http\\Message\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "PHP-FIG",
"homepage": "https://www.php-fig.org/"
}
],
"description": "PSR-17: Common interfaces for PSR-7 HTTP message factories",
"keywords": [
"factory",
"http",
"message",
"psr",
"psr-17",
"psr-7",
"request",
"response"
],
"support": {
"source": "https://github.com/php-fig/http-factory"
},
"time": "2024-04-15T12:06:14+00:00"
},
{
"name": "psr/http-message",
"version": "2.0",
"source": {
"type": "git",
"url": "https://github.com/php-fig/http-message.git",
"reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/php-fig/http-message/zipball/402d35bcb92c70c026d1a6a9883f06b2ead23d71",
"reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71",
"shasum": ""
},
"require": {
"php": "^7.2 || ^8.0"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "2.0.x-dev"
}
},
"autoload": {
"psr-4": {
"Psr\\Http\\Message\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "PHP-FIG",
"homepage": "https://www.php-fig.org/"
}
],
"description": "Common interface for HTTP messages",
"homepage": "https://github.com/php-fig/http-message",
"keywords": [
"http",
"http-message",
"psr",
"psr-7",
"request",
"response"
],
"support": {
"source": "https://github.com/php-fig/http-message/tree/2.0"
},
"time": "2023-04-04T09:54:51+00:00"
},
{ {
"name": "psr/log", "name": "psr/log",
"version": "3.0.2", "version": "3.0.2",
@@ -1573,6 +2058,50 @@
}, },
"time": "2021-10-29T13:26:27+00:00" "time": "2021-10-29T13:26:27+00:00"
}, },
{
"name": "ralouphie/getallheaders",
"version": "3.0.3",
"source": {
"type": "git",
"url": "https://github.com/ralouphie/getallheaders.git",
"reference": "120b605dfeb996808c31b6477290a714d356e822"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822",
"reference": "120b605dfeb996808c31b6477290a714d356e822",
"shasum": ""
},
"require": {
"php": ">=5.6"
},
"require-dev": {
"php-coveralls/php-coveralls": "^2.1",
"phpunit/phpunit": "^5 || ^6.5"
},
"type": "library",
"autoload": {
"files": [
"src/getallheaders.php"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Ralph Khattar",
"email": "ralph.khattar@gmail.com"
}
],
"description": "A polyfill for getallheaders.",
"support": {
"issues": "https://github.com/ralouphie/getallheaders/issues",
"source": "https://github.com/ralouphie/getallheaders/tree/develop"
},
"time": "2019-03-08T08:55:37+00:00"
},
{ {
"name": "symfony/console", "name": "symfony/console",
"version": "v6.4.17", "version": "v6.4.17",
@@ -2910,7 +3439,7 @@
], ],
"aliases": [], "aliases": [],
"minimum-stability": "stable", "minimum-stability": "stable",
"stability-flags": [], "stability-flags": {},
"prefer-stable": false, "prefer-stable": false,
"prefer-lowest": false, "prefer-lowest": false,
"platform": { "platform": {
@@ -2921,6 +3450,6 @@
"ext-xml": "*", "ext-xml": "*",
"ext-dom": "*" "ext-dom": "*"
}, },
"platform-dev": [], "platform-dev": {},
"plugin-api-version": "2.3.0" "plugin-api-version": "2.6.0"
} }

View File

@@ -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') + '/changelog', url: Cypress.env('URL') + '/change-log',
method: 'GET', method: 'GET',
}) })
}) })
@@ -132,7 +132,7 @@ describe('Check Public Pages', () => {
it('Go to server info page', () => { it('Go to server info page', () => {
cy.visit({ cy.visit({
url: Cypress.env('URL') + '/server-info', url: Cypress.env('URL') + '/ots-info',
method: 'GET', method: 'GET',
}) })
}) })

BIN
images/order_asc.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 B

BIN
images/order_desc.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 B

View File

@@ -93,6 +93,7 @@ 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');
@@ -117,6 +118,14 @@ 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';
// anonymous usage statistics // anonymous usage statistics
@@ -153,13 +162,6 @@ if(setting('core.anonymous_usage_statistics')) {
} }
} }
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 * @var OTS_Account $account_logged
*/ */

View File

@@ -1,13 +1,13 @@
SET @myaac_database_version = 43; SET @myaac_database_version = 45;
CREATE TABLE `myaac_account_actions` CREATE TABLE `myaac_account_actions`
( (
`id` int NOT NULL AUTO_INCREMENT,
`account_id` int NOT NULL, `account_id` int NOT NULL,
`ip` varchar(45) NOT NULL DEFAULT '', `ip` int unsigned NOT NULL DEFAULT 0,
`ipv6` binary(16) NOT NULL DEFAULT 0,
`date` int NOT NULL DEFAULT 0, `date` int NOT NULL DEFAULT 0,
`action` varchar(255) NOT NULL DEFAULT '', `action` varchar(255) NOT NULL DEFAULT '',
PRIMARY KEY (`id`) KEY (`account_id`)
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8mb4; ) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8mb4;
CREATE TABLE `myaac_admin_menu` CREATE TABLE `myaac_admin_menu`

View File

@@ -10,6 +10,14 @@ 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(),

View File

@@ -195,13 +195,4 @@ 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);

View File

@@ -7,6 +7,11 @@ 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';

View File

@@ -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';
@@ -79,6 +79,10 @@ $up();
require_once SYSTEM . 'migrations/31.php'; require_once SYSTEM . 'migrations/31.php';
$up(); $up();
// rules page
require_once SYSTEM . 'migrations/45.php';
$up();
if(ModelsFAQ::count() == 0) { if(ModelsFAQ::count() == 0) {
ModelsFAQ::create([ ModelsFAQ::create([
'question' => 'What is this?', 'question' => 'What is this?',
@@ -90,6 +94,17 @@ $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']);

View File

@@ -86,12 +86,25 @@ 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');
// 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(); $boostedCreature = BoostedCreature::first();
die(json_encode([ die(json_encode([
'boostedcreature' => true, 'boostedcreature' => true,
'raceid' => $boostedCreature->raceid 'raceid' => $boostedCreature->raceid
])); ]));
break;
case 'login': case 'login':

169
package-lock.json generated
View File

@@ -14,24 +14,13 @@
"tinymce": "^7.2.0" "tinymce": "^7.2.0"
}, },
"devDependencies": { "devDependencies": {
"cypress": "^13.17.0" "cypress": "^14.3.3"
}
},
"node_modules/@colors/colors": {
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz",
"integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==",
"dev": true,
"license": "MIT",
"optional": true,
"engines": {
"node": ">=0.1.90"
} }
}, },
"node_modules/@cypress/request": { "node_modules/@cypress/request": {
"version": "3.0.7", "version": "3.0.8",
"resolved": "https://registry.npmjs.org/@cypress/request/-/request-3.0.7.tgz", "resolved": "https://registry.npmjs.org/@cypress/request/-/request-3.0.8.tgz",
"integrity": "sha512-LzxlLEMbBOPYB85uXrDqvD4MgcenjRBLIns3zyhx7vTPj/0u2eQhzXvPiGcaJrV38Q9dbkExWp6cOHPJ+EtFYg==", "integrity": "sha512-h0NFgh1mJmm1nr4jCwkGHwKneVYKghUyWe6TMNrk0B9zsjAJxpg8C4/+BAcmLgCPa1vj1V8rNUaILl+zYRUWBQ==",
"dev": true, "dev": true,
"license": "Apache-2.0", "license": "Apache-2.0",
"dependencies": { "dependencies": {
@@ -48,7 +37,7 @@
"json-stringify-safe": "~5.0.1", "json-stringify-safe": "~5.0.1",
"mime-types": "~2.1.19", "mime-types": "~2.1.19",
"performance-now": "^2.1.0", "performance-now": "^2.1.0",
"qs": "6.13.1", "qs": "6.14.0",
"safe-buffer": "^5.1.2", "safe-buffer": "^5.1.2",
"tough-cookie": "^5.0.0", "tough-cookie": "^5.0.0",
"tunnel-agent": "^0.6.0", "tunnel-agent": "^0.6.0",
@@ -387,9 +376,9 @@
} }
}, },
"node_modules/call-bind-apply-helpers": { "node_modules/call-bind-apply-helpers": {
"version": "1.0.1", "version": "1.0.2",
"resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz", "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
"integrity": "sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==", "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
@@ -401,14 +390,14 @@
} }
}, },
"node_modules/call-bound": { "node_modules/call-bound": {
"version": "1.0.3", "version": "1.0.4",
"resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.3.tgz", "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz",
"integrity": "sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==", "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"call-bind-apply-helpers": "^1.0.1", "call-bind-apply-helpers": "^1.0.2",
"get-intrinsic": "^1.2.6" "get-intrinsic": "^1.3.0"
}, },
"engines": { "engines": {
"node": ">= 0.4" "node": ">= 0.4"
@@ -504,9 +493,9 @@
} }
}, },
"node_modules/cli-table3": { "node_modules/cli-table3": {
"version": "0.6.5", "version": "0.6.1",
"resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz", "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.1.tgz",
"integrity": "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==", "integrity": "sha512-w0q/enDHhPLq44ovMGdQeeDLvwxwavsJX7oQGYt/LrBlYsyaxyDnp6z3QzFut/6kLLKnlcUVJLrpB7KBfgG/RA==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
@@ -516,7 +505,7 @@
"node": "10.* || >= 12.*" "node": "10.* || >= 12.*"
}, },
"optionalDependencies": { "optionalDependencies": {
"@colors/colors": "1.5.0" "colors": "1.4.0"
} }
}, },
"node_modules/cli-truncate": { "node_modules/cli-truncate": {
@@ -563,6 +552,17 @@
"dev": true, "dev": true,
"license": "MIT" "license": "MIT"
}, },
"node_modules/colors": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz",
"integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==",
"dev": true,
"license": "MIT",
"optional": true,
"engines": {
"node": ">=0.1.90"
}
},
"node_modules/combined-stream": { "node_modules/combined-stream": {
"version": "1.0.8", "version": "1.0.8",
"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
@@ -619,14 +619,14 @@
} }
}, },
"node_modules/cypress": { "node_modules/cypress": {
"version": "13.17.0", "version": "14.3.3",
"resolved": "https://registry.npmjs.org/cypress/-/cypress-13.17.0.tgz", "resolved": "https://registry.npmjs.org/cypress/-/cypress-14.3.3.tgz",
"integrity": "sha512-5xWkaPurwkIljojFidhw8lFScyxhtiFHl/i/3zov+1Z5CmY4t9tjIdvSXfu82Y3w7wt0uR9KkucbhkVvJZLQSA==", "integrity": "sha512-1Rz7zc9iqLww6BysaESqUhtIuaFHS7nL3wREovAKYsNhLTfX3TbcBWHWgEz70YimH2NkSOsm4oIcJJ9HYHOlew==",
"dev": true, "dev": true,
"hasInstallScript": true, "hasInstallScript": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@cypress/request": "^3.0.6", "@cypress/request": "^3.0.8",
"@cypress/xvfb": "^1.2.4", "@cypress/xvfb": "^1.2.4",
"@types/sinonjs__fake-timers": "8.1.1", "@types/sinonjs__fake-timers": "8.1.1",
"@types/sizzle": "^2.3.2", "@types/sizzle": "^2.3.2",
@@ -637,9 +637,9 @@
"cachedir": "^2.3.0", "cachedir": "^2.3.0",
"chalk": "^4.1.0", "chalk": "^4.1.0",
"check-more-types": "^2.24.0", "check-more-types": "^2.24.0",
"ci-info": "^4.0.0", "ci-info": "^4.1.0",
"cli-cursor": "^3.1.0", "cli-cursor": "^3.1.0",
"cli-table3": "~0.6.1", "cli-table3": "0.6.1",
"commander": "^6.2.1", "commander": "^6.2.1",
"common-tags": "^1.8.0", "common-tags": "^1.8.0",
"dayjs": "^1.10.4", "dayjs": "^1.10.4",
@@ -663,7 +663,7 @@
"process": "^0.11.10", "process": "^0.11.10",
"proxy-from-env": "1.0.0", "proxy-from-env": "1.0.0",
"request-progress": "^3.0.0", "request-progress": "^3.0.0",
"semver": "^7.5.3", "semver": "^7.7.1",
"supports-color": "^8.1.1", "supports-color": "^8.1.1",
"tmp": "~0.2.3", "tmp": "~0.2.3",
"tree-kill": "1.2.2", "tree-kill": "1.2.2",
@@ -674,7 +674,7 @@
"cypress": "bin/cypress" "cypress": "bin/cypress"
}, },
"engines": { "engines": {
"node": "^16.0.0 || ^18.0.0 || >=20.0.0" "node": "^18.0.0 || ^20.0.0 || >=22.0.0"
} }
}, },
"node_modules/cypress/node_modules/fs-extra": { "node_modules/cypress/node_modules/fs-extra": {
@@ -819,9 +819,9 @@
} }
}, },
"node_modules/es-object-atoms": { "node_modules/es-object-atoms": {
"version": "1.0.0", "version": "1.1.1",
"resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
"integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
@@ -831,6 +831,22 @@
"node": ">= 0.4" "node": ">= 0.4"
} }
}, },
"node_modules/es-set-tostringtag": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz",
"integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==",
"dev": true,
"license": "MIT",
"dependencies": {
"es-errors": "^1.3.0",
"get-intrinsic": "^1.2.6",
"has-tostringtag": "^1.0.2",
"hasown": "^2.0.2"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/escape-string-regexp": { "node_modules/escape-string-regexp": {
"version": "1.0.5", "version": "1.0.5",
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
@@ -960,14 +976,15 @@
} }
}, },
"node_modules/form-data": { "node_modules/form-data": {
"version": "4.0.1", "version": "4.0.2",
"resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz",
"integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"asynckit": "^0.4.0", "asynckit": "^0.4.0",
"combined-stream": "^1.0.8", "combined-stream": "^1.0.8",
"es-set-tostringtag": "^2.1.0",
"mime-types": "^2.1.12" "mime-types": "^2.1.12"
}, },
"engines": { "engines": {
@@ -999,18 +1016,18 @@
} }
}, },
"node_modules/get-intrinsic": { "node_modules/get-intrinsic": {
"version": "1.2.7", "version": "1.3.0",
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.7.tgz", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
"integrity": "sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==", "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"call-bind-apply-helpers": "^1.0.1", "call-bind-apply-helpers": "^1.0.2",
"es-define-property": "^1.0.1", "es-define-property": "^1.0.1",
"es-errors": "^1.3.0", "es-errors": "^1.3.0",
"es-object-atoms": "^1.0.0", "es-object-atoms": "^1.1.1",
"function-bind": "^1.1.2", "function-bind": "^1.1.2",
"get-proto": "^1.0.0", "get-proto": "^1.0.1",
"gopd": "^1.2.0", "gopd": "^1.2.0",
"has-symbols": "^1.1.0", "has-symbols": "^1.1.0",
"hasown": "^2.0.2", "hasown": "^2.0.2",
@@ -1131,6 +1148,22 @@
"url": "https://github.com/sponsors/ljharb" "url": "https://github.com/sponsors/ljharb"
} }
}, },
"node_modules/has-tostringtag": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
"integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
"dev": true,
"license": "MIT",
"dependencies": {
"has-symbols": "^1.0.3"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/hasown": { "node_modules/hasown": {
"version": "2.0.2", "version": "2.0.2",
"resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
@@ -1560,9 +1593,9 @@
} }
}, },
"node_modules/object-inspect": { "node_modules/object-inspect": {
"version": "1.13.3", "version": "1.13.4",
"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
"integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==", "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"engines": { "engines": {
@@ -1709,13 +1742,13 @@
} }
}, },
"node_modules/qs": { "node_modules/qs": {
"version": "6.13.1", "version": "6.14.0",
"resolved": "https://registry.npmjs.org/qs/-/qs-6.13.1.tgz", "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz",
"integrity": "sha512-EJPeIn0CYrGu+hli1xilKAPXODtJ12T0sP63Ijx2/khC2JtuaN3JyNIpvmnkmaEtha9ocbG4A4cMcr+TvqvwQg==", "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==",
"dev": true, "dev": true,
"license": "BSD-3-Clause", "license": "BSD-3-Clause",
"dependencies": { "dependencies": {
"side-channel": "^1.0.6" "side-channel": "^1.1.0"
}, },
"engines": { "engines": {
"node": ">=0.6" "node": ">=0.6"
@@ -1794,9 +1827,9 @@
"license": "MIT" "license": "MIT"
}, },
"node_modules/semver": { "node_modules/semver": {
"version": "7.6.3", "version": "7.7.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
"integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
"dev": true, "dev": true,
"license": "ISC", "license": "ISC",
"bin": { "bin": {
@@ -2031,22 +2064,22 @@
"license": "GPL-2.0-or-later" "license": "GPL-2.0-or-later"
}, },
"node_modules/tldts": { "node_modules/tldts": {
"version": "6.1.71", "version": "6.1.86",
"resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.71.tgz", "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.86.tgz",
"integrity": "sha512-LQIHmHnuzfZgZWAf2HzL83TIIrD8NhhI0DVxqo9/FdOd4ilec+NTNZOlDZf7EwrTNoutccbsHjvWHYXLAtvxjw==", "integrity": "sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"tldts-core": "^6.1.71" "tldts-core": "^6.1.86"
}, },
"bin": { "bin": {
"tldts": "bin/cli.js" "tldts": "bin/cli.js"
} }
}, },
"node_modules/tldts-core": { "node_modules/tldts-core": {
"version": "6.1.71", "version": "6.1.86",
"resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.71.tgz", "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.86.tgz",
"integrity": "sha512-LRbChn2YRpic1KxY+ldL1pGXN/oVvKfCVufwfVzEQdFYNo39uF7AJa/WXdo+gYO7PTvdfkCPCed6Hkvz/kR7jg==", "integrity": "sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA==",
"dev": true, "dev": true,
"license": "MIT" "license": "MIT"
}, },
@@ -2061,9 +2094,9 @@
} }
}, },
"node_modules/tough-cookie": { "node_modules/tough-cookie": {
"version": "5.1.0", "version": "5.1.2",
"resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.1.0.tgz", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.1.2.tgz",
"integrity": "sha512-rvZUv+7MoBYTiDmFPBrhL7Ujx9Sk+q9wwm22x8c8T5IJaR+Wsyc7TNxbVxo84kZoRJZZMazowFLqpankBEQrGg==", "integrity": "sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==",
"dev": true, "dev": true,
"license": "BSD-3-Clause", "license": "BSD-3-Clause",
"dependencies": { "dependencies": {

View File

@@ -4,7 +4,7 @@
"postinstall": "node ./npm-post-install.js" "postinstall": "node ./npm-post-install.js"
}, },
"devDependencies": { "devDependencies": {
"cypress": "^13.17.0" "cypress": "^14.3.3"
}, },
"dependencies": { "dependencies": {
"@tinymce/tinymce-jquery": "^2.1.0", "@tinymce/tinymce-jquery": "^2.1.0",

View File

@@ -51,5 +51,8 @@
"themes": true, "themes": true,
"admin-pages": true, "admin-pages": true,
"admin-pages-sub-folders": true, "admin-pages-sub-folders": true,
"settings": true,
"install": true,
"init": false
} }
} }

21
system/base.php Normal file
View File

@@ -0,0 +1,21 @@
<?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'];
}
}
}

View File

@@ -109,4 +109,12 @@ $config['clients'] = [
1330, 1330,
1332, 1332,
1340, 1340,
1400,
1405,
1410,
1411,
1412,
1500,
1501,
]; ];

View File

@@ -122,6 +122,10 @@ 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');

View File

@@ -982,11 +982,12 @@ function load_config_lua($filename)
foreach($lines as $ln => $line) foreach($lines as $ln => $line)
{ {
$line = trim($line); $line = trim($line);
if(@$line[0] === '{' || @$line[0] === '}') { if(isset($line[0]) && ($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(str_contains($line, 'dofile')) {
$delimiter = '"'; $delimiter = '"';
@@ -1265,14 +1266,15 @@ 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()]);

View File

@@ -12,6 +12,7 @@ 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\Models\Town;
use MyAAC\Settings; use MyAAC\Settings;
@@ -46,6 +47,11 @@ if(isset($config['gzip_output']) && $config['gzip_output'] && isset($_SERVER['HT
global $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; global $hooks;
$hooks = new Hooks(); $hooks = new Hooks();
@@ -138,6 +144,9 @@ $ots = POT::getInstance();
$eloquentConnection = null; $eloquentConnection = null;
require_once SYSTEM . 'database.php'; require_once SYSTEM . 'database.php';
$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 ' . (IS_CLI ? 'http://your-ip.com/' : BASE_URL) . 'install');

File diff suppressed because it is too large Load Diff

View File

@@ -12,8 +12,6 @@
* @license http://www.gnu.org/licenses/lgpl-3.0.txt GNU Lesser General Public License, Version 3 * @license http://www.gnu.org/licenses/lgpl-3.0.txt GNU Lesser General Public License, Version 3
*/ */
use MyAAC\Models\AccountAction;
/** /**
* OTServ account abstraction. * OTServ account abstraction.
* *
@@ -445,9 +443,6 @@ class OTS_Account extends OTS_Row_DAO implements IteratorAggregate, Countable
throw new E_OTS_NotLoaded(); throw new E_OTS_NotLoaded();
} }
$configFreePremium = configLua('freePremium');
if(isset($configFreePremium) && getBoolean($configFreePremium)) {return -1;}
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));
@@ -1012,16 +1007,26 @@ class OTS_Account extends OTS_Row_DAO implements IteratorAggregate, Countable
public function logAction($action) public function logAction($action)
{ {
AccountAction::create([ $ip = get_browser_real_ip();
'account_id' => $this->getId(), if(!str_contains($ip, ":")) {
'ip' => get_browser_real_ip(), $ipv6 = '0';
'date' => time(), }
'action' => $action, else {
]); $ipv6 = $ip;
$ip = '';
}
return $this->db->exec('INSERT INTO `' . TABLE_PREFIX . 'account_actions` (`account_id`, `ip`, `ipv6`, `date`, `action`) VALUES (' . $this->db->quote($this->getId()).', ' . ($ip == '' ? '0' : $this->db->quote(ip2long($ip))) . ', (' . ($ipv6 == '0' ? $this->db->quote('') : $this->db->quote(inet_pton($ipv6))) . '), UNIX_TIMESTAMP(NOW()), ' . $this->db->quote($action).')');
} }
public function getActionsLog($limit) { public function getActionsLog($limit1, $limit2)
return AccountAction::where('account_id', $this->data['id'])->orderByDesc('date')->limit($limit)->get()->toArray(); {
$actions = array();
foreach($this->db->query('SELECT `ip`, `ipv6`, `date`, `action` FROM `' . TABLE_PREFIX . 'account_actions` WHERE `account_id` = ' . $this->data['id'] . ' ORDER by `date` DESC LIMIT ' . $limit1 . ', ' . $limit2 . '')->fetchAll() as $a)
$actions[] = array('ip' => $a['ip'], 'ipv6' => $a['ipv6'], 'date' => $a['date'], 'action' => $a['action']);
return $actions;
} }
/** /**
* Returns players iterator. * Returns players iterator.

View File

@@ -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,252 +48,257 @@ 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() public function getMonstersCount(): int
{ {
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.
@@ -301,89 +306,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();
} }
} }
/**#@-*/ /**#@-*/

View File

@@ -2919,6 +2919,32 @@ class OTS_Player extends OTS_Row_DAO
$this->data['banned'] = $ban['active']; $this->data['banned'] = $ban['active'];
$this->data['banned_time'] = $ban['expires']; $this->data['banned_time'] = $ban['expires'];
} }
public function isNameLocked(): bool
{
// nothing can't be banned
if( !$this->isLoaded() ) {
throw new E_OTS_NotLoaded();
}
if($this->db->hasTable('player_namelocks')) {
$ban = $this->db->query('SELECT 1 FROM `player_namelocks` WHERE `player_id` = ' . $this->data['id'])->fetch(PDO::FETCH_ASSOC);
return (isset($ban['1']));
}
else if($this->db->hasTable('bans')) {
if($this->db->hasColumn('bans', 'active')) {
$ban = $this->db->query('SELECT `active`, `expires` FROM `bans` WHERE `type` = 2 AND `active` = 1 AND `value` = ' . $this->data['id'] . ' AND (`expires` > ' . time() .' OR `expires` = -1) ORDER BY `expires` DESC')->fetch();
return isset($ban['active']);
}
else { // tfs 0.2
$ban = $this->db->query('SELECT `time` FROM `bans` WHERE `type` = 2 AND `account` = ' . $this->data['account_id'] . ' AND (`time` > ' . time() .' OR `time` = -1) ORDER BY `time` DESC')->fetch();
return isset($ban['time']) && ($ban['time'] == -1 || $ban['time'] > 0);
}
}
return false;
}
/** /**
* Deletes player. * Deletes player.
* *
@@ -2953,21 +2979,14 @@ class OTS_Player extends OTS_Row_DAO
* @return string Player proffesion name. * @return string Player proffesion name.
* @throws E_OTS_NotLoaded If player is not loaded or global vocations list is not loaded. * @throws E_OTS_NotLoaded If player is not loaded or global vocations list is not loaded.
*/ */
public function getVocationName() public function getVocationName(): string
{ {
if( !isset($this->data['vocation']) ) if( !isset($this->data['vocation']) )
{ {
throw new E_OTS_NotLoaded(); throw new E_OTS_NotLoaded();
} }
global $config; return OTS_Toolbox::getVocationName($this->data['vocation'], $this->data['promotion'] ?? 0);
$voc = $this->getVocation();
if(!isset($config['vocations'][$voc])) {
return 'Unknown';
}
return $config['vocations'][$voc];
//return POT::getInstance()->getVocationsList()->getVocationName($this->data['vocation']);
} }
/** /**

View File

@@ -26,14 +26,19 @@ class OTS_ServerInfo
* *
* @var string * @var string
*/ */
private $server; private string $server;
/** /**
* Connection port. * Connection port.
* *
* @var int * @var int
*/ */
private $port; private int $port;
/**
* Status timeout
*/
private float $timeout = 2.0;
/** /**
* Creates handler for new server. * Creates handler for new server.
@@ -41,11 +46,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.
@@ -54,46 +59,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, setting('core.status_timeout')); $socket = @fsockopen($this->server, $this->port, $error, $message, $this->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.
@@ -108,30 +113,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.
@@ -146,26 +151,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.
@@ -180,27 +185,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.
@@ -210,20 +215,24 @@ 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;
}
} }
/**#@-*/ /**#@-*/

View File

@@ -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();
} }
} }
} }
/**#@-*/ /**#@-*/

View File

@@ -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,25 +91,34 @@ 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';
}
} }
/**#@-*/ /**#@-*/

View File

@@ -48,6 +48,8 @@ $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.';

View File

@@ -52,6 +52,8 @@ $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.';

View File

@@ -52,6 +52,8 @@ $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.';

View File

@@ -1,27 +1,20 @@
<?php <?php
/**
* @var OTS_DB_MySQL $db
*/
// 2025-02-27 // 2025-05-14
// remove ipv6, change to ip (for both ipv4 + ipv6) as VARCHAR(45) // update pages links
$up = function () use ($db) { // server-info conflicts with apache2 mod
$db->query("ALTER TABLE `myaac_account_actions` DROP KEY `account_id`;"); // Changelog conflicts with changelog files
$db->query("ALTER TABLE `myaac_account_actions` ADD COLUMN `id` INT(11) NOT NULL AUTO_INCREMENT FIRST, ADD PRIMARY KEY (`id`);");
$db->modifyColumn(TABLE_PREFIX . 'account_actions', 'ip', "VARCHAR(45) NOT NULL DEFAULT ''"); use MyAAC\Models\Menu;
$db->query("UPDATE `" . TABLE_PREFIX . "account_actions` SET `ip` = INET_NTOA(`ip`) WHERE `ip` != '0';"); use MyAAC\Models\Pages;
$db->query("UPDATE `" . TABLE_PREFIX . "account_actions` SET `ip` = INET6_NTOA(`ipv6`) WHERE `ip` = '0';");
$db->dropColumn(TABLE_PREFIX . 'account_actions', 'ipv6'); $up = function() {
Menu::where('link', 'server-info')->update(['link' => 'ots-info']);
Menu::where('link', 'changelog')->update(['link' => 'change-log']);
}; };
$down = function () use ($db) { $down = function() {
$db->query("ALTER TABLE `" . TABLE_PREFIX . "account_actions` DROP `id`;"); Menu::where('link', 'ots-info')->update(['link' => 'server-info']);
$db->query("ALTER TABLE `" . TABLE_PREFIX . "account_actions` ADD KEY (`account_id`);"); Menu::where('link', 'change-log')->update(['link' => 'changelog']);
$db->addColumn(TABLE_PREFIX . 'account_actions', 'ipv6', "BINARY(16) NOT NULL DEFAULT 0x00000000000000000000000000000000 AFTER ip");
$db->query("UPDATE `" . TABLE_PREFIX . "account_actions` SET `ipv6` = INET6_ATON(ip) WHERE NOT IS_IPV4(`ip`);");
$db->query("UPDATE `" . TABLE_PREFIX . "account_actions` SET `ip` = INET_ATON(`ip`) WHERE IS_IPV4(`ip`);");
$db->query("UPDATE `" . TABLE_PREFIX . "account_actions` SET `ip` = 0 WHERE `ipv6` != 0x00000000000000000000000000000000;");
$db->modifyColumn(TABLE_PREFIX . 'account_actions', 'ip', "INT(11) UNSIGNED NOT NULL DEFAULT 0;");
}; };

32
system/migrations/45.php Normal file
View File

@@ -0,0 +1,32 @@
<?php
// 2025-05-14
// update pages links
// server-info conflicts with apache2 mod
// Changelog conflicts with changelog files
use MyAAC\Models\Pages;
$up = function() {
Pages::where('name', 'rules_on_the_page')->update(['hide' => 1]);
$rules = Pages::where('name', 'rules')->first();
if (!$rules) {
Pages::create([
'name' => 'rules',
'title' => 'Server Rules',
'body' => '<b>{{ config.lua.serverName }} Rules</b><br/>' . nl2br(file_get_contents(__DIR__ . '/30-rules.txt')),
'date' => time(),
'player_id' => 1,
'php' => 0,
'enable_tinymce' => 1,
'access' => 0,
'hide' => 0,
]);
}
};
$down = function() {
Pages::where('name', 'rules_on_the_page')->update(['hide' => 0]);
};

View File

@@ -8,7 +8,7 @@
* @link https://my-aac.org * @link https://my-aac.org
*/ */
defined('MYAAC') or die('Direct access not allowed!'); defined('MYAAC') or die('Direct access not allowed!');
$title = '404 Not Found'; $title = 'Not Found';
header('HTTP/1.0 404 Not Found'); header('HTTP/1.0 404 Not Found');
?> ?>

View File

@@ -8,7 +8,7 @@
* @link https://my-aac.org * @link https://my-aac.org
*/ */
defined('MYAAC') or die('Direct access not allowed!'); defined('MYAAC') or die('Direct access not allowed!');
$title = '405 Method Not Allowed'; $title = 'Method Not Allowed';
header('HTTP/1.0 405 Method Not Allowed'); header('HTTP/1.0 405 Method Not Allowed');
?> ?>

View File

@@ -17,6 +17,8 @@ if(!$logged) {
return; return;
} }
csrfProtect();
$email_new_time = $account_logged->getCustomField("email_new_time"); $email_new_time = $account_logged->getCustomField("email_new_time");
if($email_new_time > 10) { if($email_new_time > 10) {
@@ -164,7 +166,7 @@ if(isset($_POST['emailchangecancel']) && $_POST['emailchangecancel'] == 1) {
$account_logged->setCustomField("email_new", ""); $account_logged->setCustomField("email_new", "");
$account_logged->setCustomField("email_new_time", 0); $account_logged->setCustomField("email_new_time", 0);
$custom_buttons = '<div style="text-align:center"><table border="0" cellspacing="0" cellpadding="0" ><form action="' . getLink('account/manage') . '" method="post" ><tr><td style="border:0px;" >' . $twig->render('buttons.back.html.twig') . '</td></tr></form></table></div>'; $custom_buttons = '<div style="text-align:center"><table border="0" cellspacing="0" cellpadding="0" ><form action="' . getLink('account/manage') . '" method="post" >' . csrf(true) . '<tr><td style="border:0px;" >' . $twig->render('buttons.back.html.twig') . '</td></tr></form></table></div>';
$twig->display('success.html.twig', array( $twig->display('success.html.twig', array(
'title' => 'Email Address Change Cancelled', 'title' => 'Email Address Change Cancelled',

View File

@@ -20,6 +20,8 @@ if(!$logged) {
return; return;
} }
csrfProtect();
if(setting('core.account_country')) if(setting('core.account_country'))
require SYSTEM . 'countries.conf.php'; require SYSTEM . 'countries.conf.php';

View File

@@ -17,6 +17,8 @@ if(!$logged) {
return; return;
} }
csrfProtect();
$new_password = $_POST['newpassword'] ?? NULL; $new_password = $_POST['newpassword'] ?? NULL;
$new_password_confirm = $_POST['newpassword_confirm'] ?? NULL; $new_password_confirm = $_POST['newpassword_confirm'] ?? NULL;
$old_password = $_POST['oldpassword'] ?? NULL; $old_password = $_POST['oldpassword'] ?? NULL;

View File

@@ -20,6 +20,8 @@ if(!$logged) {
return; return;
} }
csrfProtect();
$player = null; $player = null;
$player_name = isset($_REQUEST['name']) ? stripslashes(urldecode($_REQUEST['name'])) : null; $player_name = isset($_REQUEST['name']) ? stripslashes(urldecode($_REQUEST['name'])) : null;
$new_comment = isset($_POST['comment']) ? htmlspecialchars(stripslashes(substr($_POST['comment'],0,2000))) : NULL; $new_comment = isset($_POST['comment']) ? htmlspecialchars(stripslashes(substr($_POST['comment'],0,2000))) : NULL;

View File

@@ -17,6 +17,8 @@ if(!$logged) {
return; return;
} }
csrfProtect();
$player_id = isset($_POST['player_id']) ? (int)$_POST['player_id'] : NULL; $player_id = isset($_POST['player_id']) ? (int)$_POST['player_id'] : NULL;
$name = isset($_POST['name']) ? stripslashes(ucwords(strtolower($_POST['name']))) : NULL; $name = isset($_POST['name']) ? stripslashes(ucwords(strtolower($_POST['name']))) : NULL;
if((!setting('core.account_change_character_name'))) if((!setting('core.account_change_character_name')))

View File

@@ -17,6 +17,8 @@ if(!$logged) {
return; return;
} }
csrfProtect();
$sex_changed = false; $sex_changed = false;
$player_id = isset($_POST['player_id']) ? (int)$_POST['player_id'] : NULL; $player_id = isset($_POST['player_id']) ? (int)$_POST['player_id'] : NULL;
$new_sex = isset($_POST['new_sex']) ? (int)$_POST['new_sex'] : NULL; $new_sex = isset($_POST['new_sex']) ? (int)$_POST['new_sex'] : NULL;

View File

@@ -20,6 +20,8 @@ if(!$logged) {
return; return;
} }
csrfProtect();
$character_name = isset($_POST['name']) ? stripslashes($_POST['name']) : null; $character_name = isset($_POST['name']) ? stripslashes($_POST['name']) : null;
$character_sex = isset($_POST['sex']) ? (int)$_POST['sex'] : null; $character_sex = isset($_POST['sex']) ? (int)$_POST['sex'] : null;
$character_vocation = isset($_POST['vocation']) ? (int)$_POST['vocation'] : null; $character_vocation = isset($_POST['vocation']) ? (int)$_POST['vocation'] : null;

View File

@@ -17,6 +17,8 @@ if(!$logged) {
return; return;
} }
csrfProtect();
$player_name = isset($_POST['delete_name']) ? stripslashes($_POST['delete_name']) : null; $player_name = isset($_POST['delete_name']) ? stripslashes($_POST['delete_name']) : null;
$password_verify = isset($_POST['delete_password']) ? $_POST['delete_password'] : null; $password_verify = isset($_POST['delete_password']) ? $_POST['delete_password'] : null;
$password_verify = encrypt((USE_ACCOUNT_SALT ? $account_logged->getCustomField('salt') : '') . $password_verify); $password_verify = encrypt((USE_ACCOUNT_SALT ? $account_logged->getCustomField('salt') : '') . $password_verify);

View File

@@ -23,6 +23,8 @@ if($logged)
return; return;
} }
csrfProtect();
if(setting('core.account_create_character_create')) { if(setting('core.account_create_character_create')) {
$createCharacter = new CreateCharacter(); $createCharacter = new CreateCharacter();
} }
@@ -219,8 +221,14 @@ if($save)
} }
} }
if(setting('core.account_premium_points') && setting('core.account_premium_points') > 0) { $accountDefaultPremiumPoints = setting('core.account_premium_points');
$new_account->setCustomField('premium_points', setting('core.account_premium_points')); if($accountDefaultPremiumPoints > 0) {
$new_account->setCustomField('premium_points', $accountDefaultPremiumPoints);
}
$accountDefaultCoins = setting('core.account_coins');
if($db->hasColumn('accounts', 'coins') && $accountDefaultCoins > 0) {
$new_account->setCustomField('coins', $accountDefaultCoins);
} }
$tmp_account = $email; $tmp_account = $email;

View File

@@ -18,6 +18,8 @@ if($logged || !isset($_POST['account_login']) || !isset($_POST['password_login']
return; return;
} }
csrfProtect();
$login_account = $_POST['account_login']; $login_account = $_POST['account_login'];
$login_password = $_POST['password_login']; $login_password = $_POST['password_login'];
$remember_me = isset($_POST['remember_me']); $remember_me = isset($_POST['remember_me']);
@@ -95,3 +97,8 @@ else {
} }
$hooks->trigger(HOOK_ACCOUNT_LOGIN_POST); $hooks->trigger(HOOK_ACCOUNT_LOGIN_POST);
if($logged) {
$twig->addGlobal('logged', true);
$twig->addGlobal('account_logged', $account_logged);
}

View File

@@ -34,6 +34,8 @@ if(isset($_REQUEST['redirect']))
return; return;
} }
csrfProtect();
$groups = new OTS_Groups_List(); $groups = new OTS_Groups_List();
$freePremium = isset($config['lua']['freePremium']) && getBoolean($config['lua']['freePremium']) || $account_logged->getPremDays() == OTS_Account::GRATIS_PREMIUM_DAYS; $freePremium = isset($config['lua']['freePremium']) && getBoolean($config['lua']['freePremium']) || $account_logged->getPremDays() == OTS_Account::GRATIS_PREMIUM_DAYS;
@@ -85,8 +87,12 @@ if($email_new_time > 1)
} }
} }
$actions = $account_logged->getActionsLog(1000); $actions = array();
foreach($account_logged->getActionsLog(0, 1000) as $action) {
$actions[] = array('action' => $action['action'], 'date' => $action['date'], 'ip' => $action['ip'] != 0 ? long2ip($action['ip']) : inet_ntop($action['ipv6']));
}
$players = array();
/** @var OTS_Players_List $account_players */ /** @var OTS_Players_List $account_players */
$account_players = $account_logged->getPlayersList(); $account_players = $account_logged->getPlayersList();
$account_players->orderBy('id'); $account_players->orderBy('id');

View File

@@ -1,23 +0,0 @@
<?php
/**
* Change comment
*
* @package MyAAC
* @author Gesior <jerzyskalski@wp.pl>
* @author Slawkens <slawkens@gmail.com>
* @copyright 2019 MyAAC
* @link https://my-aac.org
*/
defined('MYAAC') or die('Direct access not allowed!');
$redirect = urldecode($_REQUEST['redirect']);
// should never happen, unless hacker modify the URL
if (!str_contains($redirect, BASE_URL)) {
error('Fatal error: Cannot redirect outside the website.');
return;
}
$twig->display('account.redirect.html.twig', array(
'redirect' => $redirect
));

View File

@@ -17,6 +17,8 @@ if(!$logged) {
return; return;
} }
csrfProtect();
if(isset($_POST['reg_password'])) if(isset($_POST['reg_password']))
$reg_password = encrypt((USE_ACCOUNT_SALT ? $account_logged->getCustomField('salt') : '') . $_POST['reg_password']); $reg_password = encrypt((USE_ACCOUNT_SALT ? $account_logged->getCustomField('salt') : '') . $_POST['reg_password']);

View File

@@ -17,6 +17,8 @@ if(!$logged) {
return; return;
} }
csrfProtect();
$_POST['reg_password'] = $_POST['reg_password'] ?? ''; $_POST['reg_password'] = $_POST['reg_password'] ?? '';
$reg_password = encrypt((USE_ACCOUNT_SALT ? $account_logged->getCustomField('salt') : '') . $_POST['reg_password']); $reg_password = encrypt((USE_ACCOUNT_SALT ? $account_logged->getCustomField('salt') : '') . $_POST['reg_password']);
$old_key = $account_logged->getCustomField("key"); $old_key = $account_logged->getCustomField("key");

View File

@@ -0,0 +1,46 @@
<?php
/**
* Changelog
*
* @package MyAAC
* @author Slawkens <slawkens@gmail.com>
* @copyright 2019 MyAAC
* @link https://my-aac.org
*/
defined('MYAAC') or die('Direct access not allowed!');
$title = 'Changelog';
use MyAAC\Models\Changelog;
$_page = isset($_GET['page']) ? (int)$_GET['page'] : 0;
$limit = 30;
$offset = $_page * $limit;
$next_page = false;
$canEdit = hasFlag(FLAG_CONTENT_NEWS) || superAdmin();
$changelogs = Changelog::isPublic()->orderByDesc('date')->limit($limit + 1)->offset($offset)->get()->toArray();
$i = 0;
foreach($changelogs as $key => &$log)
{
if($i < $limit) {
$log['type'] = getChangelogType($log['type']);
$log['where'] = getChangelogWhere($log['where']);
}
else {
unset($changelogs[$key]);
}
if ($i >= $limit)
$next_page = true;
$i++;
}
$twig->display('changelog.html.twig', array(
'changelogs' => $changelogs,
'page' => $_page,
'next_page' => $next_page,
'canEdit' => $canEdit,
));

View File

@@ -1,46 +1,3 @@
<?php <?php
/**
* Changelog
*
* @package MyAAC
* @author Slawkens <slawkens@gmail.com>
* @copyright 2019 MyAAC
* @link https://my-aac.org
*/
defined('MYAAC') or die('Direct access not allowed!');
$title = 'Changelog';
use MyAAC\Models\Changelog; require 'change-log.php';
$_page = isset($_GET['page']) ? (int)$_GET['page'] : 0;
$limit = 30;
$offset = $_page * $limit;
$next_page = false;
$canEdit = hasFlag(FLAG_CONTENT_NEWS) || superAdmin();
$changelogs = Changelog::isPublic()->orderByDesc('date')->limit($limit + 1)->offset($offset)->get()->toArray();
$i = 0;
foreach($changelogs as $key => &$log)
{
if($i < $limit) {
$log['type'] = getChangelogType($log['type']);
$log['where'] = getChangelogWhere($log['where']);
}
else {
unset($changelogs[$key]);
}
if ($i >= $limit)
$next_page = true;
$i++;
}
$twig->display('changelog.html.twig', array(
'changelogs' => $changelogs,
'page' => $_page,
'next_page' => $next_page,
'canEdit' => $canEdit,
));

View File

@@ -17,6 +17,8 @@ if(!$canEdit) {
return; return;
} }
csrfProtect();
$groupsList = new OTS_Groups_List(); $groupsList = new OTS_Groups_List();
$groups = [ $groups = [
['id' => 0, 'name' => 'Guest'], ['id' => 0, 'name' => 'Guest'],
@@ -30,23 +32,24 @@ foreach ($groupsList as $group) {
} }
if(!empty($action)) { if(!empty($action)) {
if($action == 'delete_board' || $action == 'edit_board' || $action == 'hide_board' || $action == 'moveup_board' || $action == 'movedown_board') if($action == 'delete_board' || $action == 'edit_board' || $action == 'hide_board' || $action == 'moveup_board' || $action == 'movedown_board') {
$id = $_REQUEST['id']; $id = $_REQUEST['id'];
if(isset($_REQUEST['access'])) {
$access = $_REQUEST['access'];
} }
if(isset($_REQUEST['guild'])) { if(isset($_POST['access'])) {
$guild = $_REQUEST['guild']; $access = $_POST['access'];
} }
if(isset($_REQUEST['name'])) { if(isset($_POST['guild'])) {
$name = $_REQUEST['name']; $guild = $_POST['guild'];
} }
if(isset($_REQUEST['description'])) { if(isset($_POST['name'])) {
$description = stripslashes($_REQUEST['description']); $name = $_POST['name'];
}
if(isset($_POST['description'])) {
$description = stripslashes($_POST['description']);
} }
$errors = []; $errors = [];
@@ -55,12 +58,13 @@ if(!empty($action)) {
if(Forum::add_board($name, $description, $access, $guild, $errors)) { if(Forum::add_board($name, $description, $access, $guild, $errors)) {
$action = $name = $description = ''; $action = $name = $description = '';
header('Location: ' . getLink('forum')); header('Location: ' . getLink('forum'));
exit;
} }
} }
else if($action == 'delete_board') { else if($action == 'delete_board') {
Forum::delete_board($id, $errors); Forum::delete_board($id, $errors);
header('Location: ' . getLink('forum')); header('Location: ' . getLink('forum'));
$action = ''; exit;
} }
else if($action == 'edit_board') else if($action == 'edit_board')
{ {
@@ -74,28 +78,27 @@ if(!empty($action)) {
else { else {
Forum::update_board($id, $name, $access, $guild, $description); Forum::update_board($id, $name, $access, $guild, $description);
header('Location: ' . getLink('forum')); header('Location: ' . getLink('forum'));
$action = $name = $description = ''; exit;
$access = $guild = 0;
} }
} }
else if($action == 'hide_board') { else if($action == 'hide_board') {
Forum::toggleHide_board($id, $errors); Forum::toggleHide_board($id, $errors);
header('Location: ' . getLink('forum')); header('Location: ' . getLink('forum'));
$action = ''; exit;
} }
else if($action == 'moveup_board') { else if($action == 'moveup_board') {
Forum::move_board($id, -1, $errors); Forum::move_board($id, -1, $errors);
header('Location: ' . getLink('forum')); header('Location: ' . getLink('forum'));
$action = ''; exit;
} }
else if($action == 'movedown_board') { else if($action == 'movedown_board') {
Forum::move_board($id, 1, $errors); Forum::move_board($id, 1, $errors);
header('Location: ' . getLink('forum')); header('Location: ' . getLink('forum'));
$action = ''; exit;
} }
if(!empty($errors)) { if(!empty($errors)) {
$twig->display('error_box.html.twig', array('errors' => $errors)); $twig->display('error_box.html.twig', ['errors' => $errors]);
$action = ''; $action = '';
} }
} }

View File

@@ -23,8 +23,9 @@ if(!$logged) {
return; return;
} }
if(Forum::canPost($account_logged)) csrfProtect();
{
if(Forum::canPost($account_logged)) {
$post_id = isset($_REQUEST['id']) ? (int) $_REQUEST['id'] : false; $post_id = isset($_REQUEST['id']) ? (int) $_REQUEST['id'] : false;
if(!$post_id) { if(!$post_id) {
$errors[] = 'Please enter post id.'; $errors[] = 'Please enter post id.';
@@ -41,12 +42,12 @@ if(Forum::canPost($account_logged))
$char_id = $post_topic = $text = $smile = $html = null; $char_id = $post_topic = $text = $smile = $html = null;
$players_from_account = $db->query("SELECT `players`.`name`, `players`.`id` FROM `players` WHERE `players`.`account_id` = ".(int) $account_logged->getId())->fetchAll(); $players_from_account = $db->query("SELECT `players`.`name`, `players`.`id` FROM `players` WHERE `players`.`account_id` = ".(int) $account_logged->getId())->fetchAll();
$saved = false; $saved = false;
if(isset($_REQUEST['save'])) { if(isset($_POST['save'])) {
$text = stripslashes(trim($_REQUEST['text'])); $text = stripslashes(trim($_POST['text']));
$char_id = (int) $_REQUEST['char_id']; $char_id = (int) $_POST['char_id'];
$post_topic = stripslashes(trim($_REQUEST['topic'])); $post_topic = stripslashes(trim($_POST['topic']));
$smile = isset($_REQUEST['smile']) ? (int)$_REQUEST['smile'] : 0; $smile = isset($_POST['smile']) ? (int)$_POST['smile'] : 0;
$html = isset($_REQUEST['html']) ? (int)$_REQUEST['html'] : 0; $html = isset($_POST['html']) ? (int)$_POST['html'] : 0;
if (!superAdmin()) { if (!superAdmin()) {
$html = 0; $html = 0;

View File

@@ -23,15 +23,17 @@ if(!$logged) {
return; return;
} }
csrfProtect();
if(!Forum::isModerator()) { if(!Forum::isModerator()) {
echo 'You are not logged in or you are not moderator.'; echo 'You are not logged in or you are not moderator.';
return; return;
} }
$save = isset($_REQUEST['save']) && (int)$_REQUEST['save'] == 1; $save = isset($_POST['save']) && (int)$_POST['save'] == 1;
if($save) { if($save) {
$post_id = (int)$_REQUEST['id']; $post_id = (int)$_POST['id'];
$board = (int)$_REQUEST['section']; $board = (int)$_POST['section'];
if(!Forum::hasAccess($board)) { if(!Forum::hasAccess($board)) {
$errors[] = "You don't have access to this board."; $errors[] = "You don't have access to this board.";
displayErrorBoxWithBackButton($errors, getLink('forum')); displayErrorBoxWithBackButton($errors, getLink('forum'));

View File

@@ -28,6 +28,8 @@ if(!$logged) {
return; return;
} }
csrfProtect();
if(Forum::canPost($account_logged)) { if(Forum::canPost($account_logged)) {
$players_from_account = $db->query("SELECT `players`.`name`, `players`.`id` FROM `players` WHERE `players`.`account_id` = ".(int) $account_logged->getId())->fetchAll(); $players_from_account = $db->query("SELECT `players`.`name`, `players`.`id` FROM `players` WHERE `players`.`account_id` = ".(int) $account_logged->getId())->fetchAll();
$thread_id = isset($_REQUEST['thread_id']) ? (int) $_REQUEST['thread_id'] : 0; $thread_id = isset($_REQUEST['thread_id']) ? (int) $_REQUEST['thread_id'] : 0;
@@ -43,11 +45,11 @@ if(Forum::canPost($account_logged)) {
echo '<a href="' . getLink('forum') . '">Boards</a> >> <a href="' . getForumBoardLink($thread['section']) . '">'.$sections[$thread['section']]['name'].'</a> >> <a href="' . getForumThreadLink($thread_id) . '">'.htmlspecialchars($thread['post_topic']).'</a> >> <b>Post new reply</b><br /><h3>'.htmlspecialchars($thread['post_topic']).'</h3>'; echo '<a href="' . getLink('forum') . '">Boards</a> >> <a href="' . getForumBoardLink($thread['section']) . '">'.$sections[$thread['section']]['name'].'</a> >> <a href="' . getForumThreadLink($thread_id) . '">'.htmlspecialchars($thread['post_topic']).'</a> >> <b>Post new reply</b><br /><h3>'.htmlspecialchars($thread['post_topic']).'</h3>';
$quote = isset($_REQUEST['quote']) ? (int) $_REQUEST['quote'] : NULL; $quote = isset($_REQUEST['quote']) ? (int) $_REQUEST['quote'] : NULL;
$text = isset($_REQUEST['text']) ? stripslashes(trim($_REQUEST['text'])) : NULL; $text = isset($_POST['text']) ? stripslashes(trim($_POST['text'])) : NULL;
$char_id = (int) ($_REQUEST['char_id'] ?? 0); $char_id = (int) ($_POST['char_id'] ?? 0);
$post_topic = isset($_REQUEST['topic']) ? stripslashes(trim($_REQUEST['topic'])) : ''; $post_topic = isset($_POST['topic']) ? stripslashes(trim($_POST['topic'])) : '';
$smile = (int)($_REQUEST['smile'] ?? 0); $smile = (int)($_POST['smile'] ?? 0);
$html = (int)($_REQUEST['html'] ?? 0); $html = (int)($_POST['html'] ?? 0);
$saved = false; $saved = false;
if (!superAdmin()) { if (!superAdmin()) {
@@ -60,10 +62,10 @@ if(Forum::canPost($account_logged)) {
$text = '[i]Originally posted by ' . $quoted_post[0]['name'] . ' on ' . date('d.m.y H:i:s', $quoted_post[0]['post_date']) . ':[/i][quote]' . $quoted_post[0]['post_text'] . '[/quote]'; $text = '[i]Originally posted by ' . $quoted_post[0]['name'] . ' on ' . date('d.m.y H:i:s', $quoted_post[0]['post_date']) . ':[/i][quote]' . $quoted_post[0]['post_text'] . '[/quote]';
} }
} }
elseif(isset($_REQUEST['save'])) { elseif(isset($_POST['save'])) {
$length = strlen($text); $length = strlen($text);
if($length < 1 || strlen($text) > 15000) { if($length < 1 || strlen($text) > 15000) {
$errors[] = 'Too short or too long post (Length: $length letters). Minimum 1 letter, maximum 15000 letters.'; $errors[] = "Too short or too long post (Length: $length letters). Minimum 1 letter, maximum 15000 letters.";
} }
if($char_id == 0) { if($char_id == 0) {
@@ -79,15 +81,14 @@ if(Forum::canPost($account_logged)) {
} }
if(!$player_on_account) { if(!$player_on_account) {
$errors[] = 'Player with selected ID ' . $char_id . ' doesn\'t exist or isn\'t on your account'; $errors[] = "Player with selected ID $char_id doesn't exist or isn't on your account";
} }
} }
if(count($errors) == 0) { if(count($errors) == 0) {
$last_post = 0; $last_post = 0;
$query = $db->query('SELECT post_date FROM ' . FORUM_TABLE_PREFIX . 'forum ORDER BY post_date DESC LIMIT 1'); $query = $db->query('SELECT post_date FROM ' . FORUM_TABLE_PREFIX . 'forum ORDER BY post_date DESC LIMIT 1');
if($query->rowCount() > 0) if($query->rowCount() > 0) {
{
$query = $query->fetch(); $query = $query->fetch();
$last_post = $query['post_date']; $last_post = $query['post_date'];
} }

View File

@@ -28,6 +28,8 @@ if(!$logged) {
return; return;
} }
csrfProtect();
if(Forum::canPost($account_logged)) { if(Forum::canPost($account_logged)) {
$players_from_account = $db->query('SELECT `players`.`name`, `players`.`id` FROM `players` WHERE `players`.`account_id` = '.(int) $account_logged->getId())->fetchAll(); $players_from_account = $db->query('SELECT `players`.`name`, `players`.`id` FROM `players` WHERE `players`.`account_id` = '.(int) $account_logged->getId())->fetchAll();
$section_id = $_REQUEST['section_id'] ?? null; $section_id = $_REQUEST['section_id'] ?? null;
@@ -38,19 +40,18 @@ if(Forum::canPost($account_logged)) {
if ($sections[$section_id]['closed'] && !Forum::isModerator()) if ($sections[$section_id]['closed'] && !Forum::isModerator())
$errors[] = 'You cannot create topic on this board.'; $errors[] = 'You cannot create topic on this board.';
$quote = (int)(isset($_REQUEST['quote']) ? $_REQUEST['quote'] : 0); $text = isset($_POST['text']) ? stripslashes($_POST['text']) : '';
$text = isset($_REQUEST['text']) ? stripslashes($_REQUEST['text']) : ''; $char_id = (int)(isset($_POST['char_id']) ? $_POST['char_id'] : 0);
$char_id = (int)(isset($_REQUEST['char_id']) ? $_REQUEST['char_id'] : 0); $post_topic = isset($_POST['topic']) ? stripslashes($_POST['topic']) : '';
$post_topic = isset($_REQUEST['topic']) ? stripslashes($_REQUEST['topic']) : ''; $smile = (isset($_POST['smile']) ? (int)$_POST['smile'] : 0);
$smile = (isset($_REQUEST['smile']) ? (int)$_REQUEST['smile'] : 0); $html = (isset($_POST['html']) ? (int)$_POST['html'] : 0);
$html = (isset($_REQUEST['html']) ? (int)$_REQUEST['html'] : 0);
if (!superAdmin()) { if (!superAdmin()) {
$html = 0; $html = 0;
} }
$saved = false; $saved = false;
if (isset($_REQUEST['save'])) { if (isset($_POST['save'])) {
$length = strlen($post_topic); $length = strlen($post_topic);
if ($length < 1 || $length > 60) { if ($length < 1 || $length > 60) {
$errors[] = "Too short or too long topic (Length: $length letters). Minimum 1 letter, maximum 60 letters."; $errors[] = "Too short or too long topic (Length: $length letters). Minimum 1 letter, maximum 60 letters.";

View File

@@ -23,11 +23,13 @@ if(!$logged) {
return; return;
} }
csrfProtect();
if(Forum::isModerator()) { if(Forum::isModerator()) {
$id = (int) $_REQUEST['id']; $id = (int) ($_POST['id'] ?? 0);
$post = $db->query("SELECT `id`, `first_post`, `section` FROM `" . FORUM_TABLE_PREFIX . "forum` WHERE `id` = ".$id." LIMIT 1")->fetch(); $post = $db->query("SELECT `id`, `first_post`, `section` FROM `" . FORUM_TABLE_PREFIX . "forum` WHERE `id` = ".$id." LIMIT 1")->fetch();
if($post['id'] == $id && Forum::hasAccess($post['section'])) { if($post && $post['id'] == $id && Forum::hasAccess($post['section'])) {
if($post['id'] == $post['first_post']) { if($post['id'] == $post['first_post']) {
$db->query("DELETE FROM `" . FORUM_TABLE_PREFIX . "forum` WHERE `first_post` = ".$post['id']); $db->query("DELETE FROM `" . FORUM_TABLE_PREFIX . "forum` WHERE `first_post` = ".$post['id']);
header('Location: ' . getForumBoardLink($post['section'])); header('Location: ' . getForumBoardLink($post['section']));
@@ -36,7 +38,7 @@ if(Forum::isModerator()) {
$post_page = $db->query("SELECT COUNT(`" . FORUM_TABLE_PREFIX . "forum`.`id`) AS posts_count FROM `players`, `" . FORUM_TABLE_PREFIX . "forum` WHERE `players`.`id` = `" . FORUM_TABLE_PREFIX . "forum`.`author_guid` AND `" . FORUM_TABLE_PREFIX . "forum`.`id` < ".$id." AND `" . FORUM_TABLE_PREFIX . "forum`.`first_post` = ".(int) $post['first_post'])->fetch(); $post_page = $db->query("SELECT COUNT(`" . FORUM_TABLE_PREFIX . "forum`.`id`) AS posts_count FROM `players`, `" . FORUM_TABLE_PREFIX . "forum` WHERE `players`.`id` = `" . FORUM_TABLE_PREFIX . "forum`.`author_guid` AND `" . FORUM_TABLE_PREFIX . "forum`.`id` < ".$id." AND `" . FORUM_TABLE_PREFIX . "forum`.`first_post` = ".(int) $post['first_post'])->fetch();
$_page = (int) ceil($post_page['posts_count'] / setting('core.forum_threads_per_page')) - 1; $_page = (int) ceil($post_page['posts_count'] / setting('core.forum_threads_per_page')) - 1;
$db->query("DELETE FROM `" . FORUM_TABLE_PREFIX . "forum` WHERE `id` = ".$post['id']); $db->query("DELETE FROM `" . FORUM_TABLE_PREFIX . "forum` WHERE `id` = ".$post['id']);
header('Location: ' . getForumThreadLink($post['first_post'], (int) $_page)); header('Location: ' . getForumThreadLink($post['first_post'], $_page));
} }
} }
else { else {

View File

@@ -33,7 +33,7 @@ if(!Forum::hasAccess($section_id)) {
return; return;
} }
$_page = (int) (isset($_REQUEST['page']) ? $_REQUEST['page'] : 0); $_page = (int) ($_REQUEST['page'] ?? 0);
$threads_count = $db->query("SELECT COUNT(`" . FORUM_TABLE_PREFIX . "forum`.`id`) AS threads_count FROM `players`, `" . FORUM_TABLE_PREFIX . "forum` WHERE `players`.`id` = `" . FORUM_TABLE_PREFIX . "forum`.`author_guid` AND `" . FORUM_TABLE_PREFIX . "forum`.`section` = ".(int) $section_id." AND `" . FORUM_TABLE_PREFIX . "forum`.`first_post` = `" . FORUM_TABLE_PREFIX . "forum`.`id`")->fetch(); $threads_count = $db->query("SELECT COUNT(`" . FORUM_TABLE_PREFIX . "forum`.`id`) AS threads_count FROM `players`, `" . FORUM_TABLE_PREFIX . "forum` WHERE `players`.`id` = `" . FORUM_TABLE_PREFIX . "forum`.`author_guid` AND `" . FORUM_TABLE_PREFIX . "forum`.`section` = ".(int) $section_id." AND `" . FORUM_TABLE_PREFIX . "forum`.`first_post` = `" . FORUM_TABLE_PREFIX . "forum`.`id`")->fetch();
for($i = 0; $i < $threads_count['threads_count'] / setting('core.forum_threads_per_page'); $i++) { for($i = 0; $i < $threads_count['threads_count'] / setting('core.forum_threads_per_page'); $i++) {
if($i != $_page) if($i != $_page)
@@ -50,7 +50,7 @@ if($logged && (!$sections[$section_id]['closed'] || Forum::isModerator())) {
} }
echo '<br /><br />Page: '.$links_to_pages.'<br />'; echo '<br /><br />Page: '.$links_to_pages.'<br />';
$last_threads = $db->query("SELECT `players`.`id` as `player_id`, `players`.`name`, `" . FORUM_TABLE_PREFIX . "forum`.`post_text`, `" . FORUM_TABLE_PREFIX . "forum`.`post_topic`, `" . FORUM_TABLE_PREFIX . "forum`.`id`, `" . FORUM_TABLE_PREFIX . "forum`.`last_post`, `" . FORUM_TABLE_PREFIX . "forum`.`replies`, `" . FORUM_TABLE_PREFIX . "forum`.`views`, `" . FORUM_TABLE_PREFIX . "forum`.`post_date` FROM `players`, `" . FORUM_TABLE_PREFIX . "forum` WHERE `players`.`id` = `" . FORUM_TABLE_PREFIX . "forum`.`author_guid` AND `" . FORUM_TABLE_PREFIX . "forum`.`section` = ".$section_id." AND `" . FORUM_TABLE_PREFIX . "forum`.`first_post` = `" . FORUM_TABLE_PREFIX . "forum`.`id` ORDER BY `" . FORUM_TABLE_PREFIX . "forum`.`last_post` DESC LIMIT ".setting('core.forum_threads_per_page')." OFFSET ".($_page * setting('core.forum_threads_per_page')))->fetchAll(); $last_threads = $db->query("SELECT `players`.`id` as `player_id`, `players`.`name`, `" . FORUM_TABLE_PREFIX . "forum`.`first_post`, `" . FORUM_TABLE_PREFIX . "forum`.`post_text`, `" . FORUM_TABLE_PREFIX . "forum`.`post_topic`, `" . FORUM_TABLE_PREFIX . "forum`.`id`, `" . FORUM_TABLE_PREFIX . "forum`.`last_post`, `" . FORUM_TABLE_PREFIX . "forum`.`replies`, `" . FORUM_TABLE_PREFIX . "forum`.`views`, `" . FORUM_TABLE_PREFIX . "forum`.`post_date` FROM `players`, `" . FORUM_TABLE_PREFIX . "forum` WHERE `players`.`id` = `" . FORUM_TABLE_PREFIX . "forum`.`author_guid` AND `" . FORUM_TABLE_PREFIX . "forum`.`section` = ".$section_id." AND `" . FORUM_TABLE_PREFIX . "forum`.`first_post` = `" . FORUM_TABLE_PREFIX . "forum`.`id` ORDER BY `" . FORUM_TABLE_PREFIX . "forum`.`last_post` DESC LIMIT ".setting('core.forum_threads_per_page')." OFFSET ".($_page * setting('core.forum_threads_per_page')))->fetchAll(PDO::FETCH_ASSOC);
if(isset($last_threads[0])) { if(isset($last_threads[0])) {
echo '<table width="100%"> echo '<table width="100%">
@@ -67,8 +67,8 @@ if(isset($last_threads[0])) {
foreach($last_threads as $thread) { foreach($last_threads as $thread) {
echo '<tr bgcolor="' . getStyle($number_of_rows++) . '"><td>'; echo '<tr bgcolor="' . getStyle($number_of_rows++) . '"><td>';
if(Forum::isModerator()) { if(Forum::isModerator()) {
echo '<a href="' . getLink('forum') . '?action=move_thread&id='.$thread['id'].'"\')"><span style="color:darkgreen">[MOVE]</span></a>'; echo '<a href="' . getLink('forum') . '?action=move_thread&id=' . $thread['id'] . '" title="Move Thread"><img src="images/icons/arrow_right.gif"/></a>';
echo '<a href="' . getLink('forum') . '?action=remove_post&id='.$thread['id'].'" onclick="return confirm(\'Are you sure you want remove thread > '.htmlspecialchars($thread['post_topic']).' <?\')"><span style="color: red">[REMOVE]</span></a> '; $twig->display('forum.remove_post.html.twig', ['post' => $thread]);
} }
$player->load($thread['player_id']); $player->load($thread['player_id']);
@@ -82,10 +82,13 @@ if(isset($last_threads[0])) {
echo '<a href="' . getForumThreadLink($thread['id']) . '">'.htmlspecialchars($thread['post_topic']). '</a><br /><small>'.($canEditForum ? substr(strip_tags($thread['post_text']), 0, 50) : htmlspecialchars(substr($thread['post_text'], 0, 50))).'...</small></td><td>' . getPlayerLink($thread['name']) . '</td><td>'.(int) $thread['replies'].'</td><td>'.(int) $thread['views'].'</td><td>'; echo '<a href="' . getForumThreadLink($thread['id']) . '">'.htmlspecialchars($thread['post_topic']). '</a><br /><small>'.($canEditForum ? substr(strip_tags($thread['post_text']), 0, 50) : htmlspecialchars(substr($thread['post_text'], 0, 50))).'...</small></td><td>' . getPlayerLink($thread['name']) . '</td><td>'.(int) $thread['replies'].'</td><td>'.(int) $thread['views'].'</td><td>';
if($thread['last_post'] > 0) { if($thread['last_post'] > 0) {
$last_post = $db->query("SELECT `players`.`name`, `" . FORUM_TABLE_PREFIX . "forum`.`post_date` FROM `players`, `" . FORUM_TABLE_PREFIX . "forum` WHERE `" . FORUM_TABLE_PREFIX . "forum`.`first_post` = ".(int) $thread['id']." AND `players`.`id` = `" . FORUM_TABLE_PREFIX . "forum`.`author_guid` ORDER BY `post_date` DESC LIMIT 1")->fetch(); $last_post = $db->query("SELECT `players`.`name`, `" . FORUM_TABLE_PREFIX . "forum`.`post_date` FROM `players`, `" . FORUM_TABLE_PREFIX . "forum` WHERE `" . FORUM_TABLE_PREFIX . "forum`.`first_post` = ".(int) $thread['id']." AND `players`.`id` = `" . FORUM_TABLE_PREFIX . "forum`.`author_guid` ORDER BY `post_date` DESC LIMIT 1")->fetch();
if(isset($last_post['name']))
echo date('d.m.y H:i:s', $last_post['post_date']).'<br />by ' . getPlayerLink($last_post['name']); if(isset($last_post['name'])) {
else echo date('d.m.y H:i:s', $last_post['post_date']) . '<br />by ' . getPlayerLink($last_post['name']);
}
else {
echo 'No posts.'; echo 'No posts.';
}
} }
else { else {
echo date('d.m.y H:i:s', $thread['post_date']) . '<br />by ' . getPlayerLink($thread['name']); echo date('d.m.y H:i:s', $thread['post_date']) . '<br />by ' . getPlayerLink($thread['name']);

View File

@@ -35,7 +35,7 @@ if(!Forum::hasAccess($thread_starter['section'])) {
return; return;
} }
$posts_count = $db->query("SELECT COUNT(`" . FORUM_TABLE_PREFIX . "forum`.`id`) AS posts_count FROM `players`, `" . FORUM_TABLE_PREFIX . "forum` WHERE `players`.`id` = `" . FORUM_TABLE_PREFIX . "forum`.`author_guid` AND `" . FORUM_TABLE_PREFIX . "forum`.`first_post` = ".(int) $thread_id)->fetch(); $posts_count = $db->query("SELECT COUNT(`" . FORUM_TABLE_PREFIX . "forum`.`id`) AS posts_count FROM `players`, `" . FORUM_TABLE_PREFIX . "forum` WHERE `players`.`id` = `" . FORUM_TABLE_PREFIX . "forum`.`author_guid` AND `" . FORUM_TABLE_PREFIX . "forum`.`first_post` = ".$thread_id)->fetch();
for($i = 0; $i < $posts_count['posts_count'] / setting('core.forum_threads_per_page'); $i++) { for($i = 0; $i < $posts_count['posts_count'] / setting('core.forum_threads_per_page'); $i++) {
if($i != $_page) if($i != $_page)
$links_to_pages .= '<a href="' . getForumThreadLink($thread_id, $i) . '">'.($i + 1).'</a> '; $links_to_pages .= '<a href="' . getForumThreadLink($thread_id, $i) . '">'.($i + 1).'</a> ';
@@ -46,7 +46,7 @@ for($i = 0; $i < $posts_count['posts_count'] / setting('core.forum_threads_per_p
$posts = $db->query("SELECT `players`.`id` as `player_id`, `" . FORUM_TABLE_PREFIX . "forum`.`id`,`" . FORUM_TABLE_PREFIX . "forum`.`first_post`, `" . FORUM_TABLE_PREFIX . "forum`.`section`,`" . FORUM_TABLE_PREFIX . "forum`.`post_text`, `" . FORUM_TABLE_PREFIX . "forum`.`post_topic`, `" . FORUM_TABLE_PREFIX . "forum`.`post_date` AS `date`, `" . FORUM_TABLE_PREFIX . "forum`.`post_smile`, `" . FORUM_TABLE_PREFIX . "forum`.`post_html`, `" . FORUM_TABLE_PREFIX . "forum`.`author_aid`, `" . FORUM_TABLE_PREFIX . "forum`.`author_guid`, `" . FORUM_TABLE_PREFIX . "forum`.`last_edit_aid`, `" . FORUM_TABLE_PREFIX . "forum`.`edit_date` FROM `players`, `" . FORUM_TABLE_PREFIX . "forum` WHERE `players`.`id` = `" . FORUM_TABLE_PREFIX . "forum`.`author_guid` AND `" . FORUM_TABLE_PREFIX . "forum`.`first_post` = ".$thread_id." ORDER BY `" . FORUM_TABLE_PREFIX . "forum`.`post_date` LIMIT " . setting('core.forum_posts_per_page') . " OFFSET ".($_page * setting('core.forum_posts_per_page')))->fetchAll(); $posts = $db->query("SELECT `players`.`id` as `player_id`, `" . FORUM_TABLE_PREFIX . "forum`.`id`,`" . FORUM_TABLE_PREFIX . "forum`.`first_post`, `" . FORUM_TABLE_PREFIX . "forum`.`section`,`" . FORUM_TABLE_PREFIX . "forum`.`post_text`, `" . FORUM_TABLE_PREFIX . "forum`.`post_topic`, `" . FORUM_TABLE_PREFIX . "forum`.`post_date` AS `date`, `" . FORUM_TABLE_PREFIX . "forum`.`post_smile`, `" . FORUM_TABLE_PREFIX . "forum`.`post_html`, `" . FORUM_TABLE_PREFIX . "forum`.`author_aid`, `" . FORUM_TABLE_PREFIX . "forum`.`author_guid`, `" . FORUM_TABLE_PREFIX . "forum`.`last_edit_aid`, `" . FORUM_TABLE_PREFIX . "forum`.`edit_date` FROM `players`, `" . FORUM_TABLE_PREFIX . "forum` WHERE `players`.`id` = `" . FORUM_TABLE_PREFIX . "forum`.`author_guid` AND `" . FORUM_TABLE_PREFIX . "forum`.`first_post` = ".$thread_id." ORDER BY `" . FORUM_TABLE_PREFIX . "forum`.`post_date` LIMIT " . setting('core.forum_posts_per_page') . " OFFSET ".($_page * setting('core.forum_posts_per_page')))->fetchAll();
if(isset($posts[0]['player_id'])) { if(isset($posts[0]['player_id'])) {
$db->query("UPDATE `" . FORUM_TABLE_PREFIX . "forum` SET `views`=`views`+1 WHERE `id` = ".(int) $thread_id); $db->query("UPDATE `" . FORUM_TABLE_PREFIX . "forum` SET `views`=`views`+1 WHERE `id` = " . $thread_id);
} }
$lookaddons = $db->hasColumn('players', 'lookaddons'); $lookaddons = $db->hasColumn('players', 'lookaddons');

View File

@@ -12,11 +12,11 @@ defined('MYAAC') or die('Direct access not allowed!');
require __DIR__ . '/base.php'; require __DIR__ . '/base.php';
//set rights in guild // set rights in guild
$guild_name = isset($_REQUEST['guild']) ? urldecode($_REQUEST['guild']) : null; $guild_name = isset($_REQUEST['guild']) ? urldecode($_REQUEST['guild']) : null;
$name = isset($_REQUEST['name']) ? stripslashes($_REQUEST['name']) : null; $name = isset($_REQUEST['name']) ? stripslashes($_REQUEST['name']) : null;
if(!$logged) { if(!$logged) {
$errors[] = 'You are not logged in. You can\'t accept invitations.'; $errors[] = "You are not logged in. You can't accept invitations.";
} }
if(!Validator::guildName($guild_name)) { if(!Validator::guildName($guild_name)) {
@@ -27,11 +27,11 @@ if(empty($errors)) {
$guild = new OTS_Guild(); $guild = new OTS_Guild();
$guild->find($guild_name); $guild->find($guild_name);
if(!$guild->isLoaded()) { if(!$guild->isLoaded()) {
$errors[] = 'Guild with name <b>'.$guild_name.'</b> doesn\'t exist.'; $errors[] = "Guild with name <b>$guild_name</b> doesn't exist.";
} }
} }
if(isset($_REQUEST['todo']) && $_REQUEST['todo'] == 'save') { if(isset($_POST['todo']) && $_POST['todo'] == 'save') {
if(!Validator::characterName($name)) { if(!Validator::characterName($name)) {
$errors[] = 'Invalid name format.'; $errors[] = 'Invalid name format.';
} }
@@ -51,7 +51,7 @@ if(isset($_REQUEST['todo']) && $_REQUEST['todo'] == 'save') {
} }
} }
if(isset($_REQUEST['todo']) && $_REQUEST['todo'] == 'save') { if(isset($_POST['todo']) && $_POST['todo'] == 'save') {
if(empty($errors)) { if(empty($errors)) {
$is_invited = false; $is_invited = false;
include(SYSTEM . 'libs/pot/InvitesDriver.php'); include(SYSTEM . 'libs/pot/InvitesDriver.php');
@@ -104,7 +104,7 @@ if(!empty($errors)) {
)); ));
} }
else { else {
if(isset($_REQUEST['todo']) && $_REQUEST['todo'] == 'save') { if(isset($_POST['todo']) && $_POST['todo'] == 'save') {
$guild->acceptInvite($player); $guild->acceptInvite($player);
$twig->display('success.html.twig', array( $twig->display('success.html.twig', array(
'title' => 'Accept invitation', 'title' => 'Accept invitation',

View File

@@ -13,7 +13,7 @@ defined('MYAAC') or die('Direct access not allowed!');
require __DIR__ . '/base.php'; require __DIR__ . '/base.php';
$guild_name = isset($_REQUEST['guild']) ? urldecode($_REQUEST['guild']) : null; $guild_name = isset($_REQUEST['guild']) ? urldecode($_REQUEST['guild']) : null;
$rank_name = isset($_REQUEST['rank_name']) ? $_REQUEST['rank_name'] : null; $rank_name = $_POST['rank_name'] ?? null;
if(!Validator::guildName($guild_name)) { if(!Validator::guildName($guild_name)) {
$errors[] = Validator::getLastError(); $errors[] = Validator::getLastError();
} }
@@ -35,7 +35,7 @@ if(empty($errors)) {
$rank_list = $guild->getGuildRanksList(); $rank_list = $guild->getGuildRanksList();
$rank_list->orderBy('level', POT::ORDER_DESC); $rank_list->orderBy('level', POT::ORDER_DESC);
$guild_leader = false; $guild_leader = false;
$account_players = $account_logged->getPlayers(); $account_players = $account_logged->getPlayersList();
foreach($account_players as $player) { foreach($account_players as $player) {
if($guild_leader_char->getId() == $player->getId()) { if($guild_leader_char->getId() == $player->getId()) {
$guild_vice = true; $guild_vice = true;

View File

@@ -15,3 +15,5 @@ else
define('GUILD_MEMBERS_TABLE', 'guild_membership'); define('GUILD_MEMBERS_TABLE', 'guild_membership');
define('MOTD_EXISTS', $db->hasColumn('guilds', 'motd')); define('MOTD_EXISTS', $db->hasColumn('guilds', 'motd'));
csrfProtect();

View File

@@ -31,7 +31,7 @@ if(empty($errors)) {
$rank_list = $guild->getGuildRanksList(); $rank_list = $guild->getGuildRanksList();
$rank_list->orderBy('level', POT::ORDER_DESC); $rank_list->orderBy('level', POT::ORDER_DESC);
$guild_leader = false; $guild_leader = false;
$account_players = $account_logged->getPlayers(); $account_players = $account_logged->getPlayersList();
foreach($account_players as $player) { foreach($account_players as $player) {
if($guild->getOwner()->getId() == $player->getId()) { if($guild->getOwner()->getId() == $player->getId()) {
$guild_vice = true; $guild_vice = true;
@@ -42,8 +42,8 @@ if(empty($errors)) {
$saved = false; $saved = false;
if($guild_leader) { if($guild_leader) {
if(isset($_REQUEST['todo']) && $_REQUEST['todo'] == 'save') { if(isset($_POST['todo']) && $_POST['todo'] == 'save') {
$description = htmlspecialchars(stripslashes(substr(trim($_REQUEST['description']),0, setting('core.guild_description_chars_limit')))); $description = htmlspecialchars(stripslashes(substr(trim($_POST['description']),0, setting('core.guild_description_chars_limit'))));
$guild->setCustomField('description', $description); $guild->setCustomField('description', $description);
$saved = true; $saved = true;
} }

View File

@@ -30,7 +30,7 @@ if(empty($errors)) {
if($logged) { if($logged) {
$guild_leader_char = $guild->getOwner(); $guild_leader_char = $guild->getOwner();
$guild_leader = false; $guild_leader = false;
$account_players = $account_logged->getPlayers(); $account_players = $account_logged->getPlayersList();
foreach($account_players as $player) { foreach($account_players as $player) {
if($guild_leader_char->getId() == $player->getId()) { if($guild_leader_char->getId() == $player->getId()) {
@@ -40,14 +40,13 @@ if(empty($errors)) {
} }
} }
if($guild_leader) if($guild_leader) {
{
$max_image_size_b = setting('core.guild_image_size_kb') * 1024; $max_image_size_b = setting('core.guild_image_size_kb') * 1024;
$allowed_ext = array('image/gif', 'image/jpg', 'image/pjpeg', 'image/jpeg', 'image/bmp', 'image/png', 'image/x-png'); $allowed_ext = array('image/gif', 'image/jpg', 'image/pjpeg', 'image/jpeg', 'image/bmp', 'image/png', 'image/x-png');
$ext_name = array('image/gif' => 'gif', 'image/jpg' => 'jpg', 'image/jpeg' => 'jpg', 'image/pjpeg' => 'jpg', 'image/bmp' => 'bmp', 'image/png' => 'png', 'image/x-png' => 'png'); $ext_name = array('image/gif' => 'gif', 'image/jpg' => 'jpg', 'image/jpeg' => 'jpg', 'image/pjpeg' => 'jpg', 'image/bmp' => 'bmp', 'image/png' => 'png', 'image/x-png' => 'png');
$save_file_name = str_replace(' ', '_', strtolower($guild->getName())); $save_file_name = str_replace(' ', '_', strtolower($guild->getName()));
$save_path = GUILD_IMAGES_DIR . $save_file_name; $save_path = GUILD_IMAGES_DIR . $save_file_name;
if(isset($_REQUEST['todo']) && $_REQUEST['todo'] == 'save') if(isset($_POST['todo']) && $_POST['todo'] == 'save')
{ {
$file = $_FILES['newlogo']; $file = $_FILES['newlogo'];
if(is_uploaded_file($file['tmp_name'])) if(is_uploaded_file($file['tmp_name']))
@@ -97,13 +96,13 @@ if(empty($errors)) {
$guild_logo = $guild->getCustomField('logo_name'); $guild_logo = $guild->getCustomField('logo_name');
if(empty($guild_logo) || !file_exists(GUILD_IMAGES_DIR . $guild_logo)) { if(empty($guild_logo) || !file_exists(GUILD_IMAGES_DIR . $guild_logo)) {
$guild_logo = "default.gif"; $guild_logo = 'default.gif';
} }
$twig->display('guilds.change_logo.html.twig', array( $twig->display('guilds.change_logo.html.twig', array(
'guild_logo' => $guild_logo, 'guild_logo' => $guild_logo,
'guild' => $guild, 'guild' => $guild,
'max_image_size_b' => $max_image_size_b //'max_image_size_b' => $max_image_size_b
)); ));
} }

View File

@@ -34,7 +34,7 @@ if(empty($errors)) {
$rank_list = $guild->getGuildRanksList(); $rank_list = $guild->getGuildRanksList();
$rank_list->orderBy('level', POT::ORDER_DESC); $rank_list->orderBy('level', POT::ORDER_DESC);
$guild_leader = false; $guild_leader = false;
$account_players = $account_logged->getPlayers(); $account_players = $account_logged->getPlayersList();
foreach($account_players as $player) { foreach($account_players as $player) {
if($guild->getOwner()->getId() == $player->getId()) { if($guild->getOwner()->getId() == $player->getId()) {
$guild_vice = true; $guild_vice = true;
@@ -45,8 +45,8 @@ if(empty($errors)) {
$saved = false; $saved = false;
if($guild_leader) { if($guild_leader) {
if(isset($_REQUEST['todo']) && $_REQUEST['todo'] == 'save') { if(isset($_POST['todo']) && $_POST['todo'] == 'save') {
$motd = htmlspecialchars(stripslashes(substr($_REQUEST['motd'],0, setting('core.guild_motd_chars_limit')))); $motd = htmlspecialchars(stripslashes(substr($_POST['motd'],0, setting('core.guild_motd_chars_limit'))));
$guild->setCustomField('motd', $motd); $guild->setCustomField('motd', $motd);
$saved = true; $saved = true;
} }

View File

@@ -20,17 +20,15 @@ if(!$logged) {
} }
$name = isset($_REQUEST['name']) ? stripslashes($_REQUEST['name']) : null; $name = isset($_REQUEST['name']) ? stripslashes($_REQUEST['name']) : null;
$new_nick = isset($_REQUEST['nick']) ? stripslashes($_REQUEST['nick']) : null; $new_nick = isset($_POST['nick']) ? stripslashes($_POST['nick']) : null;
$guild_name = isset($_REQUEST['guild']) ? urldecode($_REQUEST['guild']) : null; $guild_name = isset($_REQUEST['guild']) ? urldecode($_REQUEST['guild']) : null;
if(!$name) { if(!$name) {
$errors[] = 'Please enter new name.'; $errors[] = 'Please enter new name.';
return;
} }
if(!$new_nick) { if(!$new_nick) {
$errors[] = 'Please enter new nick.'; $errors[] = 'Please enter new nick.';
return;
} }
if(empty($errors)) if(empty($errors))

View File

@@ -17,8 +17,9 @@ if(!$logged) {
} }
else { else {
$guild_name = isset($_REQUEST['guild']) ? urldecode($_REQUEST['guild']) : null; $guild_name = isset($_REQUEST['guild']) ? urldecode($_REQUEST['guild']) : null;
if(!Validator::guildName($guild_name)) if(!Validator::guildName($guild_name)) {
$errors[] = Validator::getLastError(); $errors[] = Validator::getLastError();
}
} }
if(empty($errors)) if(empty($errors))
@@ -42,7 +43,7 @@ $rank_list = $guild->getGuildRanksList();
$rank_list->orderBy('level', POT::ORDER_DESC); $rank_list->orderBy('level', POT::ORDER_DESC);
$guild_leader = false; $guild_leader = false;
$guild_vice = false; $guild_vice = false;
$account_players = $account_logged->getPlayers(); $account_players = $account_logged->getPlayersList();
foreach($account_players as $player) foreach($account_players as $player)
{ {
$player_rank = $player->getRank(); $player_rank = $player->getRank();
@@ -65,22 +66,23 @@ foreach($account_players as $player)
} }
} }
if($guild_vice) if($guild_vice) {
{ if(isset($_POST['todo']) && $_POST['todo'] === 'save') {
if(isset($_REQUEST['todo']) && $_REQUEST['todo'] === 'save')
{
$player_name = stripslashes($_REQUEST['name']); $player_name = stripslashes($_REQUEST['name']);
$new_rank = (int) $_REQUEST['rankid']; $new_rank = (int) $_POST['rankid'];
if(!Validator::characterName($player_name))
if(!Validator::characterName($player_name)) {
$errors[] = 'Invalid player name format.'; $errors[] = 'Invalid player name format.';
}
$rank = new OTS_GuildRank(); $rank = new OTS_GuildRank();
$rank->load($new_rank); $rank->load($new_rank);
if(!$rank->isLoaded()) if(!$rank->isLoaded())
$errors[] = "Rank with this ID doesn't exist."; $errors[] = "Rank with this ID doesn't exist.";
if($level_in_guild <= $rank->getLevel() && !$guild_leader) if($level_in_guild <= $rank->getLevel() && !$guild_leader)
$errors[] = "You can't set ranks with equal or higher level than your."; $errors[] = "You can't set ranks with equal or higher level than your.";
if(empty($errors))
{ if(empty($errors)) {
$player_to_change = new OTS_Player(); $player_to_change = new OTS_Player();
$player_to_change->find($player_name); $player_to_change->find($player_name);
if(!$player_to_change->isLoaded()) if(!$player_to_change->isLoaded())
@@ -108,8 +110,7 @@ if($guild_vice)
$errors[] = 'This player has higher rank in guild than you. You can\'t change his/her rank.'; $errors[] = 'This player has higher rank in guild than you. You can\'t change his/her rank.';
} }
if(empty($errors)) if(empty($errors)) {
{
$player_to_change->setRank($rank); $player_to_change->setRank($rank);
$twig->display('success.html.twig', array( $twig->display('success.html.twig', array(
'title' => 'Rank Changed', 'title' => 'Rank Changed',
@@ -125,7 +126,7 @@ if($guild_vice)
$result = getPlayersWithLowerRank($rank_list, $guild_leader, $db, $level_in_guild, $guild); $result = getPlayersWithLowerRank($rank_list, $guild_leader, $db, $level_in_guild, $guild);
$twig->display('guilds.change_rank.html.twig', array( $twig->display('guilds.change_rank.html.twig', array(
'players' => isset($result['players']) ? $result['players'] : array(), 'players' => $result['players'] ?? [],
'guild_name' => $guild->getName(), 'guild_name' => $guild->getName(),
'ranks' => $result['ranks'] 'ranks' => $result['ranks']
)); ));

View File

@@ -12,33 +12,27 @@ defined('MYAAC') or die('Direct access not allowed!');
require __DIR__ . '/base.php'; require __DIR__ . '/base.php';
if(!$logged) if(!$logged) {
{
echo "You are not logged in."; echo "You are not logged in.";
$twig->display('guilds.back_button.html.twig'); $twig->display('guilds.back_button.html.twig');
return; return;
} }
if(admin()) if(admin()) {
{
$players_list = new OTS_Players_List(); $players_list = new OTS_Players_List();
$players_list->init(); $players_list->init();
} }
else else {
$players_list = $account_logged->getPlayersList(); $players_list = $account_logged->getPlayersList();
}
if(count($players_list) > 0) if(count($players_list) > 0) {
{ foreach($players_list as $player) {
foreach($players_list as $player)
{
$player_rank = $player->getRank(); $player_rank = $player->getRank();
if($player_rank->isLoaded()) if($player_rank->isLoaded()) {
{ if($player_rank->isLoaded()) {
if($player_rank->isLoaded())
{
$rank_guild = $player_rank->getGuild(); $rank_guild = $player_rank->getGuild();
if(!$rank_guild->isLoaded()) if(!$rank_guild->isLoaded()) {
{
$player->setRank(); $player->setRank();
$player->setGuildNick(''); $player->setGuildNick('');
$changed_ranks_of[] = $player->getName(); $changed_ranks_of[] = $player->getName();
@@ -46,8 +40,7 @@ if(count($players_list) > 0)
$player_rank->delete(); $player_rank->delete();
} }
} }
else else {
{
$player->setRank(); $player->setRank();
$player->setGuildNick(''); $player->setGuildNick('');
$changed_ranks_of[] = $player->getName(); $changed_ranks_of[] = $player->getName();
@@ -55,14 +48,20 @@ if(count($players_list) > 0)
} }
} }
echo "<b>Deleted ranks (this ranks guilds doesn't exist [bug fix]):</b>"; echo "<b>Deleted ranks (this ranks guilds doesn't exist [bug fix]):</b>";
if(!empty($deleted_ranks)) if(!empty($deleted_ranks)) {
foreach($deleted_ranks as $rank) foreach ($deleted_ranks as $rank) {
echo "<li>".$rank; echo "<li>" . $rank;
}
}
echo "<BR /><BR /><b>Changed ranks of players (rank or guild of rank doesn't exist [bug fix]):</b>"; echo "<BR /><BR /><b>Changed ranks of players (rank or guild of rank doesn't exist [bug fix]):</b>";
if(!empty($changed_ranks_of))
foreach($changed_ranks_of as $name) if(!empty($changed_ranks_of)) {
echo "<li>".$name; foreach ($changed_ranks_of as $name) {
echo "<li>" . $name;
}
}
} }
else else
echo "0 players found."; echo "0 players found.";

View File

@@ -14,15 +14,15 @@ use MyAAC\Models\GuildRank;
require __DIR__ . '/base.php'; require __DIR__ . '/base.php';
$guild_name = isset($_REQUEST['guild']) ? urldecode($_REQUEST['guild']) : NULL; $guild_name = isset($_POST['guild']) ? urldecode($_POST['guild']) : NULL;
$name = isset($_REQUEST['name']) ? stripslashes($_REQUEST['name']) : NULL; $name = isset($_POST['name']) ? stripslashes($_POST['name']) : NULL;
$todo = isset($_REQUEST['todo']) ? $_REQUEST['todo'] : NULL; $todo = isset($_POST['todo']) ? $_POST['todo'] : NULL;
if(!$logged) { if(!$logged) {
$guild_errors[] = 'You are not logged in. You can\'t create guild.'; $errors[] = 'You are not logged in. You can\'t create guild.';
} }
$array_of_player_nig = array(); $array_of_player_nig = array();
if(empty($guild_errors)) if(empty($errors))
{ {
$account_players = $account_logged->getPlayersList(false); $account_players = $account_logged->getPlayersList(false);
foreach($account_players as $player) foreach($account_players as $player)
@@ -41,45 +41,44 @@ if(empty($guild_errors))
if(empty($todo)) { if(empty($todo)) {
if(count($array_of_player_nig) == 0) { if(count($array_of_player_nig) == 0) {
$guild_errors[] = 'On your account all characters are in guilds, have too low level to create new guild' . (setting('core.guild_need_premium') ? ' or you don\' have a premium account' : '') . '.'; $errors[] = 'On your account all characters are in guilds, have too low level to create new guild' . (setting('core.guild_need_premium') ? ' or you don\' have a premium account' : '') . '.';
} }
} }
if($todo == 'save') if($todo == 'save')
{ {
if(!Validator::guildName($guild_name)) { if(!Validator::guildName($guild_name)) {
$guild_errors[] = Validator::getLastError(); $errors[] = Validator::getLastError();
$guild_name = ''; $guild_name = '';
} }
if(!Validator::characterName($name)) { if(!Validator::characterName($name)) {
$guild_errors[] = 'Invalid character name format.'; $errors[] = 'Invalid character name format.';
$name = ''; $name = '';
} }
if(empty($guild_errors)) { if(empty($errors)) {
$player = new OTS_Player(); $player = new OTS_Player();
$player->find($name); $player->find($name);
if(!$player->isLoaded()) { if(!$player->isLoaded()) {
$guild_errors[] = 'Character <b>'.$name.'</b> doesn\'t exist.'; $errors[] = 'Character <b>'.$name.'</b> doesn\'t exist.';
} }
} }
if(empty($errors))
if(empty($guild_errors))
{ {
$guild = new OTS_Guild(); $guild = new OTS_Guild();
$guild->find($guild_name); $guild->find($guild_name);
if($guild->isLoaded()) { if($guild->isLoaded()) {
$guild_errors[] = 'Guild <b>'.$guild_name.'</b> already exist. Select other name.'; $errors[] = 'Guild <b>'.$guild_name.'</b> already exist. Select other name.';
} }
} }
if(empty($guild_errors) && $player->isDeleted()) { if(empty($errors) && $player->isDeleted()) {
$guild_errors[] = "Character <b>$name</b> has been deleted."; $errors[] = "Character <b>$name</b> has been deleted.";
} }
if(empty($guild_errors)) if(empty($errors))
{ {
$bad_char = true; $bad_char = true;
foreach($array_of_player_nig as $nick_from_list) { foreach($array_of_player_nig as $nick_from_list) {
@@ -88,22 +87,22 @@ if($todo == 'save')
} }
} }
if($bad_char) { if($bad_char) {
$guild_errors[] = 'Character <b>'.$name.'</b> isn\'t on your account or is already in guild.'; $errors[] = 'Character <b>'.$name.'</b> isn\'t on your account or is already in guild.';
} }
} }
if(empty($guild_errors)) { if(empty($errors)) {
if($player->getLevel() < setting('core.guild_need_level')) { if($player->getLevel() < setting('core.guild_need_level')) {
$guild_errors[] = 'Character <b>'.$name.'</b> has too low level. To create guild you need character with level <b>' . setting('core.guild_need_level') . '</b>.'; $errors[] = 'Character <b>'.$name.'</b> has too low level. To create guild you need character with level <b>' . setting('core.guild_need_level') . '</b>.';
} }
if(setting('core.guild_need_premium') && !$account_logged->isPremium()) { if(setting('core.guild_need_premium') && !$account_logged->isPremium()) {
$guild_errors[] = 'Character <b>'.$name.'</b> is on FREE account. To create guild you need PREMIUM account.'; $errors[] = 'Character <b>'.$name.'</b> is on FREE account. To create guild you need PREMIUM account.';
} }
} }
} }
if(!empty($guild_errors)) { if(!empty($errors)) {
$twig->display('error_box.html.twig', array('errors' => $guild_errors)); $twig->display('error_box.html.twig', array('errors' => $errors));
unset($todo); unset($todo);
} }

View File

@@ -45,7 +45,10 @@ if(empty($errors)) {
$twig->display('success.html.twig', array( $twig->display('success.html.twig', array(
'title' => 'Delete Guild', 'title' => 'Delete Guild',
'description' => 'Are you sure you want delete guild <b>' . $guild_name . '</b>?<br/> 'description' => 'Are you sure you want delete guild <b>' . $guild_name . '</b>?<br/>
<form action="' . getLink('guilds') . '?guild=' . $guild->getName() . '&action=delete_by_admin" METHOD="post"><input type="hidden" name="todo" value="save"><input type="submit" value="Yes, delete"></form>', <form action="' . getLink('guilds') . '?guild=' . $guild->getName() . '&action=delete_by_admin" METHOD="post">
' . csrf(true) . '
<input type="hidden" name="todo" value="save"><input type="submit" value="Yes, delete">
</form>',
'custom_buttons' => $twig->render('guilds.back_button.html.twig') 'custom_buttons' => $twig->render('guilds.back_button.html.twig')
)); ));
} }

View File

@@ -21,7 +21,7 @@ if(empty($errors)) {
$guild = new OTS_Guild(); $guild = new OTS_Guild();
$guild->find($guild_name); $guild->find($guild_name);
if(!$guild->isLoaded()) { if(!$guild->isLoaded()) {
$errors[] = 'Guild with name <b>'.$guild_name.'</b> doesn\'t exist.'; $errors[] = "Guild with name <b>$guild_name</b> doesn't exist.";
} }
} }
@@ -31,7 +31,7 @@ if(empty($errors)) {
$rank_list = $guild->getGuildRanksList(); $rank_list = $guild->getGuildRanksList();
$rank_list->orderBy('level', POT::ORDER_DESC); $rank_list->orderBy('level', POT::ORDER_DESC);
$guild_leader = false; $guild_leader = false;
$account_players = $account_logged->getPlayers(); $account_players = $account_logged->getPlayersList();
foreach($account_players as $player) { foreach($account_players as $player) {
if($guild->getOwner()->getId() == $player->getId()) { if($guild->getOwner()->getId() == $player->getId()) {

View File

@@ -15,47 +15,43 @@ require __DIR__ . '/base.php';
$guild_name = isset($_REQUEST['guild']) ? urldecode($_REQUEST['guild']) : null; $guild_name = isset($_REQUEST['guild']) ? urldecode($_REQUEST['guild']) : null;
$name = stripslashes($_REQUEST['name']); $name = stripslashes($_REQUEST['name']);
if(!$logged) if(!$logged) {
$errors[] = 'You are not logged in. You can\'t delete invitations.'; $errors[] = 'You are not logged in. You can\'t delete invitations.';
}
if(!Validator::guildName($guild_name)) if(!Validator::guildName($guild_name)) {
$errors[] = Validator::getLastError(); $errors[] = Validator::getLastError();
}
if(!Validator::characterName($name)) if(!Validator::characterName($name)) {
$errors[] = 'Invalid name format.'; $errors[] = 'Invalid name format.';
}
if(empty($errors)) if(empty($errors)) {
{
$guild = new OTS_Guild(); $guild = new OTS_Guild();
$guild->find($guild_name); $guild->find($guild_name);
if(!$guild->isLoaded()) if(!$guild->isLoaded())
$errors[] = "Guild with name <b>" . $guild_name . "</b> doesn't exist."; $errors[] = "Guild with name <b>" . $guild_name . "</b> doesn't exist.";
} }
if(empty($errors)) if(empty($errors)) {
{
$rank_list = $guild->getGuildRanksList(); $rank_list = $guild->getGuildRanksList();
$rank_list->orderBy('level', POT::ORDER_DESC); $rank_list->orderBy('level', POT::ORDER_DESC);
$guild_leader = false; $guild_leader = false;
$guild_vice = false; $guild_vice = false;
$account_players = $account_logged->getPlayers(); $account_players = $account_logged->getPlayersList();
foreach($account_players as $player) foreach($account_players as $player) {
{
$player_rank = $player->getRank(); $player_rank = $player->getRank();
if($player_rank->isLoaded()) if($player_rank->isLoaded()) {
{ foreach($rank_list as $rank_in_guild) {
foreach($rank_list as $rank_in_guild) if($rank_in_guild->getId() == $player_rank->getId()) {
{
if($rank_in_guild->getId() == $player_rank->getId())
{
$players_from_account_in_guild[] = $player->getName(); $players_from_account_in_guild[] = $player->getName();
if($player_rank->getLevel() > 1) if($player_rank->getLevel() > 1) {
{
$guild_vice = true; $guild_vice = true;
$level_in_guild = $player_rank->getLevel(); $level_in_guild = $player_rank->getLevel();
} }
if($guild->getOwner()->getId() == $player->getId())
{ if($guild->getOwner()->getId() == $player->getId()) {
$guild_vice = true; $guild_vice = true;
$guild_leader = true; $guild_leader = true;
} }
@@ -64,44 +60,46 @@ if(empty($errors))
} }
} }
if(!$guild_vice) if(!$guild_vice) {
$errors[] = 'You are not a leader or vice leader of guild <b>' . $guild_name . '</b>.'; $errors[] = 'You are not a leader or vice leader of guild <b>' . $guild_name . '</b>.';
} }
if(empty($errors))
{
$player = new OTS_Player();
$player->find($name);
if(!$player->isLoaded())
$errors[] = 'Player with name <b>' . $name . '</b> doesn\'t exist.';
} }
if(empty($errors)) if(empty($errors)) {
{ $player = new OTS_Player();
$player->find($name);
if(!$player->isLoaded()) {
$errors[] = "Player with name <b>$name</b> doesn't exist.";
}
}
if(empty($errors)) {
include(SYSTEM . 'libs/pot/InvitesDriver.php'); include(SYSTEM . 'libs/pot/InvitesDriver.php');
new InvitesDriver($guild); new InvitesDriver($guild);
$invited_list = $guild->listInvites(); $invited_list = $guild->listInvites();
if(count($invited_list) > 0) if(count($invited_list) > 0) {
{
$is_invited = false; $is_invited = false;
foreach($invited_list as $invited) foreach($invited_list as $invited) {
if($invited->getName() == $player->getName()) if ($invited->getName() == $player->getName()) {
$is_invited = true; $is_invited = true;
if(!$is_invited) }
$errors[] = '<b>'.$player->getName().'</b> isn\'t invited to your guild.'; }
if(!$is_invited) {
$errors[] = '<b>' . $player->getName() . '</b> isn\'t invited to your guild.';
}
} }
else else {
$errors[] = 'No one is invited to your guild.'; $errors[] = 'No one is invited to your guild.';
}
} }
if(!empty($errors))
{ if(!empty($errors)) {
$twig->display('error_box.html.twig', array('errors' => $errors)); $twig->display('error_box.html.twig', array('errors' => $errors));
$twig->display('guilds.back_button.html.twig', array('action' => getLink('guilds') . '?action=show&guild=' . $guild_name)); $twig->display('guilds.back_button.html.twig', array('action' => getLink('guilds') . '?action=show&guild=' . $guild_name));
} }
else else {
{ if(isset($_POST['todo']) && $_POST['todo'] == 'save') {
if(isset($_REQUEST['todo']) && $_REQUEST['todo'] == 'save')
{
$guild->deleteInvite($player); $guild->deleteInvite($player);
$twig->display('success.html.twig', array( $twig->display('success.html.twig', array(
'title' => 'Deleted player invitation', 'title' => 'Deleted player invitation',

View File

@@ -13,25 +13,27 @@ defined('MYAAC') or die('Direct access not allowed!');
require __DIR__ . '/base.php'; require __DIR__ . '/base.php';
$guild_name = isset($_REQUEST['guild']) ? urldecode($_REQUEST['guild']) : null; $guild_name = isset($_REQUEST['guild']) ? urldecode($_REQUEST['guild']) : null;
$rank_to_delete = isset($_REQUEST['rankid']) ? (int) $_REQUEST['rankid'] : null; $rank_to_delete = isset($_POST['rankid']) ? (int) $_POST['rankid'] : null;
if(!Validator::guildName($guild_name)) { if(!Validator::guildName($guild_name)) {
$guild_errors[] = Validator::getLastError(); $errors[] = Validator::getLastError();
} }
if(empty($guild_errors)) {
if(empty($errors)) {
$guild = new OTS_Guild(); $guild = new OTS_Guild();
$guild->find($guild_name); $guild->find($guild_name);
if(!$guild->isLoaded()) { if(!$guild->isLoaded()) {
$guild_errors[] = 'Guild with name <b>'.$guild_name.'</b> doesn\'t exist.'; $errors[] = 'Guild with name <b>'.$guild_name.'</b> doesn\'t exist.';
} }
} }
if(empty($guild_errors)) {
if(empty($errors)) {
if($logged) { if($logged) {
$guild_leader_char = $guild->getOwner(); $guild_leader_char = $guild->getOwner();
$rank_list = $guild->getGuildRanksList(); $rank_list = $guild->getGuildRanksList();
$rank_list->orderBy('level', POT::ORDER_DESC); $rank_list->orderBy('level', POT::ORDER_DESC);
$guild_leader = false; $guild_leader = false;
$account_players = $account_logged->getPlayers(); $account_players = $account_logged->getPlayersList();
foreach($account_players as $player) { foreach($account_players as $player) {
if($guild->getOwner()->getId() == $player->getId()) { if($guild->getOwner()->getId() == $player->getId()) {
$guild_vice = true; $guild_vice = true;
@@ -39,21 +41,21 @@ if(empty($guild_errors)) {
$level_in_guild = 3; $level_in_guild = 3;
} }
} }
if($guild_leader) { if($guild_leader) {
$rank = new OTS_GuildRank(); $rank = new OTS_GuildRank();
$rank->load($rank_to_delete); $rank->load($rank_to_delete);
if(!$rank->isLoaded()) { if(!$rank->isLoaded()) {
$guild_errors2[] = 'Rank with ID '.$rank_to_delete.' doesn\'t exist.'; $errors2[] = 'Rank with ID '.$rank_to_delete.' doesn\'t exist.';
} }
else else {
{
if($rank->getGuild()->getId() != $guild->getId()) { if($rank->getGuild()->getId() != $guild->getId()) {
$guild_errors2[] = 'Rank with ID '.$rank_to_delete.' isn\'t from your guild.'; $errors2[] = 'Rank with ID '.$rank_to_delete.' isn\'t from your guild.';
} }
else else
{ {
if(count($rank_list) < 2) { if(count($rank_list) < 2) {
$guild_errors2[] = 'You have only 1 rank in your guild. You can\'t delete this rank.'; $errors2[] = 'You have only 1 rank in your guild. You can\'t delete this rank.';
} }
else else
{ {
@@ -87,19 +89,21 @@ if(empty($guild_errors)) {
$player->setRank($new_rank); $player->setRank($new_rank);
} }
} }
$rank->delete(); $rank->delete();
$saved = true; $saved = true;
} }
} }
} }
if($saved) {
if(isset($saved) && $saved) {
$twig->display('success.html.twig', array( $twig->display('success.html.twig', array(
'title' => 'Rank Deleted', 'title' => 'Rank Deleted',
'description' => 'Rank <b>'.$rank->getName().'</b> has been deleted. Players with this rank has now other rank.', 'description' => 'Rank <b>'.$rank->getName().'</b> has been deleted. Players with this rank has now other rank.',
'custom_buttons' => '' 'custom_buttons' => ''
)); ));
} else { } else {
$twig->display('error_box.html.twig', array('errors' => $guild_errors2)); $twig->display('error_box.html.twig', array('errors' => $errors2));
} }
$twig->display('guilds.back_button.html.twig', array( $twig->display('guilds.back_button.html.twig', array(
@@ -107,18 +111,16 @@ if(empty($guild_errors)) {
'action' => getLink('guilds') . '?guild='.$guild->getName().'&action=manager' 'action' => getLink('guilds') . '?guild='.$guild->getName().'&action=manager'
)); ));
} }
else else {
{ $errors[] = 'You are not a leader of guild!';
$guild_errors[] = 'You are not a leader of guild!';
} }
} }
else else {
{ $errors[] = 'You are not logged. You can\'t manage guild.';
$guild_errors[] = 'You are not logged. You can\'t manage guild.';
} }
} }
if(!empty($guild_errors)) { if(!empty($errors)) {
$twig->display('error_box.html.twig', array('errors' => $guild_errors)); $twig->display('error_box.html.twig', array('errors' => $errors));
$twig->display('guilds.back_button.html.twig', array( $twig->display('guilds.back_button.html.twig', array(
'new_line' => true, 'new_line' => true,

View File

@@ -36,7 +36,7 @@ if(empty($errors)) {
$rank_list->orderBy('level', POT::ORDER_DESC); $rank_list->orderBy('level', POT::ORDER_DESC);
$guild_leader = false; $guild_leader = false;
$guild_vice = false; $guild_vice = false;
$account_players = $account_logged->getPlayers(); $account_players = $account_logged->getPlayersList();
foreach($account_players as $player) { foreach($account_players as $player) {
$player_rank = $player->getRank(); $player_rank = $player->getRank();
if($player_rank->isLoaded()) { if($player_rank->isLoaded()) {
@@ -62,7 +62,7 @@ if(!$guild_vice) {
$errors[] = 'You are not a leader or vice leader of guild <b>'.$guild_name.'</b>.'.$level_in_guild; $errors[] = 'You are not a leader or vice leader of guild <b>'.$guild_name.'</b>.'.$level_in_guild;
} }
if(isset($_REQUEST['todo']) && $_REQUEST['todo'] == 'save') { if(isset($_POST['todo']) && $_POST['todo'] == 'save') {
if(!Validator::characterName($name)) { if(!Validator::characterName($name)) {
$errors[] = 'Invalid name format.'; $errors[] = 'Invalid name format.';
} }
@@ -71,7 +71,7 @@ if(isset($_REQUEST['todo']) && $_REQUEST['todo'] == 'save') {
$player = new OTS_Player(); $player = new OTS_Player();
$player->find($name); $player->find($name);
if(!$player->isLoaded()) { if(!$player->isLoaded()) {
$errors[] = 'Player with name <b>' . $name . '</b> doesn\'t exist.'; $errors[] = "Player with name <b>$name</b> doesn't exist.";
} else if ($player->isDeleted()) { } else if ($player->isDeleted()) {
$errors[] = "Character with name <b>$name</b> has been deleted."; $errors[] = "Character with name <b>$name</b> has been deleted.";
} }
@@ -102,7 +102,7 @@ if(!empty($errors)) {
$twig->display('error_box.html.twig', array('errors' => $errors)); $twig->display('error_box.html.twig', array('errors' => $errors));
} }
else { else {
if(isset($_REQUEST['todo']) && $_REQUEST['todo'] == 'save') { if(isset($_POST['todo']) && $_POST['todo'] == 'save') {
$guild->invite($player); $guild->invite($player);
$twig->display('success.html.twig', array( $twig->display('success.html.twig', array(
'title' => 'Invite player', 'title' => 'Invite player',

View File

@@ -41,7 +41,7 @@ if(empty($errors)) {
$rank_list->orderBy('level', POT::ORDER_DESC); $rank_list->orderBy('level', POT::ORDER_DESC);
$guild_leader = false; $guild_leader = false;
$guild_vice = false; $guild_vice = false;
$account_players = $account_logged->getPlayers(); $account_players = $account_logged->getPlayersList();
foreach($account_players as $player) { foreach($account_players as $player) {
$player_rank = $player->getRank(); $player_rank = $player->getRank();
if($player_rank->isLoaded()) { if($player_rank->isLoaded()) {
@@ -102,7 +102,7 @@ if(!empty($errors)) {
} }
else else
{ {
if(isset($_REQUEST['todo']) && $_REQUEST['todo'] == 'save') { if(isset($_POST['todo']) && $_POST['todo'] == 'save') {
$player->setRank(); $player->setRank();
$twig->display('success.html.twig', array( $twig->display('success.html.twig', array(

View File

@@ -34,7 +34,7 @@ if(empty($errors)) {
$array_of_player_ig = array(); $array_of_player_ig = array();
if(empty($errors)) { if(empty($errors)) {
$guild_owner_name = $guild->getOwner()->getName(); $guild_owner_name = $guild->getOwner()->getName();
if(isset($_REQUEST['todo']) && $_REQUEST['todo'] == 'save') { if(isset($_POST['todo']) && $_POST['todo'] == 'save') {
if(!Validator::characterName($name)) { if(!Validator::characterName($name)) {
$errors[] = 'Invalid name format.'; $errors[] = 'Invalid name format.';
} }
@@ -72,7 +72,7 @@ if(empty($errors)) {
} }
else else
{ {
$account_players = $account_logged->getPlayers(); $account_players = $account_logged->getPlayersList();
foreach($account_players as $player_fac) { foreach($account_players as $player_fac) {
$player_rank = $player_fac->getRank(); $player_rank = $player_fac->getRank();
if($player_rank->isLoaded()) { if($player_rank->isLoaded()) {
@@ -94,7 +94,7 @@ if(!empty($errors)) {
} }
else else
{ {
if(isset($_REQUEST['todo']) && $_REQUEST['todo'] == 'save') { if(isset($_POST['todo']) && $_POST['todo'] == 'save') {
$player->setRank(); $player->setRank();
$twig->display('success.html.twig', array( $twig->display('success.html.twig', array(
'title' => 'Leave guild', 'title' => 'Leave guild',

View File

@@ -14,31 +14,31 @@ defined('MYAAC') or die('Direct access not allowed!');
require __DIR__ . '/base.php'; require __DIR__ . '/base.php';
$guilds_list = new OTS_Guilds_List(); $guilds_list = new OTS_Guilds_List();
$guilds_list->orderBy("name"); $guilds_list->orderBy('name');
$guilds = array(); $guilds = array();
if(count($guilds_list) > 0) if(count($guilds_list) > 0) {
{
/** /**
* @var OTS_Guild $guild * @var OTS_Guild $guild
*/ */
foreach ($guilds_list as $guild) { foreach ($guilds_list as $guild) {
$guild_logo = $guild->getCustomField('logo_name'); $guild_logo = $guild->getCustomField('logo_name');
if (empty($guild_logo) || !file_exists(GUILD_IMAGES_DIR . $guild_logo)) if (empty($guild_logo) || !file_exists(GUILD_IMAGES_DIR . $guild_logo)) {
$guild_logo = "default.gif"; $guild_logo = 'default.gif';
}
$description = $guild->getCustomField('description'); $description = $guild->getCustomField('description');
$description_with_lines = str_replace(array("\r\n", "\n", "\r"), '<br />', $description, $count); $description_with_lines = str_replace(array("\r\n", "\n", "\r"), '<br />', $description, $count);
if ($count < setting('core.guild_description_lines_limit')) if ($count < setting('core.guild_description_lines_limit')) {
$description = nl2br($description); $description = nl2br($description);
}
$guildName = $guild->getName(); $guildName = $guild->getName();
$guilds[] = array('name' => $guildName, 'logo' => $guild_logo, 'link' => getGuildLink($guildName, false), 'description' => $description); $guilds[] = array('name' => $guildName, 'logo' => $guild_logo, 'link' => getGuildLink($guildName, false), 'description' => $description);
} }
}; }
$twig->display('guilds.list.html.twig', array( $twig->display('guilds.list.html.twig', array(
'guilds' => $guilds, 'guilds' => $guilds,
'logged' => isset($logged) ? $logged : false,
'isAdmin' => admin(), 'isAdmin' => admin(),
)); ));

View File

@@ -21,7 +21,7 @@ if(empty($errors)) {
$guild = new OTS_Guild(); $guild = new OTS_Guild();
$guild->find($guild_name); $guild->find($guild_name);
if(!$guild->isLoaded()) { if(!$guild->isLoaded()) {
$errors[] = 'Guild with name <b>'.$guild_name.'</b> doesn\'t exist.'; $errors[] = "Guild with name <b>$guild_name</b> doesn't exist.";
} }
} }
@@ -31,7 +31,7 @@ if(empty($errors)) {
$rank_list = $guild->getGuildRanksList(); $rank_list = $guild->getGuildRanksList();
$rank_list->orderBy('level', POT::ORDER_DESC); $rank_list->orderBy('level', POT::ORDER_DESC);
$guild_leader = false; $guild_leader = false;
$account_players = $account_logged->getPlayers(); $account_players = $account_logged->getPlayersList();
foreach($account_players as $player) { foreach($account_players as $player) {
if($guild_leader_char->getId() == $player->getId()) { if($guild_leader_char->getId() == $player->getId()) {
$guild_vice = true; $guild_vice = true;
@@ -39,22 +39,22 @@ if(empty($errors)) {
$level_in_guild = 3; $level_in_guild = 3;
} }
} }
if($guild_leader) { if($guild_leader) {
$twig->display('guilds.manager.html.twig', array( $twig->display('guilds.manager.html.twig', array(
'guild' => $guild, 'guild' => $guild,
'rank_list' => $rank_list 'rank_list' => $rank_list
)); ));
} }
else else {
{
$errors[] = 'You are not a leader of guild!'; $errors[] = 'You are not a leader of guild!';
} }
} }
else else {
{ $errors[] = "You are not logged. You can't manage guild.";
$errors[] = 'You are not logged. You can\'t manage guild.';
} }
} }
if(!empty($errors)) { if(!empty($errors)) {
$twig->display('error_box.html.twig', array('errors' => $errors)); $twig->display('error_box.html.twig', array('errors' => $errors));
} }

View File

@@ -15,51 +15,52 @@ require __DIR__ . '/base.php';
$guild_name = isset($_REQUEST['guild']) ? urldecode($_REQUEST['guild']) : NULL; $guild_name = isset($_REQUEST['guild']) ? urldecode($_REQUEST['guild']) : NULL;
$pass_to = isset($_REQUEST['player']) ? stripslashes($_REQUEST['player']) : NULL; $pass_to = isset($_REQUEST['player']) ? stripslashes($_REQUEST['player']) : NULL;
if(!Validator::guildName($guild_name)) { if(!Validator::guildName($guild_name)) {
$guild_errors[] = Validator::getLastError(); $errors[] = Validator::getLastError();
} }
if(empty($guild_errors)) { if(empty($errors)) {
$guild = new OTS_Guild(); $guild = new OTS_Guild();
$guild->find($guild_name); $guild->find($guild_name);
if(!$guild->isLoaded()) { if(!$guild->isLoaded()) {
$guild_errors[] = "Guild with name <b>" . $guild_name . "</b> doesn't exist."; $errors[] = "Guild with name <b>" . $guild_name . "</b> doesn't exist.";
} }
} }
if(empty($guild_errors)) {
if(empty($errors)) {
if(isset($_POST['todo']) && $_POST['todo'] == 'save') { if(isset($_POST['todo']) && $_POST['todo'] == 'save') {
if(!Validator::characterName($pass_to)) { if(!Validator::characterName($pass_to)) {
$guild_errors2[] = 'Invalid player name format.'; $errors2[] = 'Invalid player name format.';
} }
if(empty($guild_errors2)) { if(empty($errors2)) {
$to_player = new OTS_Player(); $to_player = new OTS_Player();
$to_player->find($pass_to); $to_player->find($pass_to);
if(!$to_player->isLoaded()) { if(!$to_player->isLoaded()) {
$guild_errors2[] = 'Player with name <b>'.$pass_to.'</b> doesn\'t exist.'; $errors2[] = 'Player with name <b>'.$pass_to.'</b> doesn\'t exist.';
} else if ($to_player->isDeleted()) { } else if ($to_player->isDeleted()) {
$guild_errors2[] = "Character with name <b>$pass_to</b> has been deleted."; $errors2[] = "Character with name <b>$pass_to</b> has been deleted.";
} }
if(empty($guild_errors2)) { if(empty($errors2)) {
$to_player_rank = $to_player->getRank(); $to_player_rank = $to_player->getRank();
if($to_player_rank->isLoaded()) { if($to_player_rank->isLoaded()) {
$to_player_guild = $to_player_rank->getGuild(); $to_player_guild = $to_player_rank->getGuild();
if($to_player_guild->getId() != $guild->getId()) { if($to_player_guild->getId() != $guild->getId()) {
$guild_errors2[] = 'Player with name <b>'.$to_player->getName().'</b> isn\'t from your guild.'; $errors2[] = 'Player with name <b>'.$to_player->getName().'</b> isn\'t from your guild.';
} }
} }
else { else {
$guild_errors2[] = 'Player with name <b>'.$to_player->getName().'</b> isn\'t from your guild.'; $errors2[] = 'Player with name <b>'.$to_player->getName().'</b> isn\'t from your guild.';
} }
} }
} }
} }
} }
if(empty($guild_errors) && empty($guild_errors2)) { if(empty($errors) && empty($errors2)) {
if($logged) { if($logged) {
$guild_leader_char = $guild->getOwner(); $guild_leader_char = $guild->getOwner();
$guild_leader = false; $guild_leader = false;
$account_players = $account_logged->getPlayers(); $account_players = $account_logged->getPlayersList();
foreach($account_players as $player) { foreach($account_players as $player) {
if($guild_leader_char->getId() == $player->getId()) { if($guild_leader_char->getId() == $player->getId()) {
$guild_vice = true; $guild_vice = true;
@@ -99,23 +100,23 @@ if(empty($guild_errors) && empty($guild_errors2)) {
} }
} }
else { else {
$guild_errors[] = 'You are not a leader of guild!'; $errors[] = 'You are not a leader of guild!';
} }
} }
else { else {
$guild_errors[] = "You are not logged. You can't manage guild."; $errors[] = "You are not logged. You can't manage guild.";
} }
} }
if(empty($guild_errors) && !empty($guild_errors2)) { if(empty($errors) && !empty($errors2)) {
$twig->display('error_box.html.twig', array('errors' => $guild_errors2)); $twig->display('error_box.html.twig', array('errors' => $errors2));
echo '<br/><div style="text-align:center"><form action="' . getLink('guilds') . '?guild='.$guild->getName().'&action=pass_leadership" method="post">' . $twig->render('buttons.back.html.twig') . '</form></div>'; echo '<br/><div style="text-align:center"><form action="' . getLink('guilds') . '?guild='.$guild->getName().'&action=pass_leadership" method="post">' . $twig->render('buttons.back.html.twig') . '</form></div>';
} }
if(!empty($guild_errors)) { if(!empty($errors)) {
if(!empty($guild_errors2)) { if(!empty($errors2)) {
$guild_errors = array_merge($guild_errors, $guild_errors2); $errors = array_merge($errors, $errors2);
} }
$twig->display('error_box.html.twig', array('errors' => $guild_errors)); $twig->display('error_box.html.twig', array('errors' => $errors));
echo '<br/><div style="text-align:center"><form action="' . getLink('guilds') . '" method="post">' . $twig->render('buttons.back.html.twig') . '</form></div>'; echo '<br/><div style="text-align:center"><form action="' . getLink('guilds') . '" method="post">' . $twig->render('buttons.back.html.twig') . '</form></div>';
} }

View File

@@ -31,7 +31,7 @@ if(empty($errors)) {
$rank_list = $guild->getGuildRanksList(); $rank_list = $guild->getGuildRanksList();
$rank_list->orderBy('level', POT::ORDER_DESC); $rank_list->orderBy('level', POT::ORDER_DESC);
$guild_leader = false; $guild_leader = false;
$account_players = $account_logged->getPlayers(); $account_players = $account_logged->getPlayersList();
foreach($account_players as $player) { foreach($account_players as $player) {
if($guild_leader_char->getId() == $player->getId()) { if($guild_leader_char->getId() == $player->getId()) {
@@ -61,6 +61,7 @@ if(empty($errors)) {
$rank->save(); $rank->save();
} }
//show errors or redirect //show errors or redirect
if(empty($errors)) { if(empty($errors)) {
header("Location: " . getLink('guilds') . "?action=manager&guild=".$guild->getName()); header("Location: " . getLink('guilds') . "?action=manager&guild=".$guild->getName());
@@ -73,10 +74,10 @@ if(empty($errors)) {
} }
else else
{ {
$errors[] = 'You are not logged. You can\'t manage guild.'; $errors[] = "You are not logged. You can't manage guild.";
} }
} }
if(!empty($errors)) { if(!empty($errors)) {
$twig->display('error_box.html.twig', array('errors' => $errors)); $twig->display('error_box.html.twig', ['errors' => $errors]);
} }

View File

@@ -16,19 +16,18 @@ $title = 'Guilds';
require __DIR__ . '/base.php'; require __DIR__ . '/base.php';
$guild_name = isset($_REQUEST['guild']) ? urldecode($_REQUEST['guild']) : null; $guild_name = isset($_REQUEST['guild']) ? urldecode($_REQUEST['guild']) : null;
if(!Validator::guildName($guild_name)) if(!Validator::guildName($guild_name)) {
$errors[] = Validator::getLastError(); $errors[] = Validator::getLastError();
}
if(empty($errors)) if(empty($errors)) {
{
$guild = new OTS_Guild(); $guild = new OTS_Guild();
$guild->find($guild_name); $guild->find($guild_name);
if(!$guild->isLoaded()) if(!$guild->isLoaded())
$errors[] = 'Guild with name <b>'.$guild_name.'</b> doesn\'t exist.'; $errors[] = 'Guild with name <b>'.$guild_name.'</b> doesn\'t exist.';
} }
if(!empty($errors)) if(!empty($errors)) {
{
$twig->display('error_box.html.twig', array('errors' => $errors)); $twig->display('error_box.html.twig', array('errors' => $errors));
$twig->display('guilds.back_button.html.twig'); $twig->display('guilds.back_button.html.twig');
return; return;
@@ -47,9 +46,8 @@ $level_in_guild = 0;
$players_from_account_in_guild = array(); $players_from_account_in_guild = array();
$players_from_account_ids = array(); $players_from_account_ids = array();
if($logged) if($logged) {
{ $account_players = $account_logged->getPlayersList();
$account_players = $account_logged->getPlayers();
foreach($account_players as $player) foreach($account_players as $player)
{ {
$players_from_account_ids[] = $player->getId(); $players_from_account_ids[] = $player->getId();

View File

@@ -18,8 +18,11 @@ defined('MYAAC') or die('Direct access not allowed!');
$title = 'Highscores'; $title = 'Highscores';
$settingHighscoresCountryBox = setting('core.highscores_country_box'); $settingHighscoresCountryBox = setting('core.highscores_country_box');
if(config('account_country') && $settingHighscoresCountryBox) if(config('account_country') && $settingHighscoresCountryBox) {
require SYSTEM . 'countries.conf.php'; require SYSTEM . 'countries.conf.php';
}
$highscoresTTL = setting('core.highscores_cache_ttl');
$list = urldecode($_GET['list'] ?? 'experience'); $list = urldecode($_GET['list'] ?? 'experience');
$page = $_GET['page'] ?? 1; $page = $_GET['page'] ?? 1;
@@ -140,7 +143,7 @@ $needReCache = true;
$cacheKey = 'highscores_' . $skill . '_' . $vocation . '_' . $page . '_' . $configHighscoresPerPage; $cacheKey = 'highscores_' . $skill . '_' . $vocation . '_' . $page . '_' . $configHighscoresPerPage;
$cache = Cache::getInstance(); $cache = Cache::getInstance();
if ($cache->enabled()) { if ($cache->enabled() && $highscoresTTL > 0) {
$tmp = ''; $tmp = '';
if ($cache->fetch($cacheKey, $tmp)) { if ($cache->fetch($cacheKey, $tmp)) {
$highscores = unserialize($tmp); $highscores = unserialize($tmp);
@@ -214,8 +217,8 @@ if (empty($highscores)) {
})->toArray(); })->toArray();
} }
if ($cache->enabled() && $needReCache) { if ($highscoresTTL > 0 && $cache->enabled() && $needReCache) {
$cache->set($cacheKey, serialize($highscores), setting('core.highscores_cache_ttl') * 60); $cache->set($cacheKey, serialize($highscores), $highscoresTTL * 60);
} }
$show_link_to_next_page = false; $show_link_to_next_page = false;
@@ -278,6 +281,10 @@ if(setting('core.highscores_frags')) {
if(setting('core.highscores_balance')) if(setting('core.highscores_balance'))
$types['balance'] = 'Balance'; $types['balance'] = 'Balance';
if ($highscoresTTL > 0 && $cache->enabled()) {
echo '<small>*Note: Highscores are updated every' . ($highscoresTTL > 1 ? ' ' . $highscoresTTL : '') . ' minute' . ($highscoresTTL > 1 ? 's' : '') . '.</small><br/><br/>';
}
/** @var Twig\Environment $twig */ /** @var Twig\Environment $twig */
$twig->display('highscores.html.twig', [ $twig->display('highscores.html.twig', [
'highscores' => $highscores, 'highscores' => $highscores,

View File

@@ -22,13 +22,16 @@ $promotion = '';
if($db->hasColumn('players', 'promotion')) if($db->hasColumn('players', 'promotion'))
$promotion = '`promotion`,'; $promotion = '`promotion`,';
$order = $_GET['order'] ?? 'name'; $order = $_GET['order'] ?? 'name_asc';
if(!in_array($order, array('country', 'name', 'level', 'vocation'))) if(!in_array($order, ['country_asc', 'country_desc', 'name_asc', 'name_desc', 'level_asc', 'level_desc', 'vocation_asc', 'vocation_desc'])) {
$order = $db->fieldName('name'); $order = 'name_asc';
else if($order == 'country') }
$order = $db->tableName('accounts') . '.' . $db->fieldName('country'); else if($order == 'vocation_asc' || $order == 'vocation_desc') {
else if($order == 'vocation') $order = $promotion . 'vocation_' . (str_contains($order, 'asc') ? 'asc' : 'desc');
$order = $promotion . 'vocation ASC'; }
$orderExplode = explode('_', $order);
$orderSql = $orderExplode[0] . ' ' . $orderExplode[1];
$skull_type = 'skull'; $skull_type = 'skull';
if($db->hasColumn('players', 'skull_type')) { if($db->hasColumn('players', 'skull_type')) {
@@ -58,11 +61,11 @@ if (setting('core.online_vocations')) {
} }
if($db->hasTable('players_online')) // tfs 1.0 if($db->hasTable('players_online')) // tfs 1.0
$playersOnline = $db->query('SELECT `accounts`.`country`, `players`.`name`, `players`.`level`, `players`.`vocation`' . $outfit . ', `' . $skull_time . '` as `skulltime`, `' . $skull_type . '` as `skull` FROM `accounts`, `players`, `players_online` WHERE `players`.`id` = `players_online`.`player_id` AND `accounts`.`id` = `players`.`account_id` ORDER BY ' . $order); $playersOnline = $db->query('SELECT `accounts`.`country`, `players`.`name`, `players`.`level`, `players`.`vocation`' . $outfit . ', `' . $skull_time . '` as `skulltime`, `' . $skull_type . '` as `skull` FROM `accounts`, `players`, `players_online` WHERE `players`.`id` = `players_online`.`player_id` AND `accounts`.`id` = `players`.`account_id` ORDER BY ' . $orderSql);
else else
$playersOnline = $db->query('SELECT `accounts`.`country`, `players`.`name`, `players`.`level`, `players`.`vocation`' . $outfit . ', ' . $promotion . ' `' . $skull_time . '` as `skulltime`, `' . $skull_type . '` as `skull` FROM `accounts`, `players` WHERE `players`.`online` > 0 AND `accounts`.`id` = `players`.`account_id` ORDER BY ' . $order); $playersOnline = $db->query('SELECT `accounts`.`country`, `players`.`name`, `players`.`level`, `players`.`vocation`' . $outfit . ', ' . $promotion . ' `' . $skull_time . '` as `skulltime`, `' . $skull_type . '` as `skull` FROM `accounts`, `players` WHERE `players`.`online` > 0 AND `accounts`.`id` = `players`.`account_id` ORDER BY ' . $orderSql);
$players_data = array(); $players_data = [];
$players = 0; $players = 0;
$data = ''; $data = '';
foreach($playersOnline as $player) { foreach($playersOnline as $player) {
@@ -115,7 +118,7 @@ if(count($players_data) > 0) {
} }
if($result) { if($result) {
$record = 'The maximum on this game world was ' . $result['record'] . ' players' . ($timestamp ? ' on ' . date("M d Y, H:i:s", $result['timestamp']) . '.' : '.'); $record = $result['record'] . ' player' . ($result['record'] > 1 ? 's' : '') . ($timestamp ? ' (on ' . date("M d Y, H:i:s", $result['timestamp']) . ')' : '');
} }
} }
} }
@@ -124,8 +127,9 @@ $twig->display('online.html.twig', array(
'players' => $players_data, 'players' => $players_data,
'record' => $record, 'record' => $record,
'vocs' => $vocs, 'vocs' => $vocs,
'order' => $order,
)); ));
//search bar //search bar
$twig->display('online.form.html.twig'); $twig->display('characters.form.html.twig');
?> ?>

110
system/pages/ots-info.php Normal file
View File

@@ -0,0 +1,110 @@
<?php
/**
* Server info
*
* @package MyAAC
* @author Gesior <jerzyskalski@wp.pl>
* @author Slawkens <slawkens@gmail.com>
* @author whiteblXK
* @copyright 2019 MyAAC
* @link https://my-aac.org
*/
defined('MYAAC') or die('Direct access not allowed!');
$title = 'Server info';
if(isset($config['lua']['experience_stages']))
$config['lua']['experienceStages'] = $config['lua']['experience_stages'];
if(isset($config['lua']['min_pvp_level']))
$config['lua']['protectionLevel'] = $config['lua']['min_pvp_level'];
$rent = trim(strtolower($config['lua']['houseRentPeriod']));
if($rent != 'yearly' && $rent != 'monthly' && $rent != 'weekly' && $rent != 'daily')
$rent = 'never';
if(isset($config['lua']['houseCleanOld']))
$cleanOld = (int)(eval('return ' . $config['lua']['houseCleanOld'] . ';') / (24 * 60 * 60));
if(isset($config['lua']['rate_exp']))
$config['lua']['rateExp'] = $config['lua']['rate_exp'];
if(isset($config['lua']['rateExperience']))
$config['lua']['rateExp'] = $config['lua']['rateExperience'];
if(isset($config['lua']['rate_mag']))
$config['lua']['rateMagic'] = $config['lua']['rate_mag'];
if(isset($config['lua']['rate_skill']))
$config['lua']['rateSkill'] = $config['lua']['rate_skill'];
if(isset($config['lua']['rate_loot']))
$config['lua']['rateLoot'] = $config['lua']['rate_loot'];
if(isset($config['lua']['rate_spawn']))
$config['lua']['rateSpawn'] = $config['lua']['rate_spawn'];
$house_level = NULL;
if(isset($config['lua']['levelToBuyHouse']))
$house_level = $config['lua']['levelToBuyHouse'];
else if(isset($config['lua']['house_level']))
$house_level = $config['lua']['house_level'];
if(isset($config['lua']['in_fight_duration']))
$config['lua']['pzLocked'] = $config['lua']['in_fight_duration'];
$pzLocked = eval('return ' . $config['lua']['pzLocked'] . ';');
$whiteSkullTime = isset($config['lua']['whiteSkullTime']) ? $config['lua']['whiteSkullTime'] : NULL;
if(!isset($whiteSkullTime) && isset($config['lua']['unjust_skull_duration']))
$whiteSkullTime = $config['lua']['unjust_skull_duration'];
if(isset($whiteSkullTime))
$whiteSkullTime = eval('return ' . $whiteSkullTime . ';');
$redSkullLength = isset($config['lua']['redSkullLength']) ? $config['lua']['redSkullLength'] : NULL;
if(!isset($redSkullLength) && isset($config['lua']['red_skull_duration']))
$redSkullLength = $config['lua']['red_skull_duration'];
if(isset($redSkullLength))
$redSkullLength = eval('return ' . $redSkullLength . ';');
$blackSkull = false;
$blackSkullLength = NULL;
if(isset($config['lua']['useBlackSkull']) && getBoolean($config['lua']['useBlackSkull']))
{
$blackSkullLength = $config['lua']['blackSkullLength'];
$blackSkull = true;
}
else if(isset($config['lua']['black_skull_duration'])) {
$blackSkullLength = eval('return ' . $config['lua']['blackSkullLength'] . ';');
$blackSkull = true;
}
$clientVersion = NULL;
if(isset($status['online']))
$clientVersion = isset($status['clientVersion']) ? $status['clientVersion'] : null;
$twig->display('serverinfo.html.twig', array(
'experienceStages' => isset($config['lua']['experienceStages']) && getBoolean($config['lua']['experienceStages']) ? $config['lua']['experienceStages'] : null,
'serverIp' => str_replace('/', '', str_replace('http://', '', $config['lua']['url'])),
'clientVersion' => $clientVersion,
'globalSaveHour' => isset($config['lua']['globalSaveEnabled']) && getBoolean($config['lua']['globalSaveEnabled']) ? $config['lua']['globalSaveHour'] : null,
'protectionLevel' => $config['lua']['protectionLevel'],
'houseRent' => $rent == 'never' ? 'disabled' : $rent,
'houseOld' => isset($cleanOld) ? $cleanOld : null,
'rateExp' => $config['lua']['rateExp'],
'rateExpFromPlayers' => isset($config['lua']['rateExperienceFromPlayers']) ? $config['lua']['rateExperienceFromPlayers'] : null,
'rateMagic' => $config['lua']['rateMagic'],
'rateSkill' => $config['lua']['rateSkill'],
'rateLoot' => $config['lua']['rateLoot'],
'rateSpawn' => $config['lua']['rateSpawn'],
'houseLevel' => $house_level,
'pzLocked' => $pzLocked,
'whiteSkullTime' => $whiteSkullTime,
'redSkullLength' => $redSkullLength,
'blackSkull' => $blackSkull,
'blackSkullLength' => $blackSkullLength,
'dailyFragsToRedSkull' => isset($config['lua']['dailyFragsToRedSkull']) ? $config['lua']['dailyFragsToRedSkull'] : (isset($config['lua']['kills_per_day_red_skull']) ? $config['lua']['kills_per_day_red_skull'] : null),
'weeklyFragsToRedSkull' => isset($config['lua']['weeklyFragsToRedSkull']) ? $config['lua']['weeklyFragsToRedSkull'] : (isset($config['lua']['kills_per_week_red_skull']) ? $config['lua']['kills_per_week_red_skull'] : null),
'monthlyFragsToRedSkull' => isset($config['lua']['monthlyFragsToRedSkull']) ? $config['lua']['monthlyFragsToRedSkull'] : (isset($config['lua']['kills_per_month_red_skull']) ? $config['lua']['kills_per_month_red_skull'] : null),
'dailyFragsToBlackSkull' => isset($config['lua']['dailyFragsToBlackSkull']) ? $config['lua']['dailyFragsToBlackSkull'] : (isset($config['lua']['kills_per_day_black_skull']) ? $config['lua']['kills_per_day_black_skull'] : null),
'weeklyFragsToBlackSkull' => isset($config['lua']['weeklyFragsToBlackSkull']) ? $config['lua']['weeklyFragsToBlackSkull'] : (isset($config['lua']['kills_per_week_black_skull']) ? $config['lua']['kills_per_week_black_skull'] : null),
'monthlyFragsToBlackSkull' => isset($config['lua']['monthlyFragsToBlackSkull']) ? $config['lua']['monthlyFragsToBlackSkull'] : (isset($config['lua']['kills_per_month_black_skull']) ? $config['lua']['kills_per_month_black_skull'] : null),
'banishmentLength' => isset($config['lua']['banishment_length']) ? eval('return (' . $config['lua']['banishment_length'] . ') / (24 * 60 * 60);') : null,
'finalBanishmentLength' => isset($config['lua']['final_banishment_length']) ? eval('return (' . $config['lua']['final_banishment_length'] . ') / (24 * 60 * 60);') : null,
'ipBanishmentLength' => isset($config['lua']['ip_banishment_length']) ? eval('return (' . $config['lua']['ip_banishment_length'] . ') / (24 * 60 * 60);') : null,
));

View File

@@ -1,14 +0,0 @@
<?php
/**
* Rules
*
* @package MyAAC
* @author Gesior <jerzyskalski@wp.pl>
* @author Slawkens <slawkens@gmail.com>
* @copyright 2019 MyAAC
* @link https://my-aac.org
*/
defined('MYAAC') or die('Direct access not allowed!');
$title = 'Server Rules';
$twig->display('rules.html.twig');

Some files were not shown because too many files have changed in this diff Show More