Compare commits

..

156 Commits

Author SHA1 Message Date
slawkens
adabaf1635 Fix if $hooks not defined 2025-05-24 16:01:09 +02:00
slawkens
2a335328d2 feat: new hook: HOOK_FILTER_POT, possibility to replace POT classes 2025-05-24 15:51:37 +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
slawkens
4ca58b4178 Fix PHP 8.4 deprecation warnings
"Implicitly marking parameter $var as nullable is deprecated, the explicit nullable type must be used instead"
2025-05-09 13:45:46 +02:00
slawkens
03e2752139 Use optionally separate folder for views (thanks @Scrollog for idea) 2025-05-09 13:38:48 +02:00
slawkens
2fece725a4 Improve cypress workflow: add php 8.4 + ignore upload warnings 2025-05-09 13:23:04 +02:00
slawkens
c24c580796 Fix installMenus when theme/template was removed from disc 2025-05-09 13:09:44 +02:00
slawkens
620a47da72 Update Hooks.php 2025-05-08 20:05:27 +02:00
slawkens
9b75011224 New filter: HOOK_FILTER_ROUTES 2025-05-08 20:05:18 +02:00
slawkens
5b4b7b8a97 triggerFilter -> pass by reference (faster x5) 2025-05-08 20:05:08 +02:00
Slawomir Boczek
99997eb57d Feature/twig hooks filters (#258)
* feat: Hooks filters

* Cleanup
2025-05-08 20:04:54 +02:00
slawkens
73a5829974 Better monster images (no image not found anymore) + use cache 2025-05-05 21:21:54 +02:00
slawkens
497338c2d6 Update robots.txt 2025-05-04 17:20:23 +02:00
slawkens
beb348fe27 testing something 2025-05-04 17:20:12 +02:00
slawkens
5b1bd4f005 Update robots.txt 2025-05-04 17:00:22 +02:00
slawkens
f09606d01b Just testing something 2025-05-04 16:54:49 +02:00
slawkens
67ab425bb9 Add float & double types to the Settings 2025-05-04 09:14:30 +02:00
slawkens
113473f256 Add optional param _page_only for single-page apps etc. 2025-05-03 22:04:08 +02:00
slawkens
d6ac4e8d85 Update index.php 2025-05-03 21:04:13 +02:00
Slawomir Boczek
6845869838 Hoping for a better appear in search engines.. 2025-04-27 17:50:57 +02:00
slawkens
0fbd4bf1be nginx: block additionally *.sql 2025-04-24 13:44:38 +02:00
slawkens
1e45d5c393 Optimize .htaccess FilesMatch: Block access to *.md/json/dist/sql 2025-04-24 13:43:50 +02:00
slawkens
dbea69f314 Fix if user removes the menu category 2025-04-23 20:41:50 +02:00
slawkens
4e6aa0f262 Fix boostedCreature fetch on login.php 2025-04-23 18:05:14 +02:00
slawkens
fa1f927082 Update login.php 2025-04-23 18:04:54 +02:00
slawkens
de0512f11a Start v1.4.1-dev 2025-04-22 15:57:23 +02:00
slawkens
93c09b3380 Release v1.4 2025-04-22 13:42:55 +02:00
slawkens
d47195a787 Do not autoload sub-folders if autoload pages is disabled 2025-04-22 13:30:11 +02:00
slawkens
b618084d50 Fix headline.php: change image format to .png cause of black background 2025-04-21 23:43:57 +02:00
slawkens
d0d0af289d Refactor code + use clearCache() instead 2025-04-20 21:32:46 +02:00
slawkens
1d0c173e7d Clear cache on plugin enable/disable, fixes some issues with plugin pages 2025-04-20 21:30:59 +02:00
slawkens
4e7c894cf2 Nothing.. 2025-04-20 21:29:37 +02:00
slawkens
b71555d60d Update router.php 2025-04-20 21:29:22 +02:00
slawkens
c2bf94fb23 Fix: display 404 error instead of 500 when page has been removed from filesystem 2025-04-20 20:40:10 +02:00
João
8cf3409077 SQL Syntax Standardization (#298)
* Update schema.sql

* Update schema.sql
2025-04-18 23:17:35 +02:00
slawkens
e0043b1300 Fix warning 2025-04-18 20:44:11 +02:00
slawkens
86cb5821f6 README.md corrections
* Add links to docs & faq
* add info about 2.x dev version
* fix some grammar typos
2025-04-18 19:42:33 +02:00
slawkens
82a533d88c Add $db->hasTableAndColumns($table, $columns), credits to @opentibiabr Team 2025-04-18 18:12:56 +02:00
slawkens
ceaa0639e6 feat: admin-pages (can add admin pages through plugins)
Also possibility to overwrite default myaac admin pages
2025-04-18 13:57:53 +02:00
slawkens
6844f4392a Change logout button color 2025-04-06 23:46:52 +02:00
slawkens
6d8f4718a1 pages in theme folder have precedence over normal pages 2025-04-06 22:37:36 +02:00
slawkens
f40b986b59 Small changes in account.login.html.twig
* change inputs width to 100%
* fix form closing
* formatting
2025-04-06 17:00:59 +02:00
slawkens
190697ce98 Update config.php 2025-04-06 16:43:30 +02:00
slawkens
64f6d3abca Add noSubmit option to buttons.base 2025-04-06 16:43:19 +02:00
slawkens
e6f05a2731 Plugin name is required, version is optional 2025-04-06 16:41:28 +02:00
slawkens
6a0356aa0f Update version 2025-04-04 21:31:17 +02:00
slawkens
50d649dbde Release v1.3.3 2025-04-04 21:25:19 +02:00
slawkens
6c568fd36a Fix uninstall plugin when plugin is disabled 2025-04-04 21:08:49 +02:00
slawkens
fa6b6aa153 Display more info when error parsing config.lua value 2025-04-04 20:07:42 +02:00
slawkens
ae639d65b0 PHP 8 things 2025-04-03 20:39:27 +02:00
slawkens
35e2483de8 Change root folder to /var/www/html, like in default config 2025-04-02 19:48:23 +02:00
slawkens
bbf923e1a6 Update common.php 2025-04-01 07:56:29 +02:00
slawkens
211b6ea698 Update CHANGELOG-1.x.md 2025-04-01 07:37:43 +02:00
slawkens
6d156ae080 Update CHANGELOG-1.x.md 2025-04-01 07:29:43 +02:00
slawkens
a5b3940e59 Prepare to release 1.3.2 2025-04-01 07:28:36 +02:00
slawkens
dbf73d0b61 Show/hide IP Ban Protection options depending on the value (enabled/disabled) 2025-03-31 20:38:42 +02:00
slawkens
65696f63e3 Fix debugbar/admin panel menu when using custom base_dir 2025-03-31 18:13:45 +02:00
slawkens
6341093578 Update version 2025-03-30 07:10:16 +02:00
slawkens
d25c71857f Do not require init.php in cache:clear command 2025-03-30 07:10:05 +02:00
slawkens
7dcb5c4a1f Update version to 1.x-dev 2025-03-26 22:02:56 +01:00
slawkens
ff1723b756 Release v1.3.1 2025-03-19 20:37:44 +01:00
slawkens
1a5771ad51 Fix migrate:run command 2025-03-16 20:33:53 +01:00
slawkens
6fac883659 Replace links with from accountmanagement to account/manage 2025-03-16 12:39:07 +01:00
slawkens
4a6896b446 getPremDays: returns -1 if freePremium 2025-03-15 22:48:59 +01:00
slawkens
0852fba6f0 Release v1.3 2025-03-10 20:26:25 +01:00
slawkens
9239a4f419 Fix the second "Save" button -> addition to previous commit 2025-03-10 12:46:33 +01:00
slawkens
00fe1adc15 Fix: add possibility to remove all menu items 2025-03-10 10:48:12 +01:00
slawkens
c2f55791c0 Nothing important, just better code style 2025-03-03 20:07:59 +01:00
slawkens
464492d826 Update OTS_Account.php 2025-02-26 16:16:45 +01:00
slawkens
887b5068ad Fix house links 2025-02-15 12:15:35 +01:00
slawkens
4c5cc8b573 Change monster link to $_GET ?name= 2025-02-15 12:03:44 +01:00
slawkens
529bdcf016 Use latest outfit-images host from @gesior 2025-02-12 18:20:24 +01:00
slawkens
3e3f4bb5a5 Fix long title on headline.php 2025-02-12 16:17:03 +01:00
slawkens
aa52df6e2e Fix menu colors once again, plus add !important tag 2025-02-09 20:54:47 +01:00
slawkens
3b31915c22 Update CHANGELOG.md 2025-02-09 12:25:56 +01:00
slawkens
1c6cda4df9 Update year 2025-02-09 11:50:14 +01:00
slawkens
cf51f7aa8d Release v1.2 2025-02-09 11:32:34 +01:00
slawkens
ed89b99cd1 Addition to previous commit, allow list types with spaces 2025-02-09 01:29:32 +01:00
slawkens
9d7fc98e1e Fix if vocation name has more words 2025-02-09 01:16:15 +01:00
slawkens
f646856e20 Unification of the variable menu_default_links_color 2025-02-09 01:02:14 +01:00
slawkens
f97f8cbe87 Move admin.menus.header html to twig 2025-02-09 00:47:46 +01:00
slawkens
3da3e62c5b Option to reset menus 2025-02-09 00:42:11 +01:00
slawkens
d5dd7297b5 Fix deprecation warnings from jquery 2025-02-09 00:03:39 +01:00
slawkens
73de93a561 Rework menus: Different categories can have different colors 2025-02-08 23:56:58 +01:00
slawkens
ae1161d770 Add template_name to twig variables 2025-02-08 23:43:15 +01:00
slawkens
4455964db4 Update cypress.yml 2025-02-02 22:41:31 +01:00
slawkens
84870dbf2d Update release.sh 2025-02-02 22:39:06 +01:00
slawkens
329153fda6 Fix branch name in workflows 2025-02-02 22:38:40 +01:00
slawkens
4b6024dc45 Save settings in a transaction 2025-02-02 22:36:18 +01:00
slawkens
28fef952f8 feat: Settings: enable Save button only if changes has been made 2025-02-02 22:36:17 +01:00
slawkens
4fda4f643b feat: Settings: password input with hide/show options 2025-02-02 21:55:16 +01:00
slawkens
19686725dc Add HOOK_INIT, executed just after $hooks are loaded 2025-02-02 16:17:49 +01:00
slawkens
a73fb1003e Fix HOOK_STARTUP location 2025-02-02 16:17:24 +01:00
slawkens
b46ddb43d0 Twig session(key) function + reworked session functions to accept multi-array like in Laravel
Important: getSession returns NULL now instead of false if session value not found
2025-02-02 16:16:59 +01:00
slawkens
de468a8dcd Fixed need to click on button second time 2025-02-02 14:22:57 +01:00
slawkens
ea51ad27c3 Fix online status + vocation for TFS 0.x 2025-02-01 00:35:22 +01:00
dependabot[bot]
d2a4748a59 Bump twig/twig from 3.18.0 to 3.19.0 (#284)
Bumps [twig/twig](https://github.com/twigphp/Twig) from 3.18.0 to 3.19.0.
- [Changelog](https://github.com/twigphp/Twig/blob/3.x/CHANGELOG)
- [Commits](https://github.com/twigphp/Twig/compare/v3.18.0...v3.19.0)

---
updated-dependencies:
- dependency-name: twig/twig
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-01-29 20:00:58 +01:00
slawkens
a1ed209591 Update README.md 2025-01-27 22:58:32 +01:00
slawkens
34321613d6 Start v1.1.1 2025-01-27 22:57:40 +01:00
slawkens
19b290feb7 Update CHANGELOG.md 2025-01-27 22:48:32 +01:00
slawkens
9ab25abcdf Release v1.1 2025-01-27 22:30:18 +01:00
slawkens
ea753278a0 Secure direct access to template.php 2025-01-27 22:15:00 +01:00
slawkens
4d749b8815 Fix error in CLI, where BASE_URL is not defined 2025-01-24 21:42:52 +01:00
slawkens
07012f786b Ignore lua/ folder 2025-01-22 21:45:07 +01:00
slawkens
a45ceab83a Make players.comment and guilds.description VARCHAR 2025-01-22 21:44:58 +01:00
slawkens
669c447fca Fix hook ACCOUNT_LOGIN_BEFORE_ACCOUNT location 2025-01-21 21:45:28 +01:00
slawkens
da43b32ff0 Nothing important, code refactor 2025-01-21 20:43:59 +01:00
slawkens
cbe0d187b4 Formatting and types hint 2025-01-20 16:31:54 +01:00
slawkens
c5d5bb8067 Adjust mailer settings to latest gmail 2025-01-18 16:18:47 +01:00
slawkens
e85ce193be Add forum to the list 2025-01-18 11:18:21 +01:00
slawkens
3fb2675b5a Fix tibiacom menus 2025-01-18 11:11:35 +01:00
slawkens
b7de8b32eb Revert "Fix menus like char-bazaar/auctions-history etc."
This reverts commit dd47423157.
2025-01-18 11:05:15 +01:00
slawkens
89be68731e Update CHANGELOG.md 2025-01-18 00:11:18 +01:00
slawkens
10dd818b13 Optimize $player->isOnline() function 2025-01-17 22:49:40 +01:00
slawkens
13a1598a46 Nothing important: Convert spaces to tabs 2025-01-17 22:38:27 +01:00
slawkens
4f6178eca0 Initialize menus with menu_categories
If user add custom categories, it will fix an issue where Menu is not collapsed
2025-01-17 21:07:02 +01:00
slawkens
dc2b5afd99 functions_custom.php are not optional 2025-01-17 17:12:21 +01:00
slawkens
11cee81c5f Additional fix to previous commit 2025-01-17 16:36:05 +01:00
slawkens
d639e77d04 tibiacom: Fix the closing MenuBottom if there are extra categories 2025-01-17 16:24:30 +01:00
slawkens
dd47423157 Fix menus like char-bazaar/auctions-history etc. 2025-01-17 11:16:19 +01:00
slawkens
b02c7f4239 Fix note message 2025-01-14 19:29:47 +01:00
170 changed files with 4470 additions and 3551 deletions

View File

@@ -1,9 +1,9 @@
name: Cypress
on:
pull_request:
branches: [master]
branches: [main]
push:
branches: [master]
branches: [main]
jobs:
cypress:
@@ -22,7 +22,7 @@ jobs:
strategy:
fail-fast: false
matrix:
php-versions: [ '8.1', '8.2', '8.3' ]
php-versions: [ '8.1', '8.2', '8.3', '8.4' ]
ots: ['tfs-1.4', 'canary-3.1.2'] # TODO: add 'tfs-master' (actually doesn't work cause AAC doesn't support reading .env configuration)
name: Cypress (PHP ${{ matrix.php-versions }}, ${{ matrix.ots }})
steps:
@@ -35,7 +35,7 @@ jobs:
- name: Checkout MyAAC
uses: actions/checkout@v4
with:
ref: master
ref: main
- uses: actions/setup-node@v4
with:
@@ -146,6 +146,7 @@ jobs:
with:
name: cypress-screenshots-${{ matrix.php-versions }}-${{ matrix.ots }}
path: cypress/screenshots
if-no-files-found: ignore
- name: Upload Cypress Videos
uses: actions/upload-artifact@v4
@@ -153,6 +154,7 @@ jobs:
with:
name: cypress-videos-${{ matrix.php-versions }}-${{ matrix.ots }}
path: cypress/videos
if-no-files-found: ignore
- name: Upload PHP Logs
uses: actions/upload-artifact@v4

View File

@@ -1,9 +1,9 @@
name: PHP Linting
on:
pull_request:
branches: [master]
branches: [main]
push:
branches: [master]
branches: [main]
jobs:
phplint:

View File

@@ -2,9 +2,9 @@ name: "PHPStan"
on:
pull_request:
branches: [master]
branches: [main]
push:
branches: [master]
branches: [main]
jobs:
tests:
@@ -14,7 +14,7 @@ jobs:
strategy:
fail-fast: false
matrix:
php-versions: [ '8.1', '8.2', '8.3' ]
php-versions: [ '8.1', '8.2', '8.3', '8.4' ]
steps:
- name: "Checkout"
uses: "actions/checkout@v4"

4
.gitignore vendored
View File

@@ -4,6 +4,7 @@ Thumbs.db
#
/.htaccess
lua
# composer
composer.phar
@@ -75,6 +76,3 @@ landing
# system
system/functions_custom.php
# others/rest
system/pages/downloads.php

View File

@@ -6,7 +6,7 @@
Options -MultiViews
</IfModule>
<FilesMatch "^(CHANGELOG\.md|README\.md|composer\.json|composer\.lock|package\.json|package-lock\.json|cypress\.env\.json)$">
<FilesMatch "^(.*\.md|.*\.json|.*\.dist|.*\.sql|CHANGELOG|README|composer\.lock)$">
Require all denied
</FilesMatch>

View File

@@ -1,5 +1,128 @@
# Changelog
## [1.5 - 14.05.2025]
### Added
* Feature/twig hooks filters (#258)
* Add latest client versions (14.00 - 15.01) (https://github.com/slawkens/myaac/commit/5367df23812c6182863353c9a39fd7fb0b743f4b)
* db variable to twig (https://github.com/slawkens/myaac/commit/5ed1aec28e146b871a75597411d12e42a067f4e6)
* New filter: HOOK_FILTER_ROUTES (https://github.com/slawkens/myaac/commit/9b75011224f385db8b27e109bfeb28e75b9d779c)
* Allow optionally separate folder for views (thanks @Scrollog for idea) (https://github.com/slawkens/myaac/commit/03e275213901a89edb0ebb8974b776a992ab391f)
* Add float & double types to the Settings (https://github.com/slawkens/myaac/commit/67ab425bb9796d9d123296e3fda542fa8f7f05ee)
* Add optional param _page_only for single-page apps etc. (https://github.com/slawkens/myaac/commit/113473f2560aab6d364c301cc14a8b5ba8f309f4)
### Changed
* Change OTS_Account->getPremDays to not return -1 in case of freePremium (https://github.com/slawkens/myaac/commit/3befde2a1e4d24a011311e785f15185db57e19b8)
* Add note about highscores being updated x minutes + allow ttl 0 to disable cache (https://github.com/slawkens/myaac/commit/a161cff00329da6f970f3a70967fe8346fe92bbc)
* Better monster images (no image not found anymore) + use cache (https://github.com/slawkens/myaac/commit/73a5829974ceca3f02d7925d5cfbd5fa50b1bbd2)
* Rename server-info -> ots-info, changelog -> change-log (Due to conflict with apache2 server-info mod) (https://github.com/slawkens/myaac/commit/3949d84e5d7631f332111b6d00278bddbd0ad10a)
* Move rules page to admin panel (https://github.com/slawkens/myaac/commit/3949d84e5d7631f332111b6d00278bddbd0ad10a)
### Fixed
* php 8.4 warnings
* Visitors counter not working properly on dev mode (https://github.com/slawkens/myaac/commit/da151051186c913dd0dd091aabe893649c2b9ee7)
* Fix login.php boosted creature & boss (not sure exact version, but should be 14.12 or around) (https://github.com/slawkens/myaac/commit/c48b8006319f6c3b5f082befd16785420bb98110)
* Fix installMenus when theme/template was removed from disc (https://github.com/slawkens/myaac/commit/c24c580796bccd54bf9e95b864763f4642684d55)
* Fix if user removes the menu category (https://github.com/slawkens/myaac/commit/dbea69f31478391dacfbbc02c8353c39b4245daf)
### Updated:
* Update cypress from version ^13.17.0 to ^14.3.3 (https://github.com/slawkens/myaac/commit/629fd18ea166860d5898a822f44f9277da6ce43d)
## [1.4 - 22.04.2025]
### Added
* feat: admin-pages (can add admin pages through plugins) (https://github.com/slawkens/myaac/commit/ceaa0639e66d31e8177ff90791463470367aa45d)
* just place the page in admin-pages folder in the plugin
* Also, possibility to overwrite default myaac admin pages
* Add db->hasTableAndColumns(table, columns), credits to @opentibiabr Team (https://github.com/slawkens/myaac/commit/82a533d88c8a342076891d132b4b409ed9a1fe72)
* Add noSubmit option to buttons.base (https://github.com/slawkens/myaac/commit/64f6d3abcada3bf9fd7599f50d2fac0a1367f383)
### Fixed
* Fix: display 404 error instead of 500 when page has been removed from filesystem (https://github.com/slawkens/myaac/commit/c2bf94fb2370d2009a2eb907f818955132cf8611)
* Fix headline.php: change image format to .png cause of black background (https://github.com/slawkens/myaac/commit/b618084d50918539d9a70abd97e764137b966067)
* Clear cache on plugin enable/disable, fixes some issues with plugin pages being cached (https://github.com/slawkens/myaac/commit/1d0c173e7d000aecbd432800941fc3e38a0e50f2)
* Do not autoload sub-folders if autoload pages is disabled (https://github.com/slawkens/myaac/commit/d47195a7878095336f9c9edc6f96244257f67eec)
### Changed
* SQL Syntax Standardization (by @JoaozinhoBrasil, #298)
* Pages in theme/template folder will now have precedence over normal pages (https://github.com/slawkens/myaac/commit/6d8f4718a1d349fba8f0ebc39cfd3a1a84d104b0)
* Small changes in account.login.html.twig (https://github.com/slawkens/myaac/commit/f40b986b59d4c8fa89ab4745731bf366f8619976)
* Plugin name is required, version is optional (https://github.com/slawkens/myaac/commit/e6f05a2731c61d931be49e121c068e49c0ad5e01)
## [1.3.3 - 04.04.2025]
### Fixed
* Fix uninstall plugin when plugin is disabled (https://github.com/slawkens/myaac/commit/6c568fd36a271270684fc412ccd556b230273a6d)
### Changed
* Display more useful info when error parsing config.lua (https://github.com/slawkens/myaac/commit/fa6b6aa153ffc131e0d1631a4dcd9012a5850c2e)
### Other
* Small adjustments (https://github.com/slawkens/myaac/commit/35e2483de86e295bdf089cceffa25842eeb2e34c, https://github.com/slawkens/myaac/commit/ae639d65b0bfa491e747e907e2ebc77f83f47981)
## [1.3.2 - 01.04.2025]
### Fixed
* Fix debugBar/admin panel menu when using custom base_dir (https://github.com/slawkens/myaac/commit/65696f63e3aac02ff952ea81279e7cb2fa7570fb)
### Changed
* Settings: Show/hide IP Ban Protection options depending on the value (enabled/disabled) (https://github.com/slawkens/myaac/commit/dbf73d0b61b45601ae95e51b23c051c2704169c5)
* Do not require init.php in cache:clear command (https://github.com/slawkens/myaac/commit/d25c71857f767834239bbffacd00fdc671adb157)
## [1.3.1 - 19.03.2025]
### Fixed
* Fixed migrate:run command (https://github.com/slawkens/myaac/commit/1a5771ad51e595fe13368a0721b059c4ecefb17d)
### Changed
* Small adjustments (https://github.com/slawkens/myaac/commit/6fac883659f581baac1361826d046410156f1e58, https://github.com/slawkens/myaac/commit/4a6896b4469968b9904292734cf6c14ba5eeef14)
## [1.3 - 10.03.2025]
### Changed
* Use latest outfit-images host from @gesior (https://github.com/slawkens/myaac/commit/529bdcf016dd0f9dffbc34d81f99a046a9ddb70d)
* Change monster link to $_GET ?name= (https://github.com/slawkens/myaac/commit/4c5cc8b573b2b3e7ec00a22b7ede30a68083a924)
### Fixed
* Fixed house links (https://github.com/slawkens/myaac/commit/887b5068ad11c4cdab614afd34525caba785ce13)
* Fixed long title on headline.php (https://github.com/slawkens/myaac/commit/3e3f4bb5a514158ec8777684ca6c7f1c2a37bed5)
* Fixed menu colors once again, plus add !important tag (https://github.com/slawkens/myaac/commit/aa52df6e2ec92cafc25b655ae907bf2e1746d9cc)
* Fix: add possibility to remove all menu items in admin panel (https://github.com/slawkens/myaac/commit/00fe1adc15ea7646596d755f6e6e1f7854ffc1d5, https://github.com/slawkens/myaac/commit/9239a4f4198c3ad260802ac3b47e9c41b80b754e)
## [1.2 - 09.02.2025]
### Added
* Twig session(key) function + reworked session functions to accept multi-array like in Laravel (https://github.com/slawkens/myaac/commit/b46ddb43d03ef7e5fc34e555e92e856bdc905691)
* add template_name to twig variables (https://github.com/slawkens/myaac/commit/ae1161d77050bda181802b4496c9de920a7bb1bc)
* add HOOK_INIT, executed just after $hooks are loaded (https://github.com/slawkens/myaac/commit/19686725dc810f63a07f049f82c66cf336d90ca6)
### Changed
* settings: password input hide/show, enable Save button only if changes has been made, save settings in transaction (https://github.com/slawkens/myaac/commit/4fda4f643b60a151179e5dd4f04912fb2618d98f, https://github.com/slawkens/myaac/commit/28fef952f857b79d64bc7495ffa5e1999e68e192, https://github.com/slawkens/myaac/commit/4b6024dc451accadb6c469fa282a9a764c1c0a81)
* rework menus: Different categories can have different colors + Option to reset menus (https://github.com/slawkens/myaac/commit/73de93a561f6b13111e019075724357d8a617249, https://github.com/slawkens/myaac/commit/3da3e62c5b12390d75de9b3320729bcca6e0b458)
### Fixed
* highscores: Fix online status + vocation for TFS 0.x (https://github.com/slawkens/myaac/commit/ea51ad27c38be88d86514cb979bb394fcfbef1f0)
* clear cache button in admin bar needed to be clicked twice until it worked (https://github.com/slawkens/myaac/commit/ea51ad27c38be88d86514cb979bb394fcfbef1f0)
* HOOK_STARTUP location (https://github.com/slawkens/myaac/commit/a73fb1003ee3f812cf182d1834d65f08e6f60d1f)
* if vocation name has more words (https://github.com/slawkens/myaac/commit/9d7fc98e1e0a96b59ecc1a7c39800a64445db364)
### Updated
* Bump twig/twig from 3.18.0 to 3.19.0 (#284)
## [1.1 - 27.01.2025]
### Changed
* adjust mailer settings descriptions to latest gmail (https://github.com/slawkens/myaac/commit/c5d5bb80671db135e6b503f53684771c7272e05d)
* optimize $player->isOnline() function, thanks @gesior (https://github.com/slawkens/myaac/commit/10dd818b139d5e1bb1ca9ec81edfb083ba9316b4)
* make players.comment and guilds.description VARCHAR (https://github.com/slawkens/myaac/commit/a45ceab83a74bee2b89cdb72baceda75e577e3cf)
* add lua/ folder to .gitignore (https://github.com/slawkens/myaac/commit/07012f786b1114cb6ab2f064f82c645b136a375a)
### Fixed
* general fixes in the tibiacom template menus, better support for custom menus
* make functions_custom.php optional (https://github.com/slawkens/myaac/commit/dc2b5afd9980984e2b259c9fc99f2ade46f70a5a)
* error in CLI, where BASE_URL is not defined (https://github.com/slawkens/myaac/commit/4d749b881582f64b5a46196dbbb5ee8097127f03)
* hook ACCOUNT_LOGIN_BEFORE_ACCOUNT location (https://github.com/slawkens/myaac/commit/669c447fca8643ce56d9ef8c1374ec647c780998)
## [1.0.1 - 14.01.2025]
### Fixed
@@ -140,7 +263,6 @@ Minimum PHP version for this release is 8.1.
* support for login and create account only by email (configurable)
* with no need for account name
* Google ReCAPTCHA v3 support (available as plugin)
* automatically load towns names from .OTBM file
* support for Account Number
* suggest account number option
* many new functions, hooks and configurables

View File

@@ -1,3 +1,3 @@
* Gesior.pl (2007 - 2008)
* Slawkens (2009 - 2023)
* Slawkens (2009 - 2025)
* Contributors listed in CONTRIBUTORS.txt

View File

@@ -1,6 +1,6 @@
# [MyAAC](https://my-aac.org)
MyAAC is a free and open-source Automatic Account Creator (AAC) written in PHP. It is a fork of the [Gesior](https://github.com/gesior/Gesior2012) project. It supports only MySQL databases.
MyAAC is a free and open-source Automatic Account Creator (AAC) for Open Tibia Servers written in PHP. It is a fork of the [Gesior](https://github.com/gesior/Gesior2012) project. It supports only MySQL databases.
Official website: https://my-aac.org
@@ -12,11 +12,18 @@ Official website: https://my-aac.org
| Version | Status | Branch | Requirements |
|:--------|:-----------------------|:--------|:---------------|
| **1.x** | **Active development** | develop | **PHP >= 8.1** |
| 2.x | Experimental features | develop | PHP >= 8.1 |
| **1.x** | **Active development** | main | **PHP >= 8.1** |
| 0.9.x | Not developed anymore | 0.9 | PHP >= 7.2.5 |
| 0.8.x | Active support | master | PHP >= 7.2.5 |
| 0.8.x | Active support | 0.8 | PHP >= 7.2.5 |
| 0.7.x | End Of Life | 0.7 | PHP >= 5.3.3 |
The recommended version to install is 1.x, which can be found at releases page - [https://github.com/slawkens/myaac/releases](https://github.com/slawkens/myaac/releases).
### Documentation
* [docs.my-aac.org](https://docs.my-aac.org)
* [my-aac.org - FAQ](https://my-aac.org/faqs/)
### Requirements
- MySQL database
@@ -47,23 +54,23 @@ Official website: https://my-aac.org
### Configuration
Check *config.php* to get more informations. (Notice: MyAAC 1.0+ doesn't use config.php anymore, it has been moved to Admin Panel - Settings page).
Check *config.php* to get more information. (Notice: MyAAC 1.0+ doesn't use config.php anymore, it has been moved to Admin Panel - Settings page).
Use *config.local.php* for your local configuration changes.
### Branches
This repository follows the Git Flow Workflow.
Cheatsheet: [Git-Flow-Cheetsheet](https://danielkummer.github.io/git-flow-cheatsheet)
Cheatsheet: [Git-Flow-Cheatsheet](https://danielkummer.github.io/git-flow-cheatsheet)
That means, we use:
* master branch, for current stable release
* main branch, for current stable release
* develop branch, for development version (next release)
* feature branches, for features etc.
### Known Problems
- Some compatibility issues with some exotical distibutions.
- Some compatibility issues with some exotic distributions.
### Contributing
@@ -73,11 +80,11 @@ Pull requests should be made to the *develop* branch as that is the working bran
Bug fixes to current release should be done to master branch.
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
If you have a great idea or want contribute to the project - visit our website at https://www.my-aac.org
If you have a great idea or want to contribute to the project - visit our website at https://www.my-aac.org
## Project supported by JetBrains
@@ -88,4 +95,4 @@ Many thanks to Jetbrains for kindly providing a license for me to work on this a
### 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

@@ -7,7 +7,7 @@ $hooks->register('debugbar_admin_head_end', HOOK_ADMIN_HEAD_END, function ($para
return;
}
$debugBarRenderer = $debugBar->getJavascriptRenderer();
$debugBarRenderer = $debugBar->getJavascriptRenderer(BASE_URL . 'vendor/maximebf/debugbar/src/DebugBar/Resources/');
echo $debugBarRenderer->renderHead();
});
$hooks->register('debugbar_admin_body_end', HOOK_ADMIN_BODY_END, function ($params) {
@@ -17,6 +17,6 @@ $hooks->register('debugbar_admin_body_end', HOOK_ADMIN_BODY_END, function ($para
return;
}
$debugBarRenderer = $debugBar->getJavascriptRenderer();
$debugBarRenderer = $debugBar->getJavascriptRenderer(BASE_URL . 'vendor/maximebf/debugbar/src/DebugBar/Resources/');
echo $debugBarRenderer->render();
});

View File

@@ -1,6 +1,8 @@
<?php
// few things we'll need
use MyAAC\Plugins;
require '../common.php';
const ADMIN_PANEL = true;
@@ -42,15 +44,21 @@ if(!$logged || !admin()) {
$page = 'login';
}
// include our page
$file = __DIR__ . '/pages/' . $page . '.php';
if(!@file_exists($file)) {
if (str_contains($page, 'plugins/')) {
$file = BASE . $page;
}
else {
$page = '404';
$file = SYSTEM . 'pages/404.php';
$pluginsAdminPages = Plugins::getAdminPages();
if(isset($pluginsAdminPages[$page]) && file_exists(BASE . $pluginsAdminPages[$page])) {
$file = BASE . $pluginsAdminPages[$page];
}
else {
// include our page
$file = __DIR__ . '/pages/' . $page . '.php';
if(!@file_exists($file)) {
if (str_contains($page, 'plugins/')) {
$file = BASE . $page;
}
else {
$page = '404';
$file = SYSTEM . 'pages/404.php';
}
}
}

View File

@@ -11,12 +11,12 @@
defined('MYAAC') or die('Direct access not allowed!');
$title = 'MyAAC Changelog';
if (!file_exists(BASE . 'CHANGELOG.md')) {
if (!file_exists(BASE . 'CHANGELOG-1.x.md')) {
echo 'File CHANGELOG.md doesn\'t exist.';
return;
}
$changelog = file_get_contents(BASE . 'CHANGELOG.md');
$changelog = file_get_contents(BASE . 'CHANGELOG-1.x.md');
$Parsedown = new Parsedown();

View File

@@ -27,11 +27,11 @@ $pluginThemes = Plugins::getThemes();
if (isset($_POST['template'])) {
$template = $_POST['template'];
if (isset($_POST['menu'])) {
$post_menu = $_POST['menu'];
$post_menu_link = $_POST['menu_link'];
$post_menu_blank = $_POST['menu_blank'];
$post_menu_color = $_POST['menu_color'];
if (isset($_POST['save'])) {
$post_menu = $_POST['menu'] ?? [];
$post_menu_link = $_POST['menu_link'] ?? [];
$post_menu_blank = $_POST['menu_blank'] ?? [];
$post_menu_color = $_POST['menu_color'] ?? [];
if (count($post_menu) != count($post_menu_link)) {
echo 'Menu count is not equal menu links. Something went wrong when sending form.';
return;
@@ -59,11 +59,7 @@ if (isset($_POST['template'])) {
}
}
$cache = Cache::getInstance();
if ($cache->enabled()) {
$cache->delete('template_menus');
}
onTemplateMenusChange();
success('Saved at ' . date('H:i'));
}
@@ -82,38 +78,48 @@ if (isset($_POST['template'])) {
return;
}
if (isset($_GET['reset_colors'])) {
if (isset($config['menu_default_color'])) {
Menu::where('template', $template)->update(['color' => str_replace('#', '', $config['menu_default_color'])]);
success('Colors has been reset.');
}
else {
warning('There is no default color defined, cannot reset colors.');
}
}
if (!isset($config['menu_categories'])) {
echo "No menu categories set in template config.php.<br/>This template doesn't support dynamic menus.";
return;
}
if (isset($_GET['reset_colors'])) {
foreach ($config['menu_categories'] as $id => $options) {
$color = $options['default_links_color'] ?? ($config['menu_default_links_color'] ?? ($config['menu_default_color'] ?? '#ffffff'));
Menu::where('template', $template)->where('category', $id)->update(['color' => str_replace('#', '', $color)]);
}
onTemplateMenusChange();
success('Colors has been reset at ' . date('H:i'));
}
if (isset($_GET['reset_menus'])) {
$configMenus = config('menus');
if (isset($configMenus)) {
Plugins::installMenus($template, config('menus'), true);
onTemplateMenusChange();
success('Menus has been reset at ' . date('H:i'));
}
else {
error("This template don't support reinstalling menus.");
}
}
$title = 'Menus - ' . $template;
$canResetColors = isset($config['menu_default_color']) || isset($config['menu_default_links_color']);
foreach ($config['menu_categories'] as $id => $options) {
if (isset($options['default_links_color'])) {
$canResetColors = true;
}
}
$twig->display('admin.menus.header.html.twig', [
'template' => $template,
'canResetColors' => $canResetColors
]);
?>
<div align="center" class="text-center">
<p class="note">You are editing: <?= $template ?><br/><br/>
Hint: You can drag menu items.<br/>
Hint: Add links to external sites using: <b>http://</b> or <b>https://</b> prefix.<br/>
Not all templates support blank and colorful links.
</p>
<?php if (isset($config['menu_default_color'])) {?>
<form method="post" action="?p=menus&reset_colors" onsubmit="return confirm('Do you really want to reset colors?');">
<?php csrf(); ?>
<input type="hidden" name="template" value="<?php echo $template ?>"/>
<button type="submit" class="btn btn-danger">Reset Colors to default</button>
</form>
<br/>
<?php } ?>
</div>
<?php
$menus = Menu::query()
->select('name', 'link', 'blank', 'color', 'category', 'ordering')
@@ -129,7 +135,7 @@ if (isset($_POST['template'])) {
<form method="post" id="menus-form" action="?p=menus">
<?php csrf(); ?>
<input type="hidden" name="template" value="<?php echo $template ?>"/>
<button type="submit" class="btn btn-info">Save</button><br/><br/>
<button type="submit" name="save" class="btn btn-info">Save</button><br/><br/>
<div class="row">
<?php foreach ($config['menu_categories'] as $id => $cat): ?>
<div class="col-md-12 col-lg-6">
@@ -143,12 +149,13 @@ if (isset($_POST['template'])) {
if (isset($menus[$id])) {
$i = 0;
foreach ($menus[$id] as $menu):
$color = (empty($menu['color']) ? ($cat['default_links_color'] ?? ($config['menu_default_links_color'] ?? ($config['menu_default_color'] ?? '#ffffff'))) : '#' . $menu['color']);
?>
<li class="ui-state-default" id="list-<?php echo $id ?>-<?php echo $i ?>"><label>Name:</label> <input type="text" name="menu[<?php echo $id ?>][]" value="<?php echo escapeHtml($menu['name']); ?>"/>
<label>Link:</label> <input type="text" name="menu_link[<?php echo $id ?>][]" value="<?php echo $menu['link'] ?>"/>
<input type="hidden" name="menu_blank[<?php echo $id ?>][]" value="0"/>
<label><input class="blank-checkbox" type="checkbox" <?php echo($menu['blank'] == 1 ? 'checked' : '') ?>/><span title="Open in New Window">New Window</span></label>
<input class="color-picker" type="text" name="menu_color[<?php echo $id ?>][]" value="<?php echo (empty($menu['color']) ? ($config['menu_default_color'] ?? '#ffffff') : $menu['color']); ?>"/>
<input class="color-picker" type="text" name="menu_color[<?php echo $id ?>][]" value="<?php echo $color; ?>"/>
<a class="remove-button" id="remove-button-<?php echo $id ?>-<?php echo $i ?>"><i class="fas fa-trash"></a></i></li>
<?php $i++; $last_id[$id] = $i;
endforeach;
@@ -161,7 +168,7 @@ if (isset($_POST['template'])) {
</div>
<div class="row pb-2">
<div class="col-md-12">
<button type="submit" class="btn btn-info">Save</button>
<button type="submit" name="save" class="btn btn-info">Save</button>
<?php
echo '<button type="button" class="btn btn-danger float-right" value="Cancel" onclick="window.location = \'' . ADMIN_URL . '?p=menus\';"><i class="fas fa-cancel"></i> Cancel</button>';
?>
@@ -172,7 +179,6 @@ if (isset($_POST['template'])) {
$twig->display('admin.menus.js.html.twig', array(
'menus' => $menus,
'last_id' => $last_id,
'menu_default_color' => $config['menu_default_color'] ?? '#ffffff'
));
?>
<?php
@@ -194,3 +200,11 @@ if (isset($_POST['template'])) {
'templates' => $templates
));
}
function onTemplateMenusChange(): void
{
$cache = Cache::getInstance();
if ($cache->enabled()) {
$cache->delete('template_menus');
}
}

View File

@@ -7,7 +7,7 @@ defined('MYAAC') or die('Direct access not allowed!');
$balance = 0;
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(

View File

@@ -7,7 +7,12 @@ defined('MYAAC') or die('Direct access not allowed!');
$coins = 0;
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(

View File

@@ -7,7 +7,7 @@ defined('MYAAC') or die('Direct access not allowed!');
$players = 0;
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(

View File

@@ -19,7 +19,7 @@
{% set i = i + 1 %}
<tr>
<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>
</tr>
{% endfor %}

View File

@@ -19,7 +19,7 @@
{% set i = i + 1 %}
<tr>
<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.coins }}</td>
</tr>
{% endfor %}

View File

@@ -19,7 +19,7 @@
{% set i = i + 1 %}
<tr>
<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>
</tr>
{% endfor %}

View File

@@ -19,7 +19,7 @@
{% set i = i + 1 %}
<tr>
<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>
</tr>
{% endfor %}

View File

@@ -17,7 +17,7 @@ csrfProtect();
$use_datatable = true;
if (!getBoolean(setting('core.admin_plugins_manage_enable'))) {
if (!setting('core.admin_plugins_manage_enable')) {
warning('Plugin installation and management is disabled in Settings.<br/>If you wish to enable, go to Settings and enable <strong>Enable Plugins Manage</strong>.');
}
else {

View File

@@ -26,8 +26,8 @@
if (version_compare(phpversion(), '8.1', '<')) die('PHP version 8.1 or higher is required.');
const MYAAC = true;
const MYAAC_VERSION = '1.0.1';
const DATABASE_VERSION = 42;
const MYAAC_VERSION = '1.5.1-dev';
const DATABASE_VERSION = 45;
const TABLE_PREFIX = 'myaac_';
define('START_TIME', microtime(true));
define('MYAAC_OS', stripos(PHP_OS, 'WIN') === 0 ? 'WINDOWS' : (strtoupper(PHP_OS) === 'DARWIN' ? 'MAC' : 'LINUX'));

18
composer.lock generated
View File

@@ -2637,16 +2637,16 @@
},
{
"name": "twig/twig",
"version": "v3.18.0",
"version": "v3.19.0",
"source": {
"type": "git",
"url": "https://github.com/twigphp/Twig.git",
"reference": "acffa88cc2b40dbe42eaf3a5025d6c0d4600cc50"
"reference": "d4f8c2b86374f08efc859323dbcd95c590f7124e"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/twigphp/Twig/zipball/acffa88cc2b40dbe42eaf3a5025d6c0d4600cc50",
"reference": "acffa88cc2b40dbe42eaf3a5025d6c0d4600cc50",
"url": "https://api.github.com/repos/twigphp/Twig/zipball/d4f8c2b86374f08efc859323dbcd95c590f7124e",
"reference": "d4f8c2b86374f08efc859323dbcd95c590f7124e",
"shasum": ""
},
"require": {
@@ -2701,7 +2701,7 @@
],
"support": {
"issues": "https://github.com/twigphp/Twig/issues",
"source": "https://github.com/twigphp/Twig/tree/v3.18.0"
"source": "https://github.com/twigphp/Twig/tree/v3.19.0"
},
"funding": [
{
@@ -2713,7 +2713,7 @@
"type": "tidelift"
}
],
"time": "2024-12-29T10:51:50+00:00"
"time": "2025-01-29T07:06:14+00:00"
},
{
"name": "voku/portable-ascii",
@@ -2910,7 +2910,7 @@
],
"aliases": [],
"minimum-stability": "stable",
"stability-flags": {},
"stability-flags": [],
"prefer-stable": false,
"prefer-lowest": false,
"platform": {
@@ -2921,6 +2921,6 @@
"ext-xml": "*",
"ext-dom": "*"
},
"platform-dev": {},
"plugin-api-version": "2.6.0"
"platform-dev": [],
"plugin-api-version": "2.3.0"
}

View File

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

View File

@@ -31,11 +31,11 @@ require_once 'common.php';
require_once SYSTEM . 'functions.php';
$uri = $_SERVER['REQUEST_URI'];
if(false !== strpos($uri, 'index.php')) {
if(str_contains($uri, 'index.php')) {
$uri = str_replace_first('/index.php', '', $uri);
}
if(0 === strpos($uri, '/')) {
if(str_starts_with($uri, '/')) {
$uri = str_replace_first('/', '', $uri);
}
@@ -76,6 +76,8 @@ require_once SYSTEM . 'status.php';
$twig->addGlobal('config', $config);
$twig->addGlobal('status', $status);
$hooks->trigger(HOOK_STARTUP);
// backward support for gesior
if(setting('core.backward_support')) {
define('INITIALIZED', true);
@@ -117,8 +119,6 @@ if(setting('core.backward_support')) {
require_once SYSTEM . 'router.php';
$hooks->trigger(HOOK_STARTUP);
// anonymous usage statistics
// sent only when user agrees
if(setting('core.anonymous_usage_statistics')) {
@@ -168,6 +168,7 @@ if ($logged && admin()) {
'username' => USE_ACCOUNT_NAME ? $account_logged->getName() : $account_logged->getId()
]);
}
$title_full = (isset($title) ? $title . ' - ' : '') . $config['lua']['serverName'];
require $template_path . '/' . $template_index;

View File

@@ -26,6 +26,9 @@ if(!isset($error) || !$error) {
$config['database_type'] = $config['lua']['database_type'];
else if(isset($config['lua']['sql_type'])) // otserv
$config['database_type'] = $config['lua']['sql_type'];
else {
$config['database_type'] = '';
}
$config['database_type'] = strtolower($config['database_type']);
if(empty($config['database_type'])) {

View File

@@ -1,35 +1,35 @@
SET @myaac_database_version = 42;
SET @myaac_database_version = 45;
CREATE TABLE `myaac_account_actions`
(
`account_id` INT(11) NOT NULL,
`ip` INT(10) UNSIGNED NOT NULL DEFAULT 0,
`ipv6` BINARY(16) NOT NULL DEFAULT 0,
`date` INT(11) NOT NULL DEFAULT 0,
`action` VARCHAR(255) NOT NULL DEFAULT '',
`account_id` int NOT NULL,
`ip` int unsigned NOT NULL DEFAULT 0,
`ipv6` binary(16) NOT NULL DEFAULT 0,
`date` int NOT NULL DEFAULT 0,
`action` varchar(255) NOT NULL DEFAULT '',
KEY (`account_id`)
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8mb4;
CREATE TABLE `myaac_admin_menu`
(
`id` INT(11) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(255) NOT NULL DEFAULT '',
`page` VARCHAR(255) NOT NULL DEFAULT '',
`ordering` INT(11) NOT NULL DEFAULT 0,
`flags` INT(11) NOT NULL DEFAULT 0,
`enabled` INT(1) NOT NULL DEFAULT 1,
`id` int NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL DEFAULT '',
`page` varchar(255) NOT NULL DEFAULT '',
`ordering` int NOT NULL DEFAULT 0,
`flags` int NOT NULL DEFAULT 0,
`enabled` int NOT NULL DEFAULT 1,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8mb4;
CREATE TABLE `myaac_changelog`
(
`id` INT(11) NOT NULL AUTO_INCREMENT,
`body` VARCHAR(500) NOT NULL DEFAULT '',
`type` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '1 - added, 2 - removed, 3 - changed, 4 - fixed',
`where` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '1 - server, 2 - site',
`date` INT(11) NOT NULL DEFAULT 0,
`player_id` INT(11) NOT NULL DEFAULT 0,
`hide` TINYINT(1) NOT NULL DEFAULT 0,
`id` int NOT NULL AUTO_INCREMENT,
`body` varchar(500) NOT NULL DEFAULT '',
`type` tinyint NOT NULL DEFAULT 0 COMMENT '1 - added, 2 - removed, 3 - changed, 4 - fixed',
`where` tinyint NOT NULL DEFAULT 0 COMMENT '1 - server, 2 - site',
`date` int NOT NULL DEFAULT 0,
`player_id` int NOT NULL DEFAULT 0,
`hide` tinyint NOT NULL DEFAULT 0,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8mb4;
@@ -37,9 +37,9 @@ INSERT INTO `myaac_changelog` (`id`, `type`, `where`, `date`, `body`, `hide`) VA
CREATE TABLE `myaac_config`
(
`id` INT(11) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(30) NOT NULL,
`value` VARCHAR(1000) NOT NULL,
`id` int NOT NULL AUTO_INCREMENT,
`name` varchar(30) NOT NULL,
`value` varchar(1000) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE (`name`)
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8mb4;
@@ -48,24 +48,24 @@ INSERT INTO `myaac_config` (`name`, `value`) VALUES ('database_version', @myaac_
CREATE TABLE `myaac_faq`
(
`id` INT(11) NOT NULL AUTO_INCREMENT,
`question` VARCHAR(255) NOT NULL DEFAULT '',
`answer` VARCHAR(1020) NOT NULL DEFAULT '',
`ordering` INT(11) NOT NULL DEFAULT 0,
`hide` TINYINT(1) NOT NULL DEFAULT 0,
`id` int NOT NULL AUTO_INCREMENT,
`question` varchar(255) NOT NULL DEFAULT '',
`answer` varchar(1020) NOT NULL DEFAULT '',
`ordering` int NOT NULL DEFAULT 0,
`hide` tinyint NOT NULL DEFAULT 0,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8mb4;
CREATE TABLE `myaac_forum_boards`
(
`id` INT(11) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(32) NOT NULL,
`description` VARCHAR(255) NOT NULL DEFAULT '',
`ordering` INT(11) NOT NULL DEFAULT 0,
`guild` INT(11) NOT NULL DEFAULT 0,
`access` INT(11) NOT NULL DEFAULT 0,
`closed` TINYINT(1) NOT NULL DEFAULT 0,
`hide` TINYINT(1) NOT NULL DEFAULT 0,
`id` int NOT NULL AUTO_INCREMENT,
`name` varchar(32) NOT NULL,
`description` varchar(255) NOT NULL DEFAULT '',
`ordering` int NOT NULL DEFAULT 0,
`guild` int NOT NULL DEFAULT 0,
`access` int NOT NULL DEFAULT 0,
`closed` tinyint NOT NULL DEFAULT 0,
`hide` tinyint NOT NULL DEFAULT 0,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8mb4;
INSERT INTO `myaac_forum_boards` (`id`, `name`, `description`, `ordering`, `closed`) VALUES (NULL, 'News', 'News commenting', 0, 1);
@@ -76,100 +76,100 @@ INSERT INTO `myaac_forum_boards` (`id`, `name`, `description`, `ordering`) VALUE
CREATE TABLE `myaac_forum`
(
`id` int(11) NOT NULL AUTO_INCREMENT,
`first_post` int(11) NOT NULL default '0',
`last_post` int(11) NOT NULL default '0',
`section` int(3) NOT NULL default '0',
`replies` int(20) NOT NULL default '0',
`views` int(20) NOT NULL default '0',
`author_aid` int(20) NOT NULL default '0',
`author_guid` int(20) NOT NULL default '0',
`id` int NOT NULL AUTO_INCREMENT,
`first_post` int NOT NULL DEFAULT 0,
`last_post` int NOT NULL DEFAULT 0,
`section` int NOT NULL DEFAULT 0,
`replies` int NOT NULL DEFAULT 0,
`views` int NOT NULL DEFAULT 0,
`author_aid` int NOT NULL DEFAULT 0,
`author_guid` int NOT NULL DEFAULT 0,
`post_text` text NOT NULL,
`post_topic` varchar(255) NOT NULL DEFAULT '',
`post_smile` tinyint(1) NOT NULL default '0',
`post_html` tinyint(1) NOT NULL default '0',
`post_date` int(20) NOT NULL default '0',
`last_edit_aid` int(20) NOT NULL default '0',
`edit_date` int(20) NOT NULL default '0',
`post_ip` varchar(45) NOT NULL default '0.0.0.0',
`sticked` tinyint(1) NOT NULL DEFAULT '0',
`closed` tinyint(1) NOT NULL DEFAULT '0',
`post_smile` tinyint NOT NULL DEFAULT 0,
`post_html` tinyint NOT NULL DEFAULT 0,
`post_date` int NOT NULL DEFAULT 0,
`last_edit_aid` int NOT NULL DEFAULT 0,
`edit_date` int NOT NULL DEFAULT 0,
`post_ip` varchar(45) NOT NULL DEFAULT '0.0.0.0',
`sticked` tinyint NOT NULL DEFAULT 0,
`closed` tinyint NOT NULL DEFAULT 0,
PRIMARY KEY (`id`),
KEY `section` (`section`)
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8mb4;
CREATE TABLE `myaac_menu`
(
`id` INT(11) NOT NULL AUTO_INCREMENT,
`template` VARCHAR(255) NOT NULL,
`name` VARCHAR(255) NOT NULL,
`link` VARCHAR(255) NOT NULL,
`blank` TINYINT(1) NOT NULL DEFAULT 0,
`color` VARCHAR(6) NOT NULL DEFAULT '',
`category` INT(11) NOT NULL DEFAULT 1,
`ordering` INT(11) NOT NULL DEFAULT 0,
`enabled` INT(1) NOT NULL DEFAULT 1,
`id` int NOT NULL AUTO_INCREMENT,
`template` varchar(255) NOT NULL,
`name` varchar(255) NOT NULL,
`link` varchar(255) NOT NULL,
`blank` tinyint NOT NULL DEFAULT 0,
`color` varchar(6) NOT NULL DEFAULT '',
`category` int NOT NULL DEFAULT 1,
`ordering` int NOT NULL DEFAULT 0,
`enabled` int NOT NULL DEFAULT 1,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8mb4;
CREATE TABLE `myaac_monsters` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`hide` tinyint(1) NOT NULL default 0,
`id` int NOT NULL AUTO_INCREMENT,
`hide` tinyint NOT NULL DEFAULT 0,
`name` varchar(255) NOT NULL,
`mana` int(11) NOT NULL DEFAULT 0,
`exp` int(11) NOT NULL,
`health` int(11) NOT NULL,
`look` VARCHAR(255) NOT NULL DEFAULT '',
`speed_lvl` int(11) NOT NULL default 1,
`use_haste` tinyint(1) NOT NULL,
`mana` int NOT NULL DEFAULT 0,
`exp` int NOT NULL,
`health` int NOT NULL,
`look` varchar(255) NOT NULL DEFAULT '',
`speed_lvl` int NOT NULL DEFAULT 1,
`use_haste` tinyint NOT NULL,
`voices` text NOT NULL,
`immunities` varchar(255) NOT NULL,
`elements` TEXT NOT NULL,
`summonable` tinyint(1) NOT NULL,
`convinceable` tinyint(1) NOT NULL,
`pushable` TINYINT(1) NOT NULL DEFAULT '0',
`canpushitems` TINYINT(1) NOT NULL DEFAULT '0',
`canwalkonenergy` TINYINT(1) NOT NULL DEFAULT '0',
`canwalkonpoison` TINYINT(1) NOT NULL DEFAULT '0',
`canwalkonfire` TINYINT(1) NOT NULL DEFAULT '0',
`runonhealth` TINYINT(1) NOT NULL DEFAULT '0',
`hostile` TINYINT(1) NOT NULL DEFAULT '0',
`attackable` TINYINT(1) NOT NULL DEFAULT '0',
`rewardboss` TINYINT(1) NOT NULL DEFAULT '0',
`defense` INT(11) NOT NULL DEFAULT '0',
`armor` INT(11) NOT NULL DEFAULT '0',
`canpushcreatures` TINYINT(1) NOT NULL DEFAULT '0',
`elements` text NOT NULL,
`summonable` tinyint NOT NULL,
`convinceable` tinyint NOT NULL,
`pushable` tinyint NOT NULL DEFAULT 0,
`canpushitems` tinyint NOT NULL DEFAULT 0,
`canwalkonenergy` tinyint NOT NULL DEFAULT 0,
`canwalkonpoison` tinyint NOT NULL DEFAULT 0,
`canwalkonfire` tinyint NOT NULL DEFAULT 0,
`runonhealth` tinyint NOT NULL DEFAULT 0,
`hostile` tinyint NOT NULL DEFAULT 0,
`attackable` tinyint NOT NULL DEFAULT 0,
`rewardboss` tinyint NOT NULL DEFAULT 0,
`defense` int NOT NULL DEFAULT 0,
`armor` int NOT NULL DEFAULT 0,
`canpushcreatures` tinyint NOT NULL DEFAULT 0,
`race` varchar(255) NOT NULL,
`loot` text NOT NULL,
`summons` TEXT NOT NULL,
`summons` text NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8mb4;
CREATE TABLE `myaac_news`
(
`id` INT(11) NOT NULL AUTO_INCREMENT,
`title` VARCHAR(100) NOT NULL,
`body` TEXT NOT NULL,
`type` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '1 - news, 2 - ticker, 3 - article',
`date` INT(11) NOT NULL DEFAULT 0,
`category` TINYINT(1) NOT NULL DEFAULT 0,
`player_id` INT(11) NOT NULL DEFAULT 0,
`last_modified_by` INT(11) NOT NULL DEFAULT 0,
`last_modified_date` INT(11) NOT NULL DEFAULT 0,
`comments` VARCHAR(50) NOT NULL DEFAULT '',
`article_text` VARCHAR(300) NOT NULL DEFAULT '',
`article_image` VARCHAR(100) NOT NULL DEFAULT '',
`hide` TINYINT(1) NOT NULL DEFAULT 0,
`id` int NOT NULL AUTO_INCREMENT,
`title` varchar(100) NOT NULL,
`body` text NOT NULL,
`type` tinyint NOT NULL DEFAULT 0 COMMENT '1 - news, 2 - ticker, 3 - article',
`date` int NOT NULL DEFAULT 0,
`category` tinyint NOT NULL DEFAULT 0,
`player_id` int NOT NULL DEFAULT 0,
`last_modified_by` int NOT NULL DEFAULT 0,
`last_modified_date` int NOT NULL DEFAULT 0,
`comments` varchar(50) NOT NULL DEFAULT '',
`article_text` varchar(300) NOT NULL DEFAULT '',
`article_image` varchar(100) NOT NULL DEFAULT '',
`hide` tinyint NOT NULL DEFAULT 0,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8mb4;
CREATE TABLE `myaac_news_categories`
(
`id` INT(11) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(50) NOT NULL DEFAULT "",
`description` VARCHAR(50) NOT NULL DEFAULT "",
`icon_id` INT(2) NOT NULL DEFAULT 0,
`hide` TINYINT(1) NOT NULL DEFAULT 0,
`id` int NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL DEFAULT "",
`description` varchar(50) NOT NULL DEFAULT "",
`icon_id` int NOT NULL DEFAULT 0,
`hide` tinyint NOT NULL DEFAULT 0,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8mb4;
@@ -181,39 +181,39 @@ INSERT INTO `myaac_news_categories` (`id`, `icon_id`) VALUES (NULL, 4);
CREATE TABLE `myaac_notepad`
(
`id` INT(11) NOT NULL AUTO_INCREMENT,
`account_id` INT(11) NOT NULL,
/*`name` VARCHAR(30) NOT NULL,*/
`content` TEXT NOT NULL,
/*`public` TINYINT(1) NOT NULL DEFAULT 0*/
`id` int NOT NULL AUTO_INCREMENT,
`account_id` int NOT NULL,
/*`name` varchar(30) NOT NULL,*/
`content` text NOT NULL,
/*`public` tinyint NOT NULL DEFAULT 0*/
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8mb4;
CREATE TABLE `myaac_pages`
(
`id` INT NOT NULL AUTO_INCREMENT,
`name` VARCHAR(30) NOT NULL,
`title` VARCHAR(30) NOT NULL,
`body` TEXT NOT NULL,
`date` INT(11) NOT NULL DEFAULT 0,
`player_id` INT(11) NOT NULL DEFAULT 0,
`php` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '0 - plain html, 1 - php',
`enable_tinymce` TINYINT(1) NOT NULL DEFAULT 1 COMMENT '1 - enabled, 0 - disabled',
`access` TINYINT(2) NOT NULL DEFAULT 0,
`hide` TINYINT(1) NOT NULL DEFAULT 0,
`name` varchar(30) NOT NULL,
`title` varchar(30) NOT NULL,
`body` text NOT NULL,
`date` int NOT NULL DEFAULT 0,
`player_id` int NOT NULL DEFAULT 0,
`php` tinyint NOT NULL DEFAULT 0 COMMENT '0 - plain html, 1 - php',
`enable_tinymce` tinyint NOT NULL DEFAULT 1 COMMENT '1 - enabled, 0 - disabled',
`access` tinyint NOT NULL DEFAULT 0,
`hide` tinyint NOT NULL DEFAULT 0,
PRIMARY KEY (`id`),
UNIQUE (`name`)
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8mb4;
CREATE TABLE `myaac_gallery`
(
`id` INT(11) NOT NULL AUTO_INCREMENT,
`comment` VARCHAR(255) NOT NULL DEFAULT '',
`image` VARCHAR(255) NOT NULL,
`thumb` VARCHAR(255) NOT NULL,
`author` VARCHAR(50) NOT NULL DEFAULT '',
`ordering` INT(11) NOT NULL DEFAULT 0,
`hide` TINYINT(1) NOT NULL DEFAULT 0,
`id` int NOT NULL AUTO_INCREMENT,
`comment` varchar(255) NOT NULL DEFAULT '',
`image` varchar(255) NOT NULL,
`thumb` varchar(255) NOT NULL,
`author` varchar(50) NOT NULL DEFAULT '',
`ordering` int NOT NULL DEFAULT 0,
`hide` tinyint NOT NULL DEFAULT 0,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8mb4;
@@ -221,51 +221,51 @@ INSERT INTO `myaac_gallery` (`id`, `ordering`, `comment`, `image`, `thumb`, `aut
CREATE TABLE `myaac_settings`
(
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(255) NOT NULL DEFAULT '',
`key` VARCHAR(255) NOT NULL DEFAULT '',
`value` TEXT NOT NULL,
`id` int NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL DEFAULT '',
`key` varchar(255) NOT NULL DEFAULT '',
`value` text NOT NULL,
PRIMARY KEY (`id`),
KEY `key` (`key`)
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8mb4;
CREATE TABLE `myaac_spells`
(
`id` INT(11) NOT NULL AUTO_INCREMENT,
`spell` VARCHAR(255) NOT NULL DEFAULT '',
`name` VARCHAR(255) NOT NULL,
`words` VARCHAR(255) NOT NULL DEFAULT '',
`category` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '1 - attack, 2 - healing, 3 - summon, 4 - supply, 5 - support',
`type` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '1 - instant, 2 - conjure, 3 - rune',
`level` INT(11) NOT NULL DEFAULT 0,
`maglevel` INT(11) NOT NULL DEFAULT 0,
`mana` INT(11) NOT NULL DEFAULT 0,
`soul` TINYINT(3) NOT NULL DEFAULT 0,
`conjure_id` INT(11) NOT NULL DEFAULT 0,
`conjure_count` TINYINT(3) NOT NULL DEFAULT 0,
`reagent` INT(11) NOT NULL DEFAULT 0,
`item_id` INT(11) NOT NULL DEFAULT 0,
`premium` TINYINT(1) NOT NULL DEFAULT 0,
`vocations` VARCHAR(100) NOT NULL DEFAULT '',
`hide` TINYINT(1) NOT NULL DEFAULT 0,
`id` int NOT NULL AUTO_INCREMENT,
`spell` varchar(255) NOT NULL DEFAULT '',
`name` varchar(255) NOT NULL,
`words` varchar(255) NOT NULL DEFAULT '',
`category` tinyint NOT NULL DEFAULT 0 COMMENT '1 - attack, 2 - healing, 3 - summon, 4 - supply, 5 - support',
`type` tinyint NOT NULL DEFAULT 0 COMMENT '1 - instant, 2 - conjure, 3 - rune',
`level` int NOT NULL DEFAULT 0,
`maglevel` int NOT NULL DEFAULT 0,
`mana` int NOT NULL DEFAULT 0,
`soul` tinyint NOT NULL DEFAULT 0,
`conjure_id` int NOT NULL DEFAULT 0,
`conjure_count` tinyint NOT NULL DEFAULT 0,
`reagent` int NOT NULL DEFAULT 0,
`item_id` int NOT NULL DEFAULT 0,
`premium` tinyint NOT NULL DEFAULT 0,
`vocations` varchar(100) NOT NULL DEFAULT '',
`hide` tinyint NOT NULL DEFAULT 0,
PRIMARY KEY (`id`),
UNIQUE (`name`)
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8mb4;
CREATE TABLE `myaac_visitors`
(
`ip` VARCHAR(45) NOT NULL,
`lastvisit` INT(11) NOT NULL DEFAULT 0,
`page` VARCHAR(2048) NOT NULL,
`user_agent` VARCHAR(255) NOT NULL DEFAULT '',
`ip` varchar(45) NOT NULL,
`lastvisit` int NOT NULL DEFAULT 0,
`page` varchar(2048) NOT NULL,
`user_agent` varchar(255) NOT NULL DEFAULT '',
UNIQUE (`ip`)
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8mb4;
CREATE TABLE `myaac_weapons`
(
`id` INT(11) NOT NULL,
`level` INT(11) NOT NULL DEFAULT 0,
`maglevel` INT(11) NOT NULL DEFAULT 0,
`vocations` VARCHAR(100) NOT NULL DEFAULT '',
`id` int NOT NULL,
`level` int NOT NULL DEFAULT 0,
`maglevel` int NOT NULL DEFAULT 0,
`vocations` varchar(100) NOT NULL DEFAULT '',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8mb4;

View File

@@ -1,3 +1,4 @@
<?php defined('MYAAC') or die('Direct access not allowed!'); ?>
<!DOCTYPE html>
<html dir="<?php echo $locale['direction']; ?>" lang="<?php echo $locale['lang']; ?>" xml:lang="<?php echo $locale['lang']; ?>">
<head>

View File

@@ -156,9 +156,14 @@ if ($db->hasTable('guilds')) {
}
if (!$db->hasColumn('guilds', 'description')) {
if (query("ALTER TABLE `guilds` ADD `description` TEXT NOT NULL;"))
if (query("ALTER TABLE `guilds` ADD `description` VARCHAR(5000) NOT NULL DEFAULT '';"))
success($locale['step_database_adding_field'] . ' guilds.description...');
}
else {
if (query("ALTER TABLE `guilds` MODIFY `description` VARCHAR(5000) NOT NULL DEFAULT '';")) {
success($locale['step_database_modifying_field'] . ' guilds.description...');
}
}
if ($db->hasColumn('guilds', 'logo_gfx_name')) {
if (query("ALTER TABLE `guilds` CHANGE `logo_gfx_name` `logo_name` VARCHAR( 255 ) NOT NULL DEFAULT 'default.gif';")) {
@@ -197,9 +202,14 @@ if ($db->hasTable('players')) {
}
if (!$db->hasColumn('players', 'comment')) {
if (query("ALTER TABLE `players` ADD `comment` TEXT NOT NULL;"))
if (query("ALTER TABLE `players` ADD `comment` VARCHAR(5000) NOT NULL DEFAULT '';"))
success($locale['step_database_adding_field'] . ' players.comment...');
}
else {
if (query("ALTER TABLE `players` MODIFY `comment` VARCHAR(5000) NOT NULL DEFAULT '';")) {
success($locale['step_database_modifying_field'] . ' players.comment...');
}
}
if ($db->hasColumn('players', 'rank_id')) {
if (query("ALTER TABLE players MODIFY `rank_id` INT(11) NOT NULL DEFAULT 0;"))

View File

@@ -54,12 +54,13 @@ if ($db->hasTable('players')) {
}
}
Plugins::installMenus('kathrine', require TEMPLATES . 'kathrine/menus.php');
Plugins::installMenus('tibiacom', require TEMPLATES . 'tibiacom/menus.php');
DataLoader::setLocale($locale);
DataLoader::load();
// add menus entries
require_once SYSTEM . 'migrations/17.php';
$up();
// update config.highscores_ids_hidden
require_once SYSTEM . 'migrations/20.php';
$up();
@@ -78,6 +79,10 @@ $up();
require_once SYSTEM . 'migrations/31.php';
$up();
// rules page
require_once SYSTEM . 'migrations/45.php';
$up();
if(ModelsFAQ::count() == 0) {
ModelsFAQ::create([
'question' => 'What is this?',

View File

@@ -86,12 +86,25 @@ switch ($action) {
die(json_encode(['eventlist' => $eventlist, 'lastupdatetimestamp' => time()]));
case 'boostedcreature':
$boostedCreature = BoostedCreature::latest();
$clientVersion = (int)setting('core.client');
// 14.00 and up
if ($clientVersion >= 1400) {
$creatureBoost = $db->query("SELECT * FROM " . $db->tableName('boosted_creature'))->fetchAll();
$bossBoost = $db->query("SELECT * FROM " . $db->tableName('boosted_boss'))->fetchAll();
die(json_encode([
'boostedcreature' => true,
'creatureraceid' => intval($creatureBoost[0]['raceid']),
'bossraceid' => intval($bossBoost[0]['raceid'])
]));
}
// lower clients
$boostedCreature = BoostedCreature::first();
die(json_encode([
'boostedcreature' => true,
'raceid' => $boostedCreature->raceid
]));
break;
case 'login':
@@ -143,7 +156,7 @@ switch ($action) {
if ($limiter->exceeded($ip)) {
sendError($ban_msg);
}
sendError(($inputEmail != false ? 'Email' : 'Account name') . ' or password is not correct.');
}

View File

@@ -1,6 +1,6 @@
server {
listen 80;
root /home/otserv/www/public;
root /var/www/html;
index index.php;
server_name your-domain.com;
@@ -14,7 +14,7 @@ server {
# block .htaccess, CHANGELOG.md, composer.json etc.
# this is to prevent finding software versions
location ~\.(ht|md|json|dist)$ {
location ~\.(ht|md|json|dist|sql)$ {
deny all;
}

169
package-lock.json generated
View File

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

View File

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

View File

@@ -1,6 +1,6 @@
{
"name": "create-account-hint",
"description": "This plugin display text 'To play on Forgotten you need an account. All you have to do to create your new account is to enter an account name, password, country and your email address. Also you have to agree to the terms presented below. If you have done so, your account name will be shown on the following page and your account password will be sent to your email address along with further instructions. If you do not receive the email with your password, please check your spam filter.' on the create account page. <strong>Be careful when uninstalling this!</strong>",
"description": "This plugin display text 'To play on Forgotten you need an account. All you have to do to create your new account is to enter an account name, password, country and your email address. Also you have to agree to the terms presented below. If you have done so, your account name will be shown on the following page and your account password will be sent to your email address along with further instructions. If you do not receive the email with your password, please check your spam filter.' on the create account page.",
"version": "1.0",
"author": "slawkens",
"contact": "slawkens@gmail.com",

View File

@@ -9,7 +9,4 @@
*/
defined('MYAAC') or die('Direct access not allowed!');
global $twig_loader;
$twig_loader->prependPath(BASE . 'plugins/account-create-hint');
$twig->display('hint.html.twig');
$twig->display('account-create-hint/hint.html.twig');

View File

@@ -46,8 +46,10 @@
"settings": "plugins/your-plugin-folder/settings.php",
"autoload": {
"pages": true,
"pagesSubFolders": false,
"pages-sub-folders": false,
"commands": true,
"themes": true
"themes": true,
"admin-pages": true,
"admin-pages-sub-folders": true,
}
}

View File

@@ -22,7 +22,7 @@ if [ $1 = "prepare" ]; then
mkdir -p tmp
# get myaac from git archive
git archive --format zip --output tmp/myaac.zip master
git archive --format zip --output tmp/myaac.zip main
cd tmp/ || exit

View File

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

View File

@@ -74,7 +74,3 @@ function fieldExist($field, $table)
global $db;
return $db->hasColumn($table, $field);
}
function getCreatureImgPath($creature): string {
return getMonsterImgPath($creature);
}

View File

@@ -122,6 +122,10 @@ try {
$eloquentConnection = $capsule->getConnection();
if (isset($twig)) {
$twig->addGlobal('db', $db);
}
} catch (Exception $e) {
if(isset($cache) && $cache->enabled()) {
$cache->delete('config_lua');

View File

@@ -49,7 +49,7 @@ function warning($message, $return = false) {
return message($message, 'warning', $return);
}
function note($message, $return = false) {
return info($message, $return);
return message($message, 'note', $return);
}
function info($message, $return = false) {
return message($message, 'info', $return);
@@ -121,7 +121,7 @@ function getPlayerLink($name, $generate = true, bool $colored = false): string
function getMonsterLink($name, $generate = true): string
{
$url = BASE_URL . (setting('core.friendly_urls') ? '' : 'index.php/') . 'monsters/' . urlencode($name);
$url = BASE_URL . (setting('core.friendly_urls') ? '' : 'index.php/') . 'monsters?name=' . urlencode($name);
if(!$generate) return $url;
return generateLink($url, $name);
@@ -129,16 +129,14 @@ function getMonsterLink($name, $generate = true): string
function getHouseLink($name, $generate = true): string
{
if(is_numeric($name))
{
if(is_numeric($name)) {
$house = House::find(intval($name), ['name']);
if ($house) {
$name = $house->name;
}
}
$url = BASE_URL . (setting('core.friendly_urls') ? '' : 'index.php/') . 'houses/' . urlencode($name);
$url = BASE_URL . (setting('core.friendly_urls') ? '' : 'index.php/') . 'houses?name=' . urlencode($name);
if(!$generate) return $url;
return generateLink($url, $name);
@@ -547,33 +545,39 @@ function template_header($is_admin = false): string
*/
function template_footer(): string
{
global $views_counter;
$ret = '';
$footer = [];
if(admin()) {
$ret .= generateLink(ADMIN_URL, 'Admin Panel', true);
$footer[] = generateLink(ADMIN_URL, 'Admin Panel', true);
}
if(setting('core.visitors_counter')) {
global $visitors;
$amount = $visitors->getAmountVisitors();
$ret .= '<br/>Currently there ' . ($amount > 1 ? 'are' : 'is') . ' ' . $amount . ' visitor' . ($amount > 1 ? 's' : '') . '.';
$footer[] = 'Currently there ' . ($amount > 1 ? 'are' : 'is') . ' ' . $amount . ' visitor' . ($amount > 1 ? 's' : '') . '.';
}
if(setting('core.views_counter')) {
$ret .= '<br/>Page has been viewed ' . $views_counter . ' times.';
global $views_counter;
$footer[] = 'Page has been viewed ' . $views_counter . ' times.';
}
if(setting('core.footer_load_time')) {
$ret .= '<br/>Load time: ' . round(microtime(true) - START_TIME, 4) . ' seconds.';
$footer[] = 'Load time: ' . round(microtime(true) - START_TIME, 4) . ' seconds.';
}
$settingFooter = setting('core.footer');
if(isset($settingFooter[0])) {
$ret .= '<br/>' . $settingFooter;
$footer[] = '' . $settingFooter;
}
// please respect my work and help spreading the word, thanks!
return $ret . '<br/>' . base64_decode('UG93ZXJlZCBieSA8YSBocmVmPSJodHRwOi8vbXktYWFjLm9yZyIgdGFyZ2V0PSJfYmxhbmsiPk15QUFDLjwvYT4=');
$footer[] = base64_decode('UG93ZXJlZCBieSA8YSBocmVmPSJodHRwOi8vbXktYWFjLm9yZyIgdGFyZ2V0PSJfYmxhbmsiPk15QUFDLjwvYT4=');
global $hooks;
$hooks->triggerFilter(HOOK_FILTER_THEME_FOOTER, $footer);
return implode('<br/>', $footer);
}
function template_ga_code()
@@ -984,31 +988,29 @@ function load_config_lua($filename)
continue;
}
$tmp_exp = explode('=', $line, 2);
if(strpos($line, 'dofile') !== false)
{
if(str_contains($line, 'dofile')) {
$delimiter = '"';
if(strpos($line, $delimiter) === false)
if(!str_contains($line, $delimiter)) {
$delimiter = "'";
}
$tmp = explode($delimiter, $line);
$result = array_merge($result, load_config_lua($config['server_path'] . $tmp[1]));
}
else if(count($tmp_exp) >= 2)
{
else if(count($tmp_exp) >= 2) {
$key = trim($tmp_exp[0]);
if(0 !== strpos($key, '--'))
{
if(!str_starts_with($key, '--')) {
$value = trim($tmp_exp[1]);
if(strpos($value, '--') !== false) {// found some deep comment
if(str_contains($value, '--')) {// found some deep comment
$value = preg_replace('/--.*$/i', '', $value);
}
if(is_numeric($value))
$result[$key] = (float) $value;
elseif(in_array(@$value[0], array("'", '"')) && in_array(@$value[strlen($value) - 1], array("'", '"')))
$result[$key] = (string) substr(substr($value, 1), 0, -1);
$result[$key] = substr(substr($value, 1), 0, -1);
elseif(in_array($value, array('true', 'false')))
$result[$key] = ($value === 'true') ? true : false;
$result[$key] = $value === 'true';
elseif(@$value[0] === '{') {
// arrays are not supported yet
// just ignore the error
@@ -1016,12 +1018,19 @@ function load_config_lua($filename)
}
else
{
foreach($result as $tmp_key => $tmp_value) // load values definied by other keys, like: dailyFragsToBlackSkull = dailyFragsToRedSkull
foreach($result as $tmp_key => $tmp_value) { // load values defined by other keys, like: dailyFragsToBlackSkull = dailyFragsToRedSkull
$value = str_replace($tmp_key, $tmp_value, $value);
$ret = @eval("return $value;");
if((string) $ret == '' && trim($value) !== '""') // = parser error
{
throw new RuntimeException('ERROR: Loading config.lua file. Line <b>' . ($ln + 1) . '</b> of LUA config file is not valid [key: <b>' . $key . '</b>]');
}
try {
$ret = eval("return $value;");
}
catch (Throwable $e) {
throw new RuntimeException('ERROR: Loading config.lua file. Line: ' . ($ln + 1) . ' - Unable to parse value "' . $value . '" - ' . $e->getMessage());
}
if((string) $ret == '' && trim($value) !== '""') {
throw new RuntimeException('ERROR: Loading config.lua file. Line ' . ($ln + 1) . ' is not valid [key: ' . $key . ']');
}
$result[$key] = $ret;
}
@@ -1030,8 +1039,7 @@ function load_config_lua($filename)
}
}
$result = array_merge($result, isset($config['lua']) ? $config['lua'] : array());
return $result;
return array_merge($result, $config['lua'] ?? []);
}
function str_replace_first($search,$replace, $subject) {
@@ -1057,17 +1065,36 @@ function get_browser_real_ip() {
return '0';
}
function setSession($key, $data) {
$_SESSION[setting('core.session_prefix') . $key] = $data;
function setSession($key, $value = null): void {
if (!is_array($key)) {
$key = [$key => $value];
}
foreach ($key as $arrayKey => $arrayValue) {
if (is_null($arrayValue)) {
unsetSession($arrayKey);
}
else {
$_SESSION[setting('core.session_prefix') . $arrayKey] = $arrayValue;
}
}
}
function getSession($key) {
$key = setting('core.session_prefix') . $key;
return isset($_SESSION[$key]) ? $_SESSION[$key] : false;
return $_SESSION[setting('core.session_prefix') . $key] ?? null;
}
function unsetSession($key) {
function unsetSession($key): void {
unset($_SESSION[setting('core.session_prefix') . $key]);
}
function session($key): mixed {
if (is_array($key)) {
setSession($key);
return null;
}
return getSession($key);
}
function csrf(bool $return = false): string {
return CsrfToken::create($return);
}
@@ -1107,10 +1134,6 @@ function getTopPlayers($limit = 5, $skill = 'level') {
$columns[] = 'lookaddons';
}
if ($db->hasColumn('players', 'online')) {
$columns[] = 'online';
}
return Player::query()
->select($columns)
->withOnlineStatus()
@@ -1555,22 +1578,6 @@ function right($str, $length) {
return substr($str, -$length);
}
function getMonsterImgPath($monster): string
{
$monster_path = setting('core.monsters_images_url');
$monster_gfx_name = trim(strtolower($monster)) . setting('core.monsters_images_extension');
if (!file_exists($monster_path . $monster_gfx_name)) {
$monster_gfx_name = str_replace(" ", "", $monster_gfx_name);
if (file_exists($monster_path . $monster_gfx_name)) {
return $monster_path . $monster_gfx_name;
} else {
return $monster_path . 'nophoto.png';
}
} else {
return $monster_path . $monster_gfx_name;
}
}
function between($x, $lim1, $lim2) {
if ($lim1 < $lim2) {
$lower = $lim1; $upper = $lim2;
@@ -1679,4 +1686,7 @@ function getAccountIdentityColumn(): string
require_once SYSTEM . 'compat/base.php';
// custom functions
require SYSTEM . 'functions_custom.php';
$customFunctions = SYSTEM . 'functions_custom.php';
if (is_file($customFunctions)) {
require $customFunctions;
}

View File

@@ -50,6 +50,7 @@ $cache = Cache::getInstance();
global $hooks;
$hooks = new Hooks();
$hooks->load();
$hooks->trigger(HOOK_INIT);
// twig
require_once SYSTEM . 'twig.php';
@@ -137,9 +138,12 @@ $ots = POT::getInstance();
$eloquentConnection = null;
require_once SYSTEM . 'database.php';
$twig->addGlobal('logged', false);
$twig->addGlobal('account_logged', new \OTS_Account());
// verify myaac tables exists in database
if(!defined('MYAAC_INSTALL') && !$db->hasTable('myaac_account_actions')) {
throw new RuntimeException('Seems that the table myaac_account_actions of MyAAC doesn\'t exist in the database. This is a fatal error. You can try to reinstall MyAAC by visiting ' . BASE_URL . 'install');
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');
}
// execute migrations

File diff suppressed because it is too large Load Diff

View File

@@ -446,16 +446,13 @@ class OTS_Account extends OTS_Row_DAO implements IteratorAggregate, Countable
if(isset($this->data['premium_ends_at']) || isset($this->data['premend'])) {
$col = isset($this->data['premium_ends_at']) ? 'premium_ends_at' : 'premend';
$ret = ceil(($this->data[$col] - time()) / (24 * 60 * 60));
return $ret > 0 ? $ret : 0;
return max($ret, 0);
}
if($this->data['premdays'] == 0) {
return 0;
}
global $config;
if(isset($config['lua']['freePremium']) && getBoolean($config['lua']['freePremium'])) return -1;
if($this->data['premdays'] == self::GRATIS_PREMIUM_DAYS){
return self::GRATIS_PREMIUM_DAYS;
}
@@ -1011,7 +1008,7 @@ class OTS_Account extends OTS_Row_DAO implements IteratorAggregate, Countable
public function logAction($action)
{
$ip = get_browser_real_ip();
if(strpos($ip, ":") === false) {
if(!str_contains($ip, ":")) {
$ipv6 = '0';
}
else {

View File

@@ -234,6 +234,19 @@ class OTS_DB_MySQL extends OTS_Base_DB
return $this->hasTable($table) && ($this->has_column_cache[$table . '.' . $column] = count($this->query('SHOW COLUMNS FROM `' . $table . "` LIKE '" . $column . "'")->fetchAll()) > 0);
}
public function hasTableAndColumns(string $table, array $columns = []): bool
{
if (!$this->hasTable($table)) return false;
foreach ($columns as $column) {
if (!$this->hasColumn($table, $column)) {
return false;
}
}
return true;
}
public function revalidateCache() {
foreach($this->has_table_cache as $key => $value) {
$this->hasTableInternal($key);

View File

@@ -97,7 +97,7 @@ class OTS_Guild extends OTS_Row_DAO implements IteratorAggregate, Countable
*
* @param IOTS_GuildAction $invites Invites driver (don't pass it to clear driver).
*/
public function setInvitesDriver(IOTS_GuildAction $invites = null)
public function setInvitesDriver(?IOTS_GuildAction $invites = null)
{
$this->invites = $invites;
}
@@ -107,7 +107,7 @@ class OTS_Guild extends OTS_Row_DAO implements IteratorAggregate, Countable
*
* @param IOTS_GuildAction $requests Membership requests driver (don't pass it to clear driver).
*/
public function setRequestsDriver(IOTS_GuildAction $requests = null)
public function setRequestsDriver(?IOTS_GuildAction $requests = null)
{
$this->requests = $requests;
}

View File

@@ -60,7 +60,7 @@ class OTS_GuildRank extends OTS_Row_DAO implements IteratorAggregate, Countable
* @throws PDOException On PDO operation error.
* @throws E_OTS_NotLoaded If given <var>$guild</var> object is not loaded.
*/
public function find($name, OTS_Guild $guild = null)
public function find($name, ?OTS_Guild $guild = null)
{
$where = '';

View File

@@ -15,11 +15,11 @@
/**
* Wrapper for 'info' respond's DOMDocument.
*
*
* <p>
* Note: as this class extends DOMDocument class and contains exacly respond XML tree you can work on it as on normal DOM tree.
* </p>
*
*
* @package POT
* @version 0.1.0
* @property-read string $tspqVersion Root element version.
@@ -48,252 +48,257 @@ class OTS_InfoRespond extends DOMDocument
{
/**
* Returns version of root element.
*
*
* @return string TSPQ version.
* @throws DOMException On DOM operation error.
*/
public function getTSPQVersion()
{
return $this->documentElement->getAttribute('version');
}
public function getTSPQVersion()
{
return $this->documentElement->getAttribute('version');
}
/**
* Returns server uptime.
*
*
* @return int Uptime.
* @throws DOMException On DOM operation error.
*/
public function getUptime()
{
return (int) $this->documentElement->getElementsByTagName('serverinfo')->item(0)->getAttribute('uptime');
}
public function getUptime()
{
return (int) $this->documentElement->getElementsByTagName('serverinfo')->item(0)->getAttribute('uptime');
}
/**
* Returns server IP.
*
*
* @return string IP.
* @throws DOMException On DOM operation error.
*/
public function getIP()
{
return $this->documentElement->getElementsByTagName('serverinfo')->item(0)->getAttribute('ip');
}
public function getIP()
{
return $this->documentElement->getElementsByTagName('serverinfo')->item(0)->getAttribute('ip');
}
/**
* Returns server name.
*
*
* @return string Name.
* @throws DOMException On DOM operation error.
*/
public function getName()
{
return $this->documentElement->getElementsByTagName('serverinfo')->item(0)->getAttribute('servername');
}
public function getName()
{
return $this->documentElement->getElementsByTagName('serverinfo')->item(0)->getAttribute('servername');
}
/**
* Returns server port.
*
*
* @return int Port.
* @throws DOMException On DOM operation error.
*/
public function getPort()
{
return (int) $this->documentElement->getElementsByTagName('serverinfo')->item(0)->getAttribute('port');
}
public function getPort()
{
return (int) $this->documentElement->getElementsByTagName('serverinfo')->item(0)->getAttribute('port');
}
/**
* Returns server location.
*
*
* @return string Location.
* @throws DOMException On DOM operation error.
*/
public function getLocation()
{
return $this->documentElement->getElementsByTagName('serverinfo')->item(0)->getAttribute('location');
}
public function getLocation()
{
return $this->documentElement->getElementsByTagName('serverinfo')->item(0)->getAttribute('location');
}
/**
* Returns server website.
*
*
* @return string Website URL.
* @throws DOMException On DOM operation error.
*/
public function getURL()
{
return $this->documentElement->getElementsByTagName('serverinfo')->item(0)->getAttribute('url');
}
public function getURL()
{
return $this->documentElement->getElementsByTagName('serverinfo')->item(0)->getAttribute('url');
}
/**
* Returns server attribute.
*
*
* I have no idea what the hell is it representing :P.
*
*
* @return string Attribute value.
* @throws DOMException On DOM operation error.
*/
public function getServer()
{
return $this->documentElement->getElementsByTagName('serverinfo')->item(0)->getAttribute('server');
}
public function getServer()
{
return $this->documentElement->getElementsByTagName('serverinfo')->item(0)->getAttribute('server');
}
/**
* Returns server version.
*
*
* @return string Version.
* @throws DOMException On DOM operation error.
*/
public function getServerVersion()
{
return $this->documentElement->getElementsByTagName('serverinfo')->item(0)->getAttribute('version');
}
public function getServerVersion()
{
return $this->documentElement->getElementsByTagName('serverinfo')->item(0)->getAttribute('version');
}
/**
* Returns dedicated version of client.
*
*
* @return string Version.
* @throws DOMException On DOM operation error.
*/
public function getClientVersion()
{
return $this->documentElement->getElementsByTagName('serverinfo')->item(0)->getAttribute('client');
}
public function getClientVersion()
{
return $this->documentElement->getElementsByTagName('serverinfo')->item(0)->getAttribute('client');
}
/**
* Returns owner name.
*
*
* @return string Owner name.
* @throws DOMException On DOM operation error.
*/
public function getOwner()
{
return $this->documentElement->getElementsByTagName('owner')->item(0)->getAttribute('name');
}
public function getOwner()
{
return $this->documentElement->getElementsByTagName('owner')->item(0)->getAttribute('name');
}
/**
* Returns owner e-mail.
*
*
* @return string Owner e-mail.
* @throws DOMException On DOM operation error.
*/
public function getEMail()
{
return $this->documentElement->getElementsByTagName('owner')->item(0)->getAttribute('email');
}
public function getEMail()
{
return $this->documentElement->getElementsByTagName('owner')->item(0)->getAttribute('email');
}
/**
* Returns current amount of players online.
*
*
* @return int Count of players.
* @throws DOMException On DOM operation error.
*/
public function getOnlinePlayers()
{
return (int) $this->documentElement->getElementsByTagName('players')->item(0)->getAttribute('online');
}
public function getOnlinePlayers()
{
return (int) $this->documentElement->getElementsByTagName('players')->item(0)->getAttribute('online');
}
/**
* Returns maximum amount of players online.
*
*
* @return int Maximum allowed count of players.
* @throws DOMException On DOM operation error.
*/
public function getMaxPlayers()
{
return (int) $this->documentElement->getElementsByTagName('players')->item(0)->getAttribute('max');
}
public function getMaxPlayers()
{
return (int) $this->documentElement->getElementsByTagName('players')->item(0)->getAttribute('max');
}
/**
* Returns record of online players.
*
*
* @return int Players online record.
* @throws DOMException On DOM operation error.
*/
public function getPlayersPeak()
{
return (int) $this->documentElement->getElementsByTagName('players')->item(0)->getAttribute('peak');
}
public function getPlayersPeak()
{
return (int) $this->documentElement->getElementsByTagName('players')->item(0)->getAttribute('peak');
}
/**
* Returns number of all monsters on map.
*
*
* @return int Count of monsters.
* @throws DOMException On DOM operation error.
*/
public function getMonstersCount()
{
return (int) $this->documentElement->getElementsByTagName('monsters')->item(0)->getAttribute('total');
}
public function getMonstersCount(): int
{
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.
*
*
* @return string Map name.
* @throws DOMException On DOM operation error.
*/
public function getMapName()
{
return $this->documentElement->getElementsByTagName('map')->item(0)->getAttribute('name');
}
public function getMapName()
{
return $this->documentElement->getElementsByTagName('map')->item(0)->getAttribute('name');
}
/**
* Returns map author.
*
*
* @return string Mapper name.
* @throws DOMException On DOM operation error.
*/
public function getMapAuthor()
{
return $this->documentElement->getElementsByTagName('map')->item(0)->getAttribute('author');
}
public function getMapAuthor()
{
return $this->documentElement->getElementsByTagName('map')->item(0)->getAttribute('author');
}
/**
* Returns map width.
*
*
* @return int Map width.
* @throws DOMException On DOM operation error.
*/
public function getMapWidth()
{
return (int) $this->documentElement->getElementsByTagName('map')->item(0)->getAttribute('width');
}
public function getMapWidth()
{
return (int) $this->documentElement->getElementsByTagName('map')->item(0)->getAttribute('width');
}
/**
* Returns map height.
*
*
* @return int Map height.
* @throws DOMException On DOM operation error.
*/
public function getMapHeight()
{
return (int) $this->documentElement->getElementsByTagName('map')->item(0)->getAttribute('height');
}
public function getMapHeight()
{
return (int) $this->documentElement->getElementsByTagName('map')->item(0)->getAttribute('height');
}
/**
* Returns server's Message Of The Day
*
*
* @version 0.1.0
* @return string Server MOTD.
* @throws DOMException On DOM operation error.
*/
public function getMOTD()
{
// look for text node child
foreach( $this->documentElement->getElementsByTagName('motd')->item(0)->childNodes as $child)
{
if($child->nodeType == XML_TEXT_NODE)
{
// found
return $child->nodeValue;
}
}
public function getMOTD()
{
// look for text node child
foreach( $this->documentElement->getElementsByTagName('motd')->item(0)->childNodes as $child)
{
if($child->nodeType == XML_TEXT_NODE)
{
// found
return $child->nodeValue;
}
}
// strange...
return '';
}
// strange...
return '';
}
/**
* Magic PHP5 method.
*
*
* @version 0.1.0
* @since 0.1.0
* @param string $name Property name.
@@ -301,89 +306,89 @@ class OTS_InfoRespond extends DOMDocument
* @throws OutOfBoundsException For non-supported properties.
* @throws DOMException On DOM operation error.
*/
public function __get($name)
{
switch($name)
{
case 'tspqVersion':
return $this->getTSPQVersion();
public function __get($name)
{
switch($name)
{
case 'tspqVersion':
return $this->getTSPQVersion();
case 'uptime':
return $this->getUptime();
case 'uptime':
return $this->getUptime();
case 'ip':
return $this->getIP();
case 'ip':
return $this->getIP();
case 'name':
return $this->getName();
case 'name':
return $this->getName();
case 'port':
return $this->getPort();
case 'port':
return $this->getPort();
case 'location':
return $this->getLocation();
case 'location':
return $this->getLocation();
case 'url':
return $this->getURL();
case 'url':
return $this->getURL();
case 'server':
return $this->getServer();
case 'server':
return $this->getServer();
case 'serverVersion':
return $this->getServerVersion();
case 'serverVersion':
return $this->getServerVersion();
case 'clientVersion':
return $this->getClientVersion();
case 'clientVersion':
return $this->getClientVersion();
case 'owner':
return $this->getOwner();
case 'owner':
return $this->getOwner();
case 'eMail':
return $this->getEMail();
case 'eMail':
return $this->getEMail();
case 'onlinePlayers':
return $this->getOnlinePlayers();
case 'onlinePlayers':
return $this->getOnlinePlayers();
case 'maxPlayers':
return $this->getMaxPlayers();
case 'maxPlayers':
return $this->getMaxPlayers();
case 'playersPeak':
return $this->getPlayersPeak();
case 'playersPeak':
return $this->getPlayersPeak();
case 'monstersCount':
return $this->getMonstersCount();
case 'monstersCount':
return $this->getMonstersCount();
case 'mapName':
return $this->getMapName();
case 'mapName':
return $this->getMapName();
case 'mapAuthor':
return $this->getMapAuthor();
case 'mapAuthor':
return $this->getMapAuthor();
case 'mapWidth':
return $this->getMapWidth();
case 'mapWidth':
return $this->getMapWidth();
case 'mapHeight':
return $this->getMapHeight();
case 'mapHeight':
return $this->getMapHeight();
case 'motd':
return $this->getMOTD();
case 'motd':
return $this->getMOTD();
default:
throw new OutOfBoundsException();
}
}
default:
throw new OutOfBoundsException();
}
}
/**
* Returns string representation of XML.
*
*
* @version 0.1.0
* @since 0.1.0
* @return string String representation of object.
*/
public function __toString()
{
return $this->saveXML();
}
public function __toString()
{
return $this->saveXML();
}
}
/**#@-*/

View File

@@ -284,7 +284,7 @@ class OTS_Monster extends DOMDocument
*/
public function getLook()
{
$look = array();
$look = [];
$element = $this->documentElement->getElementsByTagName('look')->item(0);
@@ -292,14 +292,30 @@ class OTS_Monster extends DOMDocument
return $look;
}
$look['type'] = $element->getAttribute('type');
$look['typeex'] = $element->getAttribute('typeex');
$look['head'] = $element->getAttribute('head');
$look['body'] = $element->getAttribute('body');
$look['legs'] = $element->getAttribute('legs');
$look['feet'] = $element->getAttribute('feet');
$look['addons'] = $element->getAttribute('addons');
$look['corpse'] = $element->getAttribute('corpse');
if ($element->hasAttribute('typeex')) {
$look['typeEx'] = (int) $element->getAttribute('typeex');
}
if ($element->hasAttribute('type')) {
$look['type'] = (int) $element->getAttribute('type');
}
if ($element->hasAttribute('head')) {
$look['head'] = (int) $element->getAttribute('head');
}
if ($element->hasAttribute('body')) {
$look['body'] = (int) $element->getAttribute('body');
}
if ($element->hasAttribute('legs')) {
$look['legs'] = (int) $element->getAttribute('legs');
}
if ($element->hasAttribute('feet')) {
$look['feet'] = (int) $element->getAttribute('feet');
}
if ($element->hasAttribute('addons')) {
$look['addons'] = (int) $element->getAttribute('addons');
}
if ($element->hasAttribute('corpse')) {
$look['corpse'] = (int) $element->getAttribute('corpse');
}
return $look;
}

File diff suppressed because it is too large Load Diff

View File

@@ -26,14 +26,19 @@ class OTS_ServerInfo
*
* @var string
*/
private $server;
private string $server;
/**
* Connection port.
*
* @var int
*/
private $port;
private int $port;
/**
* Status timeout
*/
private float $timeout = 2.0;
/**
* Creates handler for new server.
@@ -41,11 +46,11 @@ class OTS_ServerInfo
* @param string $server Server IP/domain.
* @param int $port OTServ port.
*/
public function __construct($server, $port)
{
$this->server = $server;
$this->port = $port;
}
public function __construct($server, $port)
{
$this->server = $server;
$this->port = $port;
}
/**
* Sends packet to server.
@@ -54,46 +59,46 @@ class OTS_ServerInfo
* @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.
*/
private function send(OTS_Buffer $packet)
{
// connects to server
$socket = @fsockopen($this->server, $this->port, $error, $message, setting('core.status_timeout'));
private function send(OTS_Buffer $packet)
{
// connects to server
$socket = @fsockopen($this->server, $this->port, $error, $message, $this->timeout);
// if connected then checking statistics
if($socket)
{
// sets 5 second timeout for reading and writing
stream_set_timeout($socket, 5);
// if connected then checking statistics
if($socket)
{
// sets 5 second timeout for reading and writing
stream_set_timeout($socket, 5);
// creates real packet
$packet = $packet->getBuffer();
$packet = pack('v', strlen($packet) ) . $packet;
// creates real packet
$packet = $packet->getBuffer();
$packet = pack('v', strlen($packet) ) . $packet;
// sends packet with request
// 06 - length of packet, 255, 255 is the comamnd identifier, 'info' is a request
fwrite($socket, $packet);
// sends packet with request
// 06 - length of packet, 255, 255 is the comamnd identifier, 'info' is a request
fwrite($socket, $packet);
// reads respond
//$data = stream_get_contents($socket);
// reads respond
//$data = stream_get_contents($socket);
$data = '';
while (!feof($socket))
$data .= fgets($socket, 1024);
// closing connection to current server
fclose($socket);
// closing connection to current server
fclose($socket);
// sometimes server returns empty info
if( empty($data) )
{
// returns offline state
return false;
}
// sometimes server returns empty info
if( empty($data) )
{
// returns offline state
return false;
}
return new OTS_Buffer($data);
}
return new OTS_Buffer($data);
}
return false;
}
return false;
}
/**
* Queries server status.
@@ -108,30 +113,30 @@ class OTS_ServerInfo
* @example examples/info.php info.php
* @tutorial POT/Server_status.pkg
*/
public function status()
{
// request packet
$request = new OTS_Buffer();
$request->putChar(255);
$request->putChar(255);
$request->putString('info', false);
public function status()
{
// request packet
$request = new OTS_Buffer();
$request->putChar(255);
$request->putChar(255);
$request->putString('info', false);
$status = $this->send($request);
$status = $this->send($request);
// checks if server is online
if($status)
{
// loads respond XML
$info = new OTS_InfoRespond();
if(!$info->loadXML( $status->getBuffer()))
// checks if server is online
if($status)
{
// loads respond XML
$info = new OTS_InfoRespond();
if(!$info->loadXML( $status->getBuffer()))
return false;
return $info;
}
return $info;
}
// offline
return false;
}
// offline
return false;
}
/**
* Queries server information.
@@ -146,26 +151,26 @@ class OTS_ServerInfo
* @example examples/server.php info.php
* @tutorial POT/Server_status.pkg
*/
public function info($flags)
{
// request packet
$request = new OTS_Buffer();
$request->putChar(255);
$request->putChar(1);
$request->putShort($flags);
public function info($flags)
{
// request packet
$request = new OTS_Buffer();
$request->putChar(255);
$request->putChar(1);
$request->putShort($flags);
$status = $this->send($request);
$status = $this->send($request);
// checks if server is online
if($status)
{
// loads respond
return new OTS_ServerStatus($status);
}
// checks if server is online
if($status)
{
// loads respond
return new OTS_ServerStatus($status);
}
// offline
return false;
}
// offline
return false;
}
/**
* Checks player online status.
@@ -180,27 +185,27 @@ class OTS_ServerInfo
* @example examples/server.php info.php
* @tutorial POT/Server_status.pkg
*/
public function playerStatus($name)
{
// request packet
$request = new OTS_Buffer();
$request->putChar(255);
$request->putChar(1);
$request->putShort(OTS_ServerStatus::REQUEST_PLAYER_STATUS_INFO);
$request->putString($name);
public function playerStatus($name)
{
// request packet
$request = new OTS_Buffer();
$request->putChar(255);
$request->putChar(1);
$request->putShort(OTS_ServerStatus::REQUEST_PLAYER_STATUS_INFO);
$request->putString($name);
$status = $this->send($request);
$status = $this->send($request);
// checks if server is online
if($status)
{
$status->getChar();
return (bool) $status->getChar();
}
// checks if server is online
if($status)
{
$status->getChar();
return (bool) $status->getChar();
}
// offline
return false;
}
// offline
return false;
}
/**
* Magic PHP5 method.
@@ -210,20 +215,24 @@ class OTS_ServerInfo
* @throws OutOfBoundsException For non-supported properties.
* @throws E_OTS_OutOfBuffer When there is read attemp after end of packet stream.
*/
public function __get($name)
{
switch($name)
{
case 'status':
return $this->status();
public function __get($name)
{
switch($name)
{
case 'status':
return $this->status();
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);
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);
default:
throw new OutOfBoundsException();
}
}
default:
throw new OutOfBoundsException();
}
}
public function setTimeout($timeout) {
$this->timeout = $timeout;
}
}
/**#@-*/

View File

@@ -40,175 +40,175 @@ class OTS_ServerStatus
/**
* Basic server info.
*/
const REQUEST_BASIC_SERVER_INFO = 1;
const REQUEST_BASIC_SERVER_INFO = 1;
/**
* Server owner info.
*/
const REQUEST_OWNER_SERVER_INFO = 2;
const REQUEST_OWNER_SERVER_INFO = 2;
/**
* Server extra info.
*/
const REQUEST_MISC_SERVER_INFO = 4;
const REQUEST_MISC_SERVER_INFO = 4;
/**
* Players stats info.
*/
const REQUEST_PLAYERS_INFO = 8;
const REQUEST_PLAYERS_INFO = 8;
/**
* Map info.
*/
const REQUEST_MAP_INFO = 16;
const REQUEST_MAP_INFO = 16;
/**
* Extended players info.
*/
const REQUEST_EXT_PLAYERS_INFO = 32;
const REQUEST_EXT_PLAYERS_INFO = 32;
/**
* Player status info.
*/
const REQUEST_PLAYER_STATUS_INFO = 64;
const REQUEST_PLAYER_STATUS_INFO = 64;
/**
* Server software info.
*/
const REQUEST_SERVER_SOFTWARE_INFO = 128;
const REQUEST_SERVER_SOFTWARE_INFO = 128;
/**
* Basic server respond.
*/
const RESPOND_BASIC_SERVER_INFO = 0x10;
const RESPOND_BASIC_SERVER_INFO = 0x10;
/**
* Server owner respond.
*/
const RESPOND_OWNER_SERVER_INFO = 0x11;
const RESPOND_OWNER_SERVER_INFO = 0x11;
/**
* Server extra respond.
*/
const RESPOND_MISC_SERVER_INFO = 0x12;
const RESPOND_MISC_SERVER_INFO = 0x12;
/**
* Players stats respond.
*/
const RESPOND_PLAYERS_INFO = 0x20;
const RESPOND_PLAYERS_INFO = 0x20;
/**
* Map respond.
*/
const RESPOND_MAP_INFO = 0x30;
const RESPOND_MAP_INFO = 0x30;
/**
* Extended players info.
*/
const RESPOND_EXT_PLAYERS_INFO = 0x21;
const RESPOND_EXT_PLAYERS_INFO = 0x21;
/**
* Player status info.
*/
const RESPOND_PLAYER_STATUS_INFO = 0x22;
const RESPOND_PLAYER_STATUS_INFO = 0x22;
/**
* Server software info.
*/
const RESPOND_SERVER_SOFTWARE_INFO = 0x23;
const RESPOND_SERVER_SOFTWARE_INFO = 0x23;
/**
* Server name.
*
* @var string
*/
private $name;
private $name;
/**
* Server IP.
*
* @var string
*/
private $ip;
private $ip;
/**
* Server port.
*
* @var string
*/
private $port;
private $port;
/**
* Owner name.
*
* @var string
*/
private $owner;
private $owner;
/**
* Owner's e-mail.
*
* @var string
*/
private $eMail;
private $eMail;
/**
* Message of the day.
*
* @var string
*/
private $motd;
private $motd;
/**
* Server location.
*
* @var string
*/
private $location;
private $location;
/**
* Website URL.
*
* @var string
*/
private $url;
private $url;
/**
* Uptime.
*
* @var int
*/
private $uptime;
private $uptime;
/**
* Status version.
*
* @var string
*/
private $version;
private $version;
/**
* Players online.
*
* @var int
*/
private $online;
private $online;
/**
* Maximum players.
*
* @var int
*/
private $max;
private $max;
/**
* Players peak.
*
* @var int
*/
private $peak;
private $peak;
/**
* Map name.
*
* @var string
*/
private $map;
private $map;
/**
* Map author.
*
* @var string
*/
private $author;
private $author;
/**
* Map width.
*
* @var int
*/
private $width;
private $width;
/**
* Map height.
*
* @var int
*/
private $height;
private $height;
/**
* Players online list.
*
* @var array
*/
private $players = array();
private $players = array();
/**
* Server software.
@@ -224,277 +224,277 @@ class OTS_ServerStatus
*
* @param OTS_Buffer $info Information packet.
*/
public function __construct(OTS_Buffer $info)
{
// skips packet length
$info->getShort();
public function __construct(OTS_Buffer $info)
{
// skips packet length
$info->getShort();
while( $info->isValid() )
{
switch( $info->getChar() )
{
case self::RESPOND_BASIC_SERVER_INFO:
$this->name = $info->getString();
$this->ip = $info->getString();
$this->port = (int) $info->getString();
break;
while( $info->isValid() )
{
switch( $info->getChar() )
{
case self::RESPOND_BASIC_SERVER_INFO:
$this->name = $info->getString();
$this->ip = $info->getString();
$this->port = (int) $info->getString();
break;
case self::RESPOND_OWNER_SERVER_INFO:
$this->owner = $info->getString();
$this->eMail = $info->getString();
break;
case self::RESPOND_OWNER_SERVER_INFO:
$this->owner = $info->getString();
$this->eMail = $info->getString();
break;
case self::RESPOND_MISC_SERVER_INFO:
$this->motd = $info->getString();
$this->location = $info->getString();
$this->url = $info->getString();
case self::RESPOND_MISC_SERVER_INFO:
$this->motd = $info->getString();
$this->location = $info->getString();
$this->url = $info->getString();
$uptime = $info->getLong() << 32;
$uptime = $info->getLong() << 32;
$this->uptime += $info->getLong() + $uptime;
$this->version = $info->getString();
break;
$this->uptime += $info->getLong() + $uptime;
$this->version = $info->getString();
break;
case self::RESPOND_PLAYERS_INFO:
$this->online = $info->getLong();
$this->max = $info->getLong();
$this->peak = $info->getLong();
break;
case self::RESPOND_PLAYERS_INFO:
$this->online = $info->getLong();
$this->max = $info->getLong();
$this->peak = $info->getLong();
break;
case self::RESPOND_MAP_INFO:
$this->map = $info->getString();
$this->author = $info->getString();
$this->width = $info->getShort();
$this->height = $info->getShort();
break;
case self::RESPOND_MAP_INFO:
$this->map = $info->getString();
$this->author = $info->getString();
$this->width = $info->getShort();
$this->height = $info->getShort();
break;
case self::RESPOND_EXT_PLAYERS_INFO:
$count = $info->getLong();
case self::RESPOND_EXT_PLAYERS_INFO:
$count = $info->getLong();
for($i = 0; $i < $count; $i++)
{
$name = $info->getString();
$this->players[$name] = $info->getLong();
}
break;
for($i = 0; $i < $count; $i++)
{
$name = $info->getString();
$this->players[$name] = $info->getLong();
}
break;
case self::RESPOND_SERVER_SOFTWARE_INFO:
$this->softwareName = $info->getString();
$this->softwareVersion = $info->getString();
$this->softwareProtocol = $info->getString();
break;
}
}
}
}
}
}
/**
* Returns server uptime.
*
* @return int Uptime.
*/
public function getUptime()
{
return $this->uptime;
}
public function getUptime()
{
return $this->uptime;
}
/**
* Returns server IP.
*
* @return string IP.
*/
public function getIP()
{
return $this->ip;
}
public function getIP()
{
return $this->ip;
}
/**
* Returns server name.
*
* @return string Name.
*/
public function getName()
{
return $this->name;
}
public function getName()
{
return $this->name;
}
/**
* Returns server port.
*
* @return int Port.
*/
public function getPort()
{
return $this->port;
}
public function getPort()
{
return $this->port;
}
/**
* Returns server location.
*
* @return string Location.
*/
public function getLocation()
{
return $this->location;
}
public function getLocation()
{
return $this->location;
}
/**
* Returns server website.
*
* @return string Website URL.
*/
public function getURL()
{
return $this->url;
}
public function getURL()
{
return $this->url;
}
/**
* Returns server version.
*
* @return string Version.
*/
public function getServerVersion()
{
return $this->version;
}
public function getServerVersion()
{
return $this->version;
}
/**
* Returns owner name.
*
* @return string Owner name.
*/
public function getOwner()
{
return $this->owner;
}
public function getOwner()
{
return $this->owner;
}
/**
* Returns owner e-mail.
*
* @return string Owner e-mail.
*/
public function getEMail()
{
return $this->eMail;
}
public function getEMail()
{
return $this->eMail;
}
/**
* Returns current amount of players online.
*
* @return int Count of players.
*/
public function getOnlinePlayers()
{
return $this->online;
}
public function getOnlinePlayers()
{
return $this->online;
}
/**
* Returns maximum amount of players online.
*
* @return int Maximum allowed count of players.
*/
public function getMaxPlayers()
{
return $this->max;
}
public function getMaxPlayers()
{
return $this->max;
}
/**
* Returns record of online players.
*
* @return int Players online record.
*/
public function getPlayersPeak()
{
return $this->peak;
}
public function getPlayersPeak()
{
return $this->peak;
}
/**
* Returns map name.
*
* @return string Map name.
*/
public function getMapName()
{
return $this->map;
}
public function getMapName()
{
return $this->map;
}
/**
* Returns map author.
*
* @return string Mapper name.
*/
public function getMapAuthor()
{
return $this->author;
}
public function getMapAuthor()
{
return $this->author;
}
/**
* Returns map width.
*
* @return int Map width.
*/
public function getMapWidth()
{
return $this->width;
}
public function getMapWidth()
{
return $this->width;
}
/**
* Returns map height.
*
* @return int Map height.
*/
public function getMapHeight()
{
return $this->height;
}
public function getMapHeight()
{
return $this->height;
}
/**
* Returns server's Message Of The Day
*
* @return string Server MOTD.
*/
public function getMOTD()
{
return $this->motd;
}
public function getMOTD()
{
return $this->motd;
}
/**
* Returns list of players currently online.
*
* @return array List of players in format 'name' => level.
*/
public function getPlayers()
{
}
public function getPlayers()
{
}
/**
* Returns software name.
*
* @return string Software name.
*/
public function getSoftwareName()
{
return $this->softwareName;
}
public function getSoftwareName()
{
return $this->softwareName;
}
/**
* Returns software version.
*
* @return string Software version.
*/
public function getSoftwareVersion()
{
return $this->softwareVersion;
}
public function getSoftwareVersion()
{
return $this->softwareVersion;
}
/**
* Returns software protocol.
*
* @return string Software protocol.
*/
public function getSoftwareProtocol()
{
return $this->softwareProtocol;
}
public function getSoftwareProtocol()
{
return $this->softwareProtocol;
}
/**
* Magic PHP5 method.
@@ -503,68 +503,68 @@ class OTS_ServerStatus
* @return mixed Property value.
* @throws OutOfBoundsException For non-supported properties.
*/
public function __get($name)
{
switch($name)
{
case 'uptime':
return $this->getUptime();
public function __get($name)
{
switch($name)
{
case 'uptime':
return $this->getUptime();
case 'ip':
return $this->getIP();
case 'ip':
return $this->getIP();
case 'name':
return $this->getName();
case 'name':
return $this->getName();
case 'port':
return $this->getPort();
case 'port':
return $this->getPort();
case 'location':
return $this->getLocation();
case 'location':
return $this->getLocation();
case 'url':
return $this->getURL();
case 'url':
return $this->getURL();
case 'serverVersion':
return $this->getServerVersion();
case 'serverVersion':
return $this->getServerVersion();
case 'owner':
return $this->getOwner();
case 'owner':
return $this->getOwner();
case 'eMail':
return $this->getEMail();
case 'eMail':
return $this->getEMail();
case 'onlinePlayers':
return $this->getOnlinePlayers();
case 'onlinePlayers':
return $this->getOnlinePlayers();
case 'maxPlayers':
return $this->getMaxPlayers();
case 'maxPlayers':
return $this->getMaxPlayers();
case 'playersPeak':
return $this->getPlayersPeak();
case 'playersPeak':
return $this->getPlayersPeak();
case 'mapName':
return $this->getMapName();
case 'mapName':
return $this->getMapName();
case 'mapAuthor':
return $this->getMapAuthor();
case 'mapAuthor':
return $this->getMapAuthor();
case 'mapWidth':
return $this->getMapWidth();
case 'mapWidth':
return $this->getMapWidth();
case 'mapHeight':
return $this->getMapHeight();
case 'mapHeight':
return $this->getMapHeight();
case 'motd':
return $this->getMOTD();
case 'motd':
return $this->getMOTD();
case 'players':
return $this->getPlayers();
case 'players':
return $this->getPlayers();
default:
throw new OutOfBoundsException();
}
}
default:
throw new OutOfBoundsException();
}
}
}
/**#@-*/

View File

@@ -14,12 +14,12 @@ $account_logged = new OTS_Account();
// stay-logged with sessions
$current_session = getSession('account');
if($current_session !== false)
if($current_session)
{
$account_logged->load($current_session);
if($account_logged->isLoaded() && $account_logged->getPassword() == getSession('password')
//&& (!isset($_SESSION['admin']) || admin())
&& (getSession('remember_me') !== false || getSession('last_visit') > time() - 15 * 60)) { // login for 15 minutes if "remember me" is not used
&& (getSession('remember_me') || getSession('last_visit') > time() - 15 * 60)) { // login for 15 minutes if "remember me" is not used
$logged = true;
}
else {

View File

@@ -10,8 +10,13 @@ $up = function () use ($db) {
$db->exec(file_get_contents(__DIR__ . '/17-menu.sql'));
}
Plugins::installMenus('kathrine', require TEMPLATES . 'kathrine/menus.php');
Plugins::installMenus('tibiacom', require TEMPLATES . 'tibiacom/menus.php');
$themes = ['kathrine', 'tibiacom',];
foreach ($themes as $theme) {
$file = TEMPLATES . $theme . '/menus.php';
if (is_file($file)) {
Plugins::installMenus($theme, require $file);
}
}
};
$down = function () use ($db) {

20
system/migrations/43.php Normal file
View File

@@ -0,0 +1,20 @@
<?php
/**
* @var OTS_DB_MySQL $db
*/
// 2025-01-22
// change columns to VARCHAR
$up = function () use ($db) {
$db->query("UPDATE guilds set description = '' WHERE description is NULL;"); // prevent truncate error when column is NULL
$db->modifyColumn('guilds', 'description', "VARCHAR(5000) NOT NULL DEFAULT ''");
$db->query("UPDATE players set comment = '' WHERE comment is NULL;");
$db->modifyColumn('players', 'comment', "VARCHAR(5000) NOT NULL DEFAULT ''");
};
$down = function () use ($db) {
$db->modifyColumn('guilds', 'description', "TEXT NOT NULL");
$db->modifyColumn('players', 'comment', "TEXT NOT NULL");
};

20
system/migrations/44.php Normal file
View File

@@ -0,0 +1,20 @@
<?php
// 2025-05-14
// update pages links
// server-info conflicts with apache2 mod
// Changelog conflicts with changelog files
use MyAAC\Models\Menu;
use MyAAC\Models\Pages;
$up = function() {
Menu::where('link', 'server-info')->update(['link' => 'ots-info']);
Menu::where('link', 'changelog')->update(['link' => 'change-log']);
};
$down = function() {
Menu::where('link', 'ots-info')->update(['link' => 'server-info']);
Menu::where('link', 'change-log')->update(['link' => 'changelog']);
};

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

@@ -17,6 +17,8 @@ if(!$logged) {
return;
}
csrfProtect();
$email_new_time = $account_logged->getCustomField("email_new_time");
if($email_new_time > 10) {

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -23,6 +23,8 @@ if($logged)
return;
}
csrfProtect();
if(setting('core.account_create_character_create')) {
$createCharacter = new CreateCharacter();
}

View File

@@ -18,6 +18,8 @@ if($logged || !isset($_POST['account_login']) || !isset($_POST['password_login']
return;
}
csrfProtect();
$login_account = $_POST['account_login'];
$login_password = $_POST['password_login'];
$remember_me = isset($_POST['remember_me']);
@@ -95,3 +97,8 @@ else {
}
$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;
}
csrfProtect();
$groups = new OTS_Groups_List();
$freePremium = isset($config['lua']['freePremium']) && getBoolean($config['lua']['freePremium']) || $account_logged->getPremDays() == OTS_Account::GRATIS_PREMIUM_DAYS;

View File

@@ -17,6 +17,8 @@ if(!$logged) {
return;
}
csrfProtect();
if(isset($_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;
}
csrfProtect();
$_POST['reg_password'] = $_POST['reg_password'] ?? '';
$reg_password = encrypt((USE_ACCOUNT_SALT ? $account_logged->getCustomField('salt') : '') . $_POST['reg_password']);
$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
/**
* 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,
));
require 'change-log.php';

View File

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

View File

@@ -23,8 +23,9 @@ if(!$logged) {
return;
}
if(Forum::canPost($account_logged))
{
csrfProtect();
if(Forum::canPost($account_logged)) {
$post_id = isset($_REQUEST['id']) ? (int) $_REQUEST['id'] : false;
if(!$post_id) {
$errors[] = 'Please enter post id.';
@@ -41,12 +42,12 @@ if(Forum::canPost($account_logged))
$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();
$saved = false;
if(isset($_REQUEST['save'])) {
$text = stripslashes(trim($_REQUEST['text']));
$char_id = (int) $_REQUEST['char_id'];
$post_topic = stripslashes(trim($_REQUEST['topic']));
$smile = isset($_REQUEST['smile']) ? (int)$_REQUEST['smile'] : 0;
$html = isset($_REQUEST['html']) ? (int)$_REQUEST['html'] : 0;
if(isset($_POST['save'])) {
$text = stripslashes(trim($_POST['text']));
$char_id = (int) $_POST['char_id'];
$post_topic = stripslashes(trim($_POST['topic']));
$smile = isset($_POST['smile']) ? (int)$_POST['smile'] : 0;
$html = isset($_POST['html']) ? (int)$_POST['html'] : 0;
if (!superAdmin()) {
$html = 0;

View File

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

View File

@@ -28,6 +28,8 @@ if(!$logged) {
return;
}
csrfProtect();
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();
$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>';
$quote = isset($_REQUEST['quote']) ? (int) $_REQUEST['quote'] : NULL;
$text = isset($_REQUEST['text']) ? stripslashes(trim($_REQUEST['text'])) : NULL;
$char_id = (int) ($_REQUEST['char_id'] ?? 0);
$post_topic = isset($_REQUEST['topic']) ? stripslashes(trim($_REQUEST['topic'])) : '';
$smile = (int)($_REQUEST['smile'] ?? 0);
$html = (int)($_REQUEST['html'] ?? 0);
$text = isset($_POST['text']) ? stripslashes(trim($_POST['text'])) : NULL;
$char_id = (int) ($_POST['char_id'] ?? 0);
$post_topic = isset($_POST['topic']) ? stripslashes(trim($_POST['topic'])) : '';
$smile = (int)($_POST['smile'] ?? 0);
$html = (int)($_POST['html'] ?? 0);
$saved = false;
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]';
}
}
elseif(isset($_REQUEST['save'])) {
elseif(isset($_POST['save'])) {
$length = strlen($text);
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) {
@@ -79,15 +81,14 @@ if(Forum::canPost($account_logged)) {
}
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) {
$last_post = 0;
$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();
$last_post = $query['post_date'];
}

View File

@@ -28,6 +28,8 @@ if(!$logged) {
return;
}
csrfProtect();
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();
$section_id = $_REQUEST['section_id'] ?? null;
@@ -38,19 +40,18 @@ if(Forum::canPost($account_logged)) {
if ($sections[$section_id]['closed'] && !Forum::isModerator())
$errors[] = 'You cannot create topic on this board.';
$quote = (int)(isset($_REQUEST['quote']) ? $_REQUEST['quote'] : 0);
$text = isset($_REQUEST['text']) ? stripslashes($_REQUEST['text']) : '';
$char_id = (int)(isset($_REQUEST['char_id']) ? $_REQUEST['char_id'] : 0);
$post_topic = isset($_REQUEST['topic']) ? stripslashes($_REQUEST['topic']) : '';
$smile = (isset($_REQUEST['smile']) ? (int)$_REQUEST['smile'] : 0);
$html = (isset($_REQUEST['html']) ? (int)$_REQUEST['html'] : 0);
$text = isset($_POST['text']) ? stripslashes($_POST['text']) : '';
$char_id = (int)(isset($_POST['char_id']) ? $_POST['char_id'] : 0);
$post_topic = isset($_POST['topic']) ? stripslashes($_POST['topic']) : '';
$smile = (isset($_POST['smile']) ? (int)$_POST['smile'] : 0);
$html = (isset($_POST['html']) ? (int)$_POST['html'] : 0);
if (!superAdmin()) {
$html = 0;
}
$saved = false;
if (isset($_REQUEST['save'])) {
if (isset($_POST['save'])) {
$length = strlen($post_topic);
if ($length < 1 || $length > 60) {
$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;
}
csrfProtect();
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();
if($post['id'] == $id && Forum::hasAccess($post['section'])) {
if($post && $post['id'] == $id && Forum::hasAccess($post['section'])) {
if($post['id'] == $post['first_post']) {
$db->query("DELETE FROM `" . FORUM_TABLE_PREFIX . "forum` WHERE `first_post` = ".$post['id']);
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();
$_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']);
header('Location: ' . getForumThreadLink($post['first_post'], (int) $_page));
header('Location: ' . getForumThreadLink($post['first_post'], $_page));
}
}
else {

View File

@@ -33,7 +33,7 @@ if(!Forum::hasAccess($section_id)) {
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();
for($i = 0; $i < $threads_count['threads_count'] / setting('core.forum_threads_per_page'); $i++) {
if($i != $_page)
@@ -50,7 +50,7 @@ if($logged && (!$sections[$section_id]['closed'] || Forum::isModerator())) {
}
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])) {
echo '<table width="100%">
@@ -67,8 +67,8 @@ if(isset($last_threads[0])) {
foreach($last_threads as $thread) {
echo '<tr bgcolor="' . getStyle($number_of_rows++) . '"><td>';
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=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> ';
echo '<a href="' . getLink('forum') . '?action=move_thread&id=' . $thread['id'] . '" title="Move Thread"><img src="images/icons/arrow_right.gif"/></a>';
$twig->display('forum.remove_post.html.twig', ['post' => $thread]);
}
$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>';
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();
if(isset($last_post['name']))
echo date('d.m.y H:i:s', $last_post['post_date']).'<br />by ' . getPlayerLink($last_post['name']);
else
if(isset($last_post['name'])) {
echo date('d.m.y H:i:s', $last_post['post_date']) . '<br />by ' . getPlayerLink($last_post['name']);
}
else {
echo 'No posts.';
}
}
else {
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;
}
$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++) {
if($i != $_page)
$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();
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');

View File

@@ -12,11 +12,11 @@ defined('MYAAC') or die('Direct access not allowed!');
require __DIR__ . '/base.php';
//set rights in guild
// set rights in guild
$guild_name = isset($_REQUEST['guild']) ? urldecode($_REQUEST['guild']) : null;
$name = isset($_REQUEST['name']) ? stripslashes($_REQUEST['name']) : null;
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)) {
@@ -27,11 +27,11 @@ if(empty($errors)) {
$guild = new OTS_Guild();
$guild->find($guild_name);
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)) {
$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)) {
$is_invited = false;
include(SYSTEM . 'libs/pot/InvitesDriver.php');
@@ -104,7 +104,7 @@ if(!empty($errors)) {
));
}
else {
if(isset($_REQUEST['todo']) && $_REQUEST['todo'] == 'save') {
if(isset($_POST['todo']) && $_POST['todo'] == 'save') {
$guild->acceptInvite($player);
$twig->display('success.html.twig', array(
'title' => 'Accept invitation',

View File

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

View File

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

View File

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

View File

@@ -30,7 +30,7 @@ if(empty($errors)) {
if($logged) {
$guild_leader_char = $guild->getOwner();
$guild_leader = false;
$account_players = $account_logged->getPlayers();
$account_players = $account_logged->getPlayersList();
foreach($account_players as $player) {
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;
$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');
$save_file_name = str_replace(' ', '_', strtolower($guild->getName()));
$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'];
if(is_uploaded_file($file['tmp_name']))
@@ -97,13 +96,13 @@ if(empty($errors)) {
$guild_logo = $guild->getCustomField('logo_name');
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(
'guild_logo' => $guild_logo,
'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->orderBy('level', POT::ORDER_DESC);
$guild_leader = false;
$account_players = $account_logged->getPlayers();
$account_players = $account_logged->getPlayersList();
foreach($account_players as $player) {
if($guild->getOwner()->getId() == $player->getId()) {
$guild_vice = true;
@@ -45,8 +45,8 @@ if(empty($errors)) {
$saved = false;
if($guild_leader) {
if(isset($_REQUEST['todo']) && $_REQUEST['todo'] == 'save') {
$motd = htmlspecialchars(stripslashes(substr($_REQUEST['motd'],0, setting('core.guild_motd_chars_limit'))));
if(isset($_POST['todo']) && $_POST['todo'] == 'save') {
$motd = htmlspecialchars(stripslashes(substr($_POST['motd'],0, setting('core.guild_motd_chars_limit'))));
$guild->setCustomField('motd', $motd);
$saved = true;
}

View File

@@ -20,17 +20,15 @@ if(!$logged) {
}
$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;
if(!$name) {
$errors[] = 'Please enter new name.';
return;
}
if(!$new_nick) {
$errors[] = 'Please enter new nick.';
return;
}
if(empty($errors))

View File

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

View File

@@ -12,33 +12,27 @@ defined('MYAAC') or die('Direct access not allowed!');
require __DIR__ . '/base.php';
if(!$logged)
{
if(!$logged) {
echo "You are not logged in.";
$twig->display('guilds.back_button.html.twig');
return;
}
if(admin())
{
if(admin()) {
$players_list = new OTS_Players_List();
$players_list->init();
}
else
else {
$players_list = $account_logged->getPlayersList();
}
if(count($players_list) > 0)
{
foreach($players_list as $player)
{
if(count($players_list) > 0) {
foreach($players_list as $player) {
$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();
if(!$rank_guild->isLoaded())
{
if(!$rank_guild->isLoaded()) {
$player->setRank();
$player->setGuildNick('');
$changed_ranks_of[] = $player->getName();
@@ -46,8 +40,7 @@ if(count($players_list) > 0)
$player_rank->delete();
}
}
else
{
else {
$player->setRank();
$player->setGuildNick('');
$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>";
if(!empty($deleted_ranks))
foreach($deleted_ranks as $rank)
echo "<li>".$rank;
if(!empty($deleted_ranks)) {
foreach ($deleted_ranks as $rank) {
echo "<li>" . $rank;
}
}
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)
echo "<li>".$name;
if(!empty($changed_ranks_of)) {
foreach ($changed_ranks_of as $name) {
echo "<li>" . $name;
}
}
}
else
echo "0 players found.";

View File

@@ -14,15 +14,15 @@ use MyAAC\Models\GuildRank;
require __DIR__ . '/base.php';
$guild_name = isset($_REQUEST['guild']) ? urldecode($_REQUEST['guild']) : NULL;
$name = isset($_REQUEST['name']) ? stripslashes($_REQUEST['name']) : NULL;
$todo = isset($_REQUEST['todo']) ? $_REQUEST['todo'] : NULL;
$guild_name = isset($_POST['guild']) ? urldecode($_POST['guild']) : NULL;
$name = isset($_POST['name']) ? stripslashes($_POST['name']) : NULL;
$todo = isset($_POST['todo']) ? $_POST['todo'] : NULL;
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();
if(empty($guild_errors))
if(empty($errors))
{
$account_players = $account_logged->getPlayersList(false);
foreach($account_players as $player)
@@ -41,45 +41,44 @@ if(empty($guild_errors))
if(empty($todo)) {
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(!Validator::guildName($guild_name)) {
$guild_errors[] = Validator::getLastError();
$errors[] = Validator::getLastError();
$guild_name = '';
}
if(!Validator::characterName($name)) {
$guild_errors[] = 'Invalid character name format.';
$errors[] = 'Invalid character name format.';
$name = '';
}
if(empty($guild_errors)) {
if(empty($errors)) {
$player = new OTS_Player();
$player->find($name);
if(!$player->isLoaded()) {
$guild_errors[] = 'Character <b>'.$name.'</b> doesn\'t exist.';
$errors[] = 'Character <b>'.$name.'</b> doesn\'t exist.';
}
}
if(empty($guild_errors))
if(empty($errors))
{
$guild = new OTS_Guild();
$guild->find($guild_name);
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()) {
$guild_errors[] = "Character <b>$name</b> has been deleted.";
if(empty($errors) && $player->isDeleted()) {
$errors[] = "Character <b>$name</b> has been deleted.";
}
if(empty($guild_errors))
if(empty($errors))
{
$bad_char = true;
foreach($array_of_player_nig as $nick_from_list) {
@@ -88,22 +87,22 @@ if($todo == 'save')
}
}
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')) {
$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()) {
$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)) {
$twig->display('error_box.html.twig', array('errors' => $guild_errors));
if(!empty($errors)) {
$twig->display('error_box.html.twig', array('errors' => $errors));
unset($todo);
}

View File

@@ -45,7 +45,10 @@ if(empty($errors)) {
$twig->display('success.html.twig', array(
'title' => 'Delete Guild',
'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')
));
}

View File

@@ -21,7 +21,7 @@ if(empty($errors)) {
$guild = new OTS_Guild();
$guild->find($guild_name);
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->orderBy('level', POT::ORDER_DESC);
$guild_leader = false;
$account_players = $account_logged->getPlayers();
$account_players = $account_logged->getPlayersList();
foreach($account_players as $player) {
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;
$name = stripslashes($_REQUEST['name']);
if(!$logged)
if(!$logged) {
$errors[] = 'You are not logged in. You can\'t delete invitations.';
}
if(!Validator::guildName($guild_name))
if(!Validator::guildName($guild_name)) {
$errors[] = Validator::getLastError();
}
if(!Validator::characterName($name))
if(!Validator::characterName($name)) {
$errors[] = 'Invalid name format.';
}
if(empty($errors))
{
if(empty($errors)) {
$guild = new OTS_Guild();
$guild->find($guild_name);
if(!$guild->isLoaded())
$errors[] = "Guild with name <b>" . $guild_name . "</b> doesn't exist.";
}
if(empty($errors))
{
if(empty($errors)) {
$rank_list = $guild->getGuildRanksList();
$rank_list->orderBy('level', POT::ORDER_DESC);
$guild_leader = false;
$guild_vice = false;
$account_players = $account_logged->getPlayers();
foreach($account_players as $player)
{
$account_players = $account_logged->getPlayersList();
foreach($account_players as $player) {
$player_rank = $player->getRank();
if($player_rank->isLoaded())
{
foreach($rank_list as $rank_in_guild)
{
if($rank_in_guild->getId() == $player_rank->getId())
{
if($player_rank->isLoaded()) {
foreach($rank_list as $rank_in_guild) {
if($rank_in_guild->getId() == $player_rank->getId()) {
$players_from_account_in_guild[] = $player->getName();
if($player_rank->getLevel() > 1)
{
if($player_rank->getLevel() > 1) {
$guild_vice = true;
$level_in_guild = $player_rank->getLevel();
}
if($guild->getOwner()->getId() == $player->getId())
{
if($guild->getOwner()->getId() == $player->getId()) {
$guild_vice = 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>.';
}
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');
new InvitesDriver($guild);
$invited_list = $guild->listInvites();
if(count($invited_list) > 0)
{
if(count($invited_list) > 0) {
$is_invited = false;
foreach($invited_list as $invited)
if($invited->getName() == $player->getName())
foreach($invited_list as $invited) {
if ($invited->getName() == $player->getName()) {
$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.';
}
}
if(!empty($errors))
{
if(!empty($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));
}
else
{
if(isset($_REQUEST['todo']) && $_REQUEST['todo'] == 'save')
{
else {
if(isset($_POST['todo']) && $_POST['todo'] == 'save') {
$guild->deleteInvite($player);
$twig->display('success.html.twig', array(
'title' => 'Deleted player invitation',

View File

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

View File

@@ -36,7 +36,7 @@ if(empty($errors)) {
$rank_list->orderBy('level', POT::ORDER_DESC);
$guild_leader = false;
$guild_vice = false;
$account_players = $account_logged->getPlayers();
$account_players = $account_logged->getPlayersList();
foreach($account_players as $player) {
$player_rank = $player->getRank();
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;
}
if(isset($_REQUEST['todo']) && $_REQUEST['todo'] == 'save') {
if(isset($_POST['todo']) && $_POST['todo'] == 'save') {
if(!Validator::characterName($name)) {
$errors[] = 'Invalid name format.';
}
@@ -71,7 +71,7 @@ if(isset($_REQUEST['todo']) && $_REQUEST['todo'] == 'save') {
$player = new OTS_Player();
$player->find($name);
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()) {
$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));
}
else {
if(isset($_REQUEST['todo']) && $_REQUEST['todo'] == 'save') {
if(isset($_POST['todo']) && $_POST['todo'] == 'save') {
$guild->invite($player);
$twig->display('success.html.twig', array(
'title' => 'Invite player',

View File

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

View File

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

View File

@@ -14,23 +14,24 @@ defined('MYAAC') or die('Direct access not allowed!');
require __DIR__ . '/base.php';
$guilds_list = new OTS_Guilds_List();
$guilds_list->orderBy("name");
$guilds_list->orderBy('name');
$guilds = array();
if(count($guilds_list) > 0)
{
if(count($guilds_list) > 0) {
/**
* @var OTS_Guild $guild
*/
foreach ($guilds_list as $guild) {
$guild_logo = $guild->getCustomField('logo_name');
if (empty($guild_logo) || !file_exists(GUILD_IMAGES_DIR . $guild_logo))
$guild_logo = "default.gif";
if (empty($guild_logo) || !file_exists(GUILD_IMAGES_DIR . $guild_logo)) {
$guild_logo = 'default.gif';
}
$description = $guild->getCustomField('description');
$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);
}
$guildName = $guild->getName();
$guilds[] = array('name' => $guildName, 'logo' => $guild_logo, 'link' => getGuildLink($guildName, false), 'description' => $description);
@@ -39,6 +40,6 @@ if(count($guilds_list) > 0)
$twig->display('guilds.list.html.twig', array(
'guilds' => $guilds,
'logged' => isset($logged) ? $logged : false,
'logged' => $logged ?? false,
'isAdmin' => admin(),
));

View File

@@ -21,7 +21,7 @@ if(empty($errors)) {
$guild = new OTS_Guild();
$guild->find($guild_name);
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->orderBy('level', POT::ORDER_DESC);
$guild_leader = false;
$account_players = $account_logged->getPlayers();
$account_players = $account_logged->getPlayersList();
foreach($account_players as $player) {
if($guild_leader_char->getId() == $player->getId()) {
$guild_vice = true;
@@ -39,22 +39,22 @@ if(empty($errors)) {
$level_in_guild = 3;
}
}
if($guild_leader) {
$twig->display('guilds.manager.html.twig', array(
'guild' => $guild,
'rank_list' => $rank_list
));
}
else
{
else {
$errors[] = 'You are not a leader of guild!';
}
}
else
{
$errors[] = 'You are not logged. You can\'t manage guild.';
else {
$errors[] = "You are not logged. You can't manage guild.";
}
}
if(!empty($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;
$pass_to = isset($_REQUEST['player']) ? stripslashes($_REQUEST['player']) : NULL;
if(!Validator::guildName($guild_name)) {
$guild_errors[] = Validator::getLastError();
$errors[] = Validator::getLastError();
}
if(empty($guild_errors)) {
if(empty($errors)) {
$guild = new OTS_Guild();
$guild->find($guild_name);
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(!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->find($pass_to);
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()) {
$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();
if($to_player_rank->isLoaded()) {
$to_player_guild = $to_player_rank->getGuild();
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 {
$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) {
$guild_leader_char = $guild->getOwner();
$guild_leader = false;
$account_players = $account_logged->getPlayers();
$account_players = $account_logged->getPlayersList();
foreach($account_players as $player) {
if($guild_leader_char->getId() == $player->getId()) {
$guild_vice = true;
@@ -99,23 +100,23 @@ if(empty($guild_errors) && empty($guild_errors2)) {
}
}
else {
$guild_errors[] = 'You are not a leader of guild!';
$errors[] = 'You are not a leader of guild!';
}
}
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)) {
$twig->display('error_box.html.twig', array('errors' => $guild_errors2));
if(empty($errors) && !empty($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>';
}
if(!empty($guild_errors)) {
if(!empty($guild_errors2)) {
$guild_errors = array_merge($guild_errors, $guild_errors2);
if(!empty($errors)) {
if(!empty($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>';
}

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