mirror of
				https://github.com/slawkens/myaac.git
				synced 2025-11-04 01:36:23 +01:00 
			
		
		
		
	Compare commits
	
		
			275 Commits
		
	
	
		
			v1.1
			...
			feature/2f
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					abee4b3962 | ||
| 
						 | 
					fbdb6890b9 | ||
| 
						 | 
					041f58ed11 | ||
| 
						 | 
					4eab805d26 | ||
| 
						 | 
					3f24f961b1 | ||
| 
						 | 
					0b86459940 | ||
| 
						 | 
					7a9b11434e | ||
| 
						 | 
					9725a3c2bd | ||
| 
						 | 
					46adeefce3 | ||
| 
						 | 
					e4b66f34ac | ||
| 
						 | 
					2465bb6f9a | ||
| 
						 | 
					42671c5c19 | ||
| 
						 | 
					fec773ba4b | ||
| 
						 | 
					1b9f68c9ec | ||
| 
						 | 
					7a08f91d3f | ||
| 
						 | 
					4b948e9510 | ||
| 
						 | 
					17ca93d020 | ||
| 
						 | 
					bcc4b48eb0 | ||
| 
						 | 
					f8c4332e03 | ||
| 
						 | 
					235e0f394d | ||
| 
						 | 
					3451715e96 | ||
| 
						 | 
					d85681880e | ||
| 
						 | 
					4701461b1f | ||
| 
						 | 
					482f4067b2 | ||
| 
						 | 
					2f26748112 | ||
| 
						 | 
					98073a110a | ||
| 
						 | 
					11dae90fa9 | ||
| 
						 | 
					03c7dd0002 | ||
| 
						 | 
					20f99903ae | ||
| 
						 | 
					b6e1620f14 | ||
| 
						 | 
					9cb7792623 | ||
| 
						 | 
					0db908be18 | ||
| 
						 | 
					785d38312b | ||
| 
						 | 
					e1c04ed28e | ||
| 
						 | 
					c836308601 | ||
| 
						 | 
					0efe47ce71 | ||
| 
						 | 
					3b47e9df2f | ||
| 
						 | 
					43415cf35d | ||
| 
						 | 
					cf7fd20452 | ||
| 
						 | 
					080cc2781f | ||
| 
						 | 
					20d69a641c | ||
| 
						 | 
					2d4be327b2 | ||
| 
						 | 
					bb097b69ce | ||
| 
						 | 
					6e5a4ff8c7 | ||
| 
						 | 
					caf326a658 | ||
| 
						 | 
					bccf8e056d | ||
| 
						 | 
					7d27e5a0ba | ||
| 
						 | 
					9b6f410459 | ||
| 
						 | 
					c06b0017f1 | ||
| 
						 | 
					d8132d4d76 | ||
| 
						 | 
					1566deb84a | ||
| 
						 | 
					536b29be95 | ||
| 
						 | 
					5271633bdb | ||
| 
						 | 
					ce5b1cf2a6 | ||
| 
						 | 
					83f84172e0 | ||
| 
						 | 
					34fead906e | ||
| 
						 | 
					ec11c14024 | ||
| 
						 | 
					2fe9924437 | ||
| 
						 | 
					f0f2e3785f | ||
| 
						 | 
					36ca755243 | ||
| 
						 | 
					f17269e44c | ||
| 
						 | 
					dcb96f4ce1 | ||
| 
						 | 
					a89f9a8484 | ||
| 
						 | 
					45d6047031 | ||
| 
						 | 
					e435062025 | ||
| 
						 | 
					ecc9bd4042 | ||
| 
						 | 
					c92148d467 | ||
| 
						 | 
					b4b62442fe | ||
| 
						 | 
					047742848b | ||
| 
						 | 
					fe8281594e | ||
| 
						 | 
					0bff910a05 | ||
| 
						 | 
					6d43fc181f | ||
| 
						 | 
					13d33822b5 | ||
| 
						 | 
					f78ebad136 | ||
| 
						 | 
					d90fa323d7 | ||
| 
						 | 
					181131f7f3 | ||
| 
						 | 
					0da524fefe | ||
| 
						 | 
					797377e428 | ||
| 
						 | 
					96b5df9d74 | ||
| 
						 | 
					6cf4b9dac5 | ||
| 
						 | 
					b3dfc56c96 | ||
| 
						 | 
					96d6e04bd2 | ||
| 
						 | 
					9146eee327 | ||
| 
						 | 
					3d97fa0719 | ||
| 
						 | 
					5cfa3a697f | ||
| 
						 | 
					bb830bce44 | ||
| 
						 | 
					566c2a9151 | ||
| 
						 | 
					a66cafceab | ||
| 
						 | 
					0f48f12e2e | ||
| 
						 | 
					0ea247ce7e | ||
| 
						 | 
					b329da52aa | ||
| 
						 | 
					c720ccc451 | ||
| 
						 | 
					8dc42b6544 | ||
| 
						 | 
					dca904e61d | ||
| 
						 | 
					29faa4f695 | ||
| 
						 | 
					4767120043 | ||
| 
						 | 
					9a90e4aae2 | ||
| 
						 | 
					ba4ed6a04b | ||
| 
						 | 
					a7efacdbac | ||
| 
						 | 
					577037becc | ||
| 
						 | 
					b8abc11b96 | ||
| 
						 | 
					4def6a6cae | ||
| 
						 | 
					e6100a1b72 | ||
| 
						 | 
					522f6c11d8 | ||
| 
						 | 
					00c3635c5f | ||
| 
						 | 
					c074a48f24 | ||
| 
						 | 
					e222957893 | ||
| 
						 | 
					d423ddd07a | ||
| 
						 | 
					4d4f7759d3 | ||
| 
						 | 
					9510640ba9 | ||
| 
						 | 
					98b13c91a4 | ||
| 
						 | 
					0c95bcfd06 | ||
| 
						 | 
					524e982a0e | ||
| 
						 | 
					fffb427eae | ||
| 
						 | 
					10cd71a663 | ||
| 
						 | 
					0812fe025d | ||
| 
						 | 
					309c1fb715 | ||
| 
						 | 
					8d29fdb98b | ||
| 
						 | 
					f782850307 | ||
| 
						 | 
					835dda9659 | ||
| 
						 | 
					dcc703b1eb | ||
| 
						 | 
					9d8e9d27bd | ||
| 
						 | 
					db09980de1 | ||
| 
						 | 
					2dba778167 | ||
| 
						 | 
					ce2af2bb7a | ||
| 
						 | 
					dc839abfbb | ||
| 
						 | 
					01d49692ed | ||
| 
						 | 
					de6603a513 | ||
| 
						 | 
					dd731fd49b | ||
| 
						 | 
					064b929841 | ||
| 
						 | 
					c61747dc75 | ||
| 
						 | 
					207d6bc691 | ||
| 
						 | 
					8fdea94376 | ||
| 
						 | 
					c961a1ebf8 | ||
| 
						 | 
					770ffcfc52 | ||
| 
						 | 
					756d94bb3e | ||
| 
						 | 
					6e0f591383 | ||
| 
						 | 
					fb91281140 | ||
| 
						 | 
					d8a6090be3 | ||
| 
						 | 
					52109f5cca | ||
| 
						 | 
					4b7b121550 | ||
| 
						 | 
					28886551e8 | ||
| 
						 | 
					7d435ff643 | ||
| 
						 | 
					ae847ff9a6 | ||
| 
						 | 
					45ef390829 | ||
| 
						 | 
					84d502bf10 | ||
| 
						 | 
					e776bd52be | ||
| 
						 | 
					6e793390c6 | ||
| 
						 | 
					6eda38603c | ||
| 
						 | 
					72cdd290da | ||
| 
						 | 
					40d65a6613 | ||
| 
						 | 
					43153b2b0c | ||
| 
						 | 
					2ea549002a | ||
| 
						 | 
					4a30fb495d | ||
| 
						 | 
					4d8f5f31ae | ||
| 
						 | 
					be7b27c31a | ||
| 
						 | 
					7d213f479a | ||
| 
						 | 
					e574943707 | ||
| 
						 | 
					1e9b10d648 | ||
| 
						 | 
					7c92d1c197 | ||
| 
						 | 
					3111d66df9 | ||
| 
						 | 
					e45dd88a93 | ||
| 
						 | 
					5ed1aec28e | ||
| 
						 | 
					7e4d28c648 | ||
| 
						 | 
					3b2669fb3b | ||
| 
						 | 
					6fe3bff163 | ||
| 
						 | 
					ae5be41e11 | ||
| 
						 | 
					83a6f4b61d | ||
| 
						 | 
					ee360386d8 | ||
| 
						 | 
					bf06bed385 | ||
| 
						 | 
					3949d84e5d | ||
| 
						 | 
					a161cff003 | ||
| 
						 | 
					3befde2a1e | ||
| 
						 | 
					5367df2381 | ||
| 
						 | 
					c48b800631 | ||
| 
						 | 
					ef6549c17c | ||
| 
						 | 
					629fd18ea1 | ||
| 
						 | 
					da15105118 | ||
| 
						 | 
					4ca58b4178 | ||
| 
						 | 
					03e2752139 | ||
| 
						 | 
					2fece725a4 | ||
| 
						 | 
					c24c580796 | ||
| 
						 | 
					620a47da72 | ||
| 
						 | 
					9b75011224 | ||
| 
						 | 
					5b4b7b8a97 | ||
| 
						 | 
					99997eb57d | ||
| 
						 | 
					73a5829974 | ||
| 
						 | 
					497338c2d6 | ||
| 
						 | 
					beb348fe27 | ||
| 
						 | 
					5b1bd4f005 | ||
| 
						 | 
					f09606d01b | ||
| 
						 | 
					67ab425bb9 | ||
| 
						 | 
					113473f256 | ||
| 
						 | 
					d6ac4e8d85 | ||
| 
						 | 
					6845869838 | ||
| 
						 | 
					0fbd4bf1be | ||
| 
						 | 
					1e45d5c393 | ||
| 
						 | 
					dbea69f314 | ||
| 
						 | 
					4e6aa0f262 | ||
| 
						 | 
					fa1f927082 | ||
| 
						 | 
					de0512f11a | ||
| 
						 | 
					93c09b3380 | ||
| 
						 | 
					d47195a787 | ||
| 
						 | 
					b618084d50 | ||
| 
						 | 
					d0d0af289d | ||
| 
						 | 
					1d0c173e7d | ||
| 
						 | 
					4e7c894cf2 | ||
| 
						 | 
					b71555d60d | ||
| 
						 | 
					c2bf94fb23 | ||
| 
						 | 
					8cf3409077 | ||
| 
						 | 
					e0043b1300 | ||
| 
						 | 
					86cb5821f6 | ||
| 
						 | 
					82a533d88c | ||
| 
						 | 
					ceaa0639e6 | ||
| 
						 | 
					6844f4392a | ||
| 
						 | 
					6d8f4718a1 | ||
| 
						 | 
					f40b986b59 | ||
| 
						 | 
					190697ce98 | ||
| 
						 | 
					64f6d3abca | ||
| 
						 | 
					e6f05a2731 | ||
| 
						 | 
					6a0356aa0f | ||
| 
						 | 
					50d649dbde | ||
| 
						 | 
					6c568fd36a | ||
| 
						 | 
					fa6b6aa153 | ||
| 
						 | 
					ae639d65b0 | ||
| 
						 | 
					35e2483de8 | ||
| 
						 | 
					bbf923e1a6 | ||
| 
						 | 
					211b6ea698 | ||
| 
						 | 
					6d156ae080 | ||
| 
						 | 
					a5b3940e59 | ||
| 
						 | 
					dbf73d0b61 | ||
| 
						 | 
					65696f63e3 | ||
| 
						 | 
					6341093578 | ||
| 
						 | 
					d25c71857f | ||
| 
						 | 
					7dcb5c4a1f | ||
| 
						 | 
					ff1723b756 | ||
| 
						 | 
					1a5771ad51 | ||
| 
						 | 
					6fac883659 | ||
| 
						 | 
					4a6896b446 | ||
| 
						 | 
					0852fba6f0 | ||
| 
						 | 
					9239a4f419 | ||
| 
						 | 
					00fe1adc15 | ||
| 
						 | 
					c2f55791c0 | ||
| 
						 | 
					464492d826 | ||
| 
						 | 
					887b5068ad | ||
| 
						 | 
					4c5cc8b573 | ||
| 
						 | 
					529bdcf016 | ||
| 
						 | 
					3e3f4bb5a5 | ||
| 
						 | 
					aa52df6e2e | ||
| 
						 | 
					3b31915c22 | ||
| 
						 | 
					1c6cda4df9 | ||
| 
						 | 
					cf51f7aa8d | ||
| 
						 | 
					ed89b99cd1 | ||
| 
						 | 
					9d7fc98e1e | ||
| 
						 | 
					f646856e20 | ||
| 
						 | 
					f97f8cbe87 | ||
| 
						 | 
					3da3e62c5b | ||
| 
						 | 
					d5dd7297b5 | ||
| 
						 | 
					73de93a561 | ||
| 
						 | 
					ae1161d770 | ||
| 
						 | 
					4455964db4 | ||
| 
						 | 
					84870dbf2d | ||
| 
						 | 
					329153fda6 | ||
| 
						 | 
					4b6024dc45 | ||
| 
						 | 
					28fef952f8 | ||
| 
						 | 
					4fda4f643b | ||
| 
						 | 
					19686725dc | ||
| 
						 | 
					a73fb1003e | ||
| 
						 | 
					b46ddb43d0 | ||
| 
						 | 
					de468a8dcd | ||
| 
						 | 
					ea51ad27c3 | ||
| 
						 | 
					d2a4748a59 | ||
| 
						 | 
					a1ed209591 | ||
| 
						 | 
					34321613d6 | ||
| 
						 | 
					19b290feb7 | 
							
								
								
									
										10
									
								
								.github/workflows/cypress.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										10
									
								
								.github/workflows/cypress.yml
									
									
									
									
										vendored
									
									
								
							@@ -1,9 +1,9 @@
 | 
				
			|||||||
name: Cypress
 | 
					name: Cypress
 | 
				
			||||||
on:
 | 
					on:
 | 
				
			||||||
  pull_request:
 | 
					  pull_request:
 | 
				
			||||||
    branches: [master]
 | 
					    branches: [main]
 | 
				
			||||||
  push:
 | 
					  push:
 | 
				
			||||||
    branches: [master]
 | 
					    branches: [main]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
jobs:
 | 
					jobs:
 | 
				
			||||||
  cypress:
 | 
					  cypress:
 | 
				
			||||||
@@ -22,7 +22,7 @@ jobs:
 | 
				
			|||||||
    strategy:
 | 
					    strategy:
 | 
				
			||||||
      fail-fast: false
 | 
					      fail-fast: false
 | 
				
			||||||
      matrix:
 | 
					      matrix:
 | 
				
			||||||
        php-versions: [ '8.1', '8.2', '8.3' ]
 | 
					        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)
 | 
					        ots: ['tfs-1.4', 'canary-3.1.2'] # TODO: add 'tfs-master' (actually doesn't work cause AAC doesn't support reading .env configuration)
 | 
				
			||||||
    name: Cypress (PHP ${{ matrix.php-versions }}, ${{ matrix.ots }})
 | 
					    name: Cypress (PHP ${{ matrix.php-versions }}, ${{ matrix.ots }})
 | 
				
			||||||
    steps:
 | 
					    steps:
 | 
				
			||||||
@@ -35,7 +35,7 @@ jobs:
 | 
				
			|||||||
        - name: Checkout MyAAC
 | 
					        - name: Checkout MyAAC
 | 
				
			||||||
          uses: actions/checkout@v4
 | 
					          uses: actions/checkout@v4
 | 
				
			||||||
          with:
 | 
					          with:
 | 
				
			||||||
            ref: master
 | 
					            ref: main
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        - uses: actions/setup-node@v4
 | 
					        - uses: actions/setup-node@v4
 | 
				
			||||||
          with:
 | 
					          with:
 | 
				
			||||||
@@ -146,6 +146,7 @@ jobs:
 | 
				
			|||||||
          with:
 | 
					          with:
 | 
				
			||||||
            name: cypress-screenshots-${{ matrix.php-versions }}-${{ matrix.ots }}
 | 
					            name: cypress-screenshots-${{ matrix.php-versions }}-${{ matrix.ots }}
 | 
				
			||||||
            path: cypress/screenshots
 | 
					            path: cypress/screenshots
 | 
				
			||||||
 | 
					            if-no-files-found: ignore
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        - name: Upload Cypress Videos
 | 
					        - name: Upload Cypress Videos
 | 
				
			||||||
          uses: actions/upload-artifact@v4
 | 
					          uses: actions/upload-artifact@v4
 | 
				
			||||||
@@ -153,6 +154,7 @@ jobs:
 | 
				
			|||||||
          with:
 | 
					          with:
 | 
				
			||||||
            name: cypress-videos-${{ matrix.php-versions }}-${{ matrix.ots }}
 | 
					            name: cypress-videos-${{ matrix.php-versions }}-${{ matrix.ots }}
 | 
				
			||||||
            path: cypress/videos
 | 
					            path: cypress/videos
 | 
				
			||||||
 | 
					            if-no-files-found: ignore
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        - name: Upload PHP Logs
 | 
					        - name: Upload PHP Logs
 | 
				
			||||||
          uses: actions/upload-artifact@v4
 | 
					          uses: actions/upload-artifact@v4
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										4
									
								
								.github/workflows/phplint.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								.github/workflows/phplint.yml
									
									
									
									
										vendored
									
									
								
							@@ -1,9 +1,9 @@
 | 
				
			|||||||
name: PHP Linting
 | 
					name: PHP Linting
 | 
				
			||||||
on:
 | 
					on:
 | 
				
			||||||
  pull_request:
 | 
					  pull_request:
 | 
				
			||||||
    branches: [master]
 | 
					    branches: [main]
 | 
				
			||||||
  push:
 | 
					  push:
 | 
				
			||||||
    branches: [master]
 | 
					    branches: [main]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
jobs:
 | 
					jobs:
 | 
				
			||||||
  phplint:
 | 
					  phplint:
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										6
									
								
								.github/workflows/phpstan.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										6
									
								
								.github/workflows/phpstan.yml
									
									
									
									
										vendored
									
									
								
							@@ -2,9 +2,9 @@ name: "PHPStan"
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
on:
 | 
					on:
 | 
				
			||||||
  pull_request:
 | 
					  pull_request:
 | 
				
			||||||
    branches: [master]
 | 
					    branches: [main]
 | 
				
			||||||
  push:
 | 
					  push:
 | 
				
			||||||
    branches: [master]
 | 
					    branches: [main]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
jobs:
 | 
					jobs:
 | 
				
			||||||
  tests:
 | 
					  tests:
 | 
				
			||||||
@@ -14,7 +14,7 @@ jobs:
 | 
				
			|||||||
    strategy:
 | 
					    strategy:
 | 
				
			||||||
      fail-fast: false
 | 
					      fail-fast: false
 | 
				
			||||||
      matrix:
 | 
					      matrix:
 | 
				
			||||||
        php-versions: [ '8.1', '8.2', '8.3' ]
 | 
					        php-versions: [ '8.1', '8.2', '8.3', '8.4' ]
 | 
				
			||||||
    steps:
 | 
					    steps:
 | 
				
			||||||
      - name: "Checkout"
 | 
					      - name: "Checkout"
 | 
				
			||||||
        uses: "actions/checkout@v4"
 | 
					        uses: "actions/checkout@v4"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -6,7 +6,7 @@
 | 
				
			|||||||
	Options -MultiViews
 | 
						Options -MultiViews
 | 
				
			||||||
</IfModule>
 | 
					</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
 | 
						Require all denied
 | 
				
			||||||
</FilesMatch>
 | 
					</FilesMatch>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										405
									
								
								CHANGELOG-1.x.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										405
									
								
								CHANGELOG-1.x.md
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,405 @@
 | 
				
			|||||||
 | 
					# Changelog
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## [1.8.1 - 05.09.2025]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Added
 | 
				
			||||||
 | 
					* New Commands: plugin:enable/disable/uninstall {plugin-name} (https://github.com/slawkens/myaac/commit/7a08f91d3fc0897c1ff76089ef3c649a2c6d2003, https://github.com/slawkens/myaac/commit/fec773ba4b740f35c0a3ef92ca8444a4c7d02082)
 | 
				
			||||||
 | 
					* Gifts: Added Transferable Coins to the store dropdown menu in the admin area (by @andreoam, #321) (https://github.com/slawkens/myaac/commit/42671c5c199dd9e91c774d8c9d30da9e12f1b695)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Changed
 | 
				
			||||||
 | 
					* Commands: Allow settings to be changed/reset by plugin name (https://github.com/slawkens/myaac/commit/f8c4332e03e838d285ea0afb4b72b7c23e324d45, https://github.com/slawkens/myaac/commit/4b948e9510f7ba69d00f84d7fdaea8b3bf05b630)
 | 
				
			||||||
 | 
					* Templates: Menus should be saved for each template separately (https://github.com/slawkens/myaac/commit/482f4067b2a2e7513d9ba214274a361ffaf123d8)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Fixed
 | 
				
			||||||
 | 
					* Online: Fix skulls display (#320) (https://github.com/slawkens/myaac/commit/98073a110ae13f9592ec9d2c4d1d1aace87587a9)
 | 
				
			||||||
 | 
					* Online: Fix if there is no world_id in the server_record table (https://github.com/slawkens/myaac/commit/b6e1620f14c20eecfc9001a7d86dfb67942985c6) (Reported by @gesior in #318)
 | 
				
			||||||
 | 
					* tibiacom: some fixes to menus (https://github.com/slawkens/myaac/commit/20f99903ae80c74ad66c1cf5a5ea8d0b0fc2fd70, https://github.com/slawkens/myaac/commit/11dae90fa94fbbf47447017db5e5847c33d6aadf)
 | 
				
			||||||
 | 
					* Guilds: Fix for some servers that don't have guild_invites table (https://github.com/slawkens/myaac/commit/9725a3c2bdb7003f5cb48febb77604c31a9b805b)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## [1.8 - 02.08.2025]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Added
 | 
				
			||||||
 | 
					* Templates - Kathrine: Possibility to add custom menu categories (https://github.com/slawkens/myaac/commit/ec11c1402417c25980582467546d1c1e9bb8267f)
 | 
				
			||||||
 | 
					* Admin Panel - Accounts Editor: Add Coins Transferable (https://github.com/slawkens/myaac/commit/45d6047031c9c3a0e7e512dc5d15c75629aec5a2, https://github.com/slawkens/myaac/commit/bb097b69ce106500a49686d6f4fe604348eaa310)
 | 
				
			||||||
 | 
					* Highscores:
 | 
				
			||||||
 | 
					  * Revamped: (https://github.com/slawkens/myaac/commit/d8132d4d76e03d5aa0c042be426320655a601392)
 | 
				
			||||||
 | 
					    * Show real rank, if 2 or more players have the same skill, show them with same rank
 | 
				
			||||||
 | 
					    * New setting: highscores_online_status
 | 
				
			||||||
 | 
					    * Additional fields passed to twig: updatedAt, totalResults, page, baseLink
 | 
				
			||||||
 | 
					  * Add new Setting: Display Skills Box (https://github.com/slawkens/myaac/commit/36ca755243ef1c83f6ac87465b426d4d8d3b0bb9)
 | 
				
			||||||
 | 
					* Functions: Add getExperienceForLevel (level) (https://github.com/slawkens/myaac/commit/1566deb84a082176b8c683fda205d828bc38fbcc)
 | 
				
			||||||
 | 
					* Commands - cache:clear : Add warning about APCu clear in CLI (https://github.com/slawkens/myaac/commit/83f84172e02e8ea2ccb6dca29bc033e44c35aebc)
 | 
				
			||||||
 | 
					* Models - PlayerOnline: Add missing $fillable into model (https://github.com/slawkens/myaac/commit/43415cf35db1c1307f2684c1728693d65065ffff)
 | 
				
			||||||
 | 
					* Twig: add cache variable (https://github.com/slawkens/myaac/commit/0efe47ce71c4b364a9e96bc5a55b1655326ae6da)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Changed
 | 
				
			||||||
 | 
					* pages/online: add cache, resulting in 20x performance boost
 | 
				
			||||||
 | 
					  * (for an example server with 2k players) (https://github.com/slawkens/myaac/commit/c8363086015cbb6e8786c398c7b9ac3959a26ec4)
 | 
				
			||||||
 | 
					* Admin Bar: Move admin bar code into body_start place_holder (https://github.com/slawkens/myaac/commit/f17269e44ce9dd38447bd2e2a8e1bdb065d4161f)
 | 
				
			||||||
 | 
					* Cache::remember: $ttl = 0 means no cache (https://github.com/slawkens/myaac/commit/3b47e9df2f4051807c5ff87892f7fa3d348f9c55)
 | 
				
			||||||
 | 
					* Templates: Load config.ini with $process_sections set to true (https://github.com/slawkens/myaac/commit/a89f9a84847630eb75b4890fdcc8b7a7bfa6b8ac)
 | 
				
			||||||
 | 
					* Twig: Allow for timestamp as integer in the timeago twig function
 | 
				
			||||||
 | 
					  (https://github.com/slawkens/myaac/commit/34fead906ea13b9f09d7a3c41ed88109d34d386c)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Fixed
 | 
				
			||||||
 | 
					* Settings: Fixed two exceptions (https://github.com/slawkens/myaac/commit/6e5a4ff8c78ff5373aba091baa66cae029557643, https://github.com/slawkens/myaac/commit/20d69a641c0a933d14889a89da6d32f6a4bc6c7d)
 | 
				
			||||||
 | 
					* Models\Account + OTS_Account -> isPremium -> ignore config.freePremium (https://github.com/slawkens/myaac/commit/5271633bdbfbbfed0b1d59c403093ce6fc2b7d20)
 | 
				
			||||||
 | 
					* Admin Panel - Mailer:
 | 
				
			||||||
 | 
					  * Fix send to email link redirecting from accounts page (https://github.com/slawkens/myaac/commit/080cc2781f034c844af658229e495e9a47fd2298)
 | 
				
			||||||
 | 
					  * Option to send only to verified accounts - only if setting('core.account_mail_verify') enabled (https://github.com/slawkens/myaac/commit/cf7fd20452e863980045bb5d6012ec86c6e8e01f)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Internal
 | 
				
			||||||
 | 
					* Rewrite to use constants (account transferable coins) (https://github.com/slawkens/myaac/commit/bccf8e056df985bbe1bab5f7ab5492f714d6b62b)
 | 
				
			||||||
 | 
					* Refactor to use HAS_ACCOUNT_COINS (https://github.com/slawkens/myaac/commit/caf326a6584a234775ebc6c8000ea02b3fecd160)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## [1.7.1 - 27.06.2025]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Changed
 | 
				
			||||||
 | 
					* Rename plugin:install:install to plugin:setup, also add alias to previous command (https://github.com/slawkens/myaac/commit/13d33822b59df349199e885a78a3d6beb0863d0b)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Fixed
 | 
				
			||||||
 | 
					* Fix commands: setup + cache:clear (https://github.com/slawkens/myaac/commit/0da524fefe93b3028392e9014550eea3324d3a22, https://github.com/slawkens/myaac/commit/fe8281594e989f00280ba1adc734a9198c6b5cc1)
 | 
				
			||||||
 | 
					* Fix polls link in tibiacom template (https://github.com/slawkens/myaac/commit/d90fa323d7c77d81768df60feeb1c374b1650a0c)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## [1.7 - 22.06.2025]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Added
 | 
				
			||||||
 | 
					* Feature: plugins versions check (#310)
 | 
				
			||||||
 | 
					* New hooks: HOOK_ACCOUNT_MANAGE_AFTER_CHARACTERS, HOOK_GUILDS_AFTER_MANAGE_BUTTON (https://github.com/slawkens/myaac/commit/c074a48f245df55646b6705737f667b6a84149b2, https://github.com/slawkens/myaac/commit/e6100a1b72de8695bba1dae9ba4e28bfdce47b10)
 | 
				
			||||||
 | 
					* Add OTS_Toolbox::getVocationName(id, promotion) + OTS_Player->isNameLocked() (https://github.com/slawkens/myaac/commit/e222957893c4a1de0dc8dbba55bce1a43418d275, https://github.com/slawkens/myaac/commit/522f6c11d835afd36fd07a07074d96d7e219b488)
 | 
				
			||||||
 | 
					* Add missing csrf in more places, causing white page with error about Request (https://github.com/slawkens/myaac/commit/dca904e61d21d856bf809070e7652803a2df0f58, https://github.com/slawkens/myaac/commit/c720ccc451ff90ef40b2a1595468d061ffd7e1e4)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Changed
 | 
				
			||||||
 | 
					* Revamped online page (https://github.com/slawkens/myaac/commit/9a90e4aae280e607430511c6727d9a714b11f4c5, https://github.com/slawkens/myaac/commit/4767120043b09141870383e249f3729638d53dc2)
 | 
				
			||||||
 | 
					* Better $title inventing (https://github.com/slawkens/myaac/commit/0c95bcfd06b68b21512e477646ef7bd3a0d4912b)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Fixed
 | 
				
			||||||
 | 
					* Use apcu cache clear (https://github.com/slawkens/myaac/commit/b329da52aae9d0e21120a6444d3caf442420ce50, https://github.com/slawkens/myaac/commit/566c2a9151ab6392286f74e26853faa19a1b4f24)
 | 
				
			||||||
 | 
					* fix: boostedcreatures for 13.40 (by @GooseWithAKnife) (#307)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## [1.6.1 - 11.06.2025]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Fixed
 | 
				
			||||||
 | 
					* Fixed "Request has been cancelled due to security reasons", cause of missing csrf() in twig files (https://github.com/slawkens/myaac/commit/10cd71a6630ffec91b43a26a6d685b66c5836a6a)
 | 
				
			||||||
 | 
					* Fix: Ignore duplicated route exception (https://github.com/slawkens/myaac/commit/9d8e9d27bd87167d8d4005942a6af62bfe4c0892)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Changed
 | 
				
			||||||
 | 
					* Move counter & visitors code before router (In case someone wants to include that info on page) (https://github.com/slawkens/myaac/commit/f78285030708ad3c74ab048711f73bbf3ee5281e)
 | 
				
			||||||
 | 
					* Set TinyMCE license key to gpl (Avoid warning message in browser console) (https://github.com/slawkens/myaac/commit/8d29fdb98b92dbc3d2853ef88a185c67036b4a77)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Removed
 | 
				
			||||||
 | 
					* Remove deprecated TinyMCE plugin - template (https://github.com/slawkens/myaac/commit/309c1fb715b882e67cb673b1544a03befbf64a22)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## [1.6 - 03.06.2025]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Added
 | 
				
			||||||
 | 
					* Add new setting/configurable: site_url, prevents domain spoofing (https://github.com/slawkens/myaac/commit/d8a6090be382c35c19117cfef964b594ed02b8d4)
 | 
				
			||||||
 | 
					* Add new account coins setting (https://github.com/slawkens/myaac/commit/28886551e86fe562172c4c7f2afb89a2e7672c2e)
 | 
				
			||||||
 | 
					* autoload: settings/install/init.php (https://github.com/slawkens/myaac/commit/e5749437074c3b3556628a2aeb5bad2edf97bde0, https://github.com/slawkens/myaac/commit/7d213f479a7e40c6254069b5fc4e578dc32bf8d9, https://github.com/slawkens/myaac/commit/207d6bc69120aba1af2b51808f17e0059b571fed)
 | 
				
			||||||
 | 
					* Protect against csrf in more places (accounts & guilds & forums pages) (https://github.com/slawkens/myaac/commit/6eda38603c8ed7e99b92a78a4600b1245377f74d, https://github.com/slawkens/myaac/commit/e776bd52beb3064a9e694efd1b9021ec972ee2f6, https://github.com/slawkens/myaac/commit/84d502bf105f2a789481fba1acc820d236b4de66)
 | 
				
			||||||
 | 
					* Added two new hooks for pages loaded from database (custom pages): HOOK_BEFORE_PAGE_CUSTOM, HOOK_AFTER_PAGE_CUSTOM (https://github.com/slawkens/myaac/commit/c961a1ebf837f2ab1734a825ff2c57b4937610c9)
 | 
				
			||||||
 | 
					* Add global variables into $hooks->executeFilter (https://github.com/slawkens/myaac/commit/8fdea943768b20193eede99d60313ee84511a0be)
 | 
				
			||||||
 | 
					* Add getNPCsCount() to OTS_InfoRespond (https://github.com/slawkens/myaac/commit/7d435ff6433ef1fb2295ee79ed043ee10dc725e9)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Fixed
 | 
				
			||||||
 | 
					* Allow [] in character name (https://github.com/slawkens/myaac/commit/de6603a51347b9e656c58637ed9971fffdd7cedd)
 | 
				
			||||||
 | 
					* Do not allow access to tools/ folder after install (https://github.com/slawkens/myaac/commit/6e0f5913831f8dba69fd2d1505be3e2a303c6324)
 | 
				
			||||||
 | 
					* Fix CHANGELOG-1.x.md loading in admin panel (https://github.com/slawkens/myaac/commit/4a30fb495dbfbe1d434e8d52419eaf44fe517aee)
 | 
				
			||||||
 | 
					* Fix links not working in admin dashboard modules (https://github.com/slawkens/myaac/commit/be7b27c31aa3bbd6c0289c34d1e61139a3fe015c)
 | 
				
			||||||
 | 
					* Fix twig variables: logged + account_logged being not set directly after login (https://github.com/slawkens/myaac/commit/1e9b10d6489c488cadf7f6ed17b42f1ea6c767a8)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Changed
 | 
				
			||||||
 | 
					* OTS_ServerInfo -> move setTimeout out of class - Possibility to use the class without MyAAC (https://github.com/slawkens/myaac/commit/40d65a6613149fda51bdceb82c807e5301a3388b)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## [1.5 - 14.05.2025]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Added
 | 
				
			||||||
 | 
					* Feature/twig hooks filters (#258)
 | 
				
			||||||
 | 
					* Add latest client versions (14.00 - 15.01) (https://github.com/slawkens/myaac/commit/5367df23812c6182863353c9a39fd7fb0b743f4b)
 | 
				
			||||||
 | 
					* db variable to twig (https://github.com/slawkens/myaac/commit/5ed1aec28e146b871a75597411d12e42a067f4e6)
 | 
				
			||||||
 | 
					* New filter: HOOK_FILTER_ROUTES (https://github.com/slawkens/myaac/commit/9b75011224f385db8b27e109bfeb28e75b9d779c)
 | 
				
			||||||
 | 
					* Allow optionally separate folder for views (thanks @Scrollog for idea) (https://github.com/slawkens/myaac/commit/03e275213901a89edb0ebb8974b776a992ab391f)
 | 
				
			||||||
 | 
					* Add float & double types to the Settings (https://github.com/slawkens/myaac/commit/67ab425bb9796d9d123296e3fda542fa8f7f05ee)
 | 
				
			||||||
 | 
					* Add optional param _page_only for single-page apps etc. (https://github.com/slawkens/myaac/commit/113473f2560aab6d364c301cc14a8b5ba8f309f4)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Changed
 | 
				
			||||||
 | 
					* Change OTS_Account->getPremDays to not return -1 in case of freePremium (https://github.com/slawkens/myaac/commit/3befde2a1e4d24a011311e785f15185db57e19b8)
 | 
				
			||||||
 | 
					* Add note about highscores being updated x minutes + allow ttl 0 to disable cache (https://github.com/slawkens/myaac/commit/a161cff00329da6f970f3a70967fe8346fe92bbc)
 | 
				
			||||||
 | 
					* Better monster images (no image not found anymore) + use cache (https://github.com/slawkens/myaac/commit/73a5829974ceca3f02d7925d5cfbd5fa50b1bbd2)
 | 
				
			||||||
 | 
					* Rename server-info -> ots-info, changelog -> change-log (Due to conflict with apache2 server-info mod) (https://github.com/slawkens/myaac/commit/3949d84e5d7631f332111b6d00278bddbd0ad10a)
 | 
				
			||||||
 | 
					* Move rules page to admin panel (https://github.com/slawkens/myaac/commit/3949d84e5d7631f332111b6d00278bddbd0ad10a)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Fixed
 | 
				
			||||||
 | 
					* php 8.4 warnings
 | 
				
			||||||
 | 
					* Visitors counter not working properly on dev mode (https://github.com/slawkens/myaac/commit/da151051186c913dd0dd091aabe893649c2b9ee7)
 | 
				
			||||||
 | 
					* Fix login.php boosted creature & boss (not sure exact version, but should be 14.12 or around) (https://github.com/slawkens/myaac/commit/c48b8006319f6c3b5f082befd16785420bb98110)
 | 
				
			||||||
 | 
					* Fix installMenus when theme/template was removed from disc (https://github.com/slawkens/myaac/commit/c24c580796bccd54bf9e95b864763f4642684d55)
 | 
				
			||||||
 | 
					* Fix if user removes the menu category (https://github.com/slawkens/myaac/commit/dbea69f31478391dacfbbc02c8353c39b4245daf)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Updated:
 | 
				
			||||||
 | 
					* Update cypress from version ^13.17.0 to ^14.3.3 (https://github.com/slawkens/myaac/commit/629fd18ea166860d5898a822f44f9277da6ce43d)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## [1.4 - 22.04.2025]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Added
 | 
				
			||||||
 | 
					* feat: admin-pages (can add admin pages through plugins) (https://github.com/slawkens/myaac/commit/ceaa0639e66d31e8177ff90791463470367aa45d)
 | 
				
			||||||
 | 
						* just place the page in admin-pages folder in the plugin
 | 
				
			||||||
 | 
						* Also, possibility to overwrite default myaac admin pages
 | 
				
			||||||
 | 
					* Add db->hasTableAndColumns(table, columns), credits to @opentibiabr Team (https://github.com/slawkens/myaac/commit/82a533d88c8a342076891d132b4b409ed9a1fe72)
 | 
				
			||||||
 | 
					* Add noSubmit option to buttons.base (https://github.com/slawkens/myaac/commit/64f6d3abcada3bf9fd7599f50d2fac0a1367f383)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Fixed
 | 
				
			||||||
 | 
					* Fix: display 404 error instead of 500 when page has been removed from filesystem (https://github.com/slawkens/myaac/commit/c2bf94fb2370d2009a2eb907f818955132cf8611)
 | 
				
			||||||
 | 
					* Fix headline.php: change image format to .png cause of black background (https://github.com/slawkens/myaac/commit/b618084d50918539d9a70abd97e764137b966067)
 | 
				
			||||||
 | 
					* Clear cache on plugin enable/disable, fixes some issues with plugin pages being cached (https://github.com/slawkens/myaac/commit/1d0c173e7d000aecbd432800941fc3e38a0e50f2)
 | 
				
			||||||
 | 
					* Do not autoload sub-folders if autoload pages is disabled (https://github.com/slawkens/myaac/commit/d47195a7878095336f9c9edc6f96244257f67eec)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Changed
 | 
				
			||||||
 | 
					* SQL Syntax Standardization (by @JoaozinhoBrasil, #298)
 | 
				
			||||||
 | 
					* Pages in theme/template folder will now have precedence over normal pages (https://github.com/slawkens/myaac/commit/6d8f4718a1d349fba8f0ebc39cfd3a1a84d104b0)
 | 
				
			||||||
 | 
					* Small changes in account.login.html.twig (https://github.com/slawkens/myaac/commit/f40b986b59d4c8fa89ab4745731bf366f8619976)
 | 
				
			||||||
 | 
					* Plugin name is required, version is optional (https://github.com/slawkens/myaac/commit/e6f05a2731c61d931be49e121c068e49c0ad5e01)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## [1.3.3 - 04.04.2025]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Fixed
 | 
				
			||||||
 | 
					* Fix uninstall plugin when plugin is disabled (https://github.com/slawkens/myaac/commit/6c568fd36a271270684fc412ccd556b230273a6d)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Changed
 | 
				
			||||||
 | 
					* Display more useful info when error parsing config.lua (https://github.com/slawkens/myaac/commit/fa6b6aa153ffc131e0d1631a4dcd9012a5850c2e)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Other
 | 
				
			||||||
 | 
					* Small adjustments (https://github.com/slawkens/myaac/commit/35e2483de86e295bdf089cceffa25842eeb2e34c, https://github.com/slawkens/myaac/commit/ae639d65b0bfa491e747e907e2ebc77f83f47981)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## [1.3.2 - 01.04.2025]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Fixed
 | 
				
			||||||
 | 
					* Fix debugBar/admin panel menu when using custom base_dir (https://github.com/slawkens/myaac/commit/65696f63e3aac02ff952ea81279e7cb2fa7570fb)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Changed
 | 
				
			||||||
 | 
					* Settings: Show/hide IP Ban Protection options depending on the value (enabled/disabled) (https://github.com/slawkens/myaac/commit/dbf73d0b61b45601ae95e51b23c051c2704169c5)
 | 
				
			||||||
 | 
					* Do not require init.php in cache:clear command (https://github.com/slawkens/myaac/commit/d25c71857f767834239bbffacd00fdc671adb157)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## [1.3.1 - 19.03.2025]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Fixed
 | 
				
			||||||
 | 
					* Fixed migrate:run command (https://github.com/slawkens/myaac/commit/1a5771ad51e595fe13368a0721b059c4ecefb17d)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Changed
 | 
				
			||||||
 | 
					* Small adjustments (https://github.com/slawkens/myaac/commit/6fac883659f581baac1361826d046410156f1e58, https://github.com/slawkens/myaac/commit/4a6896b4469968b9904292734cf6c14ba5eeef14)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## [1.3 - 10.03.2025]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Changed
 | 
				
			||||||
 | 
					* Use latest outfit-images host from @gesior (https://github.com/slawkens/myaac/commit/529bdcf016dd0f9dffbc34d81f99a046a9ddb70d)
 | 
				
			||||||
 | 
					* Change monster link to $_GET ?name= (https://github.com/slawkens/myaac/commit/4c5cc8b573b2b3e7ec00a22b7ede30a68083a924)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Fixed
 | 
				
			||||||
 | 
					* Fixed house links (https://github.com/slawkens/myaac/commit/887b5068ad11c4cdab614afd34525caba785ce13)
 | 
				
			||||||
 | 
					* Fixed long title on headline.php (https://github.com/slawkens/myaac/commit/3e3f4bb5a514158ec8777684ca6c7f1c2a37bed5)
 | 
				
			||||||
 | 
					* Fixed menu colors once again, plus add !important tag (https://github.com/slawkens/myaac/commit/aa52df6e2ec92cafc25b655ae907bf2e1746d9cc)
 | 
				
			||||||
 | 
					* Fix: add possibility to remove all menu items in admin panel (https://github.com/slawkens/myaac/commit/00fe1adc15ea7646596d755f6e6e1f7854ffc1d5, https://github.com/slawkens/myaac/commit/9239a4f4198c3ad260802ac3b47e9c41b80b754e)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## [1.2 - 09.02.2025]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Added
 | 
				
			||||||
 | 
					* Twig session(key) function + reworked session functions to accept multi-array like in Laravel (https://github.com/slawkens/myaac/commit/b46ddb43d03ef7e5fc34e555e92e856bdc905691)
 | 
				
			||||||
 | 
					* add template_name to twig variables (https://github.com/slawkens/myaac/commit/ae1161d77050bda181802b4496c9de920a7bb1bc)
 | 
				
			||||||
 | 
					* add HOOK_INIT, executed just after $hooks are loaded (https://github.com/slawkens/myaac/commit/19686725dc810f63a07f049f82c66cf336d90ca6)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Changed
 | 
				
			||||||
 | 
					* settings: password input hide/show, enable Save button only if changes has been made, save settings in transaction (https://github.com/slawkens/myaac/commit/4fda4f643b60a151179e5dd4f04912fb2618d98f, https://github.com/slawkens/myaac/commit/28fef952f857b79d64bc7495ffa5e1999e68e192, https://github.com/slawkens/myaac/commit/4b6024dc451accadb6c469fa282a9a764c1c0a81)
 | 
				
			||||||
 | 
					* rework menus: Different categories can have different colors + Option to reset menus (https://github.com/slawkens/myaac/commit/73de93a561f6b13111e019075724357d8a617249, https://github.com/slawkens/myaac/commit/3da3e62c5b12390d75de9b3320729bcca6e0b458)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Fixed
 | 
				
			||||||
 | 
					* highscores: Fix online status + vocation for TFS 0.x (https://github.com/slawkens/myaac/commit/ea51ad27c38be88d86514cb979bb394fcfbef1f0)
 | 
				
			||||||
 | 
					* clear cache button in admin bar needed to be clicked twice until it worked (https://github.com/slawkens/myaac/commit/ea51ad27c38be88d86514cb979bb394fcfbef1f0)
 | 
				
			||||||
 | 
					* HOOK_STARTUP location (https://github.com/slawkens/myaac/commit/a73fb1003ee3f812cf182d1834d65f08e6f60d1f)
 | 
				
			||||||
 | 
					* if vocation name has more words (https://github.com/slawkens/myaac/commit/9d7fc98e1e0a96b59ecc1a7c39800a64445db364)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Updated
 | 
				
			||||||
 | 
					* Bump twig/twig from 3.18.0 to 3.19.0 (#284)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## [1.1 - 27.01.2025]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Changed
 | 
				
			||||||
 | 
					* adjust mailer settings descriptions to latest gmail (https://github.com/slawkens/myaac/commit/c5d5bb80671db135e6b503f53684771c7272e05d)
 | 
				
			||||||
 | 
					* optimize $player->isOnline() function, thanks @gesior (https://github.com/slawkens/myaac/commit/10dd818b139d5e1bb1ca9ec81edfb083ba9316b4)
 | 
				
			||||||
 | 
					* make players.comment and guilds.description VARCHAR (https://github.com/slawkens/myaac/commit/a45ceab83a74bee2b89cdb72baceda75e577e3cf)
 | 
				
			||||||
 | 
					* add lua/ folder to .gitignore (https://github.com/slawkens/myaac/commit/07012f786b1114cb6ab2f064f82c645b136a375a)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Fixed
 | 
				
			||||||
 | 
					* general fixes in the tibiacom template menus, better support for custom menus
 | 
				
			||||||
 | 
					* make functions_custom.php optional (https://github.com/slawkens/myaac/commit/dc2b5afd9980984e2b259c9fc99f2ade46f70a5a)
 | 
				
			||||||
 | 
					* error in CLI, where BASE_URL is not defined (https://github.com/slawkens/myaac/commit/4d749b881582f64b5a46196dbbb5ee8097127f03)
 | 
				
			||||||
 | 
					* hook ACCOUNT_LOGIN_BEFORE_ACCOUNT location (https://github.com/slawkens/myaac/commit/669c447fca8643ce56d9ef8c1374ec647c780998)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## [1.0.1 - 14.01.2025]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Fixed
 | 
				
			||||||
 | 
					* tibiacom account & news menu links not auto expanding
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Updated (Thanks dependabot)
 | 
				
			||||||
 | 
					* twig from ^2.0 to ^3.11
 | 
				
			||||||
 | 
					* tinymce from ^6.8.3 to ^7.2.0
 | 
				
			||||||
 | 
					* cypress from ^12.12.0 to ^13.17.0
 | 
				
			||||||
 | 
					* nesbot/carbon from 2.72.5 to 2.72.6
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## [1.0 - 12.01.2025]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					First stable release in the v1.0 series.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Minimum PHP 8.1 is required.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Changes since RC.2:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Added
 | 
				
			||||||
 | 
					* feature: migrations up/down. Allows to downgrade/upgrade database to specified version (https://github.com/slawkens/myaac/commit/3f6ff3a3326b0475d28d11ffd7fff51f362d799f)
 | 
				
			||||||
 | 
					* new hooks for news management (https://github.com/slawkens/myaac/commit/011a85d8ae34283ded6999882833f9d4797028ec, https://github.com/slawkens/myaac/commit/36bd3eb846e829b45313e10f7568dc4e95841143)
 | 
				
			||||||
 | 
					* None Vocation to highscores (can be changed to RookStayer in Admin Panel) (https://github.com/slawkens/myaac/commit/a4a248099521bb5b8b2aa5bd592138debd2f19d5)
 | 
				
			||||||
 | 
					* support for button_color (green, red, blue) (https://github.com/slawkens/myaac/commit/d8b6b749ee62e88b6af4a05d3d7557f90b94d94e)
 | 
				
			||||||
 | 
					* add $whoopsHandler as variable, can be used by plugins (https://github.com/slawkens/myaac/commit/b0c8cf2ecda23045d725aaf43cfb3852ed766a4b)
 | 
				
			||||||
 | 
					* PlayerModel->outfit_url attribute (https://github.com/slawkens/myaac/commit/3b5be1a8db5dceecaa388e2925a5536d13b38881)
 | 
				
			||||||
 | 
					* support for selecting plugin themes in Admin menus.php (https://github.com/slawkens/myaac/commit/77a2c1cec343ffe4be5c2c2503ee81bc32a14ca1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Changed
 | 
				
			||||||
 | 
					* schema: Change character set to utf8mb4 (support for Emojis in Menus/Pages/News/Forum etc.) (https://github.com/slawkens/myaac/commit/27c44f1bdfb6234cf0c9d5b4b491123bb205b08f)
 | 
				
			||||||
 | 
					* prefer get_browser_real_ip() over REMOTE_ADDR (https://github.com/slawkens/myaac/commit/941846605c00cee83168d2f916410b8ba8d4b7b9)
 | 
				
			||||||
 | 
					* automatically set selected current one on highscores filters (https://github.com/slawkens/myaac/commit/e96227fbe41ae281783b2d49edb169a603601813)
 | 
				
			||||||
 | 
					* rewrite towns loading code, removed OTBM loader (was too slow) (https://github.com/slawkens/myaac/commit/c980a0914632e7b27f718464f669a200707d217e)
 | 
				
			||||||
 | 
					* allow OTS_Player to be passed as object to getPlayerLink (https://github.com/slawkens/myaac/commit/84d37c5a8f2c4535a41c8aa8264752969d3f3a3d)
 | 
				
			||||||
 | 
					* do not clear menus by default on install (https://github.com/slawkens/myaac/commit/12d8faa3eda5e798f97b71e941c035187daad96e)
 | 
				
			||||||
 | 
					* display warning in admin panel - plugins - if zip extension is not installed (https://github.com/slawkens/myaac/commit/e3ffe5d9e11d78ab064a370d8541bac351c9bcd9)
 | 
				
			||||||
 | 
					* set default_socket_timeout for ipinfo.io checkup to 5 seconds (https://github.com/slawkens/myaac/commit/783d96fc6568a607d3198b832fed3a0dd06c4ebb)
 | 
				
			||||||
 | 
					* refactor getTopPlayers function (support for balance) (https://github.com/slawkens/myaac/commit/c769962e39fe8dfb72ecd5be1864e145696be794)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Fixed
 | 
				
			||||||
 | 
					* XSS in forum (https://github.com/slawkens/myaac/commit/c2b7286d20d4b579171540f7a774e8a0995d5e8f, https://github.com/slawkens/myaac/commit/8fb643596f9586005976e7bdb484a541a9d8715e)
 | 
				
			||||||
 | 
					* price deducted when changing sex (https://github.com/slawkens/myaac/commit/16671ea40b72dcf74037c359ad572f9eb825edf9)
 | 
				
			||||||
 | 
					* move_thread by unauthorized user (https://github.com/slawkens/myaac/commit/d6c40c836a53cb1710f911f77f45f28b54ea1b54, thanks @anyeor)
 | 
				
			||||||
 | 
					* TFS 1.4.2 where conditions is NULL (https://github.com/slawkens/myaac/commit/b8396d4c8482e951da538b13f2296123732c4545)
 | 
				
			||||||
 | 
					* do not show forum new thread show button if not logged in (https://github.com/slawkens/myaac/commit/507402171ba3b6e7ee184bd7fa73e0d55e0cad7a, @anyeor)
 | 
				
			||||||
 | 
					* login if limiter is disabled (https://github.com/slawkens/myaac/commit/a0f1971583f0f790013e2145fb5ac573c59fbdef)
 | 
				
			||||||
 | 
					* fixes to installMenus function (https://github.com/slawkens/myaac/commit/a2fadc5945fe0a5e39f740827f6ffbda1bb501e2)
 | 
				
			||||||
 | 
					* many PHP exceptions in different places
 | 
				
			||||||
 | 
					* fixes to tibiacom menus ActiveSubmenuItem
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Removed
 | 
				
			||||||
 | 
					* bugtracker SQL table code as the page has been removed/moved to plugins (https://github.com/slawkens/myaac/commit/5782772b901b05fb814bc718d062f6e2cd71df8c)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## [1.0-RC.2 - 25.10.2024]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Still waiting for your reports about bugs found in this release. We are very close to stable release.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Added
 | 
				
			||||||
 | 
					* feat: rate limit settings for blocking accounts login attempts (@gpedro, #266)
 | 
				
			||||||
 | 
					* search by email in accounts editor (https://github.com/slawkens/myaac/commit/c2ec46824621468f2a1cb4046805c485ed13fea5)
 | 
				
			||||||
 | 
					* New hooks in account manage + create (https://github.com/slawkens/myaac/commit/93641fc68ac9a5f1479329e2bd41380c19534d5d)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Changed
 | 
				
			||||||
 | 
					* chore: drop raw queries + accounts - search by email + accounts - required min size for search by account number (@gpedro, #266)
 | 
				
			||||||
 | 
					* Use https for outfit & item images (https://github.com/slawkens/myaac/commit/71c00aa5e01fbdfd88802912e200dd1025976231)
 | 
				
			||||||
 | 
					* Do not require players & guilds tables on install (https://github.com/slawkens/myaac/commit/779aa152fa940261c9b161533946f44e288597a2)
 | 
				
			||||||
 | 
					* Do not create player if there is no players table in db (https://github.com/slawkens/myaac/commit/201f95caa8b70e88fa651eac8c3c3aa7cd765bd0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Fixed
 | 
				
			||||||
 | 
					* Highscore frags fixed for TFS 0.3 (@Scrollog, #263)
 | 
				
			||||||
 | 
					* Missing groups variable #262. thanks, @Scrollog for reporting (https://github.com/slawkens/myaac/commit/8d8bdb6dac6df21672ac77288fff2f2f8d6eb665)
 | 
				
			||||||
 | 
					* Verified email for login.php (@gpedro, #265)
 | 
				
			||||||
 | 
					* Warning if core.account_country is disabled (https://github.com/slawkens/myaac/commit/ab73d60c61e14a1cacdb6cfbf7f89f4bf3be0833)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## [1.0-RC.1 - 23.07.2024]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Changes since 1.0-beta:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Added
 | 
				
			||||||
 | 
					* Feat: Hooks priority (https://github.com/slawkens/myaac/commit/dc17b701da053e04bfa64e21be9247a4f07505e1)
 | 
				
			||||||
 | 
					* Make autoload of pages, commands and themes configurable (https://github.com/slawkens/myaac/commit/c1d4b4f80cd6bb85507ee9471e47013955a26a91)
 | 
				
			||||||
 | 
					* Fraggers in characters page for TFS 1.x and canary (https://github.com/slawkens/myaac/commit/42f99c3edc8de39cccc5632cb42e88b24579c5a6)
 | 
				
			||||||
 | 
					* New hooks: HOOK_INSTALL_FINISH, HOOK_ACCOUNT_CREATE_CHARACTER_* (https://github.com/slawkens/myaac/commit/08ac8ebade106521a5c7396faa5ce7006e629f7c, https://github.com/slawkens/myaac/commit/45dda5e834ff2059faea6ef9be2efa76f1723cbd)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Changed
 | 
				
			||||||
 | 
					* Allow account_create_character_create even if account_mail_verify is activated (https://github.com/slawkens/myaac/commit/203e411b626fe62401a4b74a48420769e512aa39)
 | 
				
			||||||
 | 
					* Create guild_rank entries, in case MySQL trigger not loaded (https://github.com/slawkens/myaac/commit/d9c1b2507c81f306970642b35e4bf5f7cc04a6f2, https://github.com/slawkens/myaac/commit/47a19e85dd84e9f3b39a1b29cfc2c04b004832b9)
 | 
				
			||||||
 | 
					* Set Admin Account verified by default (https://github.com/slawkens/myaac/commit/cd49dfc79942f3301ce9c0b8d899b9f39bda9a41)
 | 
				
			||||||
 | 
					* Refactor account routes into sub folders (https://github.com/slawkens/myaac/commit/bdc0c43d3fd3a51030c3e916bdb9f008468f5ecd)
 | 
				
			||||||
 | 
					* Order towns by id (https://github.com/slawkens/myaac/commit/9ea2a5067fc4b75de395f381577b18914132ad84)
 | 
				
			||||||
 | 
					* Do not create news about myaac, if any news already exist (on installation (https://github.com/slawkens/myaac/commit/504242fb846b73b56b87bc1e39d070687ad7f5b4)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Fixed
 | 
				
			||||||
 | 
					* Not working google recaptcha plugin (https://github.com/slawkens/myaac/commit/a1bcb217ecf4e21fd58da4ba491da1852029898a)
 | 
				
			||||||
 | 
					* Not working account create if account_country is disabled (https://github.com/slawkens/myaac/commit/933b681a9fcdbb6283e0469b3806d2ded492d232)
 | 
				
			||||||
 | 
					* Account verify - do not allow login without verified email (Thanks @anyeor, https://github.com/slawkens/myaac/commit/fcb13f3c0fb8ceafda0bd614a229a26a269432bd)
 | 
				
			||||||
 | 
					* Detect tools/ext exists on install to prevent broken installs (https://github.com/slawkens/myaac/commit/10a739773c4f2911876bc802a0ee0537c3e00a92)
 | 
				
			||||||
 | 
					* Cache reloading each time page refreshes (https://github.com/slawkens/myaac/commit/ec96985872057340112f65073efc0c4bf86dddb0)
 | 
				
			||||||
 | 
					* Highscores frags for TFS 1.x and canary (https://github.com/slawkens/myaac/commit/a04d186c22912915f0a7873dfe677ef3b5a23c79)
 | 
				
			||||||
 | 
					* Monsters page: monster not found exception (https://github.com/slawkens/myaac/commit/ef79b99b8acc179f14b8475547347d9daca27512)
 | 
				
			||||||
 | 
					* Fixed bug if \<flags\> are not present in monster.xml (https://github.com/slawkens/myaac/commit/57b47ab7983f625c7c0ef4f5303a4d07ef172786)
 | 
				
			||||||
 | 
					* fastRoute duplicate errors (https://github.com/slawkens/myaac/commit/4c0739d3e93812dff0c33849ea3f38e4e49113ac)
 | 
				
			||||||
 | 
					* useGuildNick displaying (https://github.com/slawkens/myaac/commit/0db0ec1aa47e044c26bc403ff5078a2115d086f8)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## [1.0-beta - 18.05.2024]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Minimum PHP version for this release is 8.1.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Added
 | 
				
			||||||
 | 
					* reworked Admin Panel (@Leesneaks, @gpedro, @slawkens)
 | 
				
			||||||
 | 
					  * updated to Bootstrap v4
 | 
				
			||||||
 | 
					  * new Menu
 | 
				
			||||||
 | 
					  * new Dashboard: statistics, server status
 | 
				
			||||||
 | 
					  * new Admin Bar showed on top when admin logged in
 | 
				
			||||||
 | 
					  * new page: Server Data, to reload server data
 | 
				
			||||||
 | 
					    * Towns, NPCs & Items are stored in permanent cache
 | 
				
			||||||
 | 
					  * new pages: mass account & teleport tools
 | 
				
			||||||
 | 
					  * changelogs editor
 | 
				
			||||||
 | 
					  * revised Accounts & Players editors
 | 
				
			||||||
 | 
					  * option to add/modify admin menus with plugins
 | 
				
			||||||
 | 
					  * option to enable/disable plugins
 | 
				
			||||||
 | 
					  * better, updated TinyMCE editor (v6.x)
 | 
				
			||||||
 | 
					    * with option to upload images
 | 
				
			||||||
 | 
					  * list of open source libraries used in project page
 | 
				
			||||||
 | 
					* auto-loading of themes, commands & pages from plugins/ folder. You need just to place them in correct folder and they will be loaded automatically - this allows better customization, without interfering with core AAC folders. This will allow in the future automatic updates for plugins as well the AAC as whole.
 | 
				
			||||||
 | 
					* config.php moved to Admin Panel -> Settings page
 | 
				
			||||||
 | 
					* new console script: aac - using symfony/console
 | 
				
			||||||
 | 
					  * usage: `php aac` (will list all commands by default)
 | 
				
			||||||
 | 
					  * example: `php aac cache:clear`
 | 
				
			||||||
 | 
					  * example: `php aac plugin:install theme-example.zip`
 | 
				
			||||||
 | 
					* replace POT Query Builder to Eloquent ORM. Not 100% yet - in some places there is still old $db approach used (@gpedro) (https://github.com/slawkens/myaac/pull/230)
 | 
				
			||||||
 | 
					* brand new charming installation page (by @fernandomatos)
 | 
				
			||||||
 | 
					  * using Bootstrap
 | 
				
			||||||
 | 
					* new pages router: nikic/fast-route, allowing for better customisation
 | 
				
			||||||
 | 
					* Plugin cronjobs: central control of the cronjobs
 | 
				
			||||||
 | 
					* Guild Wars support (available as plugin)
 | 
				
			||||||
 | 
					* support for login and create account only by email (configurable)
 | 
				
			||||||
 | 
					  * with no need for account name
 | 
				
			||||||
 | 
					* Google ReCAPTCHA v3 support (available as plugin)
 | 
				
			||||||
 | 
					* support for Account Number
 | 
				
			||||||
 | 
					  * suggest account number option
 | 
				
			||||||
 | 
					* many new functions, hooks and configurables
 | 
				
			||||||
 | 
					* better Exception Handler (Whoops - https://github.com/filp/whoops)
 | 
				
			||||||
 | 
					* automated website tests (using Cypress)
 | 
				
			||||||
 | 
					* csrf protection (https://github.com/slawkens/myaac/pull/235)
 | 
				
			||||||
 | 
					* option to restrict Page view to specified group of users (Not-Logged in, logged-in players, tutors, gamemasters etc.)
 | 
				
			||||||
 | 
					* phpdebug bar (http://phpdebugbar.com/). Activated if env == 'dev', can be also activated in production by enabling "enable_debugbar" in local config
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Changed
 | 
				
			||||||
 | 
					* Composer and NPM is now used for external libraries like: Twig, PHPMailer, fast-route, jQuery, Bootstrap etc.
 | 
				
			||||||
 | 
					* mail support is disabled on fresh install, can be manually enabled by user
 | 
				
			||||||
 | 
					* disable add php pages in admin panel for security. Option to disable plugins upload
 | 
				
			||||||
 | 
					* visitors counter shows now user browser, and also if its bot
 | 
				
			||||||
 | 
					* changes in required and optional PHP extensions
 | 
				
			||||||
 | 
					* reworked Pages:
 | 
				
			||||||
 | 
						* Bans
 | 
				
			||||||
 | 
							* works now for TFS 1.x
 | 
				
			||||||
 | 
						* Highscores
 | 
				
			||||||
 | 
							* frags works for TFS 1.x
 | 
				
			||||||
 | 
							* cached
 | 
				
			||||||
 | 
						* Monsters
 | 
				
			||||||
 | 
					* moved pages to Twig:
 | 
				
			||||||
 | 
					  * experience stages
 | 
				
			||||||
 | 
					* update player_deaths entries on name change
 | 
				
			||||||
 | 
					* change_password email to be more informal
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Fixed
 | 
				
			||||||
 | 
					* hundreds of bug fixes, mostly patched from 0.8, so it makes no sense writing them again here
 | 
				
			||||||
							
								
								
									
										185
									
								
								CHANGELOG.md
									
									
									
									
									
								
							
							
						
						
									
										185
									
								
								CHANGELOG.md
									
									
									
									
									
								
							@@ -1,185 +0,0 @@
 | 
				
			|||||||
# Changelog
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
## [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
 | 
					 | 
				
			||||||
* error in CLI, where BASE_URL is not defined (https://github.com/slawkens/myaac/commit/4d749b881582f64b5a46196dbbb5ee8097127f03)
 | 
					 | 
				
			||||||
* hook ACCOUNT_LOGIN_BEFORE_ACCOUNT location (https://github.com/slawkens/myaac/commit/669c447fca8643ce56d9ef8c1374ec647c780998)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
## [1.0.1 - 14.01.2025]
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
### Fixed
 | 
					 | 
				
			||||||
* tibiacom account & news menu links not auto expanding
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
### Updated (Thanks dependabot)
 | 
					 | 
				
			||||||
* twig from ^2.0 to ^3.11
 | 
					 | 
				
			||||||
* tinymce from ^6.8.3 to ^7.2.0
 | 
					 | 
				
			||||||
* cypress from ^12.12.0 to ^13.17.0
 | 
					 | 
				
			||||||
* nesbot/carbon from 2.72.5 to 2.72.6
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
## [1.0 - 12.01.2025]
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
First stable release in the v1.0 series.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Minimum PHP 8.1 is required.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Changes since RC.2:
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
### Added
 | 
					 | 
				
			||||||
* feature: migrations up/down. Allows to downgrade/upgrade database to specified version (https://github.com/slawkens/myaac/commit/3f6ff3a3326b0475d28d11ffd7fff51f362d799f)
 | 
					 | 
				
			||||||
* new hooks for news management (https://github.com/slawkens/myaac/commit/011a85d8ae34283ded6999882833f9d4797028ec, https://github.com/slawkens/myaac/commit/36bd3eb846e829b45313e10f7568dc4e95841143)
 | 
					 | 
				
			||||||
* None Vocation to highscores (can be changed to RookStayer in Admin Panel) (https://github.com/slawkens/myaac/commit/a4a248099521bb5b8b2aa5bd592138debd2f19d5)
 | 
					 | 
				
			||||||
* support for button_color (green, red, blue) (https://github.com/slawkens/myaac/commit/d8b6b749ee62e88b6af4a05d3d7557f90b94d94e)
 | 
					 | 
				
			||||||
* add $whoopsHandler as variable, can be used by plugins (https://github.com/slawkens/myaac/commit/b0c8cf2ecda23045d725aaf43cfb3852ed766a4b)
 | 
					 | 
				
			||||||
* PlayerModel->outfit_url attribute (https://github.com/slawkens/myaac/commit/3b5be1a8db5dceecaa388e2925a5536d13b38881)
 | 
					 | 
				
			||||||
* support for selecting plugin themes in Admin menus.php (https://github.com/slawkens/myaac/commit/77a2c1cec343ffe4be5c2c2503ee81bc32a14ca1)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
### Changed
 | 
					 | 
				
			||||||
* schema: Change character set to utf8mb4 (support for Emojis in Menus/Pages/News/Forum etc.) (https://github.com/slawkens/myaac/commit/27c44f1bdfb6234cf0c9d5b4b491123bb205b08f)
 | 
					 | 
				
			||||||
* prefer get_browser_real_ip() over REMOTE_ADDR (https://github.com/slawkens/myaac/commit/941846605c00cee83168d2f916410b8ba8d4b7b9)
 | 
					 | 
				
			||||||
* automatically set selected current one on highscores filters (https://github.com/slawkens/myaac/commit/e96227fbe41ae281783b2d49edb169a603601813)
 | 
					 | 
				
			||||||
* rewrite towns loading code, removed OTBM loader (was too slow) (https://github.com/slawkens/myaac/commit/c980a0914632e7b27f718464f669a200707d217e)
 | 
					 | 
				
			||||||
* allow OTS_Player to be passed as object to getPlayerLink (https://github.com/slawkens/myaac/commit/84d37c5a8f2c4535a41c8aa8264752969d3f3a3d)
 | 
					 | 
				
			||||||
* do not clear menus by default on install (https://github.com/slawkens/myaac/commit/12d8faa3eda5e798f97b71e941c035187daad96e)
 | 
					 | 
				
			||||||
* display warning in admin panel - plugins - if zip extension is not installed (https://github.com/slawkens/myaac/commit/e3ffe5d9e11d78ab064a370d8541bac351c9bcd9)
 | 
					 | 
				
			||||||
* set default_socket_timeout for ipinfo.io checkup to 5 seconds (https://github.com/slawkens/myaac/commit/783d96fc6568a607d3198b832fed3a0dd06c4ebb)
 | 
					 | 
				
			||||||
* refactor getTopPlayers function (support for balance) (https://github.com/slawkens/myaac/commit/c769962e39fe8dfb72ecd5be1864e145696be794)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
### Fixed
 | 
					 | 
				
			||||||
* XSS in forum (https://github.com/slawkens/myaac/commit/c2b7286d20d4b579171540f7a774e8a0995d5e8f, https://github.com/slawkens/myaac/commit/8fb643596f9586005976e7bdb484a541a9d8715e)
 | 
					 | 
				
			||||||
* price deducted when changing sex (https://github.com/slawkens/myaac/commit/16671ea40b72dcf74037c359ad572f9eb825edf9)
 | 
					 | 
				
			||||||
* move_thread by unauthorized user (https://github.com/slawkens/myaac/commit/d6c40c836a53cb1710f911f77f45f28b54ea1b54, thanks @anyeor)
 | 
					 | 
				
			||||||
* TFS 1.4.2 where conditions is NULL (https://github.com/slawkens/myaac/commit/b8396d4c8482e951da538b13f2296123732c4545)
 | 
					 | 
				
			||||||
* do not show forum new thread show button if not logged in (https://github.com/slawkens/myaac/commit/507402171ba3b6e7ee184bd7fa73e0d55e0cad7a, @anyeor)
 | 
					 | 
				
			||||||
* login if limiter is disabled (https://github.com/slawkens/myaac/commit/a0f1971583f0f790013e2145fb5ac573c59fbdef)
 | 
					 | 
				
			||||||
* fixes to installMenus function (https://github.com/slawkens/myaac/commit/a2fadc5945fe0a5e39f740827f6ffbda1bb501e2)
 | 
					 | 
				
			||||||
* many PHP exceptions in different places
 | 
					 | 
				
			||||||
* fixes to tibiacom menus ActiveSubmenuItem
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
### Removed
 | 
					 | 
				
			||||||
* bugtracker SQL table code as the page has been removed/moved to plugins (https://github.com/slawkens/myaac/commit/5782772b901b05fb814bc718d062f6e2cd71df8c)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
## [1.0-RC.2 - 25.10.2024]
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Still waiting for your reports about bugs found in this release. We are very close to stable release.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
### Added
 | 
					 | 
				
			||||||
* feat: rate limit settings for blocking accounts login attempts (@gpedro, #266)
 | 
					 | 
				
			||||||
* search by email in accounts editor (https://github.com/slawkens/myaac/commit/c2ec46824621468f2a1cb4046805c485ed13fea5)
 | 
					 | 
				
			||||||
* New hooks in account manage + create (https://github.com/slawkens/myaac/commit/93641fc68ac9a5f1479329e2bd41380c19534d5d)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
### Changed
 | 
					 | 
				
			||||||
* chore: drop raw queries + accounts - search by email + accounts - required min size for search by account number (@gpedro, #266)
 | 
					 | 
				
			||||||
* Use https for outfit & item images (https://github.com/slawkens/myaac/commit/71c00aa5e01fbdfd88802912e200dd1025976231)
 | 
					 | 
				
			||||||
* Do not require players & guilds tables on install (https://github.com/slawkens/myaac/commit/779aa152fa940261c9b161533946f44e288597a2)
 | 
					 | 
				
			||||||
* Do not create player if there is no players table in db (https://github.com/slawkens/myaac/commit/201f95caa8b70e88fa651eac8c3c3aa7cd765bd0)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
### Fixed
 | 
					 | 
				
			||||||
* Highscore frags fixed for TFS 0.3 (@Scrollog, #263)
 | 
					 | 
				
			||||||
* Missing groups variable #262. thanks, @Scrollog for reporting (https://github.com/slawkens/myaac/commit/8d8bdb6dac6df21672ac77288fff2f2f8d6eb665)
 | 
					 | 
				
			||||||
* Verified email for login.php (@gpedro, #265)
 | 
					 | 
				
			||||||
* Warning if core.account_country is disabled (https://github.com/slawkens/myaac/commit/ab73d60c61e14a1cacdb6cfbf7f89f4bf3be0833)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
## [1.0-RC.1 - 23.07.2024]
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Changes since 1.0-beta:
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
### Added
 | 
					 | 
				
			||||||
* Feat: Hooks priority (https://github.com/slawkens/myaac/commit/dc17b701da053e04bfa64e21be9247a4f07505e1)
 | 
					 | 
				
			||||||
* Make autoload of pages, commands and themes configurable (https://github.com/slawkens/myaac/commit/c1d4b4f80cd6bb85507ee9471e47013955a26a91)
 | 
					 | 
				
			||||||
* Fraggers in characters page for TFS 1.x and canary (https://github.com/slawkens/myaac/commit/42f99c3edc8de39cccc5632cb42e88b24579c5a6)
 | 
					 | 
				
			||||||
* New hooks: HOOK_INSTALL_FINISH, HOOK_ACCOUNT_CREATE_CHARACTER_* (https://github.com/slawkens/myaac/commit/08ac8ebade106521a5c7396faa5ce7006e629f7c, https://github.com/slawkens/myaac/commit/45dda5e834ff2059faea6ef9be2efa76f1723cbd)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
### Changed
 | 
					 | 
				
			||||||
* Allow account_create_character_create even if account_mail_verify is activated (https://github.com/slawkens/myaac/commit/203e411b626fe62401a4b74a48420769e512aa39)
 | 
					 | 
				
			||||||
* Create guild_rank entries, in case MySQL trigger not loaded (https://github.com/slawkens/myaac/commit/d9c1b2507c81f306970642b35e4bf5f7cc04a6f2, https://github.com/slawkens/myaac/commit/47a19e85dd84e9f3b39a1b29cfc2c04b004832b9)
 | 
					 | 
				
			||||||
* Set Admin Account verified by default (https://github.com/slawkens/myaac/commit/cd49dfc79942f3301ce9c0b8d899b9f39bda9a41)
 | 
					 | 
				
			||||||
* Refactor account routes into sub folders (https://github.com/slawkens/myaac/commit/bdc0c43d3fd3a51030c3e916bdb9f008468f5ecd)
 | 
					 | 
				
			||||||
* Order towns by id (https://github.com/slawkens/myaac/commit/9ea2a5067fc4b75de395f381577b18914132ad84)
 | 
					 | 
				
			||||||
* Do not create news about myaac, if any news already exist (on installation (https://github.com/slawkens/myaac/commit/504242fb846b73b56b87bc1e39d070687ad7f5b4)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
### Fixed
 | 
					 | 
				
			||||||
* Not working google recaptcha plugin (https://github.com/slawkens/myaac/commit/a1bcb217ecf4e21fd58da4ba491da1852029898a)
 | 
					 | 
				
			||||||
* Not working account create if account_country is disabled (https://github.com/slawkens/myaac/commit/933b681a9fcdbb6283e0469b3806d2ded492d232)
 | 
					 | 
				
			||||||
* Account verify - do not allow login without verified email (Thanks @anyeor, https://github.com/slawkens/myaac/commit/fcb13f3c0fb8ceafda0bd614a229a26a269432bd)
 | 
					 | 
				
			||||||
* Detect tools/ext exists on install to prevent broken installs (https://github.com/slawkens/myaac/commit/10a739773c4f2911876bc802a0ee0537c3e00a92)
 | 
					 | 
				
			||||||
* Cache reloading each time page refreshes (https://github.com/slawkens/myaac/commit/ec96985872057340112f65073efc0c4bf86dddb0)
 | 
					 | 
				
			||||||
* Highscores frags for TFS 1.x and canary (https://github.com/slawkens/myaac/commit/a04d186c22912915f0a7873dfe677ef3b5a23c79)
 | 
					 | 
				
			||||||
* Monsters page: monster not found exception (https://github.com/slawkens/myaac/commit/ef79b99b8acc179f14b8475547347d9daca27512)
 | 
					 | 
				
			||||||
* Fixed bug if \<flags\> are not present in monster.xml (https://github.com/slawkens/myaac/commit/57b47ab7983f625c7c0ef4f5303a4d07ef172786)
 | 
					 | 
				
			||||||
* fastRoute duplicate errors (https://github.com/slawkens/myaac/commit/4c0739d3e93812dff0c33849ea3f38e4e49113ac)
 | 
					 | 
				
			||||||
* useGuildNick displaying (https://github.com/slawkens/myaac/commit/0db0ec1aa47e044c26bc403ff5078a2115d086f8)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
## [1.0-beta - 18.05.2024]
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Minimum PHP version for this release is 8.1.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
### Added
 | 
					 | 
				
			||||||
* reworked Admin Panel (@Leesneaks, @gpedro, @slawkens)
 | 
					 | 
				
			||||||
  * updated to Bootstrap v4
 | 
					 | 
				
			||||||
  * new Menu
 | 
					 | 
				
			||||||
  * new Dashboard: statistics, server status
 | 
					 | 
				
			||||||
  * new Admin Bar showed on top when admin logged in
 | 
					 | 
				
			||||||
  * new page: Server Data, to reload server data
 | 
					 | 
				
			||||||
    * Towns, NPCs & Items are stored in permanent cache
 | 
					 | 
				
			||||||
  * new pages: mass account & teleport tools
 | 
					 | 
				
			||||||
  * changelogs editor
 | 
					 | 
				
			||||||
  * revised Accounts & Players editors
 | 
					 | 
				
			||||||
  * option to add/modify admin menus with plugins
 | 
					 | 
				
			||||||
  * option to enable/disable plugins
 | 
					 | 
				
			||||||
  * better, updated TinyMCE editor (v6.x)
 | 
					 | 
				
			||||||
    * with option to upload images
 | 
					 | 
				
			||||||
  * list of open source libraries used in project page
 | 
					 | 
				
			||||||
* auto-loading of themes, commands & pages from plugins/ folder. You need just to place them in correct folder and they will be loaded automatically - this allows better customization, without interfering with core AAC folders. This will allow in the future automatic updates for plugins as well the AAC as whole.
 | 
					 | 
				
			||||||
* config.php moved to Admin Panel -> Settings page
 | 
					 | 
				
			||||||
* new console script: aac - using symfony/console
 | 
					 | 
				
			||||||
  * usage: `php aac` (will list all commands by default)
 | 
					 | 
				
			||||||
  * example: `php aac cache:clear`
 | 
					 | 
				
			||||||
  * example: `php aac plugin:install theme-example.zip`
 | 
					 | 
				
			||||||
* replace POT Query Builder to Eloquent ORM. Not 100% yet - in some places there is still old $db approach used (@gpedro) (https://github.com/slawkens/myaac/pull/230)
 | 
					 | 
				
			||||||
* brand new charming installation page (by @fernandomatos)
 | 
					 | 
				
			||||||
  * using Bootstrap
 | 
					 | 
				
			||||||
* new pages router: nikic/fast-route, allowing for better customisation
 | 
					 | 
				
			||||||
* Plugin cronjobs: central control of the cronjobs
 | 
					 | 
				
			||||||
* Guild Wars support (available as plugin)
 | 
					 | 
				
			||||||
* support for login and create account only by email (configurable)
 | 
					 | 
				
			||||||
  * with no need for account name
 | 
					 | 
				
			||||||
* Google ReCAPTCHA v3 support (available as plugin)
 | 
					 | 
				
			||||||
* support for Account Number
 | 
					 | 
				
			||||||
  * suggest account number option
 | 
					 | 
				
			||||||
* many new functions, hooks and configurables
 | 
					 | 
				
			||||||
* better Exception Handler (Whoops - https://github.com/filp/whoops)
 | 
					 | 
				
			||||||
* automated website tests (using Cypress)
 | 
					 | 
				
			||||||
* csrf protection (https://github.com/slawkens/myaac/pull/235)
 | 
					 | 
				
			||||||
* option to restrict Page view to specified group of users (Not-Logged in, logged-in players, tutors, gamemasters etc.)
 | 
					 | 
				
			||||||
* phpdebug bar (http://phpdebugbar.com/). Activated if env == 'dev', can be also activated in production by enabling "enable_debugbar" in local config
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
### Changed
 | 
					 | 
				
			||||||
* Composer and NPM is now used for external libraries like: Twig, PHPMailer, fast-route, jQuery, Bootstrap etc.
 | 
					 | 
				
			||||||
* mail support is disabled on fresh install, can be manually enabled by user
 | 
					 | 
				
			||||||
* disable add php pages in admin panel for security. Option to disable plugins upload
 | 
					 | 
				
			||||||
* visitors counter shows now user browser, and also if its bot
 | 
					 | 
				
			||||||
* changes in required and optional PHP extensions
 | 
					 | 
				
			||||||
* reworked Pages:
 | 
					 | 
				
			||||||
	* Bans
 | 
					 | 
				
			||||||
		* works now for TFS 1.x
 | 
					 | 
				
			||||||
	* Highscores
 | 
					 | 
				
			||||||
		* frags works for TFS 1.x
 | 
					 | 
				
			||||||
		* cached
 | 
					 | 
				
			||||||
	* Monsters
 | 
					 | 
				
			||||||
* moved pages to Twig:
 | 
					 | 
				
			||||||
  * experience stages
 | 
					 | 
				
			||||||
* update player_deaths entries on name change
 | 
					 | 
				
			||||||
* change_password email to be more informal
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
### Fixed
 | 
					 | 
				
			||||||
* hundreds of bug fixes, mostly patched from 0.8, so it makes no sense writing them again here
 | 
					 | 
				
			||||||
							
								
								
									
										2
									
								
								CREDITS
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								CREDITS
									
									
									
									
									
								
							@@ -1,3 +1,3 @@
 | 
				
			|||||||
* Gesior.pl (2007 - 2008)
 | 
					* Gesior.pl (2007 - 2008)
 | 
				
			||||||
* Slawkens (2009 - 2023)
 | 
					* Slawkens (2009 - 2025)
 | 
				
			||||||
* Contributors listed in CONTRIBUTORS.txt
 | 
					* Contributors listed in CONTRIBUTORS.txt
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										27
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										27
									
								
								README.md
									
									
									
									
									
								
							@@ -1,6 +1,6 @@
 | 
				
			|||||||
# [MyAAC](https://my-aac.org)
 | 
					# [MyAAC](https://my-aac.org)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
MyAAC is a free and open-source Automatic Account Creator (AAC) 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
 | 
					Official website: https://my-aac.org
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -12,11 +12,18 @@ Official website: https://my-aac.org
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
| Version | Status                 | Branch  | Requirements   |
 | 
					| 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.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   |
 | 
					| 0.7.x   | End Of Life            | 0.7     | PHP >= 5.3.3   |
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The recommended version to install is 1.x, which can be found at releases page - [https://github.com/slawkens/myaac/releases](https://github.com/slawkens/myaac/releases).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Documentation
 | 
				
			||||||
 | 
					* [docs.my-aac.org](https://docs.my-aac.org)
 | 
				
			||||||
 | 
					* [my-aac.org - FAQ](https://my-aac.org/faqs/)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### Requirements
 | 
					### Requirements
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	- MySQL database
 | 
						- MySQL database
 | 
				
			||||||
@@ -47,23 +54,23 @@ Official website: https://my-aac.org
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
### Configuration
 | 
					### Configuration
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Check *config.php* to get more informations. (Notice: MyAAC 1.0+ doesn't use config.php anymore, it has been moved to Admin Panel - Settings page).
 | 
					Check *config.php* to get more 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.
 | 
					Use *config.local.php* for your local configuration changes.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### Branches
 | 
					### Branches
 | 
				
			||||||
 | 
					
 | 
				
			||||||
This repository follows the Git Flow Workflow.
 | 
					This repository follows the Git Flow Workflow.
 | 
				
			||||||
Cheatsheet: [Git-Flow-Cheetsheet](https://danielkummer.github.io/git-flow-cheatsheet)
 | 
					Cheatsheet: [Git-Flow-Cheatsheet](https://danielkummer.github.io/git-flow-cheatsheet)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
That means, we use:
 | 
					That means, we use:
 | 
				
			||||||
* master branch, for current stable release
 | 
					* main branch, for current stable release
 | 
				
			||||||
* develop branch, for development version (next release)
 | 
					* develop branch, for development version (next release)
 | 
				
			||||||
* feature branches, for features etc.
 | 
					* feature branches, for features etc.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### Known Problems
 | 
					### Known Problems
 | 
				
			||||||
 | 
					
 | 
				
			||||||
- Some compatibility issues with some exotical distibutions.
 | 
					- Some compatibility issues with some exotic distributions.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### Contributing
 | 
					### 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.
 | 
					Bug fixes to current release should be done to master branch.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Look: [Contributing](https://github.com/otsoft/myaac/wiki/Contributing) in our wiki.
 | 
					Look: [Contributing](https://docs.my-aac.org/misc/contributing) in our wiki.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### Other Notes
 | 
					### Other Notes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
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
 | 
					## 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
 | 
					### License
 | 
				
			||||||
 | 
					
 | 
				
			||||||
This program and all associated files are released under the GNU Public License.  
 | 
					This program and all associated files are released under the GNU Public License.  
 | 
				
			||||||
See [LICENSE](https://github.com/slawkens/myaac/blob/master/LICENSE) for details.
 | 
					See [LICENSE](https://github.com/slawkens/myaac/blob/main/LICENSE) for details.
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -7,7 +7,7 @@ $hooks->register('debugbar_admin_head_end', HOOK_ADMIN_HEAD_END, function ($para
 | 
				
			|||||||
		return;
 | 
							return;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	$debugBarRenderer = $debugBar->getJavascriptRenderer();
 | 
						$debugBarRenderer = $debugBar->getJavascriptRenderer(BASE_URL . 'vendor/maximebf/debugbar/src/DebugBar/Resources/');
 | 
				
			||||||
	echo $debugBarRenderer->renderHead();
 | 
						echo $debugBarRenderer->renderHead();
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
$hooks->register('debugbar_admin_body_end', HOOK_ADMIN_BODY_END, function ($params) {
 | 
					$hooks->register('debugbar_admin_body_end', HOOK_ADMIN_BODY_END, function ($params) {
 | 
				
			||||||
@@ -17,6 +17,6 @@ $hooks->register('debugbar_admin_body_end', HOOK_ADMIN_BODY_END, function ($para
 | 
				
			|||||||
		return;
 | 
							return;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	$debugBarRenderer = $debugBar->getJavascriptRenderer();
 | 
						$debugBarRenderer = $debugBar->getJavascriptRenderer(BASE_URL . 'vendor/maximebf/debugbar/src/DebugBar/Resources/');
 | 
				
			||||||
	echo $debugBarRenderer->render();
 | 
						echo $debugBarRenderer->render();
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,6 +1,8 @@
 | 
				
			|||||||
<?php
 | 
					<?php
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// few things we'll need
 | 
					// few things we'll need
 | 
				
			||||||
 | 
					use MyAAC\Plugins;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
require '../common.php';
 | 
					require '../common.php';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const ADMIN_PANEL = true;
 | 
					const ADMIN_PANEL = true;
 | 
				
			||||||
@@ -42,9 +44,14 @@ if(!$logged || !admin()) {
 | 
				
			|||||||
	$page = 'login';
 | 
						$page = 'login';
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// include our page
 | 
					$pluginsAdminPages = Plugins::getAdminPages();
 | 
				
			||||||
$file = __DIR__ . '/pages/' . $page . '.php';
 | 
					if(isset($pluginsAdminPages[$page]) && file_exists(BASE . $pluginsAdminPages[$page])) {
 | 
				
			||||||
if(!@file_exists($file)) {
 | 
						$file = BASE . $pluginsAdminPages[$page];
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					else {
 | 
				
			||||||
 | 
						// include our page
 | 
				
			||||||
 | 
						$file = __DIR__ . '/pages/' . $page . '.php';
 | 
				
			||||||
 | 
						if(!@file_exists($file)) {
 | 
				
			||||||
		if (str_contains($page, 'plugins/')) {
 | 
							if (str_contains($page, 'plugins/')) {
 | 
				
			||||||
			$file = BASE . $page;
 | 
								$file = BASE . $page;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
@@ -52,6 +59,7 @@ if(!@file_exists($file)) {
 | 
				
			|||||||
			$page = '404';
 | 
								$page = '404';
 | 
				
			||||||
			$file = SYSTEM . 'pages/404.php';
 | 
								$file = SYSTEM . 'pages/404.php';
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
ob_start();
 | 
					ob_start();
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -26,7 +26,6 @@ if (setting('core.account_country'))
 | 
				
			|||||||
$nameOrNumberColumn = getAccountIdentityColumn();
 | 
					$nameOrNumberColumn = getAccountIdentityColumn();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
$hasSecretColumn = $db->hasColumn('accounts', 'secret');
 | 
					$hasSecretColumn = $db->hasColumn('accounts', 'secret');
 | 
				
			||||||
$hasCoinsColumn = $db->hasColumn('accounts', 'coins');
 | 
					 | 
				
			||||||
$hasPointsColumn = $db->hasColumn('accounts', 'premium_points');
 | 
					$hasPointsColumn = $db->hasColumn('accounts', 'premium_points');
 | 
				
			||||||
$hasTypeColumn = $db->hasColumn('accounts', 'type');
 | 
					$hasTypeColumn = $db->hasColumn('accounts', 'type');
 | 
				
			||||||
$hasGroupColumn = $db->hasColumn('accounts', 'group_id');
 | 
					$hasGroupColumn = $db->hasColumn('accounts', 'group_id');
 | 
				
			||||||
@@ -136,11 +135,18 @@ else if (isset($_REQUEST['search'])) {
 | 
				
			|||||||
			if (!Validator::email($email))
 | 
								if (!Validator::email($email))
 | 
				
			||||||
				$errors['email'] = Validator::getLastError();
 | 
									$errors['email'] = Validator::getLastError();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			//tibia coins
 | 
								// tibia coins
 | 
				
			||||||
			if ($hasCoinsColumn) {
 | 
								if (HAS_ACCOUNT_COINS) {
 | 
				
			||||||
				$t_coins = $_POST['t_coins'];
 | 
									$t_coins = $_POST['t_coins'];
 | 
				
			||||||
				verify_number($t_coins, 'Tibia coins', 12);
 | 
									verify_number($t_coins, 'Tibia coins', 12);
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								// transferable tibia coins
 | 
				
			||||||
 | 
								if (HAS_ACCOUNT_COINS_TRANSFERABLE || HAS_ACCOUNT_TRANSFERABLE_COINS) {
 | 
				
			||||||
 | 
									$t_coins_transferable = $_POST['t_coins_transferable'];
 | 
				
			||||||
 | 
									verify_number($t_coins_transferable, 'Transferable Tibia coins', 12);
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			// prem days
 | 
								// prem days
 | 
				
			||||||
			$p_days = (int)$_POST['p_days'];
 | 
								$p_days = (int)$_POST['p_days'];
 | 
				
			||||||
			verify_number($p_days, 'Prem days', 11);
 | 
								verify_number($p_days, 'Prem days', 11);
 | 
				
			||||||
@@ -185,12 +191,18 @@ else if (isset($_REQUEST['search'])) {
 | 
				
			|||||||
				if ($hasSecretColumn) {
 | 
									if ($hasSecretColumn) {
 | 
				
			||||||
					$account->setCustomField('secret', $secret);
 | 
										$account->setCustomField('secret', $secret);
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				$account->setCustomField('key', $key);
 | 
									$account->setCustomField('key', $key);
 | 
				
			||||||
				$account->setEMail($email);
 | 
									$account->setEMail($email);
 | 
				
			||||||
				if ($hasCoinsColumn) {
 | 
					
 | 
				
			||||||
 | 
									if (HAS_ACCOUNT_COINS) {
 | 
				
			||||||
					$account->setCustomField('coins', $t_coins);
 | 
										$account->setCustomField('coins', $t_coins);
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									if (HAS_ACCOUNT_COINS_TRANSFERABLE || HAS_ACCOUNT_TRANSFERABLE_COINS) {
 | 
				
			||||||
 | 
										$account->setCustomField(ACCOUNT_COINS_TRANSFERABLE_COLUMN, $t_coins_transferable);
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				$lastDay = 0;
 | 
									$lastDay = 0;
 | 
				
			||||||
				if($p_days != 0 && $p_days != OTS_Account::GRATIS_PREMIUM_DAYS) {
 | 
									if($p_days != 0 && $p_days != OTS_Account::GRATIS_PREMIUM_DAYS) {
 | 
				
			||||||
					$lastDay = time();
 | 
										$lastDay = time();
 | 
				
			||||||
@@ -223,9 +235,6 @@ else if (isset($_REQUEST['search'])) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
					$password = encrypt($password);
 | 
										$password = encrypt($password);
 | 
				
			||||||
					$account->setPassword($password);
 | 
										$account->setPassword($password);
 | 
				
			||||||
 | 
					 | 
				
			||||||
					if (USE_ACCOUNT_SALT)
 | 
					 | 
				
			||||||
						$account->setCustomField('salt', $salt);
 | 
					 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				$account->save();
 | 
									$account->save();
 | 
				
			||||||
@@ -395,12 +404,18 @@ else if (isset($_REQUEST['search'])) {
 | 
				
			|||||||
										<label for="email">Email:</label><?php echo (setting('core.mail_enabled') ? ' (<a href="' . ADMIN_URL . '?p=mailer&mail_to=' . $account->getEMail() . '">Send Mail</a>)' : ''); ?>
 | 
															<label for="email">Email:</label><?php echo (setting('core.mail_enabled') ? ' (<a href="' . ADMIN_URL . '?p=mailer&mail_to=' . $account->getEMail() . '">Send Mail</a>)' : ''); ?>
 | 
				
			||||||
										<input type="text" class="form-control" id="email" name="email" autocomplete="off" value="<?php echo $account->getEMail(); ?>"/>
 | 
															<input type="text" class="form-control" id="email" name="email" autocomplete="off" value="<?php echo $account->getEMail(); ?>"/>
 | 
				
			||||||
									</div>
 | 
														</div>
 | 
				
			||||||
									<?php if ($hasCoinsColumn): ?>
 | 
														<?php if (HAS_ACCOUNT_COINS): ?>
 | 
				
			||||||
										<div class="col-12 col-sm-12 col-lg-6">
 | 
															<div class="col-12 col-sm-12 col-lg-6">
 | 
				
			||||||
											<label for="t_coins">Tibia Coins:</label>
 | 
																<label for="t_coins">Tibia Coins:</label>
 | 
				
			||||||
											<input type="text" class="form-control" id="t_coins" name="t_coins" autocomplete="off" maxlength="11" value="<?php echo $account->getCustomField('coins') ?>"/>
 | 
																<input type="text" class="form-control" id="t_coins" name="t_coins" autocomplete="off" maxlength="11" value="<?php echo $account->getCustomField('coins') ?>"/>
 | 
				
			||||||
										</div>
 | 
															</div>
 | 
				
			||||||
									<?php endif; ?>
 | 
														<?php endif; ?>
 | 
				
			||||||
 | 
														<?php if (HAS_ACCOUNT_COINS_TRANSFERABLE || HAS_ACCOUNT_TRANSFERABLE_COINS): ?>
 | 
				
			||||||
 | 
															<div class="col-12 col-sm-12 col-lg-6">
 | 
				
			||||||
 | 
																<label for="t_coins_transferable">Transferable Tibia Coins:</label>
 | 
				
			||||||
 | 
																<input type="text" class="form-control" id="t_coins_transferable" name="t_coins_transferable" autocomplete="off" maxlength="11" value="<?php echo $account->getCustomField(ACCOUNT_COINS_TRANSFERABLE_COLUMN) ?>"/>
 | 
				
			||||||
 | 
															</div>
 | 
				
			||||||
 | 
														<?php endif; ?>
 | 
				
			||||||
									<div class="col-12 col-sm-12 col-lg-6">
 | 
														<div class="col-12 col-sm-12 col-lg-6">
 | 
				
			||||||
										<label for="p_days">Premium Days:</label>
 | 
															<label for="p_days">Premium Days:</label>
 | 
				
			||||||
										<input type="text" class="form-control" id="p_days" name="p_days" autocomplete="off" maxlength="11" value="<?php echo $account->getPremDays(); ?>"/>
 | 
															<input type="text" class="form-control" id="p_days" name="p_days" autocomplete="off" maxlength="11" value="<?php echo $account->getPremDays(); ?>"/>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -11,12 +11,12 @@
 | 
				
			|||||||
defined('MYAAC') or die('Direct access not allowed!');
 | 
					defined('MYAAC') or die('Direct access not allowed!');
 | 
				
			||||||
$title = 'MyAAC Changelog';
 | 
					$title = 'MyAAC Changelog';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if (!file_exists(BASE . 'CHANGELOG.md')) {
 | 
					if (!file_exists(BASE . 'CHANGELOG-1.x.md')) {
 | 
				
			||||||
	echo 'File CHANGELOG.md doesn\'t exist.';
 | 
						echo 'File CHANGELOG.md doesn\'t exist.';
 | 
				
			||||||
	return;
 | 
						return;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
$changelog = file_get_contents(BASE . 'CHANGELOG.md');
 | 
					$changelog = file_get_contents(BASE . 'CHANGELOG-1.x.md');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
$Parsedown = new Parsedown();
 | 
					$Parsedown = new Parsedown();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -25,9 +25,10 @@ if (!setting('core.mail_enabled')) {
 | 
				
			|||||||
	return;
 | 
						return;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
$mail_to = isset($_POST['mail_to']) ? stripslashes(trim($_POST['mail_to'])) : null;
 | 
					$mail_to = isset($_REQUEST['mail_to']) ? stripslashes(trim($_REQUEST['mail_to'])) : null;
 | 
				
			||||||
$mail_subject = isset($_POST['mail_subject']) ? stripslashes($_POST['mail_subject']) : null;
 | 
					$mail_subject = isset($_POST['mail_subject']) ? stripslashes($_POST['mail_subject']) : null;
 | 
				
			||||||
$mail_content = isset($_POST['mail_content']) ? stripslashes($_POST['mail_content']) : null;
 | 
					$mail_content = isset($_POST['mail_content']) ? stripslashes($_POST['mail_content']) : null;
 | 
				
			||||||
 | 
					$mail_verified_only = $_POST['mail_verified_only'] ?? false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if (isset($_POST['submit'])) {
 | 
					if (isset($_POST['submit'])) {
 | 
				
			||||||
	if (empty($mail_subject)) {
 | 
						if (empty($mail_subject)) {
 | 
				
			||||||
@@ -58,14 +59,14 @@ if (!empty($mail_content) && !empty($mail_subject) && empty($mail_to)) {
 | 
				
			|||||||
	$success = 0;
 | 
						$success = 0;
 | 
				
			||||||
	$failed = 0;
 | 
						$failed = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	$add = '';
 | 
						$query = Account::where('email', '!=', '');
 | 
				
			||||||
	if (setting('core.account_mail_verify')) {
 | 
					
 | 
				
			||||||
		note('Note: Sending only to users with verified E-Mail.');
 | 
						if ($mail_verified_only) {
 | 
				
			||||||
		$add = ' AND `email_verified` = 1';
 | 
							info('Note: Sending only to users with verified E-Mail.');
 | 
				
			||||||
 | 
							$query->where('email_verified', 1);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	$query = Account::where('email', '!=', '')->get(['email']);
 | 
						foreach ($query->get(['email']) as $email) {
 | 
				
			||||||
	foreach ($query as $email) {
 | 
					 | 
				
			||||||
		if (_mail($email->email, $mail_subject, $mail_content)) {
 | 
							if (_mail($email->email, $mail_subject, $mail_content)) {
 | 
				
			||||||
			$success++;
 | 
								$success++;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
@@ -84,5 +85,6 @@ if (!empty($mail_content) && !empty($mail_subject) && empty($mail_to)) {
 | 
				
			|||||||
$twig->display('admin.mailer.html.twig', [
 | 
					$twig->display('admin.mailer.html.twig', [
 | 
				
			||||||
	'mail_to' => $mail_to,
 | 
						'mail_to' => $mail_to,
 | 
				
			||||||
	'mail_subject' => $mail_subject,
 | 
						'mail_subject' => $mail_subject,
 | 
				
			||||||
	'mail_content' => $mail_content
 | 
						'mail_content' => $mail_content,
 | 
				
			||||||
 | 
						'mail_verified_only' => $mail_verified_only,
 | 
				
			||||||
]);
 | 
					]);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -18,7 +18,6 @@ $title = 'Mass Account Actions';
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
csrfProtect();
 | 
					csrfProtect();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
$hasCoinsColumn = $db->hasColumn('accounts', 'coins');
 | 
					 | 
				
			||||||
$hasPointsColumn = $db->hasColumn('accounts', 'premium_points');
 | 
					$hasPointsColumn = $db->hasColumn('accounts', 'premium_points');
 | 
				
			||||||
$freePremium = $config['lua']['freePremium'];
 | 
					$freePremium = $config['lua']['freePremium'];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -40,9 +39,7 @@ function admin_give_points($points)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
function admin_give_coins($coins)
 | 
					function admin_give_coins($coins)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	global $hasCoinsColumn;
 | 
						if (!HAS_ACCOUNT_COINS) {
 | 
				
			||||||
 | 
					 | 
				
			||||||
	if (!$hasCoinsColumn) {
 | 
					 | 
				
			||||||
		displayMessage('Coins not supported.');
 | 
							displayMessage('Coins not supported.');
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -167,19 +164,19 @@ if (!empty(ACTION) && isRequestMethod('post')) {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
else {
 | 
					else {
 | 
				
			||||||
	$twig->display('admin.tools.account.html.twig', array(
 | 
						$twig->display('admin.tools.account.html.twig', array(
 | 
				
			||||||
		'hasCoinsColumn' => $hasCoinsColumn,
 | 
							'hasCoinsColumn' => HAS_ACCOUNT_COINS,
 | 
				
			||||||
		'hasPointsColumn' => $hasPointsColumn,
 | 
							'hasPointsColumn' => $hasPointsColumn,
 | 
				
			||||||
		'freePremium' => $freePremium,
 | 
							'freePremium' => $freePremium,
 | 
				
			||||||
	));
 | 
						));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function displayMessage($message, $success = false) {
 | 
					function displayMessage($message, $success = false) {
 | 
				
			||||||
	global $twig, $hasCoinsColumn, $hasPointsColumn, $freePremium;
 | 
						global $twig, $hasPointsColumn, $freePremium;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	$success ? success($message): error($message);
 | 
						$success ? success($message): error($message);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	$twig->display('admin.tools.account.html.twig', array(
 | 
						$twig->display('admin.tools.account.html.twig', array(
 | 
				
			||||||
		'hasCoinsColumn' => $hasCoinsColumn,
 | 
							'hasCoinsColumn' => HAS_ACCOUNT_COINS,
 | 
				
			||||||
		'hasPointsColumn' => $hasPointsColumn,
 | 
							'hasPointsColumn' => $hasPointsColumn,
 | 
				
			||||||
		'freePremium' => $freePremium,
 | 
							'freePremium' => $freePremium,
 | 
				
			||||||
	));
 | 
						));
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -27,11 +27,11 @@ $pluginThemes = Plugins::getThemes();
 | 
				
			|||||||
if (isset($_POST['template'])) {
 | 
					if (isset($_POST['template'])) {
 | 
				
			||||||
	$template = $_POST['template'];
 | 
						$template = $_POST['template'];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (isset($_POST['menu'])) {
 | 
						if (isset($_POST['save'])) {
 | 
				
			||||||
		$post_menu = $_POST['menu'];
 | 
							$post_menu = $_POST['menu'] ?? [];
 | 
				
			||||||
		$post_menu_link = $_POST['menu_link'];
 | 
							$post_menu_link = $_POST['menu_link'] ?? [];
 | 
				
			||||||
		$post_menu_blank = $_POST['menu_blank'];
 | 
							$post_menu_blank = $_POST['menu_blank'] ?? [];
 | 
				
			||||||
		$post_menu_color = $_POST['menu_color'];
 | 
							$post_menu_color = $_POST['menu_color'] ?? [];
 | 
				
			||||||
		if (count($post_menu) != count($post_menu_link)) {
 | 
							if (count($post_menu) != count($post_menu_link)) {
 | 
				
			||||||
			echo 'Menu count is not equal menu links. Something went wrong when sending form.';
 | 
								echo 'Menu count is not equal menu links. Something went wrong when sending form.';
 | 
				
			||||||
			return;
 | 
								return;
 | 
				
			||||||
@@ -59,11 +59,7 @@ if (isset($_POST['template'])) {
 | 
				
			|||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		$cache = Cache::getInstance();
 | 
							onTemplateMenusChange();
 | 
				
			||||||
		if ($cache->enabled()) {
 | 
					 | 
				
			||||||
			$cache->delete('template_menus');
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		success('Saved at ' . date('H:i'));
 | 
							success('Saved at ' . date('H:i'));
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -82,38 +78,48 @@ if (isset($_POST['template'])) {
 | 
				
			|||||||
		return;
 | 
							return;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (isset($_GET['reset_colors'])) {
 | 
					 | 
				
			||||||
		if (isset($config['menu_default_color'])) {
 | 
					 | 
				
			||||||
			Menu::where('template', $template)->update(['color' => str_replace('#', '', $config['menu_default_color'])]);
 | 
					 | 
				
			||||||
			success('Colors has been reset.');
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		else {
 | 
					 | 
				
			||||||
			warning('There is no default color defined, cannot reset colors.');
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if (!isset($config['menu_categories'])) {
 | 
						if (!isset($config['menu_categories'])) {
 | 
				
			||||||
		echo "No menu categories set in template config.php.<br/>This template doesn't support dynamic menus.";
 | 
							echo "No menu categories set in template config.php.<br/>This template doesn't support dynamic menus.";
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (isset($_GET['reset_colors'])) {
 | 
				
			||||||
 | 
							foreach ($config['menu_categories'] as $id => $options) {
 | 
				
			||||||
 | 
								$color = $options['default_links_color'] ?? ($config['menu_default_links_color'] ?? ($config['menu_default_color'] ?? '#ffffff'));
 | 
				
			||||||
 | 
								Menu::where('template', $template)->where('category', $id)->update(['color' => str_replace('#', '', $color)]);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							onTemplateMenusChange();
 | 
				
			||||||
 | 
							success('Colors has been reset at ' . date('H:i'));
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (isset($_GET['reset_menus'])) {
 | 
				
			||||||
 | 
							$configMenus = config('menus');
 | 
				
			||||||
 | 
							if (isset($configMenus)) {
 | 
				
			||||||
 | 
								Plugins::installMenus($template, config('menus'), true);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								onTemplateMenusChange();
 | 
				
			||||||
 | 
								success('Menus has been reset at ' . date('H:i'));
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							else {
 | 
				
			||||||
 | 
								error("This template don't support reinstalling menus.");
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	$title = 'Menus - ' . $template;
 | 
						$title = 'Menus - ' . $template;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						$canResetColors = isset($config['menu_default_color']) || isset($config['menu_default_links_color']);
 | 
				
			||||||
 | 
						foreach ($config['menu_categories'] as $id => $options) {
 | 
				
			||||||
 | 
							if (isset($options['default_links_color'])) {
 | 
				
			||||||
 | 
								$canResetColors = true;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						$twig->display('admin.menus.header.html.twig', [
 | 
				
			||||||
 | 
							'template' => $template,
 | 
				
			||||||
 | 
							'canResetColors' => $canResetColors
 | 
				
			||||||
 | 
						]);
 | 
				
			||||||
	?>
 | 
						?>
 | 
				
			||||||
	<div align="center" class="text-center">
 | 
					 | 
				
			||||||
		<p class="note">You are editing: <?= $template ?><br/><br/>
 | 
					 | 
				
			||||||
			Hint: You can drag menu items.<br/>
 | 
					 | 
				
			||||||
			Hint: Add links to external sites using: <b>http://</b> or <b>https://</b> prefix.<br/>
 | 
					 | 
				
			||||||
			Not all templates support blank and colorful links.
 | 
					 | 
				
			||||||
		</p>
 | 
					 | 
				
			||||||
		<?php if (isset($config['menu_default_color'])) {?>
 | 
					 | 
				
			||||||
		<form method="post" action="?p=menus&reset_colors" onsubmit="return confirm('Do you really want to reset colors?');">
 | 
					 | 
				
			||||||
			<?php csrf(); ?>
 | 
					 | 
				
			||||||
			<input type="hidden" name="template" value="<?php echo $template ?>"/>
 | 
					 | 
				
			||||||
			<button type="submit" class="btn btn-danger">Reset Colors to default</button>
 | 
					 | 
				
			||||||
		</form>
 | 
					 | 
				
			||||||
		<br/>
 | 
					 | 
				
			||||||
		<?php } ?>
 | 
					 | 
				
			||||||
	</div>
 | 
					 | 
				
			||||||
	<?php
 | 
						<?php
 | 
				
			||||||
	$menus = Menu::query()
 | 
						$menus = Menu::query()
 | 
				
			||||||
		->select('name', 'link', 'blank', 'color', 'category', 'ordering')
 | 
							->select('name', 'link', 'blank', 'color', 'category', 'ordering')
 | 
				
			||||||
@@ -129,7 +135,7 @@ if (isset($_POST['template'])) {
 | 
				
			|||||||
	<form method="post" id="menus-form" action="?p=menus">
 | 
						<form method="post" id="menus-form" action="?p=menus">
 | 
				
			||||||
		<?php csrf(); ?>
 | 
							<?php csrf(); ?>
 | 
				
			||||||
		<input type="hidden" name="template" value="<?php echo $template ?>"/>
 | 
							<input type="hidden" name="template" value="<?php echo $template ?>"/>
 | 
				
			||||||
		<button type="submit" class="btn btn-info">Save</button><br/><br/>
 | 
							<button type="submit" name="save" class="btn btn-info">Save</button><br/><br/>
 | 
				
			||||||
		<div class="row">
 | 
							<div class="row">
 | 
				
			||||||
			<?php foreach ($config['menu_categories'] as $id => $cat): ?>
 | 
								<?php foreach ($config['menu_categories'] as $id => $cat): ?>
 | 
				
			||||||
				<div class="col-md-12 col-lg-6">
 | 
									<div class="col-md-12 col-lg-6">
 | 
				
			||||||
@@ -143,12 +149,13 @@ if (isset($_POST['template'])) {
 | 
				
			|||||||
								if (isset($menus[$id])) {
 | 
													if (isset($menus[$id])) {
 | 
				
			||||||
									$i = 0;
 | 
														$i = 0;
 | 
				
			||||||
									foreach ($menus[$id] as $menu):
 | 
														foreach ($menus[$id] as $menu):
 | 
				
			||||||
 | 
															$color = (empty($menu['color']) ? ($cat['default_links_color'] ?? ($config['menu_default_links_color'] ?? ($config['menu_default_color'] ?? '#ffffff'))) : '#' . $menu['color']);
 | 
				
			||||||
										?>
 | 
															?>
 | 
				
			||||||
										<li class="ui-state-default" id="list-<?php echo $id ?>-<?php echo $i ?>"><label>Name:</label> <input type="text" name="menu[<?php echo $id ?>][]" value="<?php echo escapeHtml($menu['name']); ?>"/>
 | 
															<li class="ui-state-default" id="list-<?php echo $id ?>-<?php echo $i ?>"><label>Name:</label> <input type="text" name="menu[<?php echo $id ?>][]" value="<?php echo escapeHtml($menu['name']); ?>"/>
 | 
				
			||||||
											<label>Link:</label> <input type="text" name="menu_link[<?php echo $id ?>][]" value="<?php echo $menu['link'] ?>"/>
 | 
																<label>Link:</label> <input type="text" name="menu_link[<?php echo $id ?>][]" value="<?php echo $menu['link'] ?>"/>
 | 
				
			||||||
											<input type="hidden" name="menu_blank[<?php echo $id ?>][]" value="0"/>
 | 
																<input type="hidden" name="menu_blank[<?php echo $id ?>][]" value="0"/>
 | 
				
			||||||
											<label><input class="blank-checkbox" type="checkbox" <?php echo($menu['blank'] == 1 ? 'checked' : '') ?>/><span title="Open in New Window">New Window</span></label>
 | 
																<label><input class="blank-checkbox" type="checkbox" <?php echo($menu['blank'] == 1 ? 'checked' : '') ?>/><span title="Open in New Window">New Window</span></label>
 | 
				
			||||||
											<input class="color-picker" type="text" name="menu_color[<?php echo $id ?>][]" value="<?php echo (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>
 | 
																<a class="remove-button" id="remove-button-<?php echo $id ?>-<?php echo $i ?>"><i class="fas fa-trash"></a></i></li>
 | 
				
			||||||
										<?php $i++; $last_id[$id] = $i;
 | 
															<?php $i++; $last_id[$id] = $i;
 | 
				
			||||||
									endforeach;
 | 
														endforeach;
 | 
				
			||||||
@@ -161,7 +168,7 @@ if (isset($_POST['template'])) {
 | 
				
			|||||||
		</div>
 | 
							</div>
 | 
				
			||||||
		<div class="row pb-2">
 | 
							<div class="row pb-2">
 | 
				
			||||||
			<div class="col-md-12">
 | 
								<div class="col-md-12">
 | 
				
			||||||
				<button type="submit" class="btn btn-info">Save</button>
 | 
									<button type="submit" name="save" class="btn btn-info">Save</button>
 | 
				
			||||||
				<?php
 | 
									<?php
 | 
				
			||||||
				echo '<button type="button" class="btn btn-danger float-right" value="Cancel" onclick="window.location = \'' . ADMIN_URL . '?p=menus\';"><i class="fas fa-cancel"></i> Cancel</button>';
 | 
									echo '<button type="button" class="btn btn-danger float-right" value="Cancel" onclick="window.location = \'' . ADMIN_URL . '?p=menus\';"><i class="fas fa-cancel"></i> Cancel</button>';
 | 
				
			||||||
				?>
 | 
									?>
 | 
				
			||||||
@@ -172,7 +179,6 @@ if (isset($_POST['template'])) {
 | 
				
			|||||||
	$twig->display('admin.menus.js.html.twig', array(
 | 
						$twig->display('admin.menus.js.html.twig', array(
 | 
				
			||||||
		'menus' => $menus,
 | 
							'menus' => $menus,
 | 
				
			||||||
		'last_id' => $last_id,
 | 
							'last_id' => $last_id,
 | 
				
			||||||
		'menu_default_color' => $config['menu_default_color'] ?? '#ffffff'
 | 
					 | 
				
			||||||
	));
 | 
						));
 | 
				
			||||||
	?>
 | 
						?>
 | 
				
			||||||
	<?php
 | 
						<?php
 | 
				
			||||||
@@ -194,3 +200,11 @@ if (isset($_POST['template'])) {
 | 
				
			|||||||
		'templates' => $templates
 | 
							'templates' => $templates
 | 
				
			||||||
	));
 | 
						));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function onTemplateMenusChange(): void
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						$cache = Cache::getInstance();
 | 
				
			||||||
 | 
						if ($cache->enabled()) {
 | 
				
			||||||
 | 
							$cache->delete('template_menus');
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -7,7 +7,7 @@ defined('MYAAC') or die('Direct access not allowed!');
 | 
				
			|||||||
$balance = 0;
 | 
					$balance = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if ($db->hasColumn('players', 'balance')) {
 | 
					if ($db->hasColumn('players', 'balance')) {
 | 
				
			||||||
	$balance = Player::orderByDesc('balance')->limit(10)->get(['balance', 'id','name', 'level'])->toArray();
 | 
						$balance = Player::orderByDesc('balance')->limit(10)->get(['id', 'name', 'balance'])->toArray();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
$twig->display('balance.html.twig', array(
 | 
					$twig->display('balance.html.twig', array(
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -6,8 +6,13 @@ defined('MYAAC') or die('Direct access not allowed!');
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
$coins = 0;
 | 
					$coins = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if ($db->hasColumn('accounts', 'coins')) {
 | 
					if (HAS_ACCOUNT_COINS) {
 | 
				
			||||||
	$coins = Account::orderByDesc('coins')->limit(10)->get(['coins', (USE_ACCOUNT_NAME ? 'name' : 'id')])->toArray();
 | 
						$whatToGet = ['id', 'coins'];
 | 
				
			||||||
 | 
						if (USE_ACCOUNT_NAME) {
 | 
				
			||||||
 | 
							$whatToGet[] = 'name';
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						$coins = Account::orderByDesc('coins')->limit(10)->get($whatToGet)->toArray();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
$twig->display('coins.html.twig', array(
 | 
					$twig->display('coins.html.twig', array(
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -7,7 +7,7 @@ defined('MYAAC') or die('Direct access not allowed!');
 | 
				
			|||||||
$players = 0;
 | 
					$players = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if ($db->hasColumn('players', 'lastlogin')) {
 | 
					if ($db->hasColumn('players', 'lastlogin')) {
 | 
				
			||||||
	$players = Player::orderByDesc('lastlogin')->limit(10)->get(['name', 'level', 'lastlogin'])->toArray();
 | 
						$players = Player::orderByDesc('lastlogin')->limit(10)->get(['id', 'name', 'level', 'lastlogin'])->toArray();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
$twig->display('lastlogin.html.twig', array(
 | 
					$twig->display('lastlogin.html.twig', array(
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -19,7 +19,7 @@
 | 
				
			|||||||
						{% set i = i + 1 %}
 | 
											{% set i = i + 1 %}
 | 
				
			||||||
						<tr>
 | 
											<tr>
 | 
				
			||||||
							<th>{{ i }}</th>
 | 
												<th>{{ i }}</th>
 | 
				
			||||||
							<td><a href="?p=players&search_name={{ result.name }}">{{ result.name }}</a></td>
 | 
												<td><a href="?p=players&id={{ result.id }}">{{ result.name }}</a></td>
 | 
				
			||||||
							<td>{{ result.balance }}</td>
 | 
												<td>{{ result.balance }}</td>
 | 
				
			||||||
						</tr>
 | 
											</tr>
 | 
				
			||||||
					{% endfor %}
 | 
										{% endfor %}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -19,7 +19,7 @@
 | 
				
			|||||||
						{% set i = i + 1 %}
 | 
											{% set i = i + 1 %}
 | 
				
			||||||
						<tr>
 | 
											<tr>
 | 
				
			||||||
							<th>{{ i }}</th>
 | 
												<th>{{ i }}</th>
 | 
				
			||||||
							<td><a href="?p=accounts&search_name={{ result.name }}">{{ result.name }}</a></td>
 | 
												<td><a href="?p=accounts&id={{ result.id }}">{{ result.name ?? result.id }}</a></td>
 | 
				
			||||||
							<td>{{ result.coins }}</td>
 | 
												<td>{{ result.coins }}</td>
 | 
				
			||||||
						</tr>
 | 
											</tr>
 | 
				
			||||||
					{% endfor %}
 | 
										{% endfor %}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -19,7 +19,7 @@
 | 
				
			|||||||
						{% set i = i + 1 %}
 | 
											{% set i = i + 1 %}
 | 
				
			||||||
						<tr>
 | 
											<tr>
 | 
				
			||||||
							<th>{{ i }}</th>
 | 
												<th>{{ i }}</th>
 | 
				
			||||||
							<td><a href="?p=players&search_name={{ result.name }}">{{ result.name }}</a></td>
 | 
												<td><a href="?p=players&id={{ result.id }}">{{ result.name }}</a></td>
 | 
				
			||||||
							<td>{{ result.lastlogin|date("M d Y, H:i:s") }}</td>
 | 
												<td>{{ result.lastlogin|date("M d Y, H:i:s") }}</td>
 | 
				
			||||||
						</tr>
 | 
											</tr>
 | 
				
			||||||
					{% endfor %}
 | 
										{% endfor %}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -19,7 +19,7 @@
 | 
				
			|||||||
						{% set i = i + 1 %}
 | 
											{% set i = i + 1 %}
 | 
				
			||||||
						<tr>
 | 
											<tr>
 | 
				
			||||||
							<th>{{ i }}</th>
 | 
												<th>{{ i }}</th>
 | 
				
			||||||
							<td><a href="?p=accounts&search_name={{ result.name }}">{{ result.name }}</a></td>
 | 
												<td><a href="?p=accounts&id={{ result.id }}">{{ result.name }}</a></td>
 | 
				
			||||||
							<td>{{ result.premium_points }}</td>
 | 
												<td>{{ result.premium_points }}</td>
 | 
				
			||||||
						</tr>
 | 
											</tr>
 | 
				
			||||||
					{% endfor %}
 | 
										{% endfor %}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -17,7 +17,7 @@ csrfProtect();
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
$use_datatable = true;
 | 
					$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>.');
 | 
						warning('Plugin installation and management is disabled in Settings.<br/>If you wish to enable, go to Settings and enable <strong>Enable Plugins Manage</strong>.');
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
else {
 | 
					else {
 | 
				
			||||||
@@ -51,6 +51,56 @@ else {
 | 
				
			|||||||
		} else {
 | 
							} else {
 | 
				
			||||||
			error('Error while disabling plugin ' . $disable . ': ' . Plugins::getError());
 | 
								error('Error while disabling plugin ' . $disable . ': ' . Plugins::getError());
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						else if (isset($_GET['check-updates'])) {
 | 
				
			||||||
 | 
							$repoUri = $config['admin_plugins_api_uri'] ?? 'https://plugins.my-aac.org/api/';
 | 
				
			||||||
 | 
							success("Fetching latest info from $repoUri..");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							$adminPlugins = new \MyAAC\Admin\Plugins();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							$adminPlugins->setApiBaseUri($repoUri);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							try {
 | 
				
			||||||
 | 
								$plugins = $adminPlugins->getLatestVersions();
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							catch (Exception $e) {
 | 
				
			||||||
 | 
								error($e->getMessage());
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (isset($plugins) && count($plugins) > 0) {
 | 
				
			||||||
 | 
								$outdated = [];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								foreach (get_plugins(true) as $plugin) {
 | 
				
			||||||
 | 
									$string = file_get_contents(BASE . 'plugins/' . $plugin . '.json');
 | 
				
			||||||
 | 
									$plugin_info = json_decode($string, true);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									if (!$plugin_info) {
 | 
				
			||||||
 | 
										continue;
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									$disabled = (str_contains($plugin, 'disabled.'));
 | 
				
			||||||
 | 
									$pluginOriginal = ($disabled ? str_replace('disabled.', '', $plugin) : $plugin);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									$info = $plugins[$pluginOriginal] ?? false;
 | 
				
			||||||
 | 
									if ($info && version_compare($info['version'], $plugin_info['version'], '>')) {
 | 
				
			||||||
 | 
										$outdated[] = [
 | 
				
			||||||
 | 
											'name' => $pluginOriginal,
 | 
				
			||||||
 | 
											'yourVersion' => $plugin_info['version'],
 | 
				
			||||||
 | 
											'latestVersion' => $info['version'],
 | 
				
			||||||
 | 
											'link' => $info['link'] ?? 'Unknown',
 | 
				
			||||||
 | 
											'download_link' => $info['download_link'] ?? 'Unknown',
 | 
				
			||||||
 | 
										];
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if (count($outdated) > 0) {
 | 
				
			||||||
 | 
									info('Following updates have been found for your plugins:');
 | 
				
			||||||
 | 
									$twig->display('admin.plugins.outdated.html.twig', ['plugins' => $outdated]);
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								else {
 | 
				
			||||||
 | 
									success('All plugins up to date!');
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
	} else if (isset($_FILES['plugin']['name'])) {
 | 
						} else if (isset($_FILES['plugin']['name'])) {
 | 
				
			||||||
		$file = $_FILES['plugin'];
 | 
							$file = $_FILES['plugin'];
 | 
				
			||||||
		$filename = $file['name'];
 | 
							$filename = $file['name'];
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -19,8 +19,7 @@ $use_datatable = true;
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
if (!setting('core.visitors_counter')): ?>
 | 
					if (!setting('core.visitors_counter')): ?>
 | 
				
			||||||
	Visitors counter is disabled.<br/>
 | 
						Visitors counter is disabled.<br/>
 | 
				
			||||||
	You can enable it by editing this configurable in <b>config.local.php</b> file:<br/>
 | 
						You can enable it in Settings -> General -> Visitors Counter.<br/>
 | 
				
			||||||
	<p style="margin-left: 3em;"><b>$config['visitors_counter'] = true;</b></p>
 | 
					 | 
				
			||||||
	<?php
 | 
						<?php
 | 
				
			||||||
	return;
 | 
						return;
 | 
				
			||||||
endif;
 | 
					endif;
 | 
				
			||||||
@@ -46,7 +45,7 @@ foreach ($tmp as &$visitor) {
 | 
				
			|||||||
		if ($dd->isBot()) {
 | 
							if ($dd->isBot()) {
 | 
				
			||||||
			$bot = $dd->getBot();
 | 
								$bot = $dd->getBot();
 | 
				
			||||||
			$message = '(Bot) %s, <a href="%s" target="_blank">%s</a>';
 | 
								$message = '(Bot) %s, <a href="%s" target="_blank">%s</a>';
 | 
				
			||||||
			$browser = sprintf($message, $bot['category'], $bot['url'], $bot['name']);
 | 
								$browser = sprintf($message, $bot['category'] ?? 'Unknown', $bot['url'] ?? '', $bot['name'] ?? 'Unknown name');
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		else {
 | 
							else {
 | 
				
			||||||
			$osFamily = OperatingSystem::getOsFamily($dd->getOs('name'));
 | 
								$osFamily = OperatingSystem::getOsFamily($dd->getOs('name'));
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,6 +1,5 @@
 | 
				
			|||||||
<?php
 | 
					<?php
 | 
				
			||||||
 | 
					
 | 
				
			||||||
use MyAAC\Hooks;
 | 
					 | 
				
			||||||
use MyAAC\Settings;
 | 
					use MyAAC\Settings;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const MYAAC_ADMIN = true;
 | 
					const MYAAC_ADMIN = true;
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										38
									
								
								common.php
									
									
									
									
									
								
							
							
						
						
									
										38
									
								
								common.php
									
									
									
									
									
								
							@@ -26,8 +26,8 @@
 | 
				
			|||||||
if (version_compare(phpversion(), '8.1', '<')) die('PHP version 8.1 or higher is required.');
 | 
					if (version_compare(phpversion(), '8.1', '<')) die('PHP version 8.1 or higher is required.');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const MYAAC = true;
 | 
					const MYAAC = true;
 | 
				
			||||||
const MYAAC_VERSION = '1.1';
 | 
					const MYAAC_VERSION = '1.8.2-dev';
 | 
				
			||||||
const DATABASE_VERSION = 43;
 | 
					const DATABASE_VERSION = 46;
 | 
				
			||||||
const TABLE_PREFIX = 'myaac_';
 | 
					const TABLE_PREFIX = 'myaac_';
 | 
				
			||||||
define('START_TIME', microtime(true));
 | 
					define('START_TIME', microtime(true));
 | 
				
			||||||
define('MYAAC_OS', stripos(PHP_OS, 'WIN') === 0 ? 'WINDOWS' : (strtoupper(PHP_OS) === 'DARWIN' ? 'MAC' : 'LINUX'));
 | 
					define('MYAAC_OS', stripos(PHP_OS, 'WIN') === 0 ? 'WINDOWS' : (strtoupper(PHP_OS) === 'DARWIN' ? 'MAC' : 'LINUX'));
 | 
				
			||||||
@@ -122,36 +122,28 @@ if (!IS_CLI) {
 | 
				
			|||||||
	session_start();
 | 
						session_start();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// basedir
 | 
					if (file_exists(BASE . 'config.local.php')) {
 | 
				
			||||||
$basedir = '';
 | 
						require BASE . 'config.local.php';
 | 
				
			||||||
$tmp = explode('/', $_SERVER['SCRIPT_NAME']);
 | 
					}
 | 
				
			||||||
$size = count($tmp) - 1;
 | 
					 | 
				
			||||||
for($i = 1; $i < $size; $i++)
 | 
					 | 
				
			||||||
	$basedir .= '/' . $tmp[$i];
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
$basedir = str_replace(['/' . ADMIN_PANEL_FOLDER, '/install', '/tools'], '', $basedir);
 | 
					require SYSTEM . 'base.php';
 | 
				
			||||||
define('BASE_DIR', $basedir);
 | 
					define('BASE_DIR', $baseDir);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if(!IS_CLI) {
 | 
					if(!IS_CLI) {
 | 
				
			||||||
	if (isset($_SERVER['HTTP_HOST'][0])) {
 | 
						if (isset($config['site_url'])) {
 | 
				
			||||||
		$baseHost = $_SERVER['HTTP_HOST'];
 | 
							$hasSlashAtEnd = ($config['site_url'][strlen($config['site_url']) - 1] == '/');
 | 
				
			||||||
	} else {
 | 
					 | 
				
			||||||
		if (isset($_SERVER['SERVER_NAME'][0])) {
 | 
					 | 
				
			||||||
			$baseHost = $_SERVER['SERVER_NAME'];
 | 
					 | 
				
			||||||
		} else {
 | 
					 | 
				
			||||||
			$baseHost = $_SERVER['SERVER_ADDR'];
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							define('SERVER_URL', $config['site_url']);
 | 
				
			||||||
 | 
							define('BASE_URL', SERVER_URL . ($hasSlashAtEnd ? '' : '/'));
 | 
				
			||||||
 | 
							define('ADMIN_URL', SERVER_URL . ($hasSlashAtEnd ? '' : '/') . ADMIN_PANEL_FOLDER . '/');
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						else {
 | 
				
			||||||
		define('SERVER_URL', 'http' . (isHttps() ? 's' : '') . '://' . $baseHost);
 | 
							define('SERVER_URL', 'http' . (isHttps() ? 's' : '') . '://' . $baseHost);
 | 
				
			||||||
		define('BASE_URL', SERVER_URL . BASE_DIR . '/');
 | 
							define('BASE_URL', SERVER_URL . BASE_DIR . '/');
 | 
				
			||||||
		define('ADMIN_URL', SERVER_URL . BASE_DIR . '/' . ADMIN_PANEL_FOLDER . '/');
 | 
							define('ADMIN_URL', SERVER_URL . BASE_DIR . '/' . ADMIN_PANEL_FOLDER . '/');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		//define('CURRENT_URL', BASE_URL . $_SERVER['REQUEST_URI']);
 | 
							//define('CURRENT_URL', BASE_URL . $_SERVER['REQUEST_URI']);
 | 
				
			||||||
}
 | 
						}
 | 
				
			||||||
 | 
					 | 
				
			||||||
if (file_exists(BASE . 'config.local.php')) {
 | 
					 | 
				
			||||||
	require BASE . 'config.local.php';
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/** @var array $config */
 | 
					/** @var array $config */
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -18,7 +18,9 @@
 | 
				
			|||||||
        "symfony/string": "^6.4",
 | 
					        "symfony/string": "^6.4",
 | 
				
			||||||
        "symfony/var-dumper": "^6.4",
 | 
					        "symfony/var-dumper": "^6.4",
 | 
				
			||||||
        "filp/whoops": "^2.15",
 | 
					        "filp/whoops": "^2.15",
 | 
				
			||||||
        "maximebf/debugbar": "1.*"
 | 
					        "maximebf/debugbar": "1.*",
 | 
				
			||||||
 | 
					        "guzzlehttp/guzzle": "7.9.3",
 | 
				
			||||||
 | 
					        "spomky-labs/otphp": "^11.3"
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "require-dev": {
 | 
					    "require-dev": {
 | 
				
			||||||
        "phpstan/phpstan": "^1.10"
 | 
					        "phpstan/phpstan": "^1.10"
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										692
									
								
								composer.lock
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										692
									
								
								composer.lock
									
									
									
										generated
									
									
									
								
							@@ -4,7 +4,7 @@
 | 
				
			|||||||
        "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
 | 
					        "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
 | 
				
			||||||
        "This file is @generated automatically"
 | 
					        "This file is @generated automatically"
 | 
				
			||||||
    ],
 | 
					    ],
 | 
				
			||||||
    "content-hash": "be4d1489a53a9cd8eec6bcaa7a096f30",
 | 
					    "content-hash": "07419f6fe133f9bebc99557f3df843c8",
 | 
				
			||||||
    "packages": [
 | 
					    "packages": [
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            "name": "brick/math",
 | 
					            "name": "brick/math",
 | 
				
			||||||
@@ -493,6 +493,331 @@
 | 
				
			|||||||
            ],
 | 
					            ],
 | 
				
			||||||
            "time": "2024-09-25T12:00:00+00:00"
 | 
					            "time": "2024-09-25T12:00:00+00:00"
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            "name": "guzzlehttp/guzzle",
 | 
				
			||||||
 | 
					            "version": "7.9.3",
 | 
				
			||||||
 | 
					            "source": {
 | 
				
			||||||
 | 
					                "type": "git",
 | 
				
			||||||
 | 
					                "url": "https://github.com/guzzle/guzzle.git",
 | 
				
			||||||
 | 
					                "reference": "7b2f29fe81dc4da0ca0ea7d42107a0845946ea77"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "dist": {
 | 
				
			||||||
 | 
					                "type": "zip",
 | 
				
			||||||
 | 
					                "url": "https://api.github.com/repos/guzzle/guzzle/zipball/7b2f29fe81dc4da0ca0ea7d42107a0845946ea77",
 | 
				
			||||||
 | 
					                "reference": "7b2f29fe81dc4da0ca0ea7d42107a0845946ea77",
 | 
				
			||||||
 | 
					                "shasum": ""
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "require": {
 | 
				
			||||||
 | 
					                "ext-json": "*",
 | 
				
			||||||
 | 
					                "guzzlehttp/promises": "^1.5.3 || ^2.0.3",
 | 
				
			||||||
 | 
					                "guzzlehttp/psr7": "^2.7.0",
 | 
				
			||||||
 | 
					                "php": "^7.2.5 || ^8.0",
 | 
				
			||||||
 | 
					                "psr/http-client": "^1.0",
 | 
				
			||||||
 | 
					                "symfony/deprecation-contracts": "^2.2 || ^3.0"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "provide": {
 | 
				
			||||||
 | 
					                "psr/http-client-implementation": "1.0"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "require-dev": {
 | 
				
			||||||
 | 
					                "bamarni/composer-bin-plugin": "^1.8.2",
 | 
				
			||||||
 | 
					                "ext-curl": "*",
 | 
				
			||||||
 | 
					                "guzzle/client-integration-tests": "3.0.2",
 | 
				
			||||||
 | 
					                "php-http/message-factory": "^1.1",
 | 
				
			||||||
 | 
					                "phpunit/phpunit": "^8.5.39 || ^9.6.20",
 | 
				
			||||||
 | 
					                "psr/log": "^1.1 || ^2.0 || ^3.0"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "suggest": {
 | 
				
			||||||
 | 
					                "ext-curl": "Required for CURL handler support",
 | 
				
			||||||
 | 
					                "ext-intl": "Required for Internationalized Domain Name (IDN) support",
 | 
				
			||||||
 | 
					                "psr/log": "Required for using the Log middleware"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "type": "library",
 | 
				
			||||||
 | 
					            "extra": {
 | 
				
			||||||
 | 
					                "bamarni-bin": {
 | 
				
			||||||
 | 
					                    "bin-links": true,
 | 
				
			||||||
 | 
					                    "forward-command": false
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "autoload": {
 | 
				
			||||||
 | 
					                "files": [
 | 
				
			||||||
 | 
					                    "src/functions_include.php"
 | 
				
			||||||
 | 
					                ],
 | 
				
			||||||
 | 
					                "psr-4": {
 | 
				
			||||||
 | 
					                    "GuzzleHttp\\": "src/"
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "notification-url": "https://packagist.org/downloads/",
 | 
				
			||||||
 | 
					            "license": [
 | 
				
			||||||
 | 
					                "MIT"
 | 
				
			||||||
 | 
					            ],
 | 
				
			||||||
 | 
					            "authors": [
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    "name": "Graham Campbell",
 | 
				
			||||||
 | 
					                    "email": "hello@gjcampbell.co.uk",
 | 
				
			||||||
 | 
					                    "homepage": "https://github.com/GrahamCampbell"
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    "name": "Michael Dowling",
 | 
				
			||||||
 | 
					                    "email": "mtdowling@gmail.com",
 | 
				
			||||||
 | 
					                    "homepage": "https://github.com/mtdowling"
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    "name": "Jeremy Lindblom",
 | 
				
			||||||
 | 
					                    "email": "jeremeamia@gmail.com",
 | 
				
			||||||
 | 
					                    "homepage": "https://github.com/jeremeamia"
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    "name": "George Mponos",
 | 
				
			||||||
 | 
					                    "email": "gmponos@gmail.com",
 | 
				
			||||||
 | 
					                    "homepage": "https://github.com/gmponos"
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    "name": "Tobias Nyholm",
 | 
				
			||||||
 | 
					                    "email": "tobias.nyholm@gmail.com",
 | 
				
			||||||
 | 
					                    "homepage": "https://github.com/Nyholm"
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    "name": "Márk Sági-Kazár",
 | 
				
			||||||
 | 
					                    "email": "mark.sagikazar@gmail.com",
 | 
				
			||||||
 | 
					                    "homepage": "https://github.com/sagikazarmark"
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    "name": "Tobias Schultze",
 | 
				
			||||||
 | 
					                    "email": "webmaster@tubo-world.de",
 | 
				
			||||||
 | 
					                    "homepage": "https://github.com/Tobion"
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            ],
 | 
				
			||||||
 | 
					            "description": "Guzzle is a PHP HTTP client library",
 | 
				
			||||||
 | 
					            "keywords": [
 | 
				
			||||||
 | 
					                "client",
 | 
				
			||||||
 | 
					                "curl",
 | 
				
			||||||
 | 
					                "framework",
 | 
				
			||||||
 | 
					                "http",
 | 
				
			||||||
 | 
					                "http client",
 | 
				
			||||||
 | 
					                "psr-18",
 | 
				
			||||||
 | 
					                "psr-7",
 | 
				
			||||||
 | 
					                "rest",
 | 
				
			||||||
 | 
					                "web service"
 | 
				
			||||||
 | 
					            ],
 | 
				
			||||||
 | 
					            "support": {
 | 
				
			||||||
 | 
					                "issues": "https://github.com/guzzle/guzzle/issues",
 | 
				
			||||||
 | 
					                "source": "https://github.com/guzzle/guzzle/tree/7.9.3"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "funding": [
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    "url": "https://github.com/GrahamCampbell",
 | 
				
			||||||
 | 
					                    "type": "github"
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    "url": "https://github.com/Nyholm",
 | 
				
			||||||
 | 
					                    "type": "github"
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/guzzle",
 | 
				
			||||||
 | 
					                    "type": "tidelift"
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            ],
 | 
				
			||||||
 | 
					            "time": "2025-03-27T13:37:11+00:00"
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            "name": "guzzlehttp/promises",
 | 
				
			||||||
 | 
					            "version": "2.2.0",
 | 
				
			||||||
 | 
					            "source": {
 | 
				
			||||||
 | 
					                "type": "git",
 | 
				
			||||||
 | 
					                "url": "https://github.com/guzzle/promises.git",
 | 
				
			||||||
 | 
					                "reference": "7c69f28996b0a6920945dd20b3857e499d9ca96c"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "dist": {
 | 
				
			||||||
 | 
					                "type": "zip",
 | 
				
			||||||
 | 
					                "url": "https://api.github.com/repos/guzzle/promises/zipball/7c69f28996b0a6920945dd20b3857e499d9ca96c",
 | 
				
			||||||
 | 
					                "reference": "7c69f28996b0a6920945dd20b3857e499d9ca96c",
 | 
				
			||||||
 | 
					                "shasum": ""
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "require": {
 | 
				
			||||||
 | 
					                "php": "^7.2.5 || ^8.0"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "require-dev": {
 | 
				
			||||||
 | 
					                "bamarni/composer-bin-plugin": "^1.8.2",
 | 
				
			||||||
 | 
					                "phpunit/phpunit": "^8.5.39 || ^9.6.20"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "type": "library",
 | 
				
			||||||
 | 
					            "extra": {
 | 
				
			||||||
 | 
					                "bamarni-bin": {
 | 
				
			||||||
 | 
					                    "bin-links": true,
 | 
				
			||||||
 | 
					                    "forward-command": false
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "autoload": {
 | 
				
			||||||
 | 
					                "psr-4": {
 | 
				
			||||||
 | 
					                    "GuzzleHttp\\Promise\\": "src/"
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "notification-url": "https://packagist.org/downloads/",
 | 
				
			||||||
 | 
					            "license": [
 | 
				
			||||||
 | 
					                "MIT"
 | 
				
			||||||
 | 
					            ],
 | 
				
			||||||
 | 
					            "authors": [
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    "name": "Graham Campbell",
 | 
				
			||||||
 | 
					                    "email": "hello@gjcampbell.co.uk",
 | 
				
			||||||
 | 
					                    "homepage": "https://github.com/GrahamCampbell"
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    "name": "Michael Dowling",
 | 
				
			||||||
 | 
					                    "email": "mtdowling@gmail.com",
 | 
				
			||||||
 | 
					                    "homepage": "https://github.com/mtdowling"
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    "name": "Tobias Nyholm",
 | 
				
			||||||
 | 
					                    "email": "tobias.nyholm@gmail.com",
 | 
				
			||||||
 | 
					                    "homepage": "https://github.com/Nyholm"
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    "name": "Tobias Schultze",
 | 
				
			||||||
 | 
					                    "email": "webmaster@tubo-world.de",
 | 
				
			||||||
 | 
					                    "homepage": "https://github.com/Tobion"
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            ],
 | 
				
			||||||
 | 
					            "description": "Guzzle promises library",
 | 
				
			||||||
 | 
					            "keywords": [
 | 
				
			||||||
 | 
					                "promise"
 | 
				
			||||||
 | 
					            ],
 | 
				
			||||||
 | 
					            "support": {
 | 
				
			||||||
 | 
					                "issues": "https://github.com/guzzle/promises/issues",
 | 
				
			||||||
 | 
					                "source": "https://github.com/guzzle/promises/tree/2.2.0"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "funding": [
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    "url": "https://github.com/GrahamCampbell",
 | 
				
			||||||
 | 
					                    "type": "github"
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    "url": "https://github.com/Nyholm",
 | 
				
			||||||
 | 
					                    "type": "github"
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/promises",
 | 
				
			||||||
 | 
					                    "type": "tidelift"
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            ],
 | 
				
			||||||
 | 
					            "time": "2025-03-27T13:27:01+00:00"
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            "name": "guzzlehttp/psr7",
 | 
				
			||||||
 | 
					            "version": "2.7.1",
 | 
				
			||||||
 | 
					            "source": {
 | 
				
			||||||
 | 
					                "type": "git",
 | 
				
			||||||
 | 
					                "url": "https://github.com/guzzle/psr7.git",
 | 
				
			||||||
 | 
					                "reference": "c2270caaabe631b3b44c85f99e5a04bbb8060d16"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "dist": {
 | 
				
			||||||
 | 
					                "type": "zip",
 | 
				
			||||||
 | 
					                "url": "https://api.github.com/repos/guzzle/psr7/zipball/c2270caaabe631b3b44c85f99e5a04bbb8060d16",
 | 
				
			||||||
 | 
					                "reference": "c2270caaabe631b3b44c85f99e5a04bbb8060d16",
 | 
				
			||||||
 | 
					                "shasum": ""
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "require": {
 | 
				
			||||||
 | 
					                "php": "^7.2.5 || ^8.0",
 | 
				
			||||||
 | 
					                "psr/http-factory": "^1.0",
 | 
				
			||||||
 | 
					                "psr/http-message": "^1.1 || ^2.0",
 | 
				
			||||||
 | 
					                "ralouphie/getallheaders": "^3.0"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "provide": {
 | 
				
			||||||
 | 
					                "psr/http-factory-implementation": "1.0",
 | 
				
			||||||
 | 
					                "psr/http-message-implementation": "1.0"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "require-dev": {
 | 
				
			||||||
 | 
					                "bamarni/composer-bin-plugin": "^1.8.2",
 | 
				
			||||||
 | 
					                "http-interop/http-factory-tests": "0.9.0",
 | 
				
			||||||
 | 
					                "phpunit/phpunit": "^8.5.39 || ^9.6.20"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "suggest": {
 | 
				
			||||||
 | 
					                "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "type": "library",
 | 
				
			||||||
 | 
					            "extra": {
 | 
				
			||||||
 | 
					                "bamarni-bin": {
 | 
				
			||||||
 | 
					                    "bin-links": true,
 | 
				
			||||||
 | 
					                    "forward-command": false
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "autoload": {
 | 
				
			||||||
 | 
					                "psr-4": {
 | 
				
			||||||
 | 
					                    "GuzzleHttp\\Psr7\\": "src/"
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "notification-url": "https://packagist.org/downloads/",
 | 
				
			||||||
 | 
					            "license": [
 | 
				
			||||||
 | 
					                "MIT"
 | 
				
			||||||
 | 
					            ],
 | 
				
			||||||
 | 
					            "authors": [
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    "name": "Graham Campbell",
 | 
				
			||||||
 | 
					                    "email": "hello@gjcampbell.co.uk",
 | 
				
			||||||
 | 
					                    "homepage": "https://github.com/GrahamCampbell"
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    "name": "Michael Dowling",
 | 
				
			||||||
 | 
					                    "email": "mtdowling@gmail.com",
 | 
				
			||||||
 | 
					                    "homepage": "https://github.com/mtdowling"
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    "name": "George Mponos",
 | 
				
			||||||
 | 
					                    "email": "gmponos@gmail.com",
 | 
				
			||||||
 | 
					                    "homepage": "https://github.com/gmponos"
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    "name": "Tobias Nyholm",
 | 
				
			||||||
 | 
					                    "email": "tobias.nyholm@gmail.com",
 | 
				
			||||||
 | 
					                    "homepage": "https://github.com/Nyholm"
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    "name": "Márk Sági-Kazár",
 | 
				
			||||||
 | 
					                    "email": "mark.sagikazar@gmail.com",
 | 
				
			||||||
 | 
					                    "homepage": "https://github.com/sagikazarmark"
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    "name": "Tobias Schultze",
 | 
				
			||||||
 | 
					                    "email": "webmaster@tubo-world.de",
 | 
				
			||||||
 | 
					                    "homepage": "https://github.com/Tobion"
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    "name": "Márk Sági-Kazár",
 | 
				
			||||||
 | 
					                    "email": "mark.sagikazar@gmail.com",
 | 
				
			||||||
 | 
					                    "homepage": "https://sagikazarmark.hu"
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            ],
 | 
				
			||||||
 | 
					            "description": "PSR-7 message implementation that also provides common utility methods",
 | 
				
			||||||
 | 
					            "keywords": [
 | 
				
			||||||
 | 
					                "http",
 | 
				
			||||||
 | 
					                "message",
 | 
				
			||||||
 | 
					                "psr-7",
 | 
				
			||||||
 | 
					                "request",
 | 
				
			||||||
 | 
					                "response",
 | 
				
			||||||
 | 
					                "stream",
 | 
				
			||||||
 | 
					                "uri",
 | 
				
			||||||
 | 
					                "url"
 | 
				
			||||||
 | 
					            ],
 | 
				
			||||||
 | 
					            "support": {
 | 
				
			||||||
 | 
					                "issues": "https://github.com/guzzle/psr7/issues",
 | 
				
			||||||
 | 
					                "source": "https://github.com/guzzle/psr7/tree/2.7.1"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "funding": [
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    "url": "https://github.com/GrahamCampbell",
 | 
				
			||||||
 | 
					                    "type": "github"
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    "url": "https://github.com/Nyholm",
 | 
				
			||||||
 | 
					                    "type": "github"
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7",
 | 
				
			||||||
 | 
					                    "type": "tidelift"
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            ],
 | 
				
			||||||
 | 
					            "time": "2025-03-27T12:30:47+00:00"
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            "name": "illuminate/collections",
 | 
					            "name": "illuminate/collections",
 | 
				
			||||||
            "version": "v10.48.25",
 | 
					            "version": "v10.48.25",
 | 
				
			||||||
@@ -1231,6 +1556,73 @@
 | 
				
			|||||||
            },
 | 
					            },
 | 
				
			||||||
            "time": "2018-02-13T20:26:39+00:00"
 | 
					            "time": "2018-02-13T20:26:39+00:00"
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            "name": "paragonie/constant_time_encoding",
 | 
				
			||||||
 | 
					            "version": "v3.0.0",
 | 
				
			||||||
 | 
					            "source": {
 | 
				
			||||||
 | 
					                "type": "git",
 | 
				
			||||||
 | 
					                "url": "https://github.com/paragonie/constant_time_encoding.git",
 | 
				
			||||||
 | 
					                "reference": "df1e7fde177501eee2037dd159cf04f5f301a512"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "dist": {
 | 
				
			||||||
 | 
					                "type": "zip",
 | 
				
			||||||
 | 
					                "url": "https://api.github.com/repos/paragonie/constant_time_encoding/zipball/df1e7fde177501eee2037dd159cf04f5f301a512",
 | 
				
			||||||
 | 
					                "reference": "df1e7fde177501eee2037dd159cf04f5f301a512",
 | 
				
			||||||
 | 
					                "shasum": ""
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "require": {
 | 
				
			||||||
 | 
					                "php": "^8"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "require-dev": {
 | 
				
			||||||
 | 
					                "phpunit/phpunit": "^9",
 | 
				
			||||||
 | 
					                "vimeo/psalm": "^4|^5"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "type": "library",
 | 
				
			||||||
 | 
					            "autoload": {
 | 
				
			||||||
 | 
					                "psr-4": {
 | 
				
			||||||
 | 
					                    "ParagonIE\\ConstantTime\\": "src/"
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "notification-url": "https://packagist.org/downloads/",
 | 
				
			||||||
 | 
					            "license": [
 | 
				
			||||||
 | 
					                "MIT"
 | 
				
			||||||
 | 
					            ],
 | 
				
			||||||
 | 
					            "authors": [
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    "name": "Paragon Initiative Enterprises",
 | 
				
			||||||
 | 
					                    "email": "security@paragonie.com",
 | 
				
			||||||
 | 
					                    "homepage": "https://paragonie.com",
 | 
				
			||||||
 | 
					                    "role": "Maintainer"
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    "name": "Steve 'Sc00bz' Thomas",
 | 
				
			||||||
 | 
					                    "email": "steve@tobtu.com",
 | 
				
			||||||
 | 
					                    "homepage": "https://www.tobtu.com",
 | 
				
			||||||
 | 
					                    "role": "Original Developer"
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            ],
 | 
				
			||||||
 | 
					            "description": "Constant-time Implementations of RFC 4648 Encoding (Base-64, Base-32, Base-16)",
 | 
				
			||||||
 | 
					            "keywords": [
 | 
				
			||||||
 | 
					                "base16",
 | 
				
			||||||
 | 
					                "base32",
 | 
				
			||||||
 | 
					                "base32_decode",
 | 
				
			||||||
 | 
					                "base32_encode",
 | 
				
			||||||
 | 
					                "base64",
 | 
				
			||||||
 | 
					                "base64_decode",
 | 
				
			||||||
 | 
					                "base64_encode",
 | 
				
			||||||
 | 
					                "bin2hex",
 | 
				
			||||||
 | 
					                "encoding",
 | 
				
			||||||
 | 
					                "hex",
 | 
				
			||||||
 | 
					                "hex2bin",
 | 
				
			||||||
 | 
					                "rfc4648"
 | 
				
			||||||
 | 
					            ],
 | 
				
			||||||
 | 
					            "support": {
 | 
				
			||||||
 | 
					                "email": "info@paragonie.com",
 | 
				
			||||||
 | 
					                "issues": "https://github.com/paragonie/constant_time_encoding/issues",
 | 
				
			||||||
 | 
					                "source": "https://github.com/paragonie/constant_time_encoding"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "time": "2024-05-08T12:36:18+00:00"
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            "name": "peppeocchi/php-cron-scheduler",
 | 
					            "name": "peppeocchi/php-cron-scheduler",
 | 
				
			||||||
            "version": "v4.0",
 | 
					            "version": "v4.0",
 | 
				
			||||||
@@ -1472,6 +1864,166 @@
 | 
				
			|||||||
            },
 | 
					            },
 | 
				
			||||||
            "time": "2021-11-05T16:47:00+00:00"
 | 
					            "time": "2021-11-05T16:47:00+00:00"
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            "name": "psr/http-client",
 | 
				
			||||||
 | 
					            "version": "1.0.3",
 | 
				
			||||||
 | 
					            "source": {
 | 
				
			||||||
 | 
					                "type": "git",
 | 
				
			||||||
 | 
					                "url": "https://github.com/php-fig/http-client.git",
 | 
				
			||||||
 | 
					                "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "dist": {
 | 
				
			||||||
 | 
					                "type": "zip",
 | 
				
			||||||
 | 
					                "url": "https://api.github.com/repos/php-fig/http-client/zipball/bb5906edc1c324c9a05aa0873d40117941e5fa90",
 | 
				
			||||||
 | 
					                "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90",
 | 
				
			||||||
 | 
					                "shasum": ""
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "require": {
 | 
				
			||||||
 | 
					                "php": "^7.0 || ^8.0",
 | 
				
			||||||
 | 
					                "psr/http-message": "^1.0 || ^2.0"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "type": "library",
 | 
				
			||||||
 | 
					            "extra": {
 | 
				
			||||||
 | 
					                "branch-alias": {
 | 
				
			||||||
 | 
					                    "dev-master": "1.0.x-dev"
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "autoload": {
 | 
				
			||||||
 | 
					                "psr-4": {
 | 
				
			||||||
 | 
					                    "Psr\\Http\\Client\\": "src/"
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "notification-url": "https://packagist.org/downloads/",
 | 
				
			||||||
 | 
					            "license": [
 | 
				
			||||||
 | 
					                "MIT"
 | 
				
			||||||
 | 
					            ],
 | 
				
			||||||
 | 
					            "authors": [
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    "name": "PHP-FIG",
 | 
				
			||||||
 | 
					                    "homepage": "https://www.php-fig.org/"
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            ],
 | 
				
			||||||
 | 
					            "description": "Common interface for HTTP clients",
 | 
				
			||||||
 | 
					            "homepage": "https://github.com/php-fig/http-client",
 | 
				
			||||||
 | 
					            "keywords": [
 | 
				
			||||||
 | 
					                "http",
 | 
				
			||||||
 | 
					                "http-client",
 | 
				
			||||||
 | 
					                "psr",
 | 
				
			||||||
 | 
					                "psr-18"
 | 
				
			||||||
 | 
					            ],
 | 
				
			||||||
 | 
					            "support": {
 | 
				
			||||||
 | 
					                "source": "https://github.com/php-fig/http-client"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "time": "2023-09-23T14:17:50+00:00"
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            "name": "psr/http-factory",
 | 
				
			||||||
 | 
					            "version": "1.1.0",
 | 
				
			||||||
 | 
					            "source": {
 | 
				
			||||||
 | 
					                "type": "git",
 | 
				
			||||||
 | 
					                "url": "https://github.com/php-fig/http-factory.git",
 | 
				
			||||||
 | 
					                "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "dist": {
 | 
				
			||||||
 | 
					                "type": "zip",
 | 
				
			||||||
 | 
					                "url": "https://api.github.com/repos/php-fig/http-factory/zipball/2b4765fddfe3b508ac62f829e852b1501d3f6e8a",
 | 
				
			||||||
 | 
					                "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a",
 | 
				
			||||||
 | 
					                "shasum": ""
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "require": {
 | 
				
			||||||
 | 
					                "php": ">=7.1",
 | 
				
			||||||
 | 
					                "psr/http-message": "^1.0 || ^2.0"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "type": "library",
 | 
				
			||||||
 | 
					            "extra": {
 | 
				
			||||||
 | 
					                "branch-alias": {
 | 
				
			||||||
 | 
					                    "dev-master": "1.0.x-dev"
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "autoload": {
 | 
				
			||||||
 | 
					                "psr-4": {
 | 
				
			||||||
 | 
					                    "Psr\\Http\\Message\\": "src/"
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "notification-url": "https://packagist.org/downloads/",
 | 
				
			||||||
 | 
					            "license": [
 | 
				
			||||||
 | 
					                "MIT"
 | 
				
			||||||
 | 
					            ],
 | 
				
			||||||
 | 
					            "authors": [
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    "name": "PHP-FIG",
 | 
				
			||||||
 | 
					                    "homepage": "https://www.php-fig.org/"
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            ],
 | 
				
			||||||
 | 
					            "description": "PSR-17: Common interfaces for PSR-7 HTTP message factories",
 | 
				
			||||||
 | 
					            "keywords": [
 | 
				
			||||||
 | 
					                "factory",
 | 
				
			||||||
 | 
					                "http",
 | 
				
			||||||
 | 
					                "message",
 | 
				
			||||||
 | 
					                "psr",
 | 
				
			||||||
 | 
					                "psr-17",
 | 
				
			||||||
 | 
					                "psr-7",
 | 
				
			||||||
 | 
					                "request",
 | 
				
			||||||
 | 
					                "response"
 | 
				
			||||||
 | 
					            ],
 | 
				
			||||||
 | 
					            "support": {
 | 
				
			||||||
 | 
					                "source": "https://github.com/php-fig/http-factory"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "time": "2024-04-15T12:06:14+00:00"
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            "name": "psr/http-message",
 | 
				
			||||||
 | 
					            "version": "2.0",
 | 
				
			||||||
 | 
					            "source": {
 | 
				
			||||||
 | 
					                "type": "git",
 | 
				
			||||||
 | 
					                "url": "https://github.com/php-fig/http-message.git",
 | 
				
			||||||
 | 
					                "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "dist": {
 | 
				
			||||||
 | 
					                "type": "zip",
 | 
				
			||||||
 | 
					                "url": "https://api.github.com/repos/php-fig/http-message/zipball/402d35bcb92c70c026d1a6a9883f06b2ead23d71",
 | 
				
			||||||
 | 
					                "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71",
 | 
				
			||||||
 | 
					                "shasum": ""
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "require": {
 | 
				
			||||||
 | 
					                "php": "^7.2 || ^8.0"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "type": "library",
 | 
				
			||||||
 | 
					            "extra": {
 | 
				
			||||||
 | 
					                "branch-alias": {
 | 
				
			||||||
 | 
					                    "dev-master": "2.0.x-dev"
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "autoload": {
 | 
				
			||||||
 | 
					                "psr-4": {
 | 
				
			||||||
 | 
					                    "Psr\\Http\\Message\\": "src/"
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "notification-url": "https://packagist.org/downloads/",
 | 
				
			||||||
 | 
					            "license": [
 | 
				
			||||||
 | 
					                "MIT"
 | 
				
			||||||
 | 
					            ],
 | 
				
			||||||
 | 
					            "authors": [
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    "name": "PHP-FIG",
 | 
				
			||||||
 | 
					                    "homepage": "https://www.php-fig.org/"
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            ],
 | 
				
			||||||
 | 
					            "description": "Common interface for HTTP messages",
 | 
				
			||||||
 | 
					            "homepage": "https://github.com/php-fig/http-message",
 | 
				
			||||||
 | 
					            "keywords": [
 | 
				
			||||||
 | 
					                "http",
 | 
				
			||||||
 | 
					                "http-message",
 | 
				
			||||||
 | 
					                "psr",
 | 
				
			||||||
 | 
					                "psr-7",
 | 
				
			||||||
 | 
					                "request",
 | 
				
			||||||
 | 
					                "response"
 | 
				
			||||||
 | 
					            ],
 | 
				
			||||||
 | 
					            "support": {
 | 
				
			||||||
 | 
					                "source": "https://github.com/php-fig/http-message/tree/2.0"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "time": "2023-04-04T09:54:51+00:00"
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            "name": "psr/log",
 | 
					            "name": "psr/log",
 | 
				
			||||||
            "version": "3.0.2",
 | 
					            "version": "3.0.2",
 | 
				
			||||||
@@ -1573,6 +2125,132 @@
 | 
				
			|||||||
            },
 | 
					            },
 | 
				
			||||||
            "time": "2021-10-29T13:26:27+00:00"
 | 
					            "time": "2021-10-29T13:26:27+00:00"
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            "name": "ralouphie/getallheaders",
 | 
				
			||||||
 | 
					            "version": "3.0.3",
 | 
				
			||||||
 | 
					            "source": {
 | 
				
			||||||
 | 
					                "type": "git",
 | 
				
			||||||
 | 
					                "url": "https://github.com/ralouphie/getallheaders.git",
 | 
				
			||||||
 | 
					                "reference": "120b605dfeb996808c31b6477290a714d356e822"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "dist": {
 | 
				
			||||||
 | 
					                "type": "zip",
 | 
				
			||||||
 | 
					                "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822",
 | 
				
			||||||
 | 
					                "reference": "120b605dfeb996808c31b6477290a714d356e822",
 | 
				
			||||||
 | 
					                "shasum": ""
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "require": {
 | 
				
			||||||
 | 
					                "php": ">=5.6"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "require-dev": {
 | 
				
			||||||
 | 
					                "php-coveralls/php-coveralls": "^2.1",
 | 
				
			||||||
 | 
					                "phpunit/phpunit": "^5 || ^6.5"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "type": "library",
 | 
				
			||||||
 | 
					            "autoload": {
 | 
				
			||||||
 | 
					                "files": [
 | 
				
			||||||
 | 
					                    "src/getallheaders.php"
 | 
				
			||||||
 | 
					                ]
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "notification-url": "https://packagist.org/downloads/",
 | 
				
			||||||
 | 
					            "license": [
 | 
				
			||||||
 | 
					                "MIT"
 | 
				
			||||||
 | 
					            ],
 | 
				
			||||||
 | 
					            "authors": [
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    "name": "Ralph Khattar",
 | 
				
			||||||
 | 
					                    "email": "ralph.khattar@gmail.com"
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            ],
 | 
				
			||||||
 | 
					            "description": "A polyfill for getallheaders.",
 | 
				
			||||||
 | 
					            "support": {
 | 
				
			||||||
 | 
					                "issues": "https://github.com/ralouphie/getallheaders/issues",
 | 
				
			||||||
 | 
					                "source": "https://github.com/ralouphie/getallheaders/tree/develop"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "time": "2019-03-08T08:55:37+00:00"
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            "name": "spomky-labs/otphp",
 | 
				
			||||||
 | 
					            "version": "11.3.0",
 | 
				
			||||||
 | 
					            "source": {
 | 
				
			||||||
 | 
					                "type": "git",
 | 
				
			||||||
 | 
					                "url": "https://github.com/Spomky-Labs/otphp.git",
 | 
				
			||||||
 | 
					                "reference": "2d8ccb5fc992b9cc65ef321fa4f00fefdb3f4b33"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "dist": {
 | 
				
			||||||
 | 
					                "type": "zip",
 | 
				
			||||||
 | 
					                "url": "https://api.github.com/repos/Spomky-Labs/otphp/zipball/2d8ccb5fc992b9cc65ef321fa4f00fefdb3f4b33",
 | 
				
			||||||
 | 
					                "reference": "2d8ccb5fc992b9cc65ef321fa4f00fefdb3f4b33",
 | 
				
			||||||
 | 
					                "shasum": ""
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "require": {
 | 
				
			||||||
 | 
					                "ext-mbstring": "*",
 | 
				
			||||||
 | 
					                "paragonie/constant_time_encoding": "^2.0 || ^3.0",
 | 
				
			||||||
 | 
					                "php": ">=8.1",
 | 
				
			||||||
 | 
					                "psr/clock": "^1.0",
 | 
				
			||||||
 | 
					                "symfony/deprecation-contracts": "^3.2"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "require-dev": {
 | 
				
			||||||
 | 
					                "ekino/phpstan-banned-code": "^1.0",
 | 
				
			||||||
 | 
					                "infection/infection": "^0.26|^0.27|^0.28|^0.29",
 | 
				
			||||||
 | 
					                "php-parallel-lint/php-parallel-lint": "^1.3",
 | 
				
			||||||
 | 
					                "phpstan/phpstan": "^1.0",
 | 
				
			||||||
 | 
					                "phpstan/phpstan-deprecation-rules": "^1.0",
 | 
				
			||||||
 | 
					                "phpstan/phpstan-phpunit": "^1.0",
 | 
				
			||||||
 | 
					                "phpstan/phpstan-strict-rules": "^1.0",
 | 
				
			||||||
 | 
					                "phpunit/phpunit": "^9.5.26|^10.0|^11.0",
 | 
				
			||||||
 | 
					                "qossmic/deptrac-shim": "^1.0",
 | 
				
			||||||
 | 
					                "rector/rector": "^1.0",
 | 
				
			||||||
 | 
					                "symfony/phpunit-bridge": "^6.1|^7.0",
 | 
				
			||||||
 | 
					                "symplify/easy-coding-standard": "^12.0"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "type": "library",
 | 
				
			||||||
 | 
					            "autoload": {
 | 
				
			||||||
 | 
					                "psr-4": {
 | 
				
			||||||
 | 
					                    "OTPHP\\": "src/"
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "notification-url": "https://packagist.org/downloads/",
 | 
				
			||||||
 | 
					            "license": [
 | 
				
			||||||
 | 
					                "MIT"
 | 
				
			||||||
 | 
					            ],
 | 
				
			||||||
 | 
					            "authors": [
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    "name": "Florent Morselli",
 | 
				
			||||||
 | 
					                    "homepage": "https://github.com/Spomky"
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    "name": "All contributors",
 | 
				
			||||||
 | 
					                    "homepage": "https://github.com/Spomky-Labs/otphp/contributors"
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            ],
 | 
				
			||||||
 | 
					            "description": "A PHP library for generating one time passwords according to RFC 4226 (HOTP Algorithm) and the RFC 6238 (TOTP Algorithm) and compatible with Google Authenticator",
 | 
				
			||||||
 | 
					            "homepage": "https://github.com/Spomky-Labs/otphp",
 | 
				
			||||||
 | 
					            "keywords": [
 | 
				
			||||||
 | 
					                "FreeOTP",
 | 
				
			||||||
 | 
					                "RFC 4226",
 | 
				
			||||||
 | 
					                "RFC 6238",
 | 
				
			||||||
 | 
					                "google authenticator",
 | 
				
			||||||
 | 
					                "hotp",
 | 
				
			||||||
 | 
					                "otp",
 | 
				
			||||||
 | 
					                "totp"
 | 
				
			||||||
 | 
					            ],
 | 
				
			||||||
 | 
					            "support": {
 | 
				
			||||||
 | 
					                "issues": "https://github.com/Spomky-Labs/otphp/issues",
 | 
				
			||||||
 | 
					                "source": "https://github.com/Spomky-Labs/otphp/tree/11.3.0"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "funding": [
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    "url": "https://github.com/Spomky",
 | 
				
			||||||
 | 
					                    "type": "github"
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    "url": "https://www.patreon.com/FlorentMorselli",
 | 
				
			||||||
 | 
					                    "type": "patreon"
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            ],
 | 
				
			||||||
 | 
					            "time": "2024-06-12T11:22:32+00:00"
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            "name": "symfony/console",
 | 
					            "name": "symfony/console",
 | 
				
			||||||
            "version": "v6.4.17",
 | 
					            "version": "v6.4.17",
 | 
				
			||||||
@@ -2637,16 +3315,16 @@
 | 
				
			|||||||
        },
 | 
					        },
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            "name": "twig/twig",
 | 
					            "name": "twig/twig",
 | 
				
			||||||
            "version": "v3.18.0",
 | 
					            "version": "v3.19.0",
 | 
				
			||||||
            "source": {
 | 
					            "source": {
 | 
				
			||||||
                "type": "git",
 | 
					                "type": "git",
 | 
				
			||||||
                "url": "https://github.com/twigphp/Twig.git",
 | 
					                "url": "https://github.com/twigphp/Twig.git",
 | 
				
			||||||
                "reference": "acffa88cc2b40dbe42eaf3a5025d6c0d4600cc50"
 | 
					                "reference": "d4f8c2b86374f08efc859323dbcd95c590f7124e"
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
            "dist": {
 | 
					            "dist": {
 | 
				
			||||||
                "type": "zip",
 | 
					                "type": "zip",
 | 
				
			||||||
                "url": "https://api.github.com/repos/twigphp/Twig/zipball/acffa88cc2b40dbe42eaf3a5025d6c0d4600cc50",
 | 
					                "url": "https://api.github.com/repos/twigphp/Twig/zipball/d4f8c2b86374f08efc859323dbcd95c590f7124e",
 | 
				
			||||||
                "reference": "acffa88cc2b40dbe42eaf3a5025d6c0d4600cc50",
 | 
					                "reference": "d4f8c2b86374f08efc859323dbcd95c590f7124e",
 | 
				
			||||||
                "shasum": ""
 | 
					                "shasum": ""
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
            "require": {
 | 
					            "require": {
 | 
				
			||||||
@@ -2701,7 +3379,7 @@
 | 
				
			|||||||
            ],
 | 
					            ],
 | 
				
			||||||
            "support": {
 | 
					            "support": {
 | 
				
			||||||
                "issues": "https://github.com/twigphp/Twig/issues",
 | 
					                "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": [
 | 
					            "funding": [
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
@@ -2713,7 +3391,7 @@
 | 
				
			|||||||
                    "type": "tidelift"
 | 
					                    "type": "tidelift"
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            ],
 | 
					            ],
 | 
				
			||||||
            "time": "2024-12-29T10:51:50+00:00"
 | 
					            "time": "2025-01-29T07:06:14+00:00"
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            "name": "voku/portable-ascii",
 | 
					            "name": "voku/portable-ascii",
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -17,7 +17,7 @@ describe('Check Public Pages', () => {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	it('Go to changelog page', () => {
 | 
						it('Go to changelog page', () => {
 | 
				
			||||||
		cy.visit({
 | 
							cy.visit({
 | 
				
			||||||
			url: Cypress.env('URL') + '/changelog',
 | 
								url: Cypress.env('URL') + '/change-log',
 | 
				
			||||||
			method: 'GET',
 | 
								method: 'GET',
 | 
				
			||||||
		})
 | 
							})
 | 
				
			||||||
	})
 | 
						})
 | 
				
			||||||
@@ -132,7 +132,7 @@ describe('Check Public Pages', () => {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	it('Go to server info page', () => {
 | 
						it('Go to server info page', () => {
 | 
				
			||||||
		cy.visit({
 | 
							cy.visit({
 | 
				
			||||||
			url: Cypress.env('URL') + '/server-info',
 | 
								url: Cypress.env('URL') + '/ots-info',
 | 
				
			||||||
			method: 'GET',
 | 
								method: 'GET',
 | 
				
			||||||
		})
 | 
							})
 | 
				
			||||||
	})
 | 
						})
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										
											BIN
										
									
								
								images/order_asc.gif
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								images/order_asc.gif
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| 
		 After Width: | Height: | Size: 56 B  | 
							
								
								
									
										
											BIN
										
									
								
								images/order_desc.gif
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								images/order_desc.gif
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| 
		 After Width: | Height: | Size: 56 B  | 
							
								
								
									
										32
									
								
								index.php
									
									
									
									
									
								
							
							
						
						
									
										32
									
								
								index.php
									
									
									
									
									
								
							@@ -31,11 +31,11 @@ require_once 'common.php';
 | 
				
			|||||||
require_once SYSTEM . 'functions.php';
 | 
					require_once SYSTEM . 'functions.php';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
$uri = $_SERVER['REQUEST_URI'];
 | 
					$uri = $_SERVER['REQUEST_URI'];
 | 
				
			||||||
if(false !== strpos($uri, 'index.php')) {
 | 
					if(str_contains($uri, 'index.php')) {
 | 
				
			||||||
	$uri = str_replace_first('/index.php', '', $uri);
 | 
						$uri = str_replace_first('/index.php', '', $uri);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if(0 === strpos($uri, '/')) {
 | 
					if(str_starts_with($uri, '/')) {
 | 
				
			||||||
	$uri = str_replace_first('/', '', $uri);
 | 
						$uri = str_replace_first('/', '', $uri);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -76,6 +76,8 @@ require_once SYSTEM . 'status.php';
 | 
				
			|||||||
$twig->addGlobal('config', $config);
 | 
					$twig->addGlobal('config', $config);
 | 
				
			||||||
$twig->addGlobal('status', $status);
 | 
					$twig->addGlobal('status', $status);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					$hooks->trigger(HOOK_STARTUP);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// backward support for gesior
 | 
					// backward support for gesior
 | 
				
			||||||
if(setting('core.backward_support')) {
 | 
					if(setting('core.backward_support')) {
 | 
				
			||||||
	define('INITIALIZED', true);
 | 
						define('INITIALIZED', true);
 | 
				
			||||||
@@ -91,6 +93,7 @@ if(setting('core.backward_support')) {
 | 
				
			|||||||
	if($logged && $account_logged)
 | 
						if($logged && $account_logged)
 | 
				
			||||||
		$group_id_of_acc_logged = $account_logged->getGroupId();
 | 
							$group_id_of_acc_logged = $account_logged->getGroupId();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						$config['serverPath'] = $config['server_path'];
 | 
				
			||||||
	$config['site'] = &$config;
 | 
						$config['site'] = &$config;
 | 
				
			||||||
	$config['server'] = &$config['lua'];
 | 
						$config['server'] = &$config['lua'];
 | 
				
			||||||
	$config['site']['shop_system'] = setting('core.gifts_system');
 | 
						$config['site']['shop_system'] = setting('core.gifts_system');
 | 
				
			||||||
@@ -115,9 +118,15 @@ if(setting('core.backward_support')) {
 | 
				
			|||||||
		$config['status']['serverStatus_' . $key] = $value;
 | 
							$config['status']['serverStatus_' . $key] = $value;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
require_once SYSTEM . 'router.php';
 | 
					if(setting('core.views_counter')) {
 | 
				
			||||||
 | 
						require_once SYSTEM . 'counter.php';
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
$hooks->trigger(HOOK_STARTUP);
 | 
					if(setting('core.visitors_counter')) {
 | 
				
			||||||
 | 
						$visitors = new Visitors(setting('core.visitors_counter_ttl'));
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					require_once SYSTEM . 'router.php';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// anonymous usage statistics
 | 
					// anonymous usage statistics
 | 
				
			||||||
// sent only when user agrees
 | 
					// sent only when user agrees
 | 
				
			||||||
@@ -153,21 +162,6 @@ if(setting('core.anonymous_usage_statistics')) {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if(setting('core.views_counter'))
 | 
					 | 
				
			||||||
	require_once SYSTEM . 'counter.php';
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
if(setting('core.visitors_counter')) {
 | 
					 | 
				
			||||||
	$visitors = new Visitors(setting('core.visitors_counter_ttl'));
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 * @var OTS_Account $account_logged
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
if ($logged && admin()) {
 | 
					 | 
				
			||||||
	$content .= $twig->render('admin-bar.html.twig', [
 | 
					 | 
				
			||||||
		'username' => USE_ACCOUNT_NAME ? $account_logged->getName() : $account_logged->getId()
 | 
					 | 
				
			||||||
	]);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
$title_full =  (isset($title) ? $title . ' - ' : '') . $config['lua']['serverName'];
 | 
					$title_full =  (isset($title) ? $title . ' - ' : '') . $config['lua']['serverName'];
 | 
				
			||||||
require $template_path . '/' . $template_index;
 | 
					require $template_path . '/' . $template_index;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -26,6 +26,9 @@ if(!isset($error) || !$error) {
 | 
				
			|||||||
		$config['database_type'] = $config['lua']['database_type'];
 | 
							$config['database_type'] = $config['lua']['database_type'];
 | 
				
			||||||
	else if(isset($config['lua']['sql_type'])) // otserv
 | 
						else if(isset($config['lua']['sql_type'])) // otserv
 | 
				
			||||||
		$config['database_type'] = $config['lua']['sql_type'];
 | 
							$config['database_type'] = $config['lua']['sql_type'];
 | 
				
			||||||
 | 
						else {
 | 
				
			||||||
 | 
							$config['database_type'] = '';
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	$config['database_type'] = strtolower($config['database_type']);
 | 
						$config['database_type'] = strtolower($config['database_type']);
 | 
				
			||||||
	if(empty($config['database_type'])) {
 | 
						if(empty($config['database_type'])) {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,35 +1,44 @@
 | 
				
			|||||||
SET @myaac_database_version = 43;
 | 
					SET @myaac_database_version = 45;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
CREATE TABLE `myaac_account_actions`
 | 
					CREATE TABLE `myaac_account_actions`
 | 
				
			||||||
(
 | 
					(
 | 
				
			||||||
	`account_id` INT(11) NOT NULL,
 | 
						`account_id` int NOT NULL,
 | 
				
			||||||
	`ip` INT(10) UNSIGNED NOT NULL DEFAULT 0,
 | 
						`ip` int unsigned NOT NULL DEFAULT 0,
 | 
				
			||||||
	`ipv6` BINARY(16) NOT NULL DEFAULT 0,
 | 
						`ipv6` binary(16) NOT NULL DEFAULT 0,
 | 
				
			||||||
	`date` INT(11) NOT NULL DEFAULT 0,
 | 
						`date` int NOT NULL DEFAULT 0,
 | 
				
			||||||
	`action` VARCHAR(255) NOT NULL DEFAULT '',
 | 
						`action` varchar(255) NOT NULL DEFAULT '',
 | 
				
			||||||
	KEY (`account_id`)
 | 
						KEY (`account_id`)
 | 
				
			||||||
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8mb4;
 | 
					) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8mb4;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CREATE TABLE `myaac_account_email_codes`
 | 
				
			||||||
 | 
					(
 | 
				
			||||||
 | 
						`id` int(11) NOT NULL AUTO_INCREMENT,
 | 
				
			||||||
 | 
						`account_id` int NOT NULL,
 | 
				
			||||||
 | 
						`code` varchar(6) NOT NULL,
 | 
				
			||||||
 | 
						`created_at` int NOT NULL,
 | 
				
			||||||
 | 
						PRIMARY KEY (`id`)
 | 
				
			||||||
 | 
					) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8mb4;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
CREATE TABLE `myaac_admin_menu`
 | 
					CREATE TABLE `myaac_admin_menu`
 | 
				
			||||||
(
 | 
					(
 | 
				
			||||||
	`id` INT(11) NOT NULL AUTO_INCREMENT,
 | 
						`id` int NOT NULL AUTO_INCREMENT,
 | 
				
			||||||
	`name` VARCHAR(255) NOT NULL DEFAULT '',
 | 
						`name` varchar(255) NOT NULL DEFAULT '',
 | 
				
			||||||
	`page` VARCHAR(255) NOT NULL DEFAULT '',
 | 
						`page` varchar(255) NOT NULL DEFAULT '',
 | 
				
			||||||
	`ordering` INT(11) NOT NULL DEFAULT 0,
 | 
						`ordering` int NOT NULL DEFAULT 0,
 | 
				
			||||||
	`flags` INT(11) NOT NULL DEFAULT 0,
 | 
						`flags` int NOT NULL DEFAULT 0,
 | 
				
			||||||
	`enabled` INT(1) NOT NULL DEFAULT 1,
 | 
						`enabled` int NOT NULL DEFAULT 1,
 | 
				
			||||||
	PRIMARY KEY (`id`)
 | 
						PRIMARY KEY (`id`)
 | 
				
			||||||
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8mb4;
 | 
					) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8mb4;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
CREATE TABLE `myaac_changelog`
 | 
					CREATE TABLE `myaac_changelog`
 | 
				
			||||||
(
 | 
					(
 | 
				
			||||||
	`id` INT(11) NOT NULL AUTO_INCREMENT,
 | 
						`id` int NOT NULL AUTO_INCREMENT,
 | 
				
			||||||
	`body` VARCHAR(500) NOT NULL DEFAULT '',
 | 
						`body` varchar(500) NOT NULL DEFAULT '',
 | 
				
			||||||
	`type` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '1 - added, 2 - removed, 3 - changed, 4 - fixed',
 | 
						`type` tinyint 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',
 | 
						`where` tinyint NOT NULL DEFAULT 0 COMMENT '1 - server, 2 - site',
 | 
				
			||||||
	`date` INT(11) NOT NULL DEFAULT 0,
 | 
						`date` int NOT NULL DEFAULT 0,
 | 
				
			||||||
	`player_id` INT(11) NOT NULL DEFAULT 0,
 | 
						`player_id` int NOT NULL DEFAULT 0,
 | 
				
			||||||
	`hide` TINYINT(1) NOT NULL DEFAULT 0,
 | 
						`hide` tinyint NOT NULL DEFAULT 0,
 | 
				
			||||||
	PRIMARY KEY (`id`)
 | 
						PRIMARY KEY (`id`)
 | 
				
			||||||
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8mb4;
 | 
					) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8mb4;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -37,9 +46,9 @@ INSERT INTO `myaac_changelog` (`id`, `type`, `where`, `date`, `body`, `hide`) VA
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
CREATE TABLE `myaac_config`
 | 
					CREATE TABLE `myaac_config`
 | 
				
			||||||
(
 | 
					(
 | 
				
			||||||
	`id` INT(11) NOT NULL AUTO_INCREMENT,
 | 
						`id` int NOT NULL AUTO_INCREMENT,
 | 
				
			||||||
	`name` VARCHAR(30) NOT NULL,
 | 
						`name` varchar(30) NOT NULL,
 | 
				
			||||||
	`value` VARCHAR(1000) NOT NULL,
 | 
						`value` varchar(1000) NOT NULL,
 | 
				
			||||||
	PRIMARY KEY (`id`),
 | 
						PRIMARY KEY (`id`),
 | 
				
			||||||
	UNIQUE (`name`)
 | 
						UNIQUE (`name`)
 | 
				
			||||||
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8mb4;
 | 
					) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8mb4;
 | 
				
			||||||
@@ -48,24 +57,24 @@ INSERT INTO `myaac_config` (`name`, `value`) VALUES ('database_version', @myaac_
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
CREATE TABLE `myaac_faq`
 | 
					CREATE TABLE `myaac_faq`
 | 
				
			||||||
(
 | 
					(
 | 
				
			||||||
	`id` INT(11) NOT NULL AUTO_INCREMENT,
 | 
						`id` int NOT NULL AUTO_INCREMENT,
 | 
				
			||||||
	`question` VARCHAR(255) NOT NULL DEFAULT '',
 | 
						`question` varchar(255) NOT NULL DEFAULT '',
 | 
				
			||||||
	`answer` VARCHAR(1020) NOT NULL DEFAULT '',
 | 
						`answer` varchar(1020) NOT NULL DEFAULT '',
 | 
				
			||||||
	`ordering` INT(11) NOT NULL DEFAULT 0,
 | 
						`ordering` int NOT NULL DEFAULT 0,
 | 
				
			||||||
	`hide` TINYINT(1) NOT NULL DEFAULT 0,
 | 
						`hide` tinyint NOT NULL DEFAULT 0,
 | 
				
			||||||
	PRIMARY KEY (`id`)
 | 
						PRIMARY KEY (`id`)
 | 
				
			||||||
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8mb4;
 | 
					) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8mb4;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
CREATE TABLE `myaac_forum_boards`
 | 
					CREATE TABLE `myaac_forum_boards`
 | 
				
			||||||
(
 | 
					(
 | 
				
			||||||
	`id` INT(11) NOT NULL AUTO_INCREMENT,
 | 
						`id` int NOT NULL AUTO_INCREMENT,
 | 
				
			||||||
	`name` VARCHAR(32) NOT NULL,
 | 
						`name` varchar(32) NOT NULL,
 | 
				
			||||||
	`description` VARCHAR(255) NOT NULL DEFAULT '',
 | 
						`description` varchar(255) NOT NULL DEFAULT '',
 | 
				
			||||||
	`ordering` INT(11) NOT NULL DEFAULT 0,
 | 
						`ordering` int NOT NULL DEFAULT 0,
 | 
				
			||||||
	`guild` INT(11) NOT NULL DEFAULT 0,
 | 
						`guild` int NOT NULL DEFAULT 0,
 | 
				
			||||||
	`access` INT(11) NOT NULL DEFAULT 0,
 | 
						`access` int NOT NULL DEFAULT 0,
 | 
				
			||||||
	`closed` TINYINT(1) NOT NULL DEFAULT 0,
 | 
						`closed` tinyint NOT NULL DEFAULT 0,
 | 
				
			||||||
	`hide` TINYINT(1) NOT NULL DEFAULT 0,
 | 
						`hide` tinyint NOT NULL DEFAULT 0,
 | 
				
			||||||
	PRIMARY KEY (`id`)
 | 
						PRIMARY KEY (`id`)
 | 
				
			||||||
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8mb4;
 | 
					) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8mb4;
 | 
				
			||||||
INSERT INTO `myaac_forum_boards` (`id`, `name`, `description`, `ordering`, `closed`) VALUES (NULL, 'News', 'News commenting', 0, 1);
 | 
					INSERT INTO `myaac_forum_boards` (`id`, `name`, `description`, `ordering`, `closed`) VALUES (NULL, 'News', 'News commenting', 0, 1);
 | 
				
			||||||
@@ -76,100 +85,100 @@ INSERT INTO `myaac_forum_boards` (`id`, `name`, `description`, `ordering`) VALUE
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
CREATE TABLE `myaac_forum`
 | 
					CREATE TABLE `myaac_forum`
 | 
				
			||||||
(
 | 
					(
 | 
				
			||||||
	`id` int(11) NOT NULL AUTO_INCREMENT,
 | 
						`id` int NOT NULL AUTO_INCREMENT,
 | 
				
			||||||
	`first_post` int(11) NOT NULL default '0',
 | 
						`first_post` int NOT NULL DEFAULT 0,
 | 
				
			||||||
	`last_post` int(11) NOT NULL default '0',
 | 
						`last_post` int NOT NULL DEFAULT 0,
 | 
				
			||||||
	`section` int(3) NOT NULL default '0',
 | 
						`section` int NOT NULL DEFAULT 0,
 | 
				
			||||||
	`replies` int(20) NOT NULL default '0',
 | 
						`replies` int NOT NULL DEFAULT 0,
 | 
				
			||||||
	`views` int(20) NOT NULL default '0',
 | 
						`views` int NOT NULL DEFAULT 0,
 | 
				
			||||||
	`author_aid` int(20) NOT NULL default '0',
 | 
						`author_aid` int NOT NULL DEFAULT 0,
 | 
				
			||||||
	`author_guid` int(20) NOT NULL default '0',
 | 
						`author_guid` int NOT NULL DEFAULT 0,
 | 
				
			||||||
	`post_text` text NOT NULL,
 | 
						`post_text` text NOT NULL,
 | 
				
			||||||
	`post_topic` varchar(255) NOT NULL DEFAULT '',
 | 
						`post_topic` varchar(255) NOT NULL DEFAULT '',
 | 
				
			||||||
	`post_smile` tinyint(1) NOT NULL default '0',
 | 
						`post_smile` tinyint NOT NULL DEFAULT 0,
 | 
				
			||||||
	`post_html` tinyint(1) NOT NULL default '0',
 | 
						`post_html` tinyint NOT NULL DEFAULT 0,
 | 
				
			||||||
	`post_date` int(20) NOT NULL default '0',
 | 
						`post_date` int NOT NULL DEFAULT 0,
 | 
				
			||||||
	`last_edit_aid` int(20) NOT NULL default '0',
 | 
						`last_edit_aid` int NOT NULL DEFAULT 0,
 | 
				
			||||||
	`edit_date` int(20) NOT NULL default '0',
 | 
						`edit_date` int NOT NULL DEFAULT 0,
 | 
				
			||||||
	`post_ip` varchar(45) NOT NULL default '0.0.0.0',
 | 
						`post_ip` varchar(45) NOT NULL DEFAULT '0.0.0.0',
 | 
				
			||||||
	`sticked` tinyint(1) NOT NULL DEFAULT '0',
 | 
						`sticked` tinyint NOT NULL DEFAULT 0,
 | 
				
			||||||
	`closed` tinyint(1) NOT NULL DEFAULT '0',
 | 
						`closed` tinyint NOT NULL DEFAULT 0,
 | 
				
			||||||
	PRIMARY KEY (`id`),
 | 
						PRIMARY KEY (`id`),
 | 
				
			||||||
	KEY `section` (`section`)
 | 
						KEY `section` (`section`)
 | 
				
			||||||
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8mb4;
 | 
					) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8mb4;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
CREATE TABLE `myaac_menu`
 | 
					CREATE TABLE `myaac_menu`
 | 
				
			||||||
(
 | 
					(
 | 
				
			||||||
	`id` INT(11) NOT NULL AUTO_INCREMENT,
 | 
						`id` int NOT NULL AUTO_INCREMENT,
 | 
				
			||||||
	`template` VARCHAR(255) NOT NULL,
 | 
						`template` varchar(255) NOT NULL,
 | 
				
			||||||
	`name` VARCHAR(255) NOT NULL,
 | 
						`name` varchar(255) NOT NULL,
 | 
				
			||||||
	`link` VARCHAR(255) NOT NULL,
 | 
						`link` varchar(255) NOT NULL,
 | 
				
			||||||
	`blank` TINYINT(1) NOT NULL DEFAULT 0,
 | 
						`blank` tinyint NOT NULL DEFAULT 0,
 | 
				
			||||||
	`color` VARCHAR(6) NOT NULL DEFAULT '',
 | 
						`color` varchar(6) NOT NULL DEFAULT '',
 | 
				
			||||||
	`category` INT(11) NOT NULL DEFAULT 1,
 | 
						`category` int NOT NULL DEFAULT 1,
 | 
				
			||||||
	`ordering` INT(11) NOT NULL DEFAULT 0,
 | 
						`ordering` int NOT NULL DEFAULT 0,
 | 
				
			||||||
	`enabled` INT(1) NOT NULL DEFAULT 1,
 | 
						`enabled` int NOT NULL DEFAULT 1,
 | 
				
			||||||
	PRIMARY KEY (`id`)
 | 
						PRIMARY KEY (`id`)
 | 
				
			||||||
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8mb4;
 | 
					) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8mb4;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
CREATE TABLE `myaac_monsters` (
 | 
					CREATE TABLE `myaac_monsters` (
 | 
				
			||||||
	`id` int(11) NOT NULL AUTO_INCREMENT,
 | 
						`id` int NOT NULL AUTO_INCREMENT,
 | 
				
			||||||
	`hide` tinyint(1) NOT NULL default 0,
 | 
						`hide` tinyint NOT NULL DEFAULT 0,
 | 
				
			||||||
	`name` varchar(255) NOT NULL,
 | 
						`name` varchar(255) NOT NULL,
 | 
				
			||||||
	`mana` int(11) NOT NULL DEFAULT 0,
 | 
						`mana` int NOT NULL DEFAULT 0,
 | 
				
			||||||
	`exp` int(11) NOT NULL,
 | 
						`exp` int NOT NULL,
 | 
				
			||||||
	`health` int(11) NOT NULL,
 | 
						`health` int NOT NULL,
 | 
				
			||||||
	`look` VARCHAR(255) NOT NULL DEFAULT '',
 | 
						`look` varchar(255) NOT NULL DEFAULT '',
 | 
				
			||||||
	`speed_lvl` int(11) NOT NULL default 1,
 | 
						`speed_lvl` int NOT NULL DEFAULT 1,
 | 
				
			||||||
	`use_haste` tinyint(1) NOT NULL,
 | 
						`use_haste` tinyint NOT NULL,
 | 
				
			||||||
	`voices` text NOT NULL,
 | 
						`voices` text NOT NULL,
 | 
				
			||||||
	`immunities` varchar(255) NOT NULL,
 | 
						`immunities` varchar(255) NOT NULL,
 | 
				
			||||||
	`elements` TEXT NOT NULL,
 | 
						`elements` text NOT NULL,
 | 
				
			||||||
	`summonable` tinyint(1) NOT NULL,
 | 
						`summonable` tinyint NOT NULL,
 | 
				
			||||||
	`convinceable` tinyint(1) NOT NULL,
 | 
						`convinceable` tinyint NOT NULL,
 | 
				
			||||||
	`pushable` TINYINT(1) NOT NULL DEFAULT '0',
 | 
						`pushable` tinyint NOT NULL DEFAULT 0,
 | 
				
			||||||
	`canpushitems` TINYINT(1) NOT NULL DEFAULT '0',
 | 
						`canpushitems` tinyint NOT NULL DEFAULT 0,
 | 
				
			||||||
	`canwalkonenergy` TINYINT(1) NOT NULL DEFAULT '0',
 | 
						`canwalkonenergy` tinyint NOT NULL DEFAULT 0,
 | 
				
			||||||
	`canwalkonpoison` TINYINT(1) NOT NULL DEFAULT '0',
 | 
						`canwalkonpoison` tinyint NOT NULL DEFAULT 0,
 | 
				
			||||||
	`canwalkonfire` TINYINT(1) NOT NULL DEFAULT '0',
 | 
						`canwalkonfire` tinyint NOT NULL DEFAULT 0,
 | 
				
			||||||
	`runonhealth` TINYINT(1) NOT NULL DEFAULT '0',
 | 
						`runonhealth` tinyint NOT NULL DEFAULT 0,
 | 
				
			||||||
	`hostile` TINYINT(1) NOT NULL DEFAULT '0',
 | 
						`hostile` tinyint NOT NULL DEFAULT 0,
 | 
				
			||||||
	`attackable` TINYINT(1) NOT NULL DEFAULT '0',
 | 
						`attackable` tinyint NOT NULL DEFAULT 0,
 | 
				
			||||||
	`rewardboss` TINYINT(1) NOT NULL DEFAULT '0',
 | 
						`rewardboss` tinyint NOT NULL DEFAULT 0,
 | 
				
			||||||
	`defense` INT(11) NOT NULL DEFAULT '0',
 | 
						`defense` int NOT NULL DEFAULT 0,
 | 
				
			||||||
	`armor` INT(11) NOT NULL DEFAULT '0',
 | 
						`armor` int NOT NULL DEFAULT 0,
 | 
				
			||||||
	`canpushcreatures` TINYINT(1) NOT NULL DEFAULT '0',
 | 
						`canpushcreatures` tinyint NOT NULL DEFAULT 0,
 | 
				
			||||||
	`race` varchar(255) NOT NULL,
 | 
						`race` varchar(255) NOT NULL,
 | 
				
			||||||
	`loot` text NOT NULL,
 | 
						`loot` text NOT NULL,
 | 
				
			||||||
	`summons` TEXT NOT NULL,
 | 
						`summons` text NOT NULL,
 | 
				
			||||||
	PRIMARY KEY (`id`)
 | 
						PRIMARY KEY (`id`)
 | 
				
			||||||
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8mb4;
 | 
					) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8mb4;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
CREATE TABLE `myaac_news`
 | 
					CREATE TABLE `myaac_news`
 | 
				
			||||||
(
 | 
					(
 | 
				
			||||||
	`id` INT(11) NOT NULL AUTO_INCREMENT,
 | 
						`id` int NOT NULL AUTO_INCREMENT,
 | 
				
			||||||
	`title` VARCHAR(100) NOT NULL,
 | 
						`title` varchar(100) NOT NULL,
 | 
				
			||||||
	`body` TEXT NOT NULL,
 | 
						`body` text NOT NULL,
 | 
				
			||||||
	`type` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '1 - news, 2 - ticker, 3 - article',
 | 
						`type` tinyint NOT NULL DEFAULT 0 COMMENT '1 - news, 2 - ticker, 3 - article',
 | 
				
			||||||
	`date` INT(11) NOT NULL DEFAULT 0,
 | 
						`date` int NOT NULL DEFAULT 0,
 | 
				
			||||||
	`category` TINYINT(1) NOT NULL DEFAULT 0,
 | 
						`category` tinyint NOT NULL DEFAULT 0,
 | 
				
			||||||
	`player_id` INT(11) NOT NULL DEFAULT 0,
 | 
						`player_id` int NOT NULL DEFAULT 0,
 | 
				
			||||||
	`last_modified_by` INT(11) NOT NULL DEFAULT 0,
 | 
						`last_modified_by` int NOT NULL DEFAULT 0,
 | 
				
			||||||
	`last_modified_date` INT(11) NOT NULL DEFAULT 0,
 | 
						`last_modified_date` int NOT NULL DEFAULT 0,
 | 
				
			||||||
	`comments` VARCHAR(50) NOT NULL DEFAULT '',
 | 
						`comments` varchar(50) NOT NULL DEFAULT '',
 | 
				
			||||||
	`article_text` VARCHAR(300) NOT NULL DEFAULT '',
 | 
						`article_text` varchar(300) NOT NULL DEFAULT '',
 | 
				
			||||||
	`article_image` VARCHAR(100) NOT NULL DEFAULT '',
 | 
						`article_image` varchar(100) NOT NULL DEFAULT '',
 | 
				
			||||||
	`hide` TINYINT(1) NOT NULL DEFAULT 0,
 | 
						`hide` tinyint NOT NULL DEFAULT 0,
 | 
				
			||||||
	PRIMARY KEY (`id`)
 | 
						PRIMARY KEY (`id`)
 | 
				
			||||||
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8mb4;
 | 
					) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8mb4;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
CREATE TABLE `myaac_news_categories`
 | 
					CREATE TABLE `myaac_news_categories`
 | 
				
			||||||
(
 | 
					(
 | 
				
			||||||
	`id` INT(11) NOT NULL AUTO_INCREMENT,
 | 
						`id` int NOT NULL AUTO_INCREMENT,
 | 
				
			||||||
	`name` VARCHAR(50) NOT NULL DEFAULT "",
 | 
						`name` varchar(50) NOT NULL DEFAULT "",
 | 
				
			||||||
	`description` VARCHAR(50) NOT NULL DEFAULT "",
 | 
						`description` varchar(50) NOT NULL DEFAULT "",
 | 
				
			||||||
	`icon_id` INT(2) NOT NULL DEFAULT 0,
 | 
						`icon_id` int NOT NULL DEFAULT 0,
 | 
				
			||||||
	`hide` TINYINT(1) NOT NULL DEFAULT 0,
 | 
						`hide` tinyint NOT NULL DEFAULT 0,
 | 
				
			||||||
	PRIMARY KEY (`id`)
 | 
						PRIMARY KEY (`id`)
 | 
				
			||||||
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8mb4;
 | 
					) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8mb4;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -181,39 +190,39 @@ INSERT INTO `myaac_news_categories` (`id`, `icon_id`) VALUES (NULL, 4);
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
CREATE TABLE `myaac_notepad`
 | 
					CREATE TABLE `myaac_notepad`
 | 
				
			||||||
(
 | 
					(
 | 
				
			||||||
	`id` INT(11) NOT NULL AUTO_INCREMENT,
 | 
						`id` int NOT NULL AUTO_INCREMENT,
 | 
				
			||||||
	`account_id` INT(11) NOT NULL,
 | 
						`account_id` int NOT NULL,
 | 
				
			||||||
	/*`name` VARCHAR(30) NOT NULL,*/
 | 
						/*`name` varchar(30) NOT NULL,*/
 | 
				
			||||||
	`content` TEXT NOT NULL,
 | 
						`content` text NOT NULL,
 | 
				
			||||||
	/*`public` TINYINT(1) NOT NULL DEFAULT 0*/
 | 
						/*`public` tinyint NOT NULL DEFAULT 0*/
 | 
				
			||||||
	PRIMARY KEY (`id`)
 | 
						PRIMARY KEY (`id`)
 | 
				
			||||||
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8mb4;
 | 
					) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8mb4;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
CREATE TABLE `myaac_pages`
 | 
					CREATE TABLE `myaac_pages`
 | 
				
			||||||
(
 | 
					(
 | 
				
			||||||
	`id` INT NOT NULL AUTO_INCREMENT,
 | 
						`id` INT NOT NULL AUTO_INCREMENT,
 | 
				
			||||||
	`name` VARCHAR(30) NOT NULL,
 | 
						`name` varchar(30) NOT NULL,
 | 
				
			||||||
	`title` VARCHAR(30) NOT NULL,
 | 
						`title` varchar(30) NOT NULL,
 | 
				
			||||||
	`body` TEXT NOT NULL,
 | 
						`body` text NOT NULL,
 | 
				
			||||||
	`date` INT(11) NOT NULL DEFAULT 0,
 | 
						`date` int NOT NULL DEFAULT 0,
 | 
				
			||||||
	`player_id` INT(11) NOT NULL DEFAULT 0,
 | 
						`player_id` int NOT NULL DEFAULT 0,
 | 
				
			||||||
	`php` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '0 - plain html, 1 - php',
 | 
						`php` tinyint NOT NULL DEFAULT 0 COMMENT '0 - plain html, 1 - php',
 | 
				
			||||||
	`enable_tinymce` TINYINT(1) NOT NULL DEFAULT 1 COMMENT '1 - enabled, 0 - disabled',
 | 
						`enable_tinymce` tinyint NOT NULL DEFAULT 1 COMMENT '1 - enabled, 0 - disabled',
 | 
				
			||||||
	`access` TINYINT(2) NOT NULL DEFAULT 0,
 | 
						`access` tinyint NOT NULL DEFAULT 0,
 | 
				
			||||||
	`hide` TINYINT(1) NOT NULL DEFAULT 0,
 | 
						`hide` tinyint NOT NULL DEFAULT 0,
 | 
				
			||||||
	PRIMARY KEY (`id`),
 | 
						PRIMARY KEY (`id`),
 | 
				
			||||||
	UNIQUE (`name`)
 | 
						UNIQUE (`name`)
 | 
				
			||||||
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8mb4;
 | 
					) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8mb4;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
CREATE TABLE `myaac_gallery`
 | 
					CREATE TABLE `myaac_gallery`
 | 
				
			||||||
(
 | 
					(
 | 
				
			||||||
	`id` INT(11) NOT NULL AUTO_INCREMENT,
 | 
						`id` int NOT NULL AUTO_INCREMENT,
 | 
				
			||||||
	`comment` VARCHAR(255) NOT NULL DEFAULT '',
 | 
						`comment` varchar(255) NOT NULL DEFAULT '',
 | 
				
			||||||
	`image` VARCHAR(255) NOT NULL,
 | 
						`image` varchar(255) NOT NULL,
 | 
				
			||||||
	`thumb` VARCHAR(255) NOT NULL,
 | 
						`thumb` varchar(255) NOT NULL,
 | 
				
			||||||
	`author` VARCHAR(50) NOT NULL DEFAULT '',
 | 
						`author` varchar(50) NOT NULL DEFAULT '',
 | 
				
			||||||
	`ordering` INT(11) NOT NULL DEFAULT 0,
 | 
						`ordering` int NOT NULL DEFAULT 0,
 | 
				
			||||||
	`hide` TINYINT(1) NOT NULL DEFAULT 0,
 | 
						`hide` tinyint NOT NULL DEFAULT 0,
 | 
				
			||||||
	PRIMARY KEY (`id`)
 | 
						PRIMARY KEY (`id`)
 | 
				
			||||||
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8mb4;
 | 
					) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8mb4;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -221,51 +230,51 @@ INSERT INTO `myaac_gallery` (`id`, `ordering`, `comment`, `image`, `thumb`, `aut
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
CREATE TABLE `myaac_settings`
 | 
					CREATE TABLE `myaac_settings`
 | 
				
			||||||
(
 | 
					(
 | 
				
			||||||
	`id` int(11) NOT NULL AUTO_INCREMENT,
 | 
						`id` int NOT NULL AUTO_INCREMENT,
 | 
				
			||||||
	`name` VARCHAR(255) NOT NULL DEFAULT '',
 | 
						`name` varchar(255) NOT NULL DEFAULT '',
 | 
				
			||||||
	`key` VARCHAR(255) NOT NULL DEFAULT '',
 | 
						`key` varchar(255) NOT NULL DEFAULT '',
 | 
				
			||||||
	`value` TEXT NOT NULL,
 | 
						`value` text NOT NULL,
 | 
				
			||||||
	PRIMARY KEY (`id`),
 | 
						PRIMARY KEY (`id`),
 | 
				
			||||||
	KEY `key` (`key`)
 | 
						KEY `key` (`key`)
 | 
				
			||||||
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8mb4;
 | 
					) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8mb4;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
CREATE TABLE `myaac_spells`
 | 
					CREATE TABLE `myaac_spells`
 | 
				
			||||||
(
 | 
					(
 | 
				
			||||||
	`id` INT(11) NOT NULL AUTO_INCREMENT,
 | 
						`id` int NOT NULL AUTO_INCREMENT,
 | 
				
			||||||
	`spell` VARCHAR(255) NOT NULL DEFAULT '',
 | 
						`spell` varchar(255) NOT NULL DEFAULT '',
 | 
				
			||||||
	`name` VARCHAR(255) NOT NULL,
 | 
						`name` varchar(255) NOT NULL,
 | 
				
			||||||
	`words` VARCHAR(255) NOT NULL DEFAULT '',
 | 
						`words` varchar(255) NOT NULL DEFAULT '',
 | 
				
			||||||
	`category` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '1 - attack, 2 - healing, 3 - summon, 4 - supply, 5 - support',
 | 
						`category` tinyint 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',
 | 
						`type` tinyint NOT NULL DEFAULT 0 COMMENT '1 - instant, 2 - conjure, 3 - rune',
 | 
				
			||||||
	`level` INT(11) NOT NULL DEFAULT 0,
 | 
						`level` int NOT NULL DEFAULT 0,
 | 
				
			||||||
	`maglevel` INT(11) NOT NULL DEFAULT 0,
 | 
						`maglevel` int NOT NULL DEFAULT 0,
 | 
				
			||||||
	`mana` INT(11) NOT NULL DEFAULT 0,
 | 
						`mana` int NOT NULL DEFAULT 0,
 | 
				
			||||||
	`soul` TINYINT(3) NOT NULL DEFAULT 0,
 | 
						`soul` tinyint NOT NULL DEFAULT 0,
 | 
				
			||||||
	`conjure_id` INT(11) NOT NULL DEFAULT 0,
 | 
						`conjure_id` int NOT NULL DEFAULT 0,
 | 
				
			||||||
	`conjure_count` TINYINT(3) NOT NULL DEFAULT 0,
 | 
						`conjure_count` tinyint NOT NULL DEFAULT 0,
 | 
				
			||||||
	`reagent` INT(11) NOT NULL DEFAULT 0,
 | 
						`reagent` int NOT NULL DEFAULT 0,
 | 
				
			||||||
	`item_id` INT(11) NOT NULL DEFAULT 0,
 | 
						`item_id` int NOT NULL DEFAULT 0,
 | 
				
			||||||
	`premium` TINYINT(1) NOT NULL DEFAULT 0,
 | 
						`premium` tinyint NOT NULL DEFAULT 0,
 | 
				
			||||||
	`vocations` VARCHAR(100) NOT NULL DEFAULT '',
 | 
						`vocations` varchar(100) NOT NULL DEFAULT '',
 | 
				
			||||||
	`hide` TINYINT(1) NOT NULL DEFAULT 0,
 | 
						`hide` tinyint NOT NULL DEFAULT 0,
 | 
				
			||||||
	PRIMARY KEY (`id`),
 | 
						PRIMARY KEY (`id`),
 | 
				
			||||||
	UNIQUE (`name`)
 | 
						UNIQUE (`name`)
 | 
				
			||||||
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8mb4;
 | 
					) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8mb4;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
CREATE TABLE `myaac_visitors`
 | 
					CREATE TABLE `myaac_visitors`
 | 
				
			||||||
(
 | 
					(
 | 
				
			||||||
	`ip` VARCHAR(45) NOT NULL,
 | 
						`ip` varchar(45) NOT NULL,
 | 
				
			||||||
	`lastvisit` INT(11) NOT NULL DEFAULT 0,
 | 
						`lastvisit` int NOT NULL DEFAULT 0,
 | 
				
			||||||
	`page` VARCHAR(2048) NOT NULL,
 | 
						`page` varchar(2048) NOT NULL,
 | 
				
			||||||
	`user_agent` VARCHAR(255) NOT NULL DEFAULT '',
 | 
						`user_agent` varchar(255) NOT NULL DEFAULT '',
 | 
				
			||||||
	UNIQUE (`ip`)
 | 
						UNIQUE (`ip`)
 | 
				
			||||||
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8mb4;
 | 
					) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8mb4;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
CREATE TABLE `myaac_weapons`
 | 
					CREATE TABLE `myaac_weapons`
 | 
				
			||||||
(
 | 
					(
 | 
				
			||||||
	`id` INT(11) NOT NULL,
 | 
						`id` int NOT NULL,
 | 
				
			||||||
	`level` INT(11) NOT NULL DEFAULT 0,
 | 
						`level` int NOT NULL DEFAULT 0,
 | 
				
			||||||
	`maglevel` INT(11) NOT NULL DEFAULT 0,
 | 
						`maglevel` int NOT NULL DEFAULT 0,
 | 
				
			||||||
	`vocations` VARCHAR(100) NOT NULL DEFAULT '',
 | 
						`vocations` varchar(100) NOT NULL DEFAULT '',
 | 
				
			||||||
	PRIMARY KEY (`id`)
 | 
						PRIMARY KEY (`id`)
 | 
				
			||||||
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8mb4;
 | 
					) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8mb4;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -10,6 +10,14 @@ foreach($config['clients'] as $client) {
 | 
				
			|||||||
	$clients[$client] = $client_version;
 | 
						$clients[$client] = $client_version;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if (empty($_SESSION['var_site_url'])) {
 | 
				
			||||||
 | 
						//require SYSTEM . 'base.php';
 | 
				
			||||||
 | 
						$serverUrl = 'http' . (isHttps() ? 's' : '') . '://' . $baseHost;
 | 
				
			||||||
 | 
						$siteURL = $serverUrl . $baseDir;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						$_SESSION['var_site_url'] = $siteURL;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
$twig->display('install.config.html.twig', array(
 | 
					$twig->display('install.config.html.twig', array(
 | 
				
			||||||
	'clients' => $clients,
 | 
						'clients' => $clients,
 | 
				
			||||||
	'timezones' => DateTimeZone::listIdentifiers(),
 | 
						'timezones' => DateTimeZone::listIdentifiers(),
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -42,10 +42,9 @@ if(!$error) {
 | 
				
			|||||||
	$configToSave['cache_prefix'] = 'myaac_' . generateRandomString(8, true, false, true);
 | 
						$configToSave['cache_prefix'] = 'myaac_' . generateRandomString(8, true, false, true);
 | 
				
			||||||
	$configToSave['database_auto_migrate'] = true;
 | 
						$configToSave['database_auto_migrate'] = true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if(!$error) {
 | 
					 | 
				
			||||||
	$content = '';
 | 
						$content = '';
 | 
				
			||||||
	$saved = Settings::saveConfig($configToSave, BASE . 'config.local.php', $content);
 | 
						$saved = Settings::saveConfig($configToSave, BASE . 'config.local.php', $content);
 | 
				
			||||||
		if ($saved) {
 | 
						if ($saved || file_exists(BASE . 'config.local.php')) {
 | 
				
			||||||
		success($locale['step_database_config_saved']);
 | 
							success($locale['step_database_config_saved']);
 | 
				
			||||||
		$_SESSION['saved'] = true;
 | 
							$_SESSION['saved'] = true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -74,14 +73,14 @@ if(!$error) {
 | 
				
			|||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
 | 
							$error = true;
 | 
				
			||||||
		$_SESSION['config_content'] = $content;
 | 
							$_SESSION['config_content'] = $content;
 | 
				
			||||||
		unset($_SESSION['saved']);
 | 
							unset($_SESSION['saved']);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			$locale['step_database_error_file'] = str_replace('$FILE$', '<b>' . BASE . 'config.php</b>', $locale['step_database_error_file']);
 | 
							$locale['step_database_error_file'] = str_replace('$FILE$', '<b>' . BASE . 'config.local.php</b>', $locale['step_database_error_file']);
 | 
				
			||||||
		error($locale['step_database_error_file'] . '<br/>
 | 
							error($locale['step_database_error_file'] . '<br/>
 | 
				
			||||||
			<textarea cols="70" rows="10">' . $content . '</textarea>');
 | 
								<textarea cols="70" rows="10">' . $content . '</textarea>');
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
?>
 | 
					?>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -195,13 +195,4 @@ if(!isset($_SESSION['installed'])) {
 | 
				
			|||||||
	$_SESSION['installed'] = true;
 | 
						$_SESSION['installed'] = true;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
foreach($_SESSION as $key => $value) {
 | 
					 | 
				
			||||||
	if(strpos($key, 'var_') !== false)
 | 
					 | 
				
			||||||
		unset($_SESSION[$key]);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
unset($_SESSION['saved']);
 | 
					 | 
				
			||||||
if(file_exists(CACHE . 'install.txt')) {
 | 
					 | 
				
			||||||
	unlink(CACHE . 'install.txt');
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
$hooks->trigger(HOOK_INSTALL_FINISH_END);
 | 
					$hooks->trigger(HOOK_INSTALL_FINISH_END);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -7,6 +7,11 @@ require SYSTEM . 'functions.php';
 | 
				
			|||||||
require BASE . 'install/includes/functions.php';
 | 
					require BASE . 'install/includes/functions.php';
 | 
				
			||||||
require BASE . 'install/includes/locale.php';
 | 
					require BASE . 'install/includes/locale.php';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if(isset($config['installed']) && $config['installed'] && !isset($_SESSION['saved'])) {
 | 
				
			||||||
 | 
						warning($locale['already_installed']);
 | 
				
			||||||
 | 
						return;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
$error = false;
 | 
					$error = false;
 | 
				
			||||||
require BASE . 'install/includes/config.php';
 | 
					require BASE . 'install/includes/config.php';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -17,11 +17,11 @@ ini_set('max_execution_time', 300);
 | 
				
			|||||||
ob_implicit_flush();
 | 
					ob_implicit_flush();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
header('X-Accel-Buffering: no');
 | 
					header('X-Accel-Buffering: no');
 | 
				
			||||||
/*
 | 
					
 | 
				
			||||||
if(isset($config['installed']) && $config['installed'] && !isset($_SESSION['saved'])) {
 | 
					if(isset($config['installed']) && $config['installed'] && !isset($_SESSION['saved'])) {
 | 
				
			||||||
	warning($locale['already_installed']);
 | 
						warning($locale['already_installed']);
 | 
				
			||||||
	return;
 | 
						return;
 | 
				
			||||||
}*/
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
require SYSTEM . 'init.php';
 | 
					require SYSTEM . 'init.php';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -54,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::setLocale($locale);
 | 
				
			||||||
DataLoader::load();
 | 
					DataLoader::load();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// add menus entries
 | 
				
			||||||
 | 
					require_once SYSTEM . 'migrations/17.php';
 | 
				
			||||||
 | 
					$up();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// update config.highscores_ids_hidden
 | 
					// update config.highscores_ids_hidden
 | 
				
			||||||
require_once SYSTEM . 'migrations/20.php';
 | 
					require_once SYSTEM . 'migrations/20.php';
 | 
				
			||||||
$up();
 | 
					$up();
 | 
				
			||||||
@@ -78,6 +79,10 @@ $up();
 | 
				
			|||||||
require_once SYSTEM . 'migrations/31.php';
 | 
					require_once SYSTEM . 'migrations/31.php';
 | 
				
			||||||
$up();
 | 
					$up();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// rules page
 | 
				
			||||||
 | 
					require_once SYSTEM . 'migrations/45.php';
 | 
				
			||||||
 | 
					$up();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if(ModelsFAQ::count() == 0) {
 | 
					if(ModelsFAQ::count() == 0) {
 | 
				
			||||||
	ModelsFAQ::create([
 | 
						ModelsFAQ::create([
 | 
				
			||||||
		'question' => 'What is this?',
 | 
							'question' => 'What is this?',
 | 
				
			||||||
@@ -89,6 +94,17 @@ $hooks->trigger(HOOK_INSTALL_FINISH);
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
$db->setClearCacheAfter(true);
 | 
					$db->setClearCacheAfter(true);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// cleanup
 | 
				
			||||||
 | 
					foreach($_SESSION as $key => $value) {
 | 
				
			||||||
 | 
						if(str_contains($key, 'var_')) {
 | 
				
			||||||
 | 
							unset($_SESSION[$key]);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					unset($_SESSION['saved']);
 | 
				
			||||||
 | 
					if(file_exists(CACHE . 'install.txt')) {
 | 
				
			||||||
 | 
						unlink(CACHE . 'install.txt');
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
$locale['step_finish_desc'] = str_replace('$ADMIN_PANEL$', generateLink(str_replace('tools/', '',ADMIN_URL), $locale['step_finish_admin_panel'], true), $locale['step_finish_desc']);
 | 
					$locale['step_finish_desc'] = str_replace('$ADMIN_PANEL$', generateLink(str_replace('tools/', '',ADMIN_URL), $locale['step_finish_admin_panel'], true), $locale['step_finish_desc']);
 | 
				
			||||||
$locale['step_finish_desc'] = str_replace('$HOMEPAGE$', generateLink(str_replace('tools/', '', BASE_URL), $locale['step_finish_homepage'], true), $locale['step_finish_desc']);
 | 
					$locale['step_finish_desc'] = str_replace('$HOMEPAGE$', generateLink(str_replace('tools/', '', BASE_URL), $locale['step_finish_homepage'], true), $locale['step_finish_desc']);
 | 
				
			||||||
$locale['step_finish_desc'] = str_replace('$LINK$', generateLink('https://my-aac.org', 'https://my-aac.org', true), $locale['step_finish_desc']);
 | 
					$locale['step_finish_desc'] = str_replace('$LINK$', generateLink('https://my-aac.org', 'https://my-aac.org', true), $locale['step_finish_desc']);
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										17
									
								
								login.php
									
									
									
									
									
								
							
							
						
						
									
										17
									
								
								login.php
									
									
									
									
									
								
							@@ -86,12 +86,25 @@ switch ($action) {
 | 
				
			|||||||
		die(json_encode(['eventlist' => $eventlist, 'lastupdatetimestamp' => time()]));
 | 
							die(json_encode(['eventlist' => $eventlist, 'lastupdatetimestamp' => time()]));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	case 'boostedcreature':
 | 
						case 'boostedcreature':
 | 
				
			||||||
		$boostedCreature = BoostedCreature::latest();
 | 
							$clientVersion = (int)setting('core.client');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// 13.40 and up
 | 
				
			||||||
 | 
							if ($clientVersion >= 1340) {
 | 
				
			||||||
 | 
								$creatureBoost = $db->query("SELECT * FROM " . $db->tableName('boosted_creature'))->fetchAll();
 | 
				
			||||||
 | 
								$bossBoost     = $db->query("SELECT * FROM " . $db->tableName('boosted_boss'))->fetchAll();
 | 
				
			||||||
 | 
								die(json_encode([
 | 
				
			||||||
 | 
									'boostedcreature' => true,
 | 
				
			||||||
 | 
									'creatureraceid'  => intval($creatureBoost[0]['raceid']),
 | 
				
			||||||
 | 
									'bossraceid'      => intval($bossBoost[0]['raceid'])
 | 
				
			||||||
 | 
								]));
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// lower clients
 | 
				
			||||||
 | 
							$boostedCreature = BoostedCreature::first();
 | 
				
			||||||
		die(json_encode([
 | 
							die(json_encode([
 | 
				
			||||||
			'boostedcreature' => true,
 | 
								'boostedcreature' => true,
 | 
				
			||||||
			'raceid' => $boostedCreature->raceid
 | 
								'raceid' => $boostedCreature->raceid
 | 
				
			||||||
		]));
 | 
							]));
 | 
				
			||||||
	break;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	case 'login':
 | 
						case 'login':
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,6 +1,6 @@
 | 
				
			|||||||
server {
 | 
					server {
 | 
				
			||||||
	listen 80;
 | 
						listen 80;
 | 
				
			||||||
	root /home/otserv/www/public;
 | 
						root /var/www/html;
 | 
				
			||||||
	index index.php;
 | 
						index index.php;
 | 
				
			||||||
	server_name your-domain.com;
 | 
						server_name your-domain.com;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -14,7 +14,7 @@ server {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	# block .htaccess, CHANGELOG.md, composer.json etc.
 | 
						# block .htaccess, CHANGELOG.md, composer.json etc.
 | 
				
			||||||
	# this is to prevent finding software versions
 | 
						# this is to prevent finding software versions
 | 
				
			||||||
	location ~\.(ht|md|json|dist)$ {
 | 
						location ~\.(ht|md|json|dist|sql)$ {
 | 
				
			||||||
		deny all;
 | 
							deny all;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										176
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										176
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							@@ -14,24 +14,13 @@
 | 
				
			|||||||
        "tinymce": "^7.2.0"
 | 
					        "tinymce": "^7.2.0"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "devDependencies": {
 | 
					      "devDependencies": {
 | 
				
			||||||
        "cypress": "^13.17.0"
 | 
					        "cypress": "^14.3.3"
 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "node_modules/@colors/colors": {
 | 
					 | 
				
			||||||
      "version": "1.5.0",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==",
 | 
					 | 
				
			||||||
      "dev": true,
 | 
					 | 
				
			||||||
      "license": "MIT",
 | 
					 | 
				
			||||||
      "optional": true,
 | 
					 | 
				
			||||||
      "engines": {
 | 
					 | 
				
			||||||
        "node": ">=0.1.90"
 | 
					 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/@cypress/request": {
 | 
					    "node_modules/@cypress/request": {
 | 
				
			||||||
      "version": "3.0.7",
 | 
					      "version": "3.0.8",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/@cypress/request/-/request-3.0.7.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/@cypress/request/-/request-3.0.8.tgz",
 | 
				
			||||||
      "integrity": "sha512-LzxlLEMbBOPYB85uXrDqvD4MgcenjRBLIns3zyhx7vTPj/0u2eQhzXvPiGcaJrV38Q9dbkExWp6cOHPJ+EtFYg==",
 | 
					      "integrity": "sha512-h0NFgh1mJmm1nr4jCwkGHwKneVYKghUyWe6TMNrk0B9zsjAJxpg8C4/+BAcmLgCPa1vj1V8rNUaILl+zYRUWBQ==",
 | 
				
			||||||
      "dev": true,
 | 
					      "dev": true,
 | 
				
			||||||
      "license": "Apache-2.0",
 | 
					      "license": "Apache-2.0",
 | 
				
			||||||
      "dependencies": {
 | 
					      "dependencies": {
 | 
				
			||||||
@@ -48,7 +37,7 @@
 | 
				
			|||||||
        "json-stringify-safe": "~5.0.1",
 | 
					        "json-stringify-safe": "~5.0.1",
 | 
				
			||||||
        "mime-types": "~2.1.19",
 | 
					        "mime-types": "~2.1.19",
 | 
				
			||||||
        "performance-now": "^2.1.0",
 | 
					        "performance-now": "^2.1.0",
 | 
				
			||||||
        "qs": "6.13.1",
 | 
					        "qs": "6.14.0",
 | 
				
			||||||
        "safe-buffer": "^5.1.2",
 | 
					        "safe-buffer": "^5.1.2",
 | 
				
			||||||
        "tough-cookie": "^5.0.0",
 | 
					        "tough-cookie": "^5.0.0",
 | 
				
			||||||
        "tunnel-agent": "^0.6.0",
 | 
					        "tunnel-agent": "^0.6.0",
 | 
				
			||||||
@@ -387,9 +376,9 @@
 | 
				
			|||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/call-bind-apply-helpers": {
 | 
					    "node_modules/call-bind-apply-helpers": {
 | 
				
			||||||
      "version": "1.0.1",
 | 
					      "version": "1.0.2",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
 | 
				
			||||||
      "integrity": "sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==",
 | 
					      "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
 | 
				
			||||||
      "dev": true,
 | 
					      "dev": true,
 | 
				
			||||||
      "license": "MIT",
 | 
					      "license": "MIT",
 | 
				
			||||||
      "dependencies": {
 | 
					      "dependencies": {
 | 
				
			||||||
@@ -401,14 +390,14 @@
 | 
				
			|||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/call-bound": {
 | 
					    "node_modules/call-bound": {
 | 
				
			||||||
      "version": "1.0.3",
 | 
					      "version": "1.0.4",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.3.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz",
 | 
				
			||||||
      "integrity": "sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==",
 | 
					      "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==",
 | 
				
			||||||
      "dev": true,
 | 
					      "dev": true,
 | 
				
			||||||
      "license": "MIT",
 | 
					      "license": "MIT",
 | 
				
			||||||
      "dependencies": {
 | 
					      "dependencies": {
 | 
				
			||||||
        "call-bind-apply-helpers": "^1.0.1",
 | 
					        "call-bind-apply-helpers": "^1.0.2",
 | 
				
			||||||
        "get-intrinsic": "^1.2.6"
 | 
					        "get-intrinsic": "^1.3.0"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "engines": {
 | 
					      "engines": {
 | 
				
			||||||
        "node": ">= 0.4"
 | 
					        "node": ">= 0.4"
 | 
				
			||||||
@@ -504,9 +493,9 @@
 | 
				
			|||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/cli-table3": {
 | 
					    "node_modules/cli-table3": {
 | 
				
			||||||
      "version": "0.6.5",
 | 
					      "version": "0.6.1",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.1.tgz",
 | 
				
			||||||
      "integrity": "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==",
 | 
					      "integrity": "sha512-w0q/enDHhPLq44ovMGdQeeDLvwxwavsJX7oQGYt/LrBlYsyaxyDnp6z3QzFut/6kLLKnlcUVJLrpB7KBfgG/RA==",
 | 
				
			||||||
      "dev": true,
 | 
					      "dev": true,
 | 
				
			||||||
      "license": "MIT",
 | 
					      "license": "MIT",
 | 
				
			||||||
      "dependencies": {
 | 
					      "dependencies": {
 | 
				
			||||||
@@ -516,7 +505,7 @@
 | 
				
			|||||||
        "node": "10.* || >= 12.*"
 | 
					        "node": "10.* || >= 12.*"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "optionalDependencies": {
 | 
					      "optionalDependencies": {
 | 
				
			||||||
        "@colors/colors": "1.5.0"
 | 
					        "colors": "1.4.0"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/cli-truncate": {
 | 
					    "node_modules/cli-truncate": {
 | 
				
			||||||
@@ -563,6 +552,17 @@
 | 
				
			|||||||
      "dev": true,
 | 
					      "dev": true,
 | 
				
			||||||
      "license": "MIT"
 | 
					      "license": "MIT"
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/colors": {
 | 
				
			||||||
 | 
					      "version": "1.4.0",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==",
 | 
				
			||||||
 | 
					      "dev": true,
 | 
				
			||||||
 | 
					      "license": "MIT",
 | 
				
			||||||
 | 
					      "optional": true,
 | 
				
			||||||
 | 
					      "engines": {
 | 
				
			||||||
 | 
					        "node": ">=0.1.90"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "node_modules/combined-stream": {
 | 
					    "node_modules/combined-stream": {
 | 
				
			||||||
      "version": "1.0.8",
 | 
					      "version": "1.0.8",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
 | 
				
			||||||
@@ -619,14 +619,14 @@
 | 
				
			|||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/cypress": {
 | 
					    "node_modules/cypress": {
 | 
				
			||||||
      "version": "13.17.0",
 | 
					      "version": "14.3.3",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/cypress/-/cypress-13.17.0.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/cypress/-/cypress-14.3.3.tgz",
 | 
				
			||||||
      "integrity": "sha512-5xWkaPurwkIljojFidhw8lFScyxhtiFHl/i/3zov+1Z5CmY4t9tjIdvSXfu82Y3w7wt0uR9KkucbhkVvJZLQSA==",
 | 
					      "integrity": "sha512-1Rz7zc9iqLww6BysaESqUhtIuaFHS7nL3wREovAKYsNhLTfX3TbcBWHWgEz70YimH2NkSOsm4oIcJJ9HYHOlew==",
 | 
				
			||||||
      "dev": true,
 | 
					      "dev": true,
 | 
				
			||||||
      "hasInstallScript": true,
 | 
					      "hasInstallScript": true,
 | 
				
			||||||
      "license": "MIT",
 | 
					      "license": "MIT",
 | 
				
			||||||
      "dependencies": {
 | 
					      "dependencies": {
 | 
				
			||||||
        "@cypress/request": "^3.0.6",
 | 
					        "@cypress/request": "^3.0.8",
 | 
				
			||||||
        "@cypress/xvfb": "^1.2.4",
 | 
					        "@cypress/xvfb": "^1.2.4",
 | 
				
			||||||
        "@types/sinonjs__fake-timers": "8.1.1",
 | 
					        "@types/sinonjs__fake-timers": "8.1.1",
 | 
				
			||||||
        "@types/sizzle": "^2.3.2",
 | 
					        "@types/sizzle": "^2.3.2",
 | 
				
			||||||
@@ -637,9 +637,9 @@
 | 
				
			|||||||
        "cachedir": "^2.3.0",
 | 
					        "cachedir": "^2.3.0",
 | 
				
			||||||
        "chalk": "^4.1.0",
 | 
					        "chalk": "^4.1.0",
 | 
				
			||||||
        "check-more-types": "^2.24.0",
 | 
					        "check-more-types": "^2.24.0",
 | 
				
			||||||
        "ci-info": "^4.0.0",
 | 
					        "ci-info": "^4.1.0",
 | 
				
			||||||
        "cli-cursor": "^3.1.0",
 | 
					        "cli-cursor": "^3.1.0",
 | 
				
			||||||
        "cli-table3": "~0.6.1",
 | 
					        "cli-table3": "0.6.1",
 | 
				
			||||||
        "commander": "^6.2.1",
 | 
					        "commander": "^6.2.1",
 | 
				
			||||||
        "common-tags": "^1.8.0",
 | 
					        "common-tags": "^1.8.0",
 | 
				
			||||||
        "dayjs": "^1.10.4",
 | 
					        "dayjs": "^1.10.4",
 | 
				
			||||||
@@ -663,7 +663,7 @@
 | 
				
			|||||||
        "process": "^0.11.10",
 | 
					        "process": "^0.11.10",
 | 
				
			||||||
        "proxy-from-env": "1.0.0",
 | 
					        "proxy-from-env": "1.0.0",
 | 
				
			||||||
        "request-progress": "^3.0.0",
 | 
					        "request-progress": "^3.0.0",
 | 
				
			||||||
        "semver": "^7.5.3",
 | 
					        "semver": "^7.7.1",
 | 
				
			||||||
        "supports-color": "^8.1.1",
 | 
					        "supports-color": "^8.1.1",
 | 
				
			||||||
        "tmp": "~0.2.3",
 | 
					        "tmp": "~0.2.3",
 | 
				
			||||||
        "tree-kill": "1.2.2",
 | 
					        "tree-kill": "1.2.2",
 | 
				
			||||||
@@ -674,7 +674,7 @@
 | 
				
			|||||||
        "cypress": "bin/cypress"
 | 
					        "cypress": "bin/cypress"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "engines": {
 | 
					      "engines": {
 | 
				
			||||||
        "node": "^16.0.0 || ^18.0.0 || >=20.0.0"
 | 
					        "node": "^18.0.0 || ^20.0.0 || >=22.0.0"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/cypress/node_modules/fs-extra": {
 | 
					    "node_modules/cypress/node_modules/fs-extra": {
 | 
				
			||||||
@@ -819,9 +819,9 @@
 | 
				
			|||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/es-object-atoms": {
 | 
					    "node_modules/es-object-atoms": {
 | 
				
			||||||
      "version": "1.0.0",
 | 
					      "version": "1.1.1",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
 | 
				
			||||||
      "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==",
 | 
					      "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
 | 
				
			||||||
      "dev": true,
 | 
					      "dev": true,
 | 
				
			||||||
      "license": "MIT",
 | 
					      "license": "MIT",
 | 
				
			||||||
      "dependencies": {
 | 
					      "dependencies": {
 | 
				
			||||||
@@ -831,6 +831,22 @@
 | 
				
			|||||||
        "node": ">= 0.4"
 | 
					        "node": ">= 0.4"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/es-set-tostringtag": {
 | 
				
			||||||
 | 
					      "version": "2.1.0",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==",
 | 
				
			||||||
 | 
					      "dev": true,
 | 
				
			||||||
 | 
					      "license": "MIT",
 | 
				
			||||||
 | 
					      "dependencies": {
 | 
				
			||||||
 | 
					        "es-errors": "^1.3.0",
 | 
				
			||||||
 | 
					        "get-intrinsic": "^1.2.6",
 | 
				
			||||||
 | 
					        "has-tostringtag": "^1.0.2",
 | 
				
			||||||
 | 
					        "hasown": "^2.0.2"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "engines": {
 | 
				
			||||||
 | 
					        "node": ">= 0.4"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "node_modules/escape-string-regexp": {
 | 
					    "node_modules/escape-string-regexp": {
 | 
				
			||||||
      "version": "1.0.5",
 | 
					      "version": "1.0.5",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
 | 
				
			||||||
@@ -960,14 +976,16 @@
 | 
				
			|||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/form-data": {
 | 
					    "node_modules/form-data": {
 | 
				
			||||||
      "version": "4.0.1",
 | 
					      "version": "4.0.4",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz",
 | 
				
			||||||
      "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==",
 | 
					      "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==",
 | 
				
			||||||
      "dev": true,
 | 
					      "dev": true,
 | 
				
			||||||
      "license": "MIT",
 | 
					      "license": "MIT",
 | 
				
			||||||
      "dependencies": {
 | 
					      "dependencies": {
 | 
				
			||||||
        "asynckit": "^0.4.0",
 | 
					        "asynckit": "^0.4.0",
 | 
				
			||||||
        "combined-stream": "^1.0.8",
 | 
					        "combined-stream": "^1.0.8",
 | 
				
			||||||
 | 
					        "es-set-tostringtag": "^2.1.0",
 | 
				
			||||||
 | 
					        "hasown": "^2.0.2",
 | 
				
			||||||
        "mime-types": "^2.1.12"
 | 
					        "mime-types": "^2.1.12"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "engines": {
 | 
					      "engines": {
 | 
				
			||||||
@@ -999,18 +1017,18 @@
 | 
				
			|||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/get-intrinsic": {
 | 
					    "node_modules/get-intrinsic": {
 | 
				
			||||||
      "version": "1.2.7",
 | 
					      "version": "1.3.0",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.7.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
 | 
				
			||||||
      "integrity": "sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==",
 | 
					      "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
 | 
				
			||||||
      "dev": true,
 | 
					      "dev": true,
 | 
				
			||||||
      "license": "MIT",
 | 
					      "license": "MIT",
 | 
				
			||||||
      "dependencies": {
 | 
					      "dependencies": {
 | 
				
			||||||
        "call-bind-apply-helpers": "^1.0.1",
 | 
					        "call-bind-apply-helpers": "^1.0.2",
 | 
				
			||||||
        "es-define-property": "^1.0.1",
 | 
					        "es-define-property": "^1.0.1",
 | 
				
			||||||
        "es-errors": "^1.3.0",
 | 
					        "es-errors": "^1.3.0",
 | 
				
			||||||
        "es-object-atoms": "^1.0.0",
 | 
					        "es-object-atoms": "^1.1.1",
 | 
				
			||||||
        "function-bind": "^1.1.2",
 | 
					        "function-bind": "^1.1.2",
 | 
				
			||||||
        "get-proto": "^1.0.0",
 | 
					        "get-proto": "^1.0.1",
 | 
				
			||||||
        "gopd": "^1.2.0",
 | 
					        "gopd": "^1.2.0",
 | 
				
			||||||
        "has-symbols": "^1.1.0",
 | 
					        "has-symbols": "^1.1.0",
 | 
				
			||||||
        "hasown": "^2.0.2",
 | 
					        "hasown": "^2.0.2",
 | 
				
			||||||
@@ -1131,6 +1149,22 @@
 | 
				
			|||||||
        "url": "https://github.com/sponsors/ljharb"
 | 
					        "url": "https://github.com/sponsors/ljharb"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/has-tostringtag": {
 | 
				
			||||||
 | 
					      "version": "1.0.2",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
 | 
				
			||||||
 | 
					      "dev": true,
 | 
				
			||||||
 | 
					      "license": "MIT",
 | 
				
			||||||
 | 
					      "dependencies": {
 | 
				
			||||||
 | 
					        "has-symbols": "^1.0.3"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "engines": {
 | 
				
			||||||
 | 
					        "node": ">= 0.4"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "funding": {
 | 
				
			||||||
 | 
					        "url": "https://github.com/sponsors/ljharb"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "node_modules/hasown": {
 | 
					    "node_modules/hasown": {
 | 
				
			||||||
      "version": "2.0.2",
 | 
					      "version": "2.0.2",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
 | 
				
			||||||
@@ -1560,9 +1594,9 @@
 | 
				
			|||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/object-inspect": {
 | 
					    "node_modules/object-inspect": {
 | 
				
			||||||
      "version": "1.13.3",
 | 
					      "version": "1.13.4",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
 | 
				
			||||||
      "integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==",
 | 
					      "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==",
 | 
				
			||||||
      "dev": true,
 | 
					      "dev": true,
 | 
				
			||||||
      "license": "MIT",
 | 
					      "license": "MIT",
 | 
				
			||||||
      "engines": {
 | 
					      "engines": {
 | 
				
			||||||
@@ -1709,13 +1743,13 @@
 | 
				
			|||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/qs": {
 | 
					    "node_modules/qs": {
 | 
				
			||||||
      "version": "6.13.1",
 | 
					      "version": "6.14.0",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.1.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz",
 | 
				
			||||||
      "integrity": "sha512-EJPeIn0CYrGu+hli1xilKAPXODtJ12T0sP63Ijx2/khC2JtuaN3JyNIpvmnkmaEtha9ocbG4A4cMcr+TvqvwQg==",
 | 
					      "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==",
 | 
				
			||||||
      "dev": true,
 | 
					      "dev": true,
 | 
				
			||||||
      "license": "BSD-3-Clause",
 | 
					      "license": "BSD-3-Clause",
 | 
				
			||||||
      "dependencies": {
 | 
					      "dependencies": {
 | 
				
			||||||
        "side-channel": "^1.0.6"
 | 
					        "side-channel": "^1.1.0"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "engines": {
 | 
					      "engines": {
 | 
				
			||||||
        "node": ">=0.6"
 | 
					        "node": ">=0.6"
 | 
				
			||||||
@@ -1794,9 +1828,9 @@
 | 
				
			|||||||
      "license": "MIT"
 | 
					      "license": "MIT"
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/semver": {
 | 
					    "node_modules/semver": {
 | 
				
			||||||
      "version": "7.6.3",
 | 
					      "version": "7.7.1",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
 | 
				
			||||||
      "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
 | 
					      "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
 | 
				
			||||||
      "dev": true,
 | 
					      "dev": true,
 | 
				
			||||||
      "license": "ISC",
 | 
					      "license": "ISC",
 | 
				
			||||||
      "bin": {
 | 
					      "bin": {
 | 
				
			||||||
@@ -2031,29 +2065,29 @@
 | 
				
			|||||||
      "license": "GPL-2.0-or-later"
 | 
					      "license": "GPL-2.0-or-later"
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/tldts": {
 | 
					    "node_modules/tldts": {
 | 
				
			||||||
      "version": "6.1.71",
 | 
					      "version": "6.1.86",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.71.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.86.tgz",
 | 
				
			||||||
      "integrity": "sha512-LQIHmHnuzfZgZWAf2HzL83TIIrD8NhhI0DVxqo9/FdOd4ilec+NTNZOlDZf7EwrTNoutccbsHjvWHYXLAtvxjw==",
 | 
					      "integrity": "sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ==",
 | 
				
			||||||
      "dev": true,
 | 
					      "dev": true,
 | 
				
			||||||
      "license": "MIT",
 | 
					      "license": "MIT",
 | 
				
			||||||
      "dependencies": {
 | 
					      "dependencies": {
 | 
				
			||||||
        "tldts-core": "^6.1.71"
 | 
					        "tldts-core": "^6.1.86"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "bin": {
 | 
					      "bin": {
 | 
				
			||||||
        "tldts": "bin/cli.js"
 | 
					        "tldts": "bin/cli.js"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/tldts-core": {
 | 
					    "node_modules/tldts-core": {
 | 
				
			||||||
      "version": "6.1.71",
 | 
					      "version": "6.1.86",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.71.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.86.tgz",
 | 
				
			||||||
      "integrity": "sha512-LRbChn2YRpic1KxY+ldL1pGXN/oVvKfCVufwfVzEQdFYNo39uF7AJa/WXdo+gYO7PTvdfkCPCed6Hkvz/kR7jg==",
 | 
					      "integrity": "sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA==",
 | 
				
			||||||
      "dev": true,
 | 
					      "dev": true,
 | 
				
			||||||
      "license": "MIT"
 | 
					      "license": "MIT"
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/tmp": {
 | 
					    "node_modules/tmp": {
 | 
				
			||||||
      "version": "0.2.3",
 | 
					      "version": "0.2.4",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.4.tgz",
 | 
				
			||||||
      "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==",
 | 
					      "integrity": "sha512-UdiSoX6ypifLmrfQ/XfiawN6hkjSBpCjhKxxZcWlUUmoXLaCKQU0bx4HF/tdDK2uzRuchf1txGvrWBzYREssoQ==",
 | 
				
			||||||
      "dev": true,
 | 
					      "dev": true,
 | 
				
			||||||
      "license": "MIT",
 | 
					      "license": "MIT",
 | 
				
			||||||
      "engines": {
 | 
					      "engines": {
 | 
				
			||||||
@@ -2061,9 +2095,9 @@
 | 
				
			|||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/tough-cookie": {
 | 
					    "node_modules/tough-cookie": {
 | 
				
			||||||
      "version": "5.1.0",
 | 
					      "version": "5.1.2",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.1.0.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.1.2.tgz",
 | 
				
			||||||
      "integrity": "sha512-rvZUv+7MoBYTiDmFPBrhL7Ujx9Sk+q9wwm22x8c8T5IJaR+Wsyc7TNxbVxo84kZoRJZZMazowFLqpankBEQrGg==",
 | 
					      "integrity": "sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==",
 | 
				
			||||||
      "dev": true,
 | 
					      "dev": true,
 | 
				
			||||||
      "license": "BSD-3-Clause",
 | 
					      "license": "BSD-3-Clause",
 | 
				
			||||||
      "dependencies": {
 | 
					      "dependencies": {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -4,7 +4,7 @@
 | 
				
			|||||||
    "postinstall": "node ./npm-post-install.js"
 | 
					    "postinstall": "node ./npm-post-install.js"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "devDependencies": {
 | 
					  "devDependencies": {
 | 
				
			||||||
    "cypress": "^13.17.0"
 | 
					    "cypress": "^14.3.3"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "dependencies": {
 | 
					  "dependencies": {
 | 
				
			||||||
    "@tinymce/tinymce-jquery": "^2.1.0",
 | 
					    "@tinymce/tinymce-jquery": "^2.1.0",
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -28,10 +28,9 @@ parameters:
 | 
				
			|||||||
		- '#Variable \$guild might not be defined#'
 | 
							- '#Variable \$guild might not be defined#'
 | 
				
			||||||
		- '#Variable \$[a-zA-Z0-9\\_]+ might not be defined#'
 | 
							- '#Variable \$[a-zA-Z0-9\\_]+ might not be defined#'
 | 
				
			||||||
		# Eloquent models
 | 
							# Eloquent models
 | 
				
			||||||
 | 
							- '#Call to an undefined method [a-zA-Z0-9\\_]+::[a-zA-Z0-9\\_]+\(\)#'
 | 
				
			||||||
		- '#Call to an undefined static method [a-zA-Z0-9\\_]+::[a-zA-Z0-9\\_]+\(\)#'
 | 
							- '#Call to an undefined static method [a-zA-Z0-9\\_]+::[a-zA-Z0-9\\_]+\(\)#'
 | 
				
			||||||
		- '#Call to an undefined method object::toArray\(\)#'
 | 
					 | 
				
			||||||
		# system/pages/highscores.php
 | 
							# system/pages/highscores.php
 | 
				
			||||||
		- '#Call to an undefined method Illuminate\\Database\\Query\\Builder::withOnlineStatus\(\)#'
 | 
					 | 
				
			||||||
		- '#Access to an undefined property Illuminate\\Database\\Eloquent\\Model::\$online_status#'
 | 
							- '#Access to an undefined property Illuminate\\Database\\Eloquent\\Model::\$online_status#'
 | 
				
			||||||
		- '#Access to an undefined property Illuminate\\Database\\Eloquent\\Model::\$vocation_name#'
 | 
							- '#Access to an undefined property Illuminate\\Database\\Eloquent\\Model::\$vocation_name#'
 | 
				
			||||||
		-
 | 
							-
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -46,8 +46,13 @@
 | 
				
			|||||||
	"settings": "plugins/your-plugin-folder/settings.php",
 | 
						"settings": "plugins/your-plugin-folder/settings.php",
 | 
				
			||||||
	"autoload": {
 | 
						"autoload": {
 | 
				
			||||||
		"pages": true,
 | 
							"pages": true,
 | 
				
			||||||
		"pagesSubFolders": false,
 | 
							"pages-sub-folders": false,
 | 
				
			||||||
		"commands": true,
 | 
							"commands": true,
 | 
				
			||||||
		"themes": true
 | 
							"themes": true,
 | 
				
			||||||
 | 
							"admin-pages": true,
 | 
				
			||||||
 | 
							"admin-pages-sub-folders": true,
 | 
				
			||||||
 | 
							"settings": true,
 | 
				
			||||||
 | 
							"install": true,
 | 
				
			||||||
 | 
							"init": false
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 }
 | 
					 }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -22,7 +22,7 @@ if [ $1 = "prepare" ]; then
 | 
				
			|||||||
	mkdir -p tmp
 | 
						mkdir -p tmp
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	# get myaac from git archive
 | 
						# get myaac from git archive
 | 
				
			||||||
	git archive --format zip --output tmp/myaac.zip master
 | 
						git archive --format zip --output tmp/myaac.zip main
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	cd tmp/ || exit
 | 
						cd tmp/ || exit
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										21
									
								
								system/base.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								system/base.php
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,21 @@
 | 
				
			|||||||
 | 
					<?php
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					$baseDir = '';
 | 
				
			||||||
 | 
					$tmp = explode('/', $_SERVER['SCRIPT_NAME']);
 | 
				
			||||||
 | 
					$size = count($tmp) - 1;
 | 
				
			||||||
 | 
					for($i = 1; $i < $size; $i++)
 | 
				
			||||||
 | 
						$baseDir .= '/' . $tmp[$i];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					$baseDir = str_replace(['/' . ADMIN_PANEL_FOLDER, '/install', '/tools'], '', $baseDir);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if(!IS_CLI) {
 | 
				
			||||||
 | 
						if (isset($_SERVER['HTTP_HOST'][0])) {
 | 
				
			||||||
 | 
							$baseHost = $_SERVER['HTTP_HOST'];
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							if (isset($_SERVER['SERVER_NAME'][0])) {
 | 
				
			||||||
 | 
								$baseHost = $_SERVER['SERVER_NAME'];
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								$baseHost = $_SERVER['SERVER_ADDR'];
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -109,4 +109,12 @@ $config['clients'] = [
 | 
				
			|||||||
	1330,
 | 
						1330,
 | 
				
			||||||
	1332,
 | 
						1332,
 | 
				
			||||||
	1340,
 | 
						1340,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						1400,
 | 
				
			||||||
 | 
						1405,
 | 
				
			||||||
 | 
						1410,
 | 
				
			||||||
 | 
						1411,
 | 
				
			||||||
 | 
						1412,
 | 
				
			||||||
 | 
						1500,
 | 
				
			||||||
 | 
						1501,
 | 
				
			||||||
];
 | 
					];
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -74,7 +74,3 @@ function fieldExist($field, $table)
 | 
				
			|||||||
	global $db;
 | 
						global $db;
 | 
				
			||||||
	return $db->hasColumn($table, $field);
 | 
						return $db->hasColumn($table, $field);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					 | 
				
			||||||
function getCreatureImgPath($creature): string {
 | 
					 | 
				
			||||||
	return getMonsterImgPath($creature);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 
 | 
				
			|||||||
@@ -122,6 +122,10 @@ try {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	$eloquentConnection = $capsule->getConnection();
 | 
						$eloquentConnection = $capsule->getConnection();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (isset($twig)) {
 | 
				
			||||||
 | 
							$twig->addGlobal('db', $db);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
} catch (Exception $e) {
 | 
					} catch (Exception $e) {
 | 
				
			||||||
	if(isset($cache) && $cache->enabled()) {
 | 
						if(isset($cache) && $cache->enabled()) {
 | 
				
			||||||
		$cache->delete('config_lua');
 | 
							$cache->delete('config_lua');
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -121,7 +121,7 @@ function getPlayerLink($name, $generate = true, bool $colored = false): string
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
function getMonsterLink($name, $generate = true): string
 | 
					function getMonsterLink($name, $generate = true): string
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	$url = BASE_URL . (setting('core.friendly_urls') ? '' : 'index.php/') . 'monsters/' . urlencode($name);
 | 
						$url = BASE_URL . (setting('core.friendly_urls') ? '' : 'index.php/') . 'monsters?name=' . urlencode($name);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if(!$generate) return $url;
 | 
						if(!$generate) return $url;
 | 
				
			||||||
	return generateLink($url, $name);
 | 
						return generateLink($url, $name);
 | 
				
			||||||
@@ -129,16 +129,14 @@ function getMonsterLink($name, $generate = true): string
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
function getHouseLink($name, $generate = true): string
 | 
					function getHouseLink($name, $generate = true): string
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	if(is_numeric($name))
 | 
						if(is_numeric($name)) {
 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
		$house = House::find(intval($name), ['name']);
 | 
							$house = House::find(intval($name), ['name']);
 | 
				
			||||||
		if ($house) {
 | 
							if ($house) {
 | 
				
			||||||
			$name = $house->name;
 | 
								$name = $house->name;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						$url = BASE_URL . (setting('core.friendly_urls') ? '' : 'index.php/') . 'houses?name=' . urlencode($name);
 | 
				
			||||||
	$url = BASE_URL . (setting('core.friendly_urls') ? '' : 'index.php/') . 'houses/' . urlencode($name);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if(!$generate) return $url;
 | 
						if(!$generate) return $url;
 | 
				
			||||||
	return generateLink($url, $name);
 | 
						return generateLink($url, $name);
 | 
				
			||||||
@@ -514,6 +512,13 @@ function template_place_holder($type): string
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
	elseif ($type === 'body_start') {
 | 
						elseif ($type === 'body_start') {
 | 
				
			||||||
		$ret .= $twig->render('browsehappy.html.twig');
 | 
							$ret .= $twig->render('browsehappy.html.twig');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (admin()) {
 | 
				
			||||||
 | 
								global $account_logged;
 | 
				
			||||||
 | 
								$ret .= $twig->render('admin-bar.html.twig', [
 | 
				
			||||||
 | 
									'username' => USE_ACCOUNT_NAME ? $account_logged->getName() : $account_logged->getId()
 | 
				
			||||||
 | 
								]);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	elseif($type === 'body_end') {
 | 
						elseif($type === 'body_end') {
 | 
				
			||||||
		$ret .= template_ga_code();
 | 
							$ret .= template_ga_code();
 | 
				
			||||||
@@ -547,33 +552,39 @@ function template_header($is_admin = false): string
 | 
				
			|||||||
 */
 | 
					 */
 | 
				
			||||||
function template_footer(): string
 | 
					function template_footer(): string
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	global $views_counter;
 | 
						$footer = [];
 | 
				
			||||||
	$ret = '';
 | 
					
 | 
				
			||||||
	if(admin()) {
 | 
						if(admin()) {
 | 
				
			||||||
		$ret .= generateLink(ADMIN_URL, 'Admin Panel', true);
 | 
							$footer[] = generateLink(ADMIN_URL, 'Admin Panel', true);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if(setting('core.visitors_counter')) {
 | 
						if(setting('core.visitors_counter')) {
 | 
				
			||||||
		global $visitors;
 | 
							global $visitors;
 | 
				
			||||||
		$amount = $visitors->getAmountVisitors();
 | 
							$amount = $visitors->getAmountVisitors();
 | 
				
			||||||
		$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')) {
 | 
						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')) {
 | 
						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');
 | 
						$settingFooter = setting('core.footer');
 | 
				
			||||||
	if(isset($settingFooter[0])) {
 | 
						if(isset($settingFooter[0])) {
 | 
				
			||||||
		$ret .= '<br/>' . $settingFooter;
 | 
							$footer[] = '' . $settingFooter;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// please respect my work and help spreading the word, thanks!
 | 
						// 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()
 | 
					function template_ga_code()
 | 
				
			||||||
@@ -763,6 +774,10 @@ function formatExperience($exp, $color = true)
 | 
				
			|||||||
	return $ret;
 | 
						return $ret;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function getExperienceForLevel($level): float|int {
 | 
				
			||||||
 | 
						return ( 50 / 3 ) * pow( $level, 3 ) - ( 100 * pow( $level, 2 ) ) + ( ( 850 / 3 ) * $level ) - 200;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function get_locales()
 | 
					function get_locales()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	$ret = array();
 | 
						$ret = array();
 | 
				
			||||||
@@ -978,37 +993,36 @@ function load_config_lua($filename)
 | 
				
			|||||||
		foreach($lines as $ln => $line)
 | 
							foreach($lines as $ln => $line)
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			$line = trim($line);
 | 
								$line = trim($line);
 | 
				
			||||||
			if(@$line[0] === '{' || @$line[0] === '}') {
 | 
								if(isset($line[0]) && ($line[0] === '{' || $line[0] === '}')) {
 | 
				
			||||||
				// arrays are not supported yet
 | 
									// arrays are not supported yet
 | 
				
			||||||
				// just ignore the error
 | 
									// just ignore the error
 | 
				
			||||||
				continue;
 | 
									continue;
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			$tmp_exp = explode('=', $line, 2);
 | 
								$tmp_exp = explode('=', $line, 2);
 | 
				
			||||||
			if(strpos($line, 'dofile') !== false)
 | 
								if(str_contains($line, 'dofile')) {
 | 
				
			||||||
			{
 | 
					 | 
				
			||||||
				$delimiter = '"';
 | 
									$delimiter = '"';
 | 
				
			||||||
				if(strpos($line, $delimiter) === false)
 | 
									if(!str_contains($line, $delimiter)) {
 | 
				
			||||||
					$delimiter = "'";
 | 
										$delimiter = "'";
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				$tmp = explode($delimiter, $line);
 | 
									$tmp = explode($delimiter, $line);
 | 
				
			||||||
				$result = array_merge($result, load_config_lua($config['server_path'] . $tmp[1]));
 | 
									$result = array_merge($result, load_config_lua($config['server_path'] . $tmp[1]));
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			else if(count($tmp_exp) >= 2)
 | 
								else if(count($tmp_exp) >= 2) {
 | 
				
			||||||
			{
 | 
					 | 
				
			||||||
				$key = trim($tmp_exp[0]);
 | 
									$key = trim($tmp_exp[0]);
 | 
				
			||||||
				if(0 !== strpos($key, '--'))
 | 
									if(!str_starts_with($key, '--')) {
 | 
				
			||||||
				{
 | 
					 | 
				
			||||||
					$value = trim($tmp_exp[1]);
 | 
										$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);
 | 
											$value = preg_replace('/--.*$/i', '', $value);
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
					if(is_numeric($value))
 | 
										if(is_numeric($value))
 | 
				
			||||||
						$result[$key] = (float) $value;
 | 
											$result[$key] = (float) $value;
 | 
				
			||||||
					elseif(in_array(@$value[0], array("'", '"')) && in_array(@$value[strlen($value) - 1], array("'", '"')))
 | 
										elseif(in_array(@$value[0], array("'", '"')) && in_array(@$value[strlen($value) - 1], array("'", '"')))
 | 
				
			||||||
						$result[$key] = (string) substr(substr($value, 1), 0, -1);
 | 
											$result[$key] = substr(substr($value, 1), 0, -1);
 | 
				
			||||||
					elseif(in_array($value, array('true', 'false')))
 | 
										elseif(in_array($value, array('true', 'false')))
 | 
				
			||||||
						$result[$key] = ($value === 'true') ? true : false;
 | 
											$result[$key] = $value === 'true';
 | 
				
			||||||
					elseif(@$value[0] === '{') {
 | 
										elseif(@$value[0] === '{') {
 | 
				
			||||||
						// arrays are not supported yet
 | 
											// arrays are not supported yet
 | 
				
			||||||
						// just ignore the error
 | 
											// just ignore the error
 | 
				
			||||||
@@ -1016,12 +1030,19 @@ function load_config_lua($filename)
 | 
				
			|||||||
					}
 | 
										}
 | 
				
			||||||
					else
 | 
										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);
 | 
												$value = str_replace($tmp_key, $tmp_value, $value);
 | 
				
			||||||
						$ret = @eval("return $value;");
 | 
											}
 | 
				
			||||||
						if((string) $ret == '' && trim($value) !== '""') // = parser error
 | 
					
 | 
				
			||||||
						{
 | 
											try {
 | 
				
			||||||
							throw new RuntimeException('ERROR: Loading config.lua file. Line <b>' . ($ln + 1) . '</b> of LUA config file is not valid [key: <b>' . $key . '</b>]');
 | 
												$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;
 | 
											$result[$key] = $ret;
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
@@ -1030,8 +1051,7 @@ function load_config_lua($filename)
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	$result = array_merge($result, isset($config['lua']) ? $config['lua'] : array());
 | 
						return array_merge($result, $config['lua'] ?? []);
 | 
				
			||||||
	return $result;
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function str_replace_first($search,$replace, $subject) {
 | 
					function str_replace_first($search,$replace, $subject) {
 | 
				
			||||||
@@ -1057,17 +1077,36 @@ function get_browser_real_ip() {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	return '0';
 | 
						return '0';
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
function setSession($key, $data): void {
 | 
					function setSession($key, $value = null): void {
 | 
				
			||||||
	$_SESSION[setting('core.session_prefix') . $key] = $data;
 | 
						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) {
 | 
					function getSession($key) {
 | 
				
			||||||
	$key = setting('core.session_prefix') . $key;
 | 
						return $_SESSION[setting('core.session_prefix') . $key] ?? null;
 | 
				
			||||||
	return $_SESSION[$key] ?? false;
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
function unsetSession($key): void {
 | 
					function unsetSession($key): void {
 | 
				
			||||||
	unset($_SESSION[setting('core.session_prefix') . $key]);
 | 
						unset($_SESSION[setting('core.session_prefix') . $key]);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function session($key): mixed {
 | 
				
			||||||
 | 
						if (is_array($key)) {
 | 
				
			||||||
 | 
							setSession($key);
 | 
				
			||||||
 | 
							return null;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return getSession($key);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function csrf(bool $return = false): string {
 | 
					function csrf(bool $return = false): string {
 | 
				
			||||||
	return CsrfToken::create($return);
 | 
						return CsrfToken::create($return);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -1107,10 +1146,6 @@ function getTopPlayers($limit = 5, $skill = 'level') {
 | 
				
			|||||||
			$columns[] = 'lookaddons';
 | 
								$columns[] = 'lookaddons';
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if ($db->hasColumn('players', 'online')) {
 | 
					 | 
				
			||||||
			$columns[] = 'online';
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		return Player::query()
 | 
							return Player::query()
 | 
				
			||||||
			->select($columns)
 | 
								->select($columns)
 | 
				
			||||||
			->withOnlineStatus()
 | 
								->withOnlineStatus()
 | 
				
			||||||
@@ -1193,7 +1228,8 @@ function setting($key)
 | 
				
			|||||||
		return $settings[$key[0]] = $key[1];
 | 
							return $settings[$key[0]] = $key[1];
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return $settings[$key]['value'];
 | 
						$ret = $settings[$key];
 | 
				
			||||||
 | 
						return isset($ret) ? $ret['value'] : null;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function clearCache()
 | 
					function clearCache()
 | 
				
			||||||
@@ -1242,14 +1278,15 @@ function clearCache()
 | 
				
			|||||||
		$db->setClearCacheAfter(true);
 | 
							$db->setClearCacheAfter(true);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (function_exists('apcu_clear_cache')) {
 | 
				
			||||||
 | 
							apcu_clear_cache();
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	deleteDirectory(CACHE . 'signatures', ['index.html'], true);
 | 
						deleteDirectory(CACHE . 'signatures', ['index.html'], true);
 | 
				
			||||||
	deleteDirectory(CACHE . 'twig', ['index.html'], true);
 | 
						deleteDirectory(CACHE . 'twig', ['index.html'], true);
 | 
				
			||||||
	deleteDirectory(CACHE . 'plugins', ['index.html'], true);
 | 
						deleteDirectory(CACHE . 'plugins', ['index.html'], true);
 | 
				
			||||||
	deleteDirectory(CACHE, ['signatures', 'twig', 'plugins', 'index.html', 'persistent'], true);
 | 
						deleteDirectory(CACHE, ['signatures', 'twig', 'plugins', 'index.html', 'persistent'], true);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// routes cache
 | 
					 | 
				
			||||||
	clearRouteCache();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	global $hooks;
 | 
						global $hooks;
 | 
				
			||||||
	$hooks->trigger(HOOK_CACHE_CLEAR, ['cache' => Cache::getInstance()]);
 | 
						$hooks->trigger(HOOK_CACHE_CLEAR, ['cache' => Cache::getInstance()]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -1555,22 +1592,6 @@ function right($str, $length) {
 | 
				
			|||||||
	return substr($str, -$length);
 | 
						return substr($str, -$length);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function getMonsterImgPath($monster): string
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	$monster_path = setting('core.monsters_images_url');
 | 
					 | 
				
			||||||
	$monster_gfx_name = trim(strtolower($monster)) . setting('core.monsters_images_extension');
 | 
					 | 
				
			||||||
	if (!file_exists($monster_path . $monster_gfx_name)) {
 | 
					 | 
				
			||||||
		$monster_gfx_name = str_replace(" ", "", $monster_gfx_name);
 | 
					 | 
				
			||||||
		if (file_exists($monster_path . $monster_gfx_name)) {
 | 
					 | 
				
			||||||
			return $monster_path . $monster_gfx_name;
 | 
					 | 
				
			||||||
		} else {
 | 
					 | 
				
			||||||
			return $monster_path . 'nophoto.png';
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	} else {
 | 
					 | 
				
			||||||
		return $monster_path . $monster_gfx_name;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
function between($x, $lim1, $lim2) {
 | 
					function between($x, $lim1, $lim2) {
 | 
				
			||||||
	if ($lim1 < $lim2) {
 | 
						if ($lim1 < $lim2) {
 | 
				
			||||||
		$lower = $lim1; $upper = $lim2;
 | 
							$lower = $lim1; $upper = $lim2;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -12,6 +12,7 @@ use DebugBar\StandardDebugBar;
 | 
				
			|||||||
use MyAAC\Cache\Cache;
 | 
					use MyAAC\Cache\Cache;
 | 
				
			||||||
use MyAAC\CsrfToken;
 | 
					use MyAAC\CsrfToken;
 | 
				
			||||||
use MyAAC\Hooks;
 | 
					use MyAAC\Hooks;
 | 
				
			||||||
 | 
					use MyAAC\Plugins;
 | 
				
			||||||
use MyAAC\Models\Town;
 | 
					use MyAAC\Models\Town;
 | 
				
			||||||
use MyAAC\Settings;
 | 
					use MyAAC\Settings;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -46,10 +47,16 @@ if(isset($config['gzip_output']) && $config['gzip_output'] && isset($_SERVER['HT
 | 
				
			|||||||
global $cache;
 | 
					global $cache;
 | 
				
			||||||
$cache = Cache::getInstance();
 | 
					$cache = Cache::getInstance();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// load plugins init.php
 | 
				
			||||||
 | 
					foreach (Plugins::getInits() as $init) {
 | 
				
			||||||
 | 
						require $init;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// event system
 | 
					// event system
 | 
				
			||||||
global $hooks;
 | 
					global $hooks;
 | 
				
			||||||
$hooks = new Hooks();
 | 
					$hooks = new Hooks();
 | 
				
			||||||
$hooks->load();
 | 
					$hooks->load();
 | 
				
			||||||
 | 
					$hooks->trigger(HOOK_INIT);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// twig
 | 
					// twig
 | 
				
			||||||
require_once SYSTEM . 'twig.php';
 | 
					require_once SYSTEM . 'twig.php';
 | 
				
			||||||
@@ -137,6 +144,18 @@ $ots = POT::getInstance();
 | 
				
			|||||||
$eloquentConnection = null;
 | 
					$eloquentConnection = null;
 | 
				
			||||||
require_once SYSTEM . 'database.php';
 | 
					require_once SYSTEM . 'database.php';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					define('USE_ACCOUNT_NAME', $db->hasColumn('accounts', 'name'));
 | 
				
			||||||
 | 
					define('USE_ACCOUNT_NUMBER', $db->hasColumn('accounts', 'number'));
 | 
				
			||||||
 | 
					define('USE_ACCOUNT_SALT', $db->hasColumn('accounts', 'salt'));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					define('HAS_ACCOUNT_COINS', $db->hasColumn('accounts', 'coins'));
 | 
				
			||||||
 | 
					define('HAS_ACCOUNT_COINS_TRANSFERABLE', $db->hasColumn('accounts', 'coins_transferable'));
 | 
				
			||||||
 | 
					define('HAS_ACCOUNT_TRANSFERABLE_COINS', $db->hasColumn('accounts', 'transferable_coins'));
 | 
				
			||||||
 | 
					const ACCOUNT_COINS_TRANSFERABLE_COLUMN = (HAS_ACCOUNT_COINS_TRANSFERABLE ? 'coins_transferable' : 'transferable_coins');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					$twig->addGlobal('logged', false);
 | 
				
			||||||
 | 
					$twig->addGlobal('account_logged', new \OTS_Account());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// verify myaac tables exists in database
 | 
					// verify myaac tables exists in database
 | 
				
			||||||
if(!defined('MYAAC_INSTALL') && !$db->hasTable('myaac_account_actions')) {
 | 
					if(!defined('MYAAC_INSTALL') && !$db->hasTable('myaac_account_actions')) {
 | 
				
			||||||
	throw new RuntimeException('Seems that the table myaac_account_actions of MyAAC doesn\'t exist in the database. This is a fatal error. You can try to reinstall MyAAC by visiting ' . (IS_CLI ? 'http://your-ip.com/' : BASE_URL) . 'install');
 | 
						throw new RuntimeException('Seems that the table myaac_account_actions of MyAAC doesn\'t exist in the database. This is a fatal error. You can try to reinstall MyAAC by visiting ' . (IS_CLI ? 'http://your-ip.com/' : BASE_URL) . 'install');
 | 
				
			||||||
@@ -178,10 +197,6 @@ if($settingsItemImagesURL[strlen($settingsItemImagesURL) - 1] !== '/') {
 | 
				
			|||||||
	setting(['core.item_images_url', $settingsItemImagesURL . '/']);
 | 
						setting(['core.item_images_url', $settingsItemImagesURL . '/']);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
define('USE_ACCOUNT_NAME', $db->hasColumn('accounts', 'name'));
 | 
					 | 
				
			||||||
define('USE_ACCOUNT_NUMBER', $db->hasColumn('accounts', 'number'));
 | 
					 | 
				
			||||||
define('USE_ACCOUNT_SALT', $db->hasColumn('accounts', 'salt'));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
$towns = Cache::remember('towns', 10 * 60, function () use ($db) {
 | 
					$towns = Cache::remember('towns', 10 * 60, function () use ($db) {
 | 
				
			||||||
	if ($db->hasTable('towns') && Town::count() > 0) {
 | 
						if ($db->hasTable('towns') && Town::count() > 0) {
 | 
				
			||||||
		return Town::orderBy('id', 'ASC')->pluck('name', 'id')->toArray();
 | 
							return Town::orderBy('id', 'ASC')->pluck('name', 'id')->toArray();
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -415,9 +415,11 @@ class POT
 | 
				
			|||||||
 * @tutorial POT/Server_status.pkg
 | 
					 * @tutorial POT/Server_status.pkg
 | 
				
			||||||
 * @deprecated 0.1.4 Use OTS_ServerInfo->status().
 | 
					 * @deprecated 0.1.4 Use OTS_ServerInfo->status().
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
    public static function serverStatus($server, $port)
 | 
						public static function serverStatus($server, $port, $timeout = 2.0)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		$status = new OTS_ServerInfo($server, $port);
 | 
							$status = new OTS_ServerInfo($server, $port);
 | 
				
			||||||
 | 
							$status->setTimeout($timeout);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		return $status->status();
 | 
							return $status->status();
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -1115,7 +1117,7 @@ class POT
 | 
				
			|||||||
 *
 | 
					 *
 | 
				
			||||||
 * @param IOTS_FileCache $cache Cache handler (skip this parameter to reset cache handler to null).
 | 
					 * @param IOTS_FileCache $cache Cache handler (skip this parameter to reset cache handler to null).
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
    public function setItemsCache(IOTS_FileCache $cache = null)
 | 
						public function setItemsCache(?IOTS_FileCache $cache = null)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		$this->itemsCache = $cache;
 | 
							$this->itemsCache = $cache;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -1253,7 +1255,7 @@ class POT
 | 
				
			|||||||
 *
 | 
					 *
 | 
				
			||||||
 * @param IOTS_FileCache $cache Cache handler (skip this parameter to reset cache handler to null).
 | 
					 * @param IOTS_FileCache $cache Cache handler (skip this parameter to reset cache handler to null).
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
    public function setMapCache(IOTS_FileCache $cache = null)
 | 
						public function setMapCache(?IOTS_FileCache $cache = null)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		$this->mapCache = $cache;
 | 
							$this->mapCache = $cache;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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'])) {
 | 
							if(isset($this->data['premium_ends_at']) || isset($this->data['premend'])) {
 | 
				
			||||||
			$col = isset($this->data['premium_ends_at']) ? 'premium_ends_at' : 'premend';
 | 
								$col = isset($this->data['premium_ends_at']) ? 'premium_ends_at' : 'premend';
 | 
				
			||||||
			$ret = ceil(($this->data[$col] - time()) / (24 * 60 * 60));
 | 
								$ret = ceil(($this->data[$col] - time()) / (24 * 60 * 60));
 | 
				
			||||||
			return $ret > 0 ? $ret : 0;
 | 
								return max($ret, 0);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if($this->data['premdays'] == 0) {
 | 
							if($this->data['premdays'] == 0) {
 | 
				
			||||||
			return 0;
 | 
								return 0;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		global $config;
 | 
					 | 
				
			||||||
		if(isset($config['lua']['freePremium']) && getBoolean($config['lua']['freePremium'])) return -1;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		if($this->data['premdays'] == self::GRATIS_PREMIUM_DAYS){
 | 
							if($this->data['premdays'] == self::GRATIS_PREMIUM_DAYS){
 | 
				
			||||||
			return self::GRATIS_PREMIUM_DAYS;
 | 
								return self::GRATIS_PREMIUM_DAYS;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
@@ -476,9 +473,6 @@ class OTS_Account extends OTS_Row_DAO implements IteratorAggregate, Countable
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    public function isPremium()
 | 
					    public function isPremium()
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
		global $config;
 | 
					 | 
				
			||||||
        if(isset($config['lua']['freePremium']) && getBoolean($config['lua']['freePremium'])) return true;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		if(isset($this->data['premium_ends_at'])) {
 | 
							if(isset($this->data['premium_ends_at'])) {
 | 
				
			||||||
			return $this->data['premium_ends_at'] > time();
 | 
								return $this->data['premium_ends_at'] > time();
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
@@ -1011,7 +1005,7 @@ class OTS_Account extends OTS_Row_DAO implements IteratorAggregate, Countable
 | 
				
			|||||||
	public function logAction($action)
 | 
						public function logAction($action)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		$ip = get_browser_real_ip();
 | 
							$ip = get_browser_real_ip();
 | 
				
			||||||
		if(strpos($ip, ":") === false) {
 | 
							if(!str_contains($ip, ":")) {
 | 
				
			||||||
			$ipv6 = '0';
 | 
								$ipv6 = '0';
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		else {
 | 
							else {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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);
 | 
							return $this->hasTable($table) && ($this->has_column_cache[$table . '.' . $column] = count($this->query('SHOW COLUMNS FROM `' . $table . "` LIKE '" . $column . "'")->fetchAll()) > 0);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						public function hasTableAndColumns(string $table, array $columns = []): bool
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							if (!$this->hasTable($table)) return false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							foreach ($columns as $column) {
 | 
				
			||||||
 | 
								if (!$this->hasColumn($table, $column)) {
 | 
				
			||||||
 | 
									return false;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							return true;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	public function revalidateCache() {
 | 
						public function revalidateCache() {
 | 
				
			||||||
		foreach($this->has_table_cache as $key => $value) {
 | 
							foreach($this->has_table_cache as $key => $value) {
 | 
				
			||||||
			$this->hasTableInternal($key);
 | 
								$this->hasTableInternal($key);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -97,7 +97,7 @@ class OTS_Guild extends OTS_Row_DAO implements IteratorAggregate, Countable
 | 
				
			|||||||
 *
 | 
					 *
 | 
				
			||||||
 * @param IOTS_GuildAction $invites Invites driver (don't pass it to clear driver).
 | 
					 * @param IOTS_GuildAction $invites Invites driver (don't pass it to clear driver).
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
    public function setInvitesDriver(IOTS_GuildAction $invites = null)
 | 
					    public function setInvitesDriver(?IOTS_GuildAction $invites = null)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        $this->invites = $invites;
 | 
					        $this->invites = $invites;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@@ -107,7 +107,7 @@ class OTS_Guild extends OTS_Row_DAO implements IteratorAggregate, Countable
 | 
				
			|||||||
 *
 | 
					 *
 | 
				
			||||||
 * @param IOTS_GuildAction $requests Membership requests driver (don't pass it to clear driver).
 | 
					 * @param IOTS_GuildAction $requests Membership requests driver (don't pass it to clear driver).
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
    public function setRequestsDriver(IOTS_GuildAction $requests = null)
 | 
					    public function setRequestsDriver(?IOTS_GuildAction $requests = null)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        $this->requests = $requests;
 | 
					        $this->requests = $requests;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -60,7 +60,7 @@ class OTS_GuildRank extends OTS_Row_DAO implements IteratorAggregate, Countable
 | 
				
			|||||||
 * @throws PDOException On PDO operation error.
 | 
					 * @throws PDOException On PDO operation error.
 | 
				
			||||||
 * @throws E_OTS_NotLoaded If given <var>$guild</var> object is not loaded.
 | 
					 * @throws E_OTS_NotLoaded If given <var>$guild</var> object is not loaded.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
    public function find($name, OTS_Guild $guild = null)
 | 
					    public function find($name, ?OTS_Guild $guild = null)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        $where = '';
 | 
					        $where = '';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -219,11 +219,16 @@ class OTS_InfoRespond extends DOMDocument
 | 
				
			|||||||
 * @return int Count of monsters.
 | 
					 * @return int Count of monsters.
 | 
				
			||||||
 * @throws DOMException On DOM operation error.
 | 
					 * @throws DOMException On DOM operation error.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
    public function getMonstersCount()
 | 
						public function getMonstersCount(): int
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		return (int) $this->documentElement->getElementsByTagName('monsters')->item(0)->getAttribute('total');
 | 
							return (int) $this->documentElement->getElementsByTagName('monsters')->item(0)->getAttribute('total');
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						public function getNPCsCount(): int
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							return (int) $this->documentElement->getElementsByTagName('npcs')->item(0)->getAttribute('total');
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * Returns map name.
 | 
					 * Returns map name.
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -284,7 +284,7 @@ class OTS_Monster extends DOMDocument
 | 
				
			|||||||
 */
 | 
					 */
 | 
				
			||||||
	public function getLook()
 | 
						public function getLook()
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		$look = array();
 | 
							$look = [];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		$element = $this->documentElement->getElementsByTagName('look')->item(0);
 | 
							$element = $this->documentElement->getElementsByTagName('look')->item(0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -292,14 +292,30 @@ class OTS_Monster extends DOMDocument
 | 
				
			|||||||
			return $look;
 | 
								return $look;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		$look['type'] = $element->getAttribute('type');
 | 
							if ($element->hasAttribute('typeex')) {
 | 
				
			||||||
		$look['typeex'] = $element->getAttribute('typeex');
 | 
								$look['typeEx'] = (int) $element->getAttribute('typeex');
 | 
				
			||||||
		$look['head'] = $element->getAttribute('head');
 | 
							}
 | 
				
			||||||
		$look['body'] = $element->getAttribute('body');
 | 
							if ($element->hasAttribute('type')) {
 | 
				
			||||||
		$look['legs'] = $element->getAttribute('legs');
 | 
								$look['type'] = (int) $element->getAttribute('type');
 | 
				
			||||||
		$look['feet'] = $element->getAttribute('feet');
 | 
							}
 | 
				
			||||||
		$look['addons'] = $element->getAttribute('addons');
 | 
							if ($element->hasAttribute('head')) {
 | 
				
			||||||
		$look['corpse'] = $element->getAttribute('corpse');
 | 
								$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;
 | 
							return $look;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -2026,7 +2026,7 @@ class OTS_Player extends OTS_Row_DAO
 | 
				
			|||||||
 * @param OTS_GuildRank|null Guild rank (null to clear assign).
 | 
					 * @param OTS_GuildRank|null Guild rank (null to clear assign).
 | 
				
			||||||
 * @throws E_OTS_NotLoaded If passed <var>$guildRank</var> parameter is not loaded.
 | 
					 * @throws E_OTS_NotLoaded If passed <var>$guildRank</var> parameter is not loaded.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
	public function setRank(OTS_GuildRank $guildRank = null)
 | 
						public function setRank(?OTS_GuildRank $guildRank = null)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		if(isset($guildRank))
 | 
							if(isset($guildRank))
 | 
				
			||||||
			$this->setRankId($guildRank->getId(), $guildRank->getGuild()->getId());
 | 
								$this->setRankId($guildRank->getId(), $guildRank->getGuild()->getId());
 | 
				
			||||||
@@ -2632,7 +2632,7 @@ class OTS_Player extends OTS_Row_DAO
 | 
				
			|||||||
 * @throws E_OTS_NotLoaded If player is not loaded.
 | 
					 * @throws E_OTS_NotLoaded If player is not loaded.
 | 
				
			||||||
 * @throws PDOException On PDO operation error.
 | 
					 * @throws PDOException On PDO operation error.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
	public function setSlot($slot, OTS_Item $item = null, $pid = 0)
 | 
						public function setSlot($slot, ?OTS_Item $item = null, $pid = 0)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		static $sid;
 | 
							static $sid;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -2776,7 +2776,7 @@ class OTS_Player extends OTS_Row_DAO
 | 
				
			|||||||
 * @throws E_OTS_NotLoaded If player is not loaded.
 | 
					 * @throws E_OTS_NotLoaded If player is not loaded.
 | 
				
			||||||
 * @throws PDOException On PDO operation error.
 | 
					 * @throws PDOException On PDO operation error.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
	public function setDepot($depot, OTS_Item $item = null, $pid = 0, $depot_id = 0)
 | 
						public function setDepot($depot, ?OTS_Item $item = null, $pid = 0, $depot_id = 0)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		static $sid;
 | 
							static $sid;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -2919,6 +2919,32 @@ class OTS_Player extends OTS_Row_DAO
 | 
				
			|||||||
		$this->data['banned'] = $ban['active'];
 | 
							$this->data['banned'] = $ban['active'];
 | 
				
			||||||
		$this->data['banned_time'] = $ban['expires'];
 | 
							$this->data['banned_time'] = $ban['expires'];
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						public function isNameLocked(): bool
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							// nothing can't be banned
 | 
				
			||||||
 | 
							if( !$this->isLoaded() ) {
 | 
				
			||||||
 | 
								throw new E_OTS_NotLoaded();
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if($this->db->hasTable('player_namelocks')) {
 | 
				
			||||||
 | 
								$ban = $this->db->query('SELECT 1 FROM `player_namelocks` WHERE `player_id` = ' . $this->data['id'])->fetch(PDO::FETCH_ASSOC);
 | 
				
			||||||
 | 
								return (isset($ban['1']));
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							else if($this->db->hasTable('bans')) {
 | 
				
			||||||
 | 
								if($this->db->hasColumn('bans', 'active')) {
 | 
				
			||||||
 | 
									$ban = $this->db->query('SELECT `active`, `expires` FROM `bans` WHERE `type` = 2 AND `active` = 1 AND `value` = ' . $this->data['id'] . ' AND (`expires` > ' . time() .' OR `expires` = -1) ORDER BY `expires` DESC')->fetch();
 | 
				
			||||||
 | 
									return isset($ban['active']);
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								else { // tfs 0.2
 | 
				
			||||||
 | 
									$ban = $this->db->query('SELECT `time` FROM `bans` WHERE `type` = 2 AND `account` = ' . $this->data['account_id'] . ' AND (`time` > ' . time() .' OR `time` = -1) ORDER BY `time` DESC')->fetch();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									return isset($ban['time']) && ($ban['time'] == -1 || $ban['time'] > 0);
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							return false;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * Deletes player.
 | 
					 * Deletes player.
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
@@ -2953,21 +2979,14 @@ class OTS_Player extends OTS_Row_DAO
 | 
				
			|||||||
 * @return string Player proffesion name.
 | 
					 * @return string Player proffesion name.
 | 
				
			||||||
 * @throws E_OTS_NotLoaded If player is not loaded or global vocations list is not loaded.
 | 
					 * @throws E_OTS_NotLoaded If player is not loaded or global vocations list is not loaded.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
	public function getVocationName()
 | 
						public function getVocationName(): string
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		if( !isset($this->data['vocation']) )
 | 
							if( !isset($this->data['vocation']) )
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			throw new E_OTS_NotLoaded();
 | 
								throw new E_OTS_NotLoaded();
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		global $config;
 | 
							return OTS_Toolbox::getVocationName($this->data['vocation'], $this->data['promotion'] ?? 0);
 | 
				
			||||||
		$voc = $this->getVocation();
 | 
					 | 
				
			||||||
		if(!isset($config['vocations'][$voc])) {
 | 
					 | 
				
			||||||
			return 'Unknown';
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		return $config['vocations'][$voc];
 | 
					 | 
				
			||||||
		//return POT::getInstance()->getVocationsList()->getVocationName($this->data['vocation']);
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -26,14 +26,19 @@ class OTS_ServerInfo
 | 
				
			|||||||
 *
 | 
					 *
 | 
				
			||||||
 * @var string
 | 
					 * @var string
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
    private $server;
 | 
						private string $server;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * Connection port.
 | 
					 * Connection port.
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * @var int
 | 
					 * @var int
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
    private $port;
 | 
						private int $port;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/**
 | 
				
			||||||
 | 
						 * Status timeout
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						private float $timeout = 2.0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * Creates handler for new server.
 | 
					 * Creates handler for new server.
 | 
				
			||||||
@@ -57,7 +62,7 @@ class OTS_ServerInfo
 | 
				
			|||||||
	private function send(OTS_Buffer $packet)
 | 
						private function send(OTS_Buffer $packet)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		// connects to server
 | 
							// connects to server
 | 
				
			||||||
        $socket = @fsockopen($this->server, $this->port, $error, $message, setting('core.status_timeout'));
 | 
							$socket = @fsockopen($this->server, $this->port, $error, $message, $this->timeout);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// if connected then checking statistics
 | 
							// if connected then checking statistics
 | 
				
			||||||
		if($socket)
 | 
							if($socket)
 | 
				
			||||||
@@ -224,6 +229,10 @@ class OTS_ServerInfo
 | 
				
			|||||||
				throw new OutOfBoundsException();
 | 
									throw new OutOfBoundsException();
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						public function setTimeout($timeout) {
 | 
				
			||||||
 | 
							$this->timeout = $timeout;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**#@-*/
 | 
					/**#@-*/
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -110,6 +110,15 @@ class OTS_Toolbox
 | 
				
			|||||||
		$list->setFilter($filter);
 | 
							$list->setFilter($filter);
 | 
				
			||||||
		return $list;
 | 
							return $list;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						public static function getVocationName($id, $promotion = 0): string
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							if($promotion > 0) {
 | 
				
			||||||
 | 
								$id = ($id + ($promotion * config('vocations_amount')));
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							return config('vocations')[$id] ?? 'Unknown';
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**#@-*/
 | 
					/**#@-*/
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -48,6 +48,8 @@ $locale['step_config'] = 'Konfiguration';
 | 
				
			|||||||
$locale['step_config_title'] = 'Grundkonfiguration';
 | 
					$locale['step_config_title'] = 'Grundkonfiguration';
 | 
				
			||||||
$locale['step_config_server_path'] = 'Serverpfad';
 | 
					$locale['step_config_server_path'] = 'Serverpfad';
 | 
				
			||||||
$locale['step_config_server_path_desc'] = 'Pfad zu Ihrem TFS-Hauptverzeichnis, in dem sich die config.lua befinden.';
 | 
					$locale['step_config_server_path_desc'] = 'Pfad zu Ihrem TFS-Hauptverzeichnis, in dem sich die config.lua befinden.';
 | 
				
			||||||
 | 
					$locale['step_config_site_url'] = 'Website URL';
 | 
				
			||||||
 | 
					$locale['step_config_site_url_desc'] = 'Ihre Website-Adresse.';
 | 
				
			||||||
$locale['step_config_mail_admin'] = 'Admin E-Mail';
 | 
					$locale['step_config_mail_admin'] = 'Admin E-Mail';
 | 
				
			||||||
$locale['step_config_mail_admin_desc'] = 'Adresse, an die E-Mails aus dem Kontaktformular gesendet werden, z. B. admin@gmail.com';
 | 
					$locale['step_config_mail_admin_desc'] = 'Adresse, an die E-Mails aus dem Kontaktformular gesendet werden, z. B. admin@gmail.com';
 | 
				
			||||||
$locale['step_config_mail_admin_error'] = 'Admin E-Mail ist nicht korrekt.';
 | 
					$locale['step_config_mail_admin_error'] = 'Admin E-Mail ist nicht korrekt.';
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -52,6 +52,8 @@ $locale['step_config'] = 'Configuration';
 | 
				
			|||||||
$locale['step_config_title'] = 'Basic configuration';
 | 
					$locale['step_config_title'] = 'Basic configuration';
 | 
				
			||||||
$locale['step_config_server_path'] = 'Server path';
 | 
					$locale['step_config_server_path'] = 'Server path';
 | 
				
			||||||
$locale['step_config_server_path_desc'] = 'Path to your TFS main directory, where you have config.lua located.';
 | 
					$locale['step_config_server_path_desc'] = 'Path to your TFS main directory, where you have config.lua located.';
 | 
				
			||||||
 | 
					$locale['step_config_site_url'] = 'Website URL';
 | 
				
			||||||
 | 
					$locale['step_config_site_url_desc'] = 'Your website address.';
 | 
				
			||||||
$locale['step_config_mail_admin'] = 'Admin Email';
 | 
					$locale['step_config_mail_admin'] = 'Admin Email';
 | 
				
			||||||
$locale['step_config_mail_admin_desc'] = 'Address where emails from contact form will be delivered, for example admin@gmail.com';
 | 
					$locale['step_config_mail_admin_desc'] = 'Address where emails from contact form will be delivered, for example admin@gmail.com';
 | 
				
			||||||
$locale['step_config_mail_admin_error'] = 'Admin Email is not correct.';
 | 
					$locale['step_config_mail_admin_error'] = 'Admin Email is not correct.';
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -52,6 +52,8 @@ $locale['step_config'] = 'Konfiguracja';
 | 
				
			|||||||
$locale['step_config_title'] = 'Podstawowa konfiguracja';
 | 
					$locale['step_config_title'] = 'Podstawowa konfiguracja';
 | 
				
			||||||
$locale['step_config_server_path'] = 'Ścieżka do serwera';
 | 
					$locale['step_config_server_path'] = 'Ścieżka do serwera';
 | 
				
			||||||
$locale['step_config_server_path_desc'] = 'Ścieżka do Twojego folderu z TFS, gdzie znajduje się plik config.lua.';
 | 
					$locale['step_config_server_path_desc'] = 'Ścieżka do Twojego folderu z TFS, gdzie znajduje się plik config.lua.';
 | 
				
			||||||
 | 
					$locale['step_config_server_url'] = 'Adres strony';
 | 
				
			||||||
 | 
					$locale['step_config_server_url_desc'] = 'Adres tej strony www.';
 | 
				
			||||||
$locale['step_config_mail_admin'] = 'E-Mail admina';
 | 
					$locale['step_config_mail_admin'] = 'E-Mail admina';
 | 
				
			||||||
$locale['step_config_mail_admin_desc'] = 'Na ten adres będą dostarczane E-Maile z formularza kontaktowego, przykładowo admin@gmail.com';
 | 
					$locale['step_config_mail_admin_desc'] = 'Na ten adres będą dostarczane E-Maile z formularza kontaktowego, przykładowo admin@gmail.com';
 | 
				
			||||||
$locale['step_config_mail_admin_error'] = 'E-Mail admina jest niepoprawny.';
 | 
					$locale['step_config_mail_admin_error'] = 'E-Mail admina jest niepoprawny.';
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -14,12 +14,12 @@ $account_logged = new OTS_Account();
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// stay-logged with sessions
 | 
					// stay-logged with sessions
 | 
				
			||||||
$current_session = getSession('account');
 | 
					$current_session = getSession('account');
 | 
				
			||||||
if($current_session !== false)
 | 
					if($current_session)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	$account_logged->load($current_session);
 | 
						$account_logged->load($current_session);
 | 
				
			||||||
	if($account_logged->isLoaded() && $account_logged->getPassword() == getSession('password')
 | 
						if($account_logged->isLoaded() && $account_logged->getPassword() == getSession('password')
 | 
				
			||||||
		//&& (!isset($_SESSION['admin']) || admin())
 | 
							//&& (!isset($_SESSION['admin']) || admin())
 | 
				
			||||||
		&& (getSession('remember_me') !== 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;
 | 
								$logged = true;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	else {
 | 
						else {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -10,8 +10,13 @@ $up = function () use ($db) {
 | 
				
			|||||||
		$db->exec(file_get_contents(__DIR__ . '/17-menu.sql'));
 | 
							$db->exec(file_get_contents(__DIR__ . '/17-menu.sql'));
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	Plugins::installMenus('kathrine', require TEMPLATES . 'kathrine/menus.php');
 | 
						$themes = ['kathrine', 'tibiacom',];
 | 
				
			||||||
	Plugins::installMenus('tibiacom', require TEMPLATES . 'tibiacom/menus.php');
 | 
						foreach ($themes as $theme) {
 | 
				
			||||||
 | 
							$file = TEMPLATES . $theme . '/menus.php';
 | 
				
			||||||
 | 
							if (is_file($file)) {
 | 
				
			||||||
 | 
								Plugins::installMenus($theme, require $file);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
$down = function () use ($db) {
 | 
					$down = function () use ($db) {
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										20
									
								
								system/migrations/44.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								system/migrations/44.php
									
									
									
									
									
										Normal 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
									
								
							
							
						
						
									
										32
									
								
								system/migrations/45.php
									
									
									
									
									
										Normal 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]);
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										8
									
								
								system/migrations/46-account_email_codes.sql
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								system/migrations/46-account_email_codes.sql
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,8 @@
 | 
				
			|||||||
 | 
					CREATE TABLE `myaac_account_email_codes`
 | 
				
			||||||
 | 
					(
 | 
				
			||||||
 | 
						`id` int(11) NOT NULL AUTO_INCREMENT,
 | 
				
			||||||
 | 
						`account_id` int NOT NULL,
 | 
				
			||||||
 | 
						`code` varchar(6) NOT NULL,
 | 
				
			||||||
 | 
						`created_at` int NOT NULL,
 | 
				
			||||||
 | 
						PRIMARY KEY (`id`)
 | 
				
			||||||
 | 
					) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8mb4;
 | 
				
			||||||
							
								
								
									
										27
									
								
								system/migrations/46.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								system/migrations/46.php
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,27 @@
 | 
				
			|||||||
 | 
					<?php
 | 
				
			||||||
 | 
					// add the myaac_account_email_codes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * @var OTS_DB_MySQL $db
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					$up = function () use ($db) {
 | 
				
			||||||
 | 
						if (!$db->hasColumn('accounts', '2fa_type')) {
 | 
				
			||||||
 | 
							$db->addColumn('accounts', '2fa_type', "tinyint NOT NULL DEFAULT 0 AFTER `web_flags`");
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// add myaac_account_email_codes table
 | 
				
			||||||
 | 
						if (!$db->hasTable(TABLE_PREFIX . 'account_email_codes')) {
 | 
				
			||||||
 | 
							$db->exec(file_get_contents(__DIR__ . '/46-account_email_codes.sql'));
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					$down = function () use ($db) {
 | 
				
			||||||
 | 
						if ($db->hasColumn('accounts', '2fa_type')) {
 | 
				
			||||||
 | 
							$db->dropColumn('accounts', '2fa_type');
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						//if ($db->hasTable(TABLE_PREFIX . 'account_email_codes')) {
 | 
				
			||||||
 | 
						//	$db->dropTable(TABLE_PREFIX . 'account_email_codes');
 | 
				
			||||||
 | 
						//}
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
@@ -8,7 +8,7 @@
 | 
				
			|||||||
 * @link      https://my-aac.org
 | 
					 * @link      https://my-aac.org
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
defined('MYAAC') or die('Direct access not allowed!');
 | 
					defined('MYAAC') or die('Direct access not allowed!');
 | 
				
			||||||
$title = '404 Not Found';
 | 
					$title = 'Not Found';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
header('HTTP/1.0 404 Not Found');
 | 
					header('HTTP/1.0 404 Not Found');
 | 
				
			||||||
?>
 | 
					?>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -8,7 +8,7 @@
 | 
				
			|||||||
 * @link      https://my-aac.org
 | 
					 * @link      https://my-aac.org
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
defined('MYAAC') or die('Direct access not allowed!');
 | 
					defined('MYAAC') or die('Direct access not allowed!');
 | 
				
			||||||
$title = '405 Method Not Allowed';
 | 
					$title = 'Method Not Allowed';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
header('HTTP/1.0 405 Method Not Allowed');
 | 
					header('HTTP/1.0 405 Method Not Allowed');
 | 
				
			||||||
?>
 | 
					?>
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										124
									
								
								system/pages/account/2fa.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										124
									
								
								system/pages/account/2fa.php
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,124 @@
 | 
				
			|||||||
 | 
					<?php
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * 2-factor authentication
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @package   MyAAC
 | 
				
			||||||
 | 
					 * @author    Slawkens <slawkens@gmail.com>
 | 
				
			||||||
 | 
					 * @copyright 2019 MyAAC
 | 
				
			||||||
 | 
					 * @link      https://my-aac.org
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					use MyAAC\TwoFactorAuth\TwoFactorAuth;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					defined('MYAAC') or die('Direct access not allowed!');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					$title = 'Two Factor Authentication';
 | 
				
			||||||
 | 
					require __DIR__ . '/base.php';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					csrfProtect();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * @var OTS_Account $account_logged
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					$step = $_REQUEST['step'] ?? '';
 | 
				
			||||||
 | 
					$code = $_REQUEST['auth-code'] ?? '';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if ((!setting('core.mail_enabled')) && ACTION == 'email-code') {
 | 
				
			||||||
 | 
						$twig->display('error_box.html.twig',  ['errors' => ['Account two-factor e-mail authentication disabled.']]);
 | 
				
			||||||
 | 
						return;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if (!isset($account_logged) || !$account_logged->isLoaded()) {
 | 
				
			||||||
 | 
						$current_session = getSession('account');
 | 
				
			||||||
 | 
						if($current_session) {
 | 
				
			||||||
 | 
							$account_logged = new OTS_Account();
 | 
				
			||||||
 | 
							$account_logged->load($current_session);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					$twoFactorAuth = TwoFactorAuth::getInstance($account_logged);
 | 
				
			||||||
 | 
					$twig->addGlobal('account_logged', $account_logged);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if (ACTION == 'email-code') {
 | 
				
			||||||
 | 
						if ($step == 'resend') {
 | 
				
			||||||
 | 
							if ($twoFactorAuth->hasRecentEmailCode(15 * 60)) {
 | 
				
			||||||
 | 
								$errors = ['Sorry, one email per 15 minutes'];
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							else {
 | 
				
			||||||
 | 
								$twoFactorAuth->resendEmailCode();
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (!empty($errors)) {
 | 
				
			||||||
 | 
								$twig->display('error_box.html.twig',  ['errors' => $errors]);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							$twig->display('account.2fa.email.login.html.twig');
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						else if ($step == 'activate') {
 | 
				
			||||||
 | 
							if (!$twoFactorAuth->hasRecentEmailCode(15 * 60)) {
 | 
				
			||||||
 | 
								$twoFactorAuth->resendEmailCode();
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (isset($_POST['save'])) {
 | 
				
			||||||
 | 
								if (!empty($code)) {
 | 
				
			||||||
 | 
									$twoFactorAuth->setAuthGateway(TwoFactorAuth::TYPE_EMAIL);
 | 
				
			||||||
 | 
									if ($twoFactorAuth->getAuthGateway()->verifyCode($code)) {
 | 
				
			||||||
 | 
										$serverName = configLua('serverName');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
										$twoFactorAuth->enable(TwoFactorAuth::TYPE_EMAIL);
 | 
				
			||||||
 | 
										$twoFactorAuth->deleteOldCodes();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
										$twig->display('success.html.twig', [
 | 
				
			||||||
 | 
											'title' => 'Email Code Authentication Activated',
 | 
				
			||||||
 | 
											'description' => sprintf('You have successfully activated <b>email code authentication</b> for your account. This means an <b>email code</b> will be sent to the email address assigned to your account whenever you try to log in to the %s client or the %s website. In order to log in, you will need to enter the <b>most recent email code</b> you have received.', $serverName, $serverName)
 | 
				
			||||||
 | 
										]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
										return;
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									else {
 | 
				
			||||||
 | 
										$errors[] = 'Invalid email code!';
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (!empty($errors)) {
 | 
				
			||||||
 | 
								$twig->display('error_box.html.twig', ['errors' => $errors]);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							$twig->display('account.2fa.email_code.html.twig', ['wrongCode' => count($errors) > 0]);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						else if ($step == 'deactivate') {
 | 
				
			||||||
 | 
							//if (!$twoFactorAuth->hasRecentEmailCode(15 * 60)) {
 | 
				
			||||||
 | 
							//	$twoFactorAuth->resendEmailCode();
 | 
				
			||||||
 | 
							//}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							/*if (isset($_POST['save'])) {
 | 
				
			||||||
 | 
								if (!empty($code)) {
 | 
				
			||||||
 | 
									if ($twoFactorAuth->getAuthGateway()->verifyCode($code)) {
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
										$twoFactorAuth->disable();
 | 
				
			||||||
 | 
										$twoFactorAuth->deleteOldCodes();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
										$twig->display('success.html.twig',
 | 
				
			||||||
 | 
											[
 | 
				
			||||||
 | 
												'title' => 'Email Code Authentication Deactivated',
 | 
				
			||||||
 | 
												'description' => 'You have successfully <b>deactivated</b> the <b>Email Code Authentication</b> for your account.'
 | 
				
			||||||
 | 
											]
 | 
				
			||||||
 | 
										);
 | 
				
			||||||
 | 
										/*
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									else {
 | 
				
			||||||
 | 
										$errors[] = 'Invalid email code!';
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							/*
 | 
				
			||||||
 | 
							if (!empty($errors)) {
 | 
				
			||||||
 | 
								$twig->display('error_box.html.twig', ['errors' => $errors]);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							$twig->display('account.2fa.email.deactivate.html.twig', ['wrongCode' => count($errors) > 0]);
 | 
				
			||||||
 | 
							*/
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -17,6 +17,10 @@ if(!$logged)
 | 
				
			|||||||
	if(!empty($errors))
 | 
						if(!empty($errors))
 | 
				
			||||||
		$twig->display('error_box.html.twig', array('errors' => $errors));
 | 
							$twig->display('error_box.html.twig', array('errors' => $errors));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (defined('HIDE_LOGIN_BOX') && HIDE_LOGIN_BOX) {
 | 
				
			||||||
 | 
							return;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	$twig->display('account.login.html.twig', array(
 | 
						$twig->display('account.login.html.twig', array(
 | 
				
			||||||
		'redirect' => $_REQUEST['redirect'] ?? null,
 | 
							'redirect' => $_REQUEST['redirect'] ?? null,
 | 
				
			||||||
		'account' => USE_ACCOUNT_NAME ? 'Name' : 'Number',
 | 
							'account' => USE_ACCOUNT_NAME ? 'Name' : 'Number',
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -17,6 +17,8 @@ if(!$logged) {
 | 
				
			|||||||
	return;
 | 
						return;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					csrfProtect();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
$email_new_time = $account_logged->getCustomField("email_new_time");
 | 
					$email_new_time = $account_logged->getCustomField("email_new_time");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if($email_new_time > 10) {
 | 
					if($email_new_time > 10) {
 | 
				
			||||||
@@ -164,7 +166,7 @@ if(isset($_POST['emailchangecancel']) && $_POST['emailchangecancel'] == 1) {
 | 
				
			|||||||
	$account_logged->setCustomField("email_new", "");
 | 
						$account_logged->setCustomField("email_new", "");
 | 
				
			||||||
	$account_logged->setCustomField("email_new_time", 0);
 | 
						$account_logged->setCustomField("email_new_time", 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	$custom_buttons = '<div style="text-align:center"><table border="0" cellspacing="0" cellpadding="0" ><form action="' . getLink('account/manage') . '" method="post" ><tr><td style="border:0px;" >' . $twig->render('buttons.back.html.twig') . '</td></tr></form></table></div>';
 | 
						$custom_buttons = '<div style="text-align:center"><table border="0" cellspacing="0" cellpadding="0" ><form action="' . getLink('account/manage') . '" method="post" >' . csrf(true) . '<tr><td style="border:0px;" >' . $twig->render('buttons.back.html.twig') . '</td></tr></form></table></div>';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	$twig->display('success.html.twig', array(
 | 
						$twig->display('success.html.twig', array(
 | 
				
			||||||
		'title' => 'Email Address Change Cancelled',
 | 
							'title' => 'Email Address Change Cancelled',
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -20,6 +20,8 @@ if(!$logged) {
 | 
				
			|||||||
	return;
 | 
						return;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					csrfProtect();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if(setting('core.account_country'))
 | 
					if(setting('core.account_country'))
 | 
				
			||||||
	require SYSTEM . 'countries.conf.php';
 | 
						require SYSTEM . 'countries.conf.php';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -17,6 +17,8 @@ if(!$logged) {
 | 
				
			|||||||
	return;
 | 
						return;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					csrfProtect();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
$new_password = $_POST['newpassword'] ?? NULL;
 | 
					$new_password = $_POST['newpassword'] ?? NULL;
 | 
				
			||||||
$new_password_confirm = $_POST['newpassword_confirm'] ?? NULL;
 | 
					$new_password_confirm = $_POST['newpassword_confirm'] ?? NULL;
 | 
				
			||||||
$old_password = $_POST['oldpassword'] ?? NULL;
 | 
					$old_password = $_POST['oldpassword'] ?? NULL;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -20,6 +20,8 @@ if(!$logged) {
 | 
				
			|||||||
	return;
 | 
						return;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					csrfProtect();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
$player = null;
 | 
					$player = null;
 | 
				
			||||||
$player_name = isset($_REQUEST['name']) ? stripslashes(urldecode($_REQUEST['name'])) : null;
 | 
					$player_name = isset($_REQUEST['name']) ? stripslashes(urldecode($_REQUEST['name'])) : null;
 | 
				
			||||||
$new_comment = isset($_POST['comment']) ? htmlspecialchars(stripslashes(substr($_POST['comment'],0,2000))) : NULL;
 | 
					$new_comment = isset($_POST['comment']) ? htmlspecialchars(stripslashes(substr($_POST['comment'],0,2000))) : NULL;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -17,6 +17,8 @@ if(!$logged) {
 | 
				
			|||||||
	return;
 | 
						return;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					csrfProtect();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
$player_id = isset($_POST['player_id']) ? (int)$_POST['player_id'] : NULL;
 | 
					$player_id = isset($_POST['player_id']) ? (int)$_POST['player_id'] : NULL;
 | 
				
			||||||
$name = isset($_POST['name']) ? stripslashes(ucwords(strtolower($_POST['name']))) : NULL;
 | 
					$name = isset($_POST['name']) ? stripslashes(ucwords(strtolower($_POST['name']))) : NULL;
 | 
				
			||||||
if((!setting('core.account_change_character_name')))
 | 
					if((!setting('core.account_change_character_name')))
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -17,6 +17,8 @@ if(!$logged) {
 | 
				
			|||||||
	return;
 | 
						return;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					csrfProtect();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
$sex_changed = false;
 | 
					$sex_changed = false;
 | 
				
			||||||
$player_id = isset($_POST['player_id']) ? (int)$_POST['player_id'] : NULL;
 | 
					$player_id = isset($_POST['player_id']) ? (int)$_POST['player_id'] : NULL;
 | 
				
			||||||
$new_sex = isset($_POST['new_sex']) ? (int)$_POST['new_sex'] : NULL;
 | 
					$new_sex = isset($_POST['new_sex']) ? (int)$_POST['new_sex'] : NULL;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -20,6 +20,8 @@ if(!$logged) {
 | 
				
			|||||||
	return;
 | 
						return;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					csrfProtect();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
$character_name = isset($_POST['name']) ? stripslashes($_POST['name']) : null;
 | 
					$character_name = isset($_POST['name']) ? stripslashes($_POST['name']) : null;
 | 
				
			||||||
$character_sex = isset($_POST['sex']) ? (int)$_POST['sex'] : null;
 | 
					$character_sex = isset($_POST['sex']) ? (int)$_POST['sex'] : null;
 | 
				
			||||||
$character_vocation = isset($_POST['vocation']) ? (int)$_POST['vocation'] : null;
 | 
					$character_vocation = isset($_POST['vocation']) ? (int)$_POST['vocation'] : null;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -17,6 +17,8 @@ if(!$logged) {
 | 
				
			|||||||
	return;
 | 
						return;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					csrfProtect();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
$player_name = isset($_POST['delete_name']) ? stripslashes($_POST['delete_name']) : null;
 | 
					$player_name = isset($_POST['delete_name']) ? stripslashes($_POST['delete_name']) : null;
 | 
				
			||||||
$password_verify = isset($_POST['delete_password']) ? $_POST['delete_password'] : null;
 | 
					$password_verify = isset($_POST['delete_password']) ? $_POST['delete_password'] : null;
 | 
				
			||||||
$password_verify = encrypt((USE_ACCOUNT_SALT ? $account_logged->getCustomField('salt') : '') . $password_verify);
 | 
					$password_verify = encrypt((USE_ACCOUNT_SALT ? $account_logged->getCustomField('salt') : '') . $password_verify);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -23,6 +23,8 @@ if($logged)
 | 
				
			|||||||
	return;
 | 
						return;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					csrfProtect();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if(setting('core.account_create_character_create')) {
 | 
					if(setting('core.account_create_character_create')) {
 | 
				
			||||||
	$createCharacter = new CreateCharacter();
 | 
						$createCharacter = new CreateCharacter();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -219,8 +221,19 @@ if($save)
 | 
				
			|||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if(setting('core.account_premium_points') && setting('core.account_premium_points') > 0) {
 | 
							$accountDefaultPremiumPoints = setting('core.account_premium_points');
 | 
				
			||||||
			$new_account->setCustomField('premium_points', setting('core.account_premium_points'));
 | 
							if($accountDefaultPremiumPoints > 0) {
 | 
				
			||||||
 | 
								$new_account->setCustomField('premium_points', $accountDefaultPremiumPoints);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							$accountDefaultCoins = setting('core.account_coins');
 | 
				
			||||||
 | 
							if(HAS_ACCOUNT_COINS && $accountDefaultCoins > 0) {
 | 
				
			||||||
 | 
								$new_account->setCustomField('coins', $accountDefaultCoins);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							$accountDefaultCoinsTransferable = setting('core.account_coins_transferable');
 | 
				
			||||||
 | 
							if((HAS_ACCOUNT_COINS_TRANSFERABLE || HAS_ACCOUNT_TRANSFERABLE_COINS) && $accountDefaultCoinsTransferable > 0) {
 | 
				
			||||||
 | 
								$new_account->setCustomField(ACCOUNT_COINS_TRANSFERABLE_COLUMN, $accountDefaultCoinsTransferable);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		$tmp_account = $email;
 | 
							$tmp_account = $email;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -10,6 +10,7 @@
 | 
				
			|||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
use MyAAC\RateLimit;
 | 
					use MyAAC\RateLimit;
 | 
				
			||||||
 | 
					use MyAAC\TwoFactorAuth\TwoFactorAuth;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
defined('MYAAC') or die('Direct access not allowed!');
 | 
					defined('MYAAC') or die('Direct access not allowed!');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -18,6 +19,8 @@ if($logged || !isset($_POST['account_login']) || !isset($_POST['password_login']
 | 
				
			|||||||
	return;
 | 
						return;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					csrfProtect();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
$login_account = $_POST['account_login'];
 | 
					$login_account = $_POST['account_login'];
 | 
				
			||||||
$login_password = $_POST['password_login'];
 | 
					$login_password = $_POST['password_login'];
 | 
				
			||||||
$remember_me = isset($_POST['remember_me']);
 | 
					$remember_me = isset($_POST['remember_me']);
 | 
				
			||||||
@@ -48,8 +51,14 @@ if(!empty($login_account) && !empty($login_password))
 | 
				
			|||||||
		if (setting('core.account_mail_verify') && (int)$account_logged->getCustomField('email_verified') !== 1) {
 | 
							if (setting('core.account_mail_verify') && (int)$account_logged->getCustomField('email_verified') !== 1) {
 | 
				
			||||||
			$errors[] = 'Your account is not verified. Please verify your email address. If the message is not coming check the SPAM folder in your E-Mail client.';
 | 
								$errors[] = 'Your account is not verified. Please verify your email address. If the message is not coming check the SPAM folder in your E-Mail client.';
 | 
				
			||||||
		} else {
 | 
							} else {
 | 
				
			||||||
			session_regenerate_id();
 | 
					 | 
				
			||||||
			setSession('account', $account_logged->getId());
 | 
								setSession('account', $account_logged->getId());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								$twoFactorAuth = TwoFactorAuth::getInstance($account_logged);
 | 
				
			||||||
 | 
								if (!$twoFactorAuth->process($login_account, $login_password, $remember_me, $_POST['auth-code'] ?? '')) {
 | 
				
			||||||
 | 
									return;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								session_regenerate_id();
 | 
				
			||||||
			setSession('password', encrypt((USE_ACCOUNT_SALT ? $account_logged->getCustomField('salt') : '') . $login_password));
 | 
								setSession('password', encrypt((USE_ACCOUNT_SALT ? $account_logged->getCustomField('salt') : '') . $login_password));
 | 
				
			||||||
			if($remember_me) {
 | 
								if($remember_me) {
 | 
				
			||||||
				setSession('remember_me', true);
 | 
									setSession('remember_me', true);
 | 
				
			||||||
@@ -95,3 +104,8 @@ else {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
$hooks->trigger(HOOK_ACCOUNT_LOGIN_POST);
 | 
					$hooks->trigger(HOOK_ACCOUNT_LOGIN_POST);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if($logged) {
 | 
				
			||||||
 | 
						$twig->addGlobal('logged', true);
 | 
				
			||||||
 | 
						$twig->addGlobal('account_logged', $account_logged);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -8,6 +8,9 @@
 | 
				
			|||||||
 * @copyright 2019 MyAAC
 | 
					 * @copyright 2019 MyAAC
 | 
				
			||||||
 * @link      https://my-aac.org
 | 
					 * @link      https://my-aac.org
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					use MyAAC\TwoFactorAuth\TwoFactorAuth;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
defined('MYAAC') or die('Direct access not allowed!');
 | 
					defined('MYAAC') or die('Direct access not allowed!');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
$title = 'Account Management';
 | 
					$title = 'Account Management';
 | 
				
			||||||
@@ -34,6 +37,8 @@ if(isset($_REQUEST['redirect']))
 | 
				
			|||||||
	return;
 | 
						return;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					csrfProtect();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
$groups = new OTS_Groups_List();
 | 
					$groups = new OTS_Groups_List();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
$freePremium = isset($config['lua']['freePremium']) && getBoolean($config['lua']['freePremium']) || $account_logged->getPremDays() == OTS_Account::GRATIS_PREMIUM_DAYS;
 | 
					$freePremium = isset($config['lua']['freePremium']) && getBoolean($config['lua']['freePremium']) || $account_logged->getPremDays() == OTS_Account::GRATIS_PREMIUM_DAYS;
 | 
				
			||||||
@@ -109,6 +114,8 @@ $twig->display('account.management.html.twig', array(
 | 
				
			|||||||
	'account_registered' => $account_registered,
 | 
						'account_registered' => $account_registered,
 | 
				
			||||||
	'account_rlname' => $account_rlname,
 | 
						'account_rlname' => $account_rlname,
 | 
				
			||||||
	'account_location' => $account_location,
 | 
						'account_location' => $account_location,
 | 
				
			||||||
 | 
						'twoFactorViews' => TwoFactorAuth::getInstance($account_logged)->getAccountManageViews(),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	'actions' => $actions,
 | 
						'actions' => $actions,
 | 
				
			||||||
	'players' => $account_players
 | 
						'players' => $account_players,
 | 
				
			||||||
));
 | 
					));
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,23 +0,0 @@
 | 
				
			|||||||
<?php
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 * Change comment
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * @package   MyAAC
 | 
					 | 
				
			||||||
 * @author    Gesior <jerzyskalski@wp.pl>
 | 
					 | 
				
			||||||
 * @author    Slawkens <slawkens@gmail.com>
 | 
					 | 
				
			||||||
 * @copyright 2019 MyAAC
 | 
					 | 
				
			||||||
 * @link      https://my-aac.org
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
defined('MYAAC') or die('Direct access not allowed!');
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
$redirect = urldecode($_REQUEST['redirect']);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// should never happen, unless hacker modify the URL
 | 
					 | 
				
			||||||
if (!str_contains($redirect, BASE_URL)) {
 | 
					 | 
				
			||||||
	error('Fatal error: Cannot redirect outside the website.');
 | 
					 | 
				
			||||||
	return;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
$twig->display('account.redirect.html.twig', array(
 | 
					 | 
				
			||||||
	'redirect' => $redirect
 | 
					 | 
				
			||||||
));
 | 
					 | 
				
			||||||
@@ -17,6 +17,8 @@ if(!$logged) {
 | 
				
			|||||||
	return;
 | 
						return;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					csrfProtect();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if(isset($_POST['reg_password']))
 | 
					if(isset($_POST['reg_password']))
 | 
				
			||||||
	$reg_password = encrypt((USE_ACCOUNT_SALT ? $account_logged->getCustomField('salt') : '') . $_POST['reg_password']);
 | 
						$reg_password = encrypt((USE_ACCOUNT_SALT ? $account_logged->getCustomField('salt') : '') . $_POST['reg_password']);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -17,6 +17,8 @@ if(!$logged) {
 | 
				
			|||||||
	return;
 | 
						return;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					csrfProtect();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
$_POST['reg_password'] = $_POST['reg_password'] ?? '';
 | 
					$_POST['reg_password'] = $_POST['reg_password'] ?? '';
 | 
				
			||||||
$reg_password = encrypt((USE_ACCOUNT_SALT ? $account_logged->getCustomField('salt') : '') . $_POST['reg_password']);
 | 
					$reg_password = encrypt((USE_ACCOUNT_SALT ? $account_logged->getCustomField('salt') : '') . $_POST['reg_password']);
 | 
				
			||||||
$old_key = $account_logged->getCustomField("key");
 | 
					$old_key = $account_logged->getCustomField("key");
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										46
									
								
								system/pages/change-log.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								system/pages/change-log.php
									
									
									
									
									
										Normal 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,
 | 
				
			||||||
 | 
					));
 | 
				
			||||||
@@ -1,46 +1,3 @@
 | 
				
			|||||||
<?php
 | 
					<?php
 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 * Changelog
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * @package   MyAAC
 | 
					 | 
				
			||||||
 * @author    Slawkens <slawkens@gmail.com>
 | 
					 | 
				
			||||||
 * @copyright 2019 MyAAC
 | 
					 | 
				
			||||||
 * @link      https://my-aac.org
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
defined('MYAAC') or die('Direct access not allowed!');
 | 
					 | 
				
			||||||
$title = 'Changelog';
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
use MyAAC\Models\Changelog;
 | 
					require 'change-log.php';
 | 
				
			||||||
 | 
					 | 
				
			||||||
$_page = isset($_GET['page']) ? (int)$_GET['page'] : 0;
 | 
					 | 
				
			||||||
$limit = 30;
 | 
					 | 
				
			||||||
$offset = $_page * $limit;
 | 
					 | 
				
			||||||
$next_page = false;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
$canEdit = hasFlag(FLAG_CONTENT_NEWS) || superAdmin();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
$changelogs = Changelog::isPublic()->orderByDesc('date')->limit($limit + 1)->offset($offset)->get()->toArray();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
$i = 0;
 | 
					 | 
				
			||||||
foreach($changelogs as $key => &$log)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	if($i < $limit) {
 | 
					 | 
				
			||||||
		$log['type'] = getChangelogType($log['type']);
 | 
					 | 
				
			||||||
		$log['where'] = getChangelogWhere($log['where']);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	else {
 | 
					 | 
				
			||||||
		unset($changelogs[$key]);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if ($i >= $limit)
 | 
					 | 
				
			||||||
		$next_page = true;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	$i++;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
$twig->display('changelog.html.twig', array(
 | 
					 | 
				
			||||||
	'changelogs' => $changelogs,
 | 
					 | 
				
			||||||
	'page' => $_page,
 | 
					 | 
				
			||||||
	'next_page' => $next_page,
 | 
					 | 
				
			||||||
	'canEdit' => $canEdit,
 | 
					 | 
				
			||||||
));
 | 
					 | 
				
			||||||
 
 | 
				
			|||||||
@@ -17,6 +17,8 @@ if(!$canEdit) {
 | 
				
			|||||||
	return;
 | 
						return;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					csrfProtect();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
$groupsList = new OTS_Groups_List();
 | 
					$groupsList = new OTS_Groups_List();
 | 
				
			||||||
$groups = [
 | 
					$groups = [
 | 
				
			||||||
	['id' => 0, 'name' => 'Guest'],
 | 
						['id' => 0, 'name' => 'Guest'],
 | 
				
			||||||
@@ -30,23 +32,24 @@ foreach ($groupsList as $group) {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if(!empty($action)) {
 | 
					if(!empty($action)) {
 | 
				
			||||||
	if($action == 'delete_board' || $action == 'edit_board' || $action == 'hide_board' || $action == 'moveup_board' || $action == 'movedown_board')
 | 
						if($action == 'delete_board' || $action == 'edit_board' || $action == 'hide_board' || $action == 'moveup_board' || $action == 'movedown_board') {
 | 
				
			||||||
		$id = $_REQUEST['id'];
 | 
							$id = $_REQUEST['id'];
 | 
				
			||||||
 | 
					 | 
				
			||||||
	if(isset($_REQUEST['access'])) {
 | 
					 | 
				
			||||||
		$access = $_REQUEST['access'];
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if(isset($_REQUEST['guild'])) {
 | 
						if(isset($_POST['access'])) {
 | 
				
			||||||
		$guild = $_REQUEST['guild'];
 | 
							$access = $_POST['access'];
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if(isset($_REQUEST['name'])) {
 | 
						if(isset($_POST['guild'])) {
 | 
				
			||||||
		$name = $_REQUEST['name'];
 | 
							$guild = $_POST['guild'];
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if(isset($_REQUEST['description'])) {
 | 
						if(isset($_POST['name'])) {
 | 
				
			||||||
		$description = stripslashes($_REQUEST['description']);
 | 
							$name = $_POST['name'];
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if(isset($_POST['description'])) {
 | 
				
			||||||
 | 
							$description = stripslashes($_POST['description']);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	$errors = [];
 | 
						$errors = [];
 | 
				
			||||||
@@ -55,12 +58,13 @@ if(!empty($action)) {
 | 
				
			|||||||
		if(Forum::add_board($name, $description, $access, $guild, $errors)) {
 | 
							if(Forum::add_board($name, $description, $access, $guild, $errors)) {
 | 
				
			||||||
			$action = $name = $description = '';
 | 
								$action = $name = $description = '';
 | 
				
			||||||
			header('Location: ' . getLink('forum'));
 | 
								header('Location: ' . getLink('forum'));
 | 
				
			||||||
 | 
								exit;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	else if($action == 'delete_board') {
 | 
						else if($action == 'delete_board') {
 | 
				
			||||||
		Forum::delete_board($id, $errors);
 | 
							Forum::delete_board($id, $errors);
 | 
				
			||||||
		header('Location: ' . getLink('forum'));
 | 
							header('Location: ' . getLink('forum'));
 | 
				
			||||||
		$action = '';
 | 
							exit;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	else if($action == 'edit_board')
 | 
						else if($action == 'edit_board')
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
@@ -74,28 +78,27 @@ if(!empty($action)) {
 | 
				
			|||||||
		else {
 | 
							else {
 | 
				
			||||||
			Forum::update_board($id, $name, $access, $guild, $description);
 | 
								Forum::update_board($id, $name, $access, $guild, $description);
 | 
				
			||||||
			header('Location: ' . getLink('forum'));
 | 
								header('Location: ' . getLink('forum'));
 | 
				
			||||||
			$action = $name = $description = '';
 | 
								exit;
 | 
				
			||||||
			$access = $guild = 0;
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	else if($action == 'hide_board') {
 | 
						else if($action == 'hide_board') {
 | 
				
			||||||
		Forum::toggleHide_board($id, $errors);
 | 
							Forum::toggleHide_board($id, $errors);
 | 
				
			||||||
		header('Location: ' . getLink('forum'));
 | 
							header('Location: ' . getLink('forum'));
 | 
				
			||||||
		$action = '';
 | 
							exit;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	else if($action == 'moveup_board') {
 | 
						else if($action == 'moveup_board') {
 | 
				
			||||||
		Forum::move_board($id, -1, $errors);
 | 
							Forum::move_board($id, -1, $errors);
 | 
				
			||||||
		header('Location: ' . getLink('forum'));
 | 
							header('Location: ' . getLink('forum'));
 | 
				
			||||||
		$action = '';
 | 
							exit;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	else if($action == 'movedown_board') {
 | 
						else if($action == 'movedown_board') {
 | 
				
			||||||
		Forum::move_board($id, 1, $errors);
 | 
							Forum::move_board($id, 1, $errors);
 | 
				
			||||||
		header('Location: ' . getLink('forum'));
 | 
							header('Location: ' . getLink('forum'));
 | 
				
			||||||
		$action = '';
 | 
							exit;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if(!empty($errors)) {
 | 
						if(!empty($errors)) {
 | 
				
			||||||
		$twig->display('error_box.html.twig', array('errors' => $errors));
 | 
							$twig->display('error_box.html.twig', ['errors' => $errors]);
 | 
				
			||||||
		$action = '';
 | 
							$action = '';
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -23,8 +23,9 @@ if(!$logged) {
 | 
				
			|||||||
	return;
 | 
						return;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if(Forum::canPost($account_logged))
 | 
					csrfProtect();
 | 
				
			||||||
{
 | 
					
 | 
				
			||||||
 | 
					if(Forum::canPost($account_logged)) {
 | 
				
			||||||
	$post_id = isset($_REQUEST['id']) ? (int) $_REQUEST['id'] : false;
 | 
						$post_id = isset($_REQUEST['id']) ? (int) $_REQUEST['id'] : false;
 | 
				
			||||||
	if(!$post_id) {
 | 
						if(!$post_id) {
 | 
				
			||||||
		$errors[] = 'Please enter post id.';
 | 
							$errors[] = 'Please enter post id.';
 | 
				
			||||||
@@ -41,12 +42,12 @@ if(Forum::canPost($account_logged))
 | 
				
			|||||||
			$char_id = $post_topic = $text = $smile = $html = null;
 | 
								$char_id = $post_topic = $text = $smile = $html = null;
 | 
				
			||||||
			$players_from_account = $db->query("SELECT `players`.`name`, `players`.`id` FROM `players` WHERE `players`.`account_id` = ".(int) $account_logged->getId())->fetchAll();
 | 
								$players_from_account = $db->query("SELECT `players`.`name`, `players`.`id` FROM `players` WHERE `players`.`account_id` = ".(int) $account_logged->getId())->fetchAll();
 | 
				
			||||||
			$saved = false;
 | 
								$saved = false;
 | 
				
			||||||
			if(isset($_REQUEST['save'])) {
 | 
								if(isset($_POST['save'])) {
 | 
				
			||||||
				$text = stripslashes(trim($_REQUEST['text']));
 | 
									$text = stripslashes(trim($_POST['text']));
 | 
				
			||||||
				$char_id = (int) $_REQUEST['char_id'];
 | 
									$char_id = (int) $_POST['char_id'];
 | 
				
			||||||
				$post_topic = stripslashes(trim($_REQUEST['topic']));
 | 
									$post_topic = stripslashes(trim($_POST['topic']));
 | 
				
			||||||
				$smile = isset($_REQUEST['smile']) ? (int)$_REQUEST['smile'] : 0;
 | 
									$smile = isset($_POST['smile']) ? (int)$_POST['smile'] : 0;
 | 
				
			||||||
				$html = isset($_REQUEST['html']) ? (int)$_REQUEST['html'] : 0;
 | 
									$html = isset($_POST['html']) ? (int)$_POST['html'] : 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				if (!superAdmin()) {
 | 
									if (!superAdmin()) {
 | 
				
			||||||
					$html = 0;
 | 
										$html = 0;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -23,15 +23,17 @@ if(!$logged) {
 | 
				
			|||||||
	return;
 | 
						return;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					csrfProtect();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if(!Forum::isModerator()) {
 | 
					if(!Forum::isModerator()) {
 | 
				
			||||||
	echo 'You are not logged in or you are not moderator.';
 | 
						echo 'You are not logged in or you are not moderator.';
 | 
				
			||||||
	return;
 | 
						return;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
$save = isset($_REQUEST['save']) && (int)$_REQUEST['save'] == 1;
 | 
					$save = isset($_POST['save']) && (int)$_POST['save'] == 1;
 | 
				
			||||||
if($save) {
 | 
					if($save) {
 | 
				
			||||||
	$post_id = (int)$_REQUEST['id'];
 | 
						$post_id = (int)$_POST['id'];
 | 
				
			||||||
	$board = (int)$_REQUEST['section'];
 | 
						$board = (int)$_POST['section'];
 | 
				
			||||||
	if(!Forum::hasAccess($board)) {
 | 
						if(!Forum::hasAccess($board)) {
 | 
				
			||||||
		$errors[] = "You don't have access to this board.";
 | 
							$errors[] = "You don't have access to this board.";
 | 
				
			||||||
		displayErrorBoxWithBackButton($errors, getLink('forum'));
 | 
							displayErrorBoxWithBackButton($errors, getLink('forum'));
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -28,6 +28,8 @@ if(!$logged) {
 | 
				
			|||||||
	return;
 | 
						return;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					csrfProtect();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if(Forum::canPost($account_logged)) {
 | 
					if(Forum::canPost($account_logged)) {
 | 
				
			||||||
	$players_from_account = $db->query("SELECT `players`.`name`, `players`.`id` FROM `players` WHERE `players`.`account_id` = ".(int) $account_logged->getId())->fetchAll();
 | 
						$players_from_account = $db->query("SELECT `players`.`name`, `players`.`id` FROM `players` WHERE `players`.`account_id` = ".(int) $account_logged->getId())->fetchAll();
 | 
				
			||||||
	$thread_id = isset($_REQUEST['thread_id']) ? (int) $_REQUEST['thread_id'] : 0;
 | 
						$thread_id = isset($_REQUEST['thread_id']) ? (int) $_REQUEST['thread_id'] : 0;
 | 
				
			||||||
@@ -43,11 +45,11 @@ if(Forum::canPost($account_logged)) {
 | 
				
			|||||||
		echo '<a href="' . getLink('forum') . '">Boards</a> >> <a href="' . getForumBoardLink($thread['section']) . '">'.$sections[$thread['section']]['name'].'</a> >> <a href="' . getForumThreadLink($thread_id) . '">'.htmlspecialchars($thread['post_topic']).'</a> >> <b>Post new reply</b><br /><h3>'.htmlspecialchars($thread['post_topic']).'</h3>';
 | 
							echo '<a href="' . getLink('forum') . '">Boards</a> >> <a href="' . getForumBoardLink($thread['section']) . '">'.$sections[$thread['section']]['name'].'</a> >> <a href="' . getForumThreadLink($thread_id) . '">'.htmlspecialchars($thread['post_topic']).'</a> >> <b>Post new reply</b><br /><h3>'.htmlspecialchars($thread['post_topic']).'</h3>';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		$quote = isset($_REQUEST['quote']) ? (int) $_REQUEST['quote'] : NULL;
 | 
							$quote = isset($_REQUEST['quote']) ? (int) $_REQUEST['quote'] : NULL;
 | 
				
			||||||
		$text = isset($_REQUEST['text']) ? stripslashes(trim($_REQUEST['text'])) : NULL;
 | 
							$text = isset($_POST['text']) ? stripslashes(trim($_POST['text'])) : NULL;
 | 
				
			||||||
		$char_id = (int) ($_REQUEST['char_id'] ?? 0);
 | 
							$char_id = (int) ($_POST['char_id'] ?? 0);
 | 
				
			||||||
		$post_topic = isset($_REQUEST['topic']) ? stripslashes(trim($_REQUEST['topic'])) : '';
 | 
							$post_topic = isset($_POST['topic']) ? stripslashes(trim($_POST['topic'])) : '';
 | 
				
			||||||
		$smile = (int)($_REQUEST['smile'] ?? 0);
 | 
							$smile = (int)($_POST['smile'] ?? 0);
 | 
				
			||||||
		$html = (int)($_REQUEST['html'] ?? 0);
 | 
							$html = (int)($_POST['html'] ?? 0);
 | 
				
			||||||
		$saved = false;
 | 
							$saved = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (!superAdmin()) {
 | 
							if (!superAdmin()) {
 | 
				
			||||||
@@ -60,10 +62,10 @@ if(Forum::canPost($account_logged)) {
 | 
				
			|||||||
				$text = '[i]Originally posted by ' . $quoted_post[0]['name'] . ' on ' . date('d.m.y H:i:s', $quoted_post[0]['post_date']) . ':[/i][quote]' . $quoted_post[0]['post_text'] . '[/quote]';
 | 
									$text = '[i]Originally posted by ' . $quoted_post[0]['name'] . ' on ' . date('d.m.y H:i:s', $quoted_post[0]['post_date']) . ':[/i][quote]' . $quoted_post[0]['post_text'] . '[/quote]';
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		elseif(isset($_REQUEST['save'])) {
 | 
							elseif(isset($_POST['save'])) {
 | 
				
			||||||
			$length = strlen($text);
 | 
								$length = strlen($text);
 | 
				
			||||||
			if($length < 1 || strlen($text) > 15000) {
 | 
								if($length < 1 || strlen($text) > 15000) {
 | 
				
			||||||
				$errors[] = 'Too short or too long post (Length: $length letters). Minimum 1 letter, maximum 15000 letters.';
 | 
									$errors[] = "Too short or too long post (Length: $length letters). Minimum 1 letter, maximum 15000 letters.";
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			if($char_id == 0) {
 | 
								if($char_id == 0) {
 | 
				
			||||||
@@ -79,15 +81,14 @@ if(Forum::canPost($account_logged)) {
 | 
				
			|||||||
				}
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				if(!$player_on_account) {
 | 
									if(!$player_on_account) {
 | 
				
			||||||
					$errors[] = 'Player with selected ID ' . $char_id . ' doesn\'t exist or isn\'t on your account';
 | 
										$errors[] = "Player with selected ID $char_id doesn't exist or isn't on your account";
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			if(count($errors) == 0) {
 | 
								if(count($errors) == 0) {
 | 
				
			||||||
				$last_post = 0;
 | 
									$last_post = 0;
 | 
				
			||||||
				$query = $db->query('SELECT post_date FROM ' . FORUM_TABLE_PREFIX . 'forum ORDER BY post_date DESC LIMIT 1');
 | 
									$query = $db->query('SELECT post_date FROM ' . FORUM_TABLE_PREFIX . 'forum ORDER BY post_date DESC LIMIT 1');
 | 
				
			||||||
				if($query->rowCount() > 0)
 | 
									if($query->rowCount() > 0) {
 | 
				
			||||||
				{
 | 
					 | 
				
			||||||
					$query = $query->fetch();
 | 
										$query = $query->fetch();
 | 
				
			||||||
					$last_post = $query['post_date'];
 | 
										$last_post = $query['post_date'];
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -28,6 +28,8 @@ if(!$logged) {
 | 
				
			|||||||
	return;
 | 
						return;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					csrfProtect();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if(Forum::canPost($account_logged)) {
 | 
					if(Forum::canPost($account_logged)) {
 | 
				
			||||||
	$players_from_account = $db->query('SELECT `players`.`name`, `players`.`id` FROM `players` WHERE `players`.`account_id` = '.(int) $account_logged->getId())->fetchAll();
 | 
						$players_from_account = $db->query('SELECT `players`.`name`, `players`.`id` FROM `players` WHERE `players`.`account_id` = '.(int) $account_logged->getId())->fetchAll();
 | 
				
			||||||
	$section_id = $_REQUEST['section_id'] ?? null;
 | 
						$section_id = $_REQUEST['section_id'] ?? null;
 | 
				
			||||||
@@ -38,19 +40,18 @@ if(Forum::canPost($account_logged)) {
 | 
				
			|||||||
			if ($sections[$section_id]['closed'] && !Forum::isModerator())
 | 
								if ($sections[$section_id]['closed'] && !Forum::isModerator())
 | 
				
			||||||
				$errors[] = 'You cannot create topic on this board.';
 | 
									$errors[] = 'You cannot create topic on this board.';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			$quote = (int)(isset($_REQUEST['quote']) ? $_REQUEST['quote'] : 0);
 | 
								$text = isset($_POST['text']) ? stripslashes($_POST['text']) : '';
 | 
				
			||||||
			$text = isset($_REQUEST['text']) ? stripslashes($_REQUEST['text']) : '';
 | 
								$char_id = (int)(isset($_POST['char_id']) ? $_POST['char_id'] : 0);
 | 
				
			||||||
			$char_id = (int)(isset($_REQUEST['char_id']) ? $_REQUEST['char_id'] : 0);
 | 
								$post_topic = isset($_POST['topic']) ? stripslashes($_POST['topic']) : '';
 | 
				
			||||||
			$post_topic = isset($_REQUEST['topic']) ? stripslashes($_REQUEST['topic']) : '';
 | 
								$smile = (isset($_POST['smile']) ? (int)$_POST['smile'] : 0);
 | 
				
			||||||
			$smile = (isset($_REQUEST['smile']) ? (int)$_REQUEST['smile'] : 0);
 | 
								$html = (isset($_POST['html']) ? (int)$_POST['html'] : 0);
 | 
				
			||||||
			$html = (isset($_REQUEST['html']) ? (int)$_REQUEST['html'] : 0);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
			if (!superAdmin()) {
 | 
								if (!superAdmin()) {
 | 
				
			||||||
				$html = 0;
 | 
									$html = 0;
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			$saved = false;
 | 
								$saved = false;
 | 
				
			||||||
			if (isset($_REQUEST['save'])) {
 | 
								if (isset($_POST['save'])) {
 | 
				
			||||||
				$length = strlen($post_topic);
 | 
									$length = strlen($post_topic);
 | 
				
			||||||
				if ($length < 1 || $length > 60) {
 | 
									if ($length < 1 || $length > 60) {
 | 
				
			||||||
					$errors[] = "Too short or too long topic (Length: $length letters). Minimum 1 letter, maximum 60 letters.";
 | 
										$errors[] = "Too short or too long topic (Length: $length letters). Minimum 1 letter, maximum 60 letters.";
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -23,11 +23,13 @@ if(!$logged) {
 | 
				
			|||||||
	return;
 | 
						return;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					csrfProtect();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if(Forum::isModerator()) {
 | 
					if(Forum::isModerator()) {
 | 
				
			||||||
	$id = (int) $_REQUEST['id'];
 | 
						$id = (int) ($_POST['id'] ?? 0);
 | 
				
			||||||
	$post = $db->query("SELECT `id`, `first_post`, `section` FROM `" . FORUM_TABLE_PREFIX . "forum` WHERE `id` = ".$id." LIMIT 1")->fetch();
 | 
						$post = $db->query("SELECT `id`, `first_post`, `section` FROM `" . FORUM_TABLE_PREFIX . "forum` WHERE `id` = ".$id." LIMIT 1")->fetch();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if($post['id'] == $id && Forum::hasAccess($post['section'])) {
 | 
						if($post && $post['id'] == $id && Forum::hasAccess($post['section'])) {
 | 
				
			||||||
		if($post['id'] == $post['first_post']) {
 | 
							if($post['id'] == $post['first_post']) {
 | 
				
			||||||
			$db->query("DELETE FROM `" . FORUM_TABLE_PREFIX . "forum` WHERE `first_post` = ".$post['id']);
 | 
								$db->query("DELETE FROM `" . FORUM_TABLE_PREFIX . "forum` WHERE `first_post` = ".$post['id']);
 | 
				
			||||||
			header('Location: ' . getForumBoardLink($post['section']));
 | 
								header('Location: ' . getForumBoardLink($post['section']));
 | 
				
			||||||
@@ -36,7 +38,7 @@ if(Forum::isModerator()) {
 | 
				
			|||||||
			$post_page = $db->query("SELECT COUNT(`" . FORUM_TABLE_PREFIX . "forum`.`id`) AS posts_count FROM `players`, `" . FORUM_TABLE_PREFIX . "forum` WHERE `players`.`id` = `" . FORUM_TABLE_PREFIX . "forum`.`author_guid` AND `" . FORUM_TABLE_PREFIX . "forum`.`id` < ".$id." AND `" . FORUM_TABLE_PREFIX . "forum`.`first_post` = ".(int) $post['first_post'])->fetch();
 | 
								$post_page = $db->query("SELECT COUNT(`" . FORUM_TABLE_PREFIX . "forum`.`id`) AS posts_count FROM `players`, `" . FORUM_TABLE_PREFIX . "forum` WHERE `players`.`id` = `" . FORUM_TABLE_PREFIX . "forum`.`author_guid` AND `" . FORUM_TABLE_PREFIX . "forum`.`id` < ".$id." AND `" . FORUM_TABLE_PREFIX . "forum`.`first_post` = ".(int) $post['first_post'])->fetch();
 | 
				
			||||||
			$_page = (int) ceil($post_page['posts_count'] / setting('core.forum_threads_per_page')) - 1;
 | 
								$_page = (int) ceil($post_page['posts_count'] / setting('core.forum_threads_per_page')) - 1;
 | 
				
			||||||
			$db->query("DELETE FROM `" . FORUM_TABLE_PREFIX . "forum` WHERE `id` = ".$post['id']);
 | 
								$db->query("DELETE FROM `" . FORUM_TABLE_PREFIX . "forum` WHERE `id` = ".$post['id']);
 | 
				
			||||||
			header('Location: ' . getForumThreadLink($post['first_post'], (int) $_page));
 | 
								header('Location: ' . getForumThreadLink($post['first_post'], $_page));
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	else {
 | 
						else {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -33,7 +33,7 @@ if(!Forum::hasAccess($section_id)) {
 | 
				
			|||||||
	return;
 | 
						return;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
$_page = (int) (isset($_REQUEST['page']) ? $_REQUEST['page'] : 0);
 | 
					$_page = (int) ($_REQUEST['page'] ?? 0);
 | 
				
			||||||
$threads_count = $db->query("SELECT COUNT(`" . FORUM_TABLE_PREFIX . "forum`.`id`) AS threads_count FROM `players`, `" . FORUM_TABLE_PREFIX . "forum` WHERE `players`.`id` = `" . FORUM_TABLE_PREFIX . "forum`.`author_guid` AND `" . FORUM_TABLE_PREFIX . "forum`.`section` = ".(int) $section_id." AND `" . FORUM_TABLE_PREFIX . "forum`.`first_post` = `" . FORUM_TABLE_PREFIX . "forum`.`id`")->fetch();
 | 
					$threads_count = $db->query("SELECT COUNT(`" . FORUM_TABLE_PREFIX . "forum`.`id`) AS threads_count FROM `players`, `" . FORUM_TABLE_PREFIX . "forum` WHERE `players`.`id` = `" . FORUM_TABLE_PREFIX . "forum`.`author_guid` AND `" . FORUM_TABLE_PREFIX . "forum`.`section` = ".(int) $section_id." AND `" . FORUM_TABLE_PREFIX . "forum`.`first_post` = `" . FORUM_TABLE_PREFIX . "forum`.`id`")->fetch();
 | 
				
			||||||
for($i = 0; $i < $threads_count['threads_count'] / setting('core.forum_threads_per_page'); $i++) {
 | 
					for($i = 0; $i < $threads_count['threads_count'] / setting('core.forum_threads_per_page'); $i++) {
 | 
				
			||||||
	if($i != $_page)
 | 
						if($i != $_page)
 | 
				
			||||||
@@ -50,7 +50,7 @@ if($logged && (!$sections[$section_id]['closed'] || Forum::isModerator())) {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
echo '<br /><br />Page: '.$links_to_pages.'<br />';
 | 
					echo '<br /><br />Page: '.$links_to_pages.'<br />';
 | 
				
			||||||
$last_threads = $db->query("SELECT `players`.`id` as `player_id`, `players`.`name`, `" . FORUM_TABLE_PREFIX . "forum`.`post_text`, `" . FORUM_TABLE_PREFIX . "forum`.`post_topic`, `" . FORUM_TABLE_PREFIX . "forum`.`id`, `" . FORUM_TABLE_PREFIX . "forum`.`last_post`, `" . FORUM_TABLE_PREFIX . "forum`.`replies`, `" . FORUM_TABLE_PREFIX . "forum`.`views`, `" . FORUM_TABLE_PREFIX . "forum`.`post_date` FROM `players`, `" . FORUM_TABLE_PREFIX . "forum` WHERE `players`.`id` = `" . FORUM_TABLE_PREFIX . "forum`.`author_guid` AND `" . FORUM_TABLE_PREFIX . "forum`.`section` = ".$section_id." AND `" . FORUM_TABLE_PREFIX . "forum`.`first_post` = `" . FORUM_TABLE_PREFIX . "forum`.`id` ORDER BY `" . FORUM_TABLE_PREFIX . "forum`.`last_post` DESC LIMIT ".setting('core.forum_threads_per_page')." OFFSET ".($_page * setting('core.forum_threads_per_page')))->fetchAll();
 | 
					$last_threads = $db->query("SELECT `players`.`id` as `player_id`, `players`.`name`, `" . FORUM_TABLE_PREFIX . "forum`.`first_post`, `" . FORUM_TABLE_PREFIX . "forum`.`post_text`, `" . FORUM_TABLE_PREFIX . "forum`.`post_topic`, `" . FORUM_TABLE_PREFIX . "forum`.`id`, `" . FORUM_TABLE_PREFIX . "forum`.`last_post`, `" . FORUM_TABLE_PREFIX . "forum`.`replies`, `" . FORUM_TABLE_PREFIX . "forum`.`views`, `" . FORUM_TABLE_PREFIX . "forum`.`post_date` FROM `players`, `" . FORUM_TABLE_PREFIX . "forum` WHERE `players`.`id` = `" . FORUM_TABLE_PREFIX . "forum`.`author_guid` AND `" . FORUM_TABLE_PREFIX . "forum`.`section` = ".$section_id." AND `" . FORUM_TABLE_PREFIX . "forum`.`first_post` = `" . FORUM_TABLE_PREFIX . "forum`.`id` ORDER BY `" . FORUM_TABLE_PREFIX . "forum`.`last_post` DESC LIMIT ".setting('core.forum_threads_per_page')." OFFSET ".($_page * setting('core.forum_threads_per_page')))->fetchAll(PDO::FETCH_ASSOC);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if(isset($last_threads[0])) {
 | 
					if(isset($last_threads[0])) {
 | 
				
			||||||
	echo '<table width="100%">
 | 
						echo '<table width="100%">
 | 
				
			||||||
@@ -67,8 +67,8 @@ if(isset($last_threads[0])) {
 | 
				
			|||||||
	foreach($last_threads as $thread) {
 | 
						foreach($last_threads as $thread) {
 | 
				
			||||||
		echo '<tr bgcolor="' . getStyle($number_of_rows++) . '"><td>';
 | 
							echo '<tr bgcolor="' . getStyle($number_of_rows++) . '"><td>';
 | 
				
			||||||
		if(Forum::isModerator()) {
 | 
							if(Forum::isModerator()) {
 | 
				
			||||||
			echo '<a href="' . getLink('forum') . '?action=move_thread&id='.$thread['id'].'"\')"><span style="color:darkgreen">[MOVE]</span></a>';
 | 
								echo '<a href="' . getLink('forum') . '?action=move_thread&id=' . $thread['id'] . '" title="Move Thread"><img src="images/icons/arrow_right.gif"/></a>';
 | 
				
			||||||
			echo '<a href="' . getLink('forum') . '?action=remove_post&id='.$thread['id'].'" onclick="return confirm(\'Are you sure you want remove thread > '.htmlspecialchars($thread['post_topic']).' <?\')"><span style="color: red">[REMOVE]</span></a>  ';
 | 
								$twig->display('forum.remove_post.html.twig', ['post' => $thread]);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		$player->load($thread['player_id']);
 | 
							$player->load($thread['player_id']);
 | 
				
			||||||
@@ -82,11 +82,14 @@ if(isset($last_threads[0])) {
 | 
				
			|||||||
		echo '<a href="' . getForumThreadLink($thread['id']) . '">'.htmlspecialchars($thread['post_topic']). '</a><br /><small>'.($canEditForum ? substr(strip_tags($thread['post_text']), 0, 50) : htmlspecialchars(substr($thread['post_text'], 0, 50))).'...</small></td><td>' . getPlayerLink($thread['name']) . '</td><td>'.(int) $thread['replies'].'</td><td>'.(int) $thread['views'].'</td><td>';
 | 
							echo '<a href="' . getForumThreadLink($thread['id']) . '">'.htmlspecialchars($thread['post_topic']). '</a><br /><small>'.($canEditForum ? substr(strip_tags($thread['post_text']), 0, 50) : htmlspecialchars(substr($thread['post_text'], 0, 50))).'...</small></td><td>' . getPlayerLink($thread['name']) . '</td><td>'.(int) $thread['replies'].'</td><td>'.(int) $thread['views'].'</td><td>';
 | 
				
			||||||
		if($thread['last_post'] > 0) {
 | 
							if($thread['last_post'] > 0) {
 | 
				
			||||||
			$last_post = $db->query("SELECT `players`.`name`, `" . FORUM_TABLE_PREFIX . "forum`.`post_date` FROM `players`, `" . FORUM_TABLE_PREFIX . "forum` WHERE `" . FORUM_TABLE_PREFIX . "forum`.`first_post` = ".(int) $thread['id']." AND `players`.`id` = `" . FORUM_TABLE_PREFIX . "forum`.`author_guid` ORDER BY `post_date` DESC LIMIT 1")->fetch();
 | 
								$last_post = $db->query("SELECT `players`.`name`, `" . FORUM_TABLE_PREFIX . "forum`.`post_date` FROM `players`, `" . FORUM_TABLE_PREFIX . "forum` WHERE `" . FORUM_TABLE_PREFIX . "forum`.`first_post` = ".(int) $thread['id']." AND `players`.`id` = `" . FORUM_TABLE_PREFIX . "forum`.`author_guid` ORDER BY `post_date` DESC LIMIT 1")->fetch();
 | 
				
			||||||
			if(isset($last_post['name']))
 | 
					
 | 
				
			||||||
				echo date('d.m.y H:i:s', $last_post['post_date']).'<br />by ' . getPlayerLink($last_post['name']);
 | 
								if(isset($last_post['name'])) {
 | 
				
			||||||
			else
 | 
									echo date('d.m.y H:i:s', $last_post['post_date']) . '<br />by ' . getPlayerLink($last_post['name']);
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								else {
 | 
				
			||||||
				echo 'No posts.';
 | 
									echo 'No posts.';
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
		else {
 | 
							else {
 | 
				
			||||||
			echo date('d.m.y H:i:s', $thread['post_date']) . '<br />by ' . getPlayerLink($thread['name']);
 | 
								echo date('d.m.y H:i:s', $thread['post_date']) . '<br />by ' . getPlayerLink($thread['name']);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -35,7 +35,7 @@ if(!Forum::hasAccess($thread_starter['section'])) {
 | 
				
			|||||||
	return;
 | 
						return;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
$posts_count = $db->query("SELECT COUNT(`" . FORUM_TABLE_PREFIX . "forum`.`id`) AS posts_count FROM `players`, `" . FORUM_TABLE_PREFIX . "forum` WHERE `players`.`id` = `" . FORUM_TABLE_PREFIX . "forum`.`author_guid` AND `" . FORUM_TABLE_PREFIX . "forum`.`first_post` = ".(int) $thread_id)->fetch();
 | 
					$posts_count = $db->query("SELECT COUNT(`" . FORUM_TABLE_PREFIX . "forum`.`id`) AS posts_count FROM `players`, `" . FORUM_TABLE_PREFIX . "forum` WHERE `players`.`id` = `" . FORUM_TABLE_PREFIX . "forum`.`author_guid` AND `" . FORUM_TABLE_PREFIX . "forum`.`first_post` = ".$thread_id)->fetch();
 | 
				
			||||||
for($i = 0; $i < $posts_count['posts_count'] / setting('core.forum_threads_per_page'); $i++) {
 | 
					for($i = 0; $i < $posts_count['posts_count'] / setting('core.forum_threads_per_page'); $i++) {
 | 
				
			||||||
	if($i != $_page)
 | 
						if($i != $_page)
 | 
				
			||||||
		$links_to_pages .= '<a href="' . getForumThreadLink($thread_id, $i) . '">'.($i + 1).'</a> ';
 | 
							$links_to_pages .= '<a href="' . getForumThreadLink($thread_id, $i) . '">'.($i + 1).'</a> ';
 | 
				
			||||||
@@ -46,7 +46,7 @@ for($i = 0; $i < $posts_count['posts_count'] / setting('core.forum_threads_per_p
 | 
				
			|||||||
$posts = $db->query("SELECT `players`.`id` as `player_id`, `" . FORUM_TABLE_PREFIX . "forum`.`id`,`" . FORUM_TABLE_PREFIX . "forum`.`first_post`, `" . FORUM_TABLE_PREFIX . "forum`.`section`,`" . FORUM_TABLE_PREFIX . "forum`.`post_text`, `" . FORUM_TABLE_PREFIX . "forum`.`post_topic`, `" . FORUM_TABLE_PREFIX . "forum`.`post_date` AS `date`, `" . FORUM_TABLE_PREFIX . "forum`.`post_smile`, `" . FORUM_TABLE_PREFIX . "forum`.`post_html`, `" . FORUM_TABLE_PREFIX . "forum`.`author_aid`, `" . FORUM_TABLE_PREFIX . "forum`.`author_guid`, `" . FORUM_TABLE_PREFIX . "forum`.`last_edit_aid`, `" . FORUM_TABLE_PREFIX . "forum`.`edit_date` FROM `players`, `" . FORUM_TABLE_PREFIX . "forum` WHERE `players`.`id` = `" . FORUM_TABLE_PREFIX . "forum`.`author_guid` AND `" . FORUM_TABLE_PREFIX . "forum`.`first_post` = ".$thread_id." ORDER BY `" . FORUM_TABLE_PREFIX . "forum`.`post_date` LIMIT " . setting('core.forum_posts_per_page') . " OFFSET ".($_page * setting('core.forum_posts_per_page')))->fetchAll();
 | 
					$posts = $db->query("SELECT `players`.`id` as `player_id`, `" . FORUM_TABLE_PREFIX . "forum`.`id`,`" . FORUM_TABLE_PREFIX . "forum`.`first_post`, `" . FORUM_TABLE_PREFIX . "forum`.`section`,`" . FORUM_TABLE_PREFIX . "forum`.`post_text`, `" . FORUM_TABLE_PREFIX . "forum`.`post_topic`, `" . FORUM_TABLE_PREFIX . "forum`.`post_date` AS `date`, `" . FORUM_TABLE_PREFIX . "forum`.`post_smile`, `" . FORUM_TABLE_PREFIX . "forum`.`post_html`, `" . FORUM_TABLE_PREFIX . "forum`.`author_aid`, `" . FORUM_TABLE_PREFIX . "forum`.`author_guid`, `" . FORUM_TABLE_PREFIX . "forum`.`last_edit_aid`, `" . FORUM_TABLE_PREFIX . "forum`.`edit_date` FROM `players`, `" . FORUM_TABLE_PREFIX . "forum` WHERE `players`.`id` = `" . FORUM_TABLE_PREFIX . "forum`.`author_guid` AND `" . FORUM_TABLE_PREFIX . "forum`.`first_post` = ".$thread_id." ORDER BY `" . FORUM_TABLE_PREFIX . "forum`.`post_date` LIMIT " . setting('core.forum_posts_per_page') . " OFFSET ".($_page * setting('core.forum_posts_per_page')))->fetchAll();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if(isset($posts[0]['player_id'])) {
 | 
					if(isset($posts[0]['player_id'])) {
 | 
				
			||||||
	$db->query("UPDATE `" . FORUM_TABLE_PREFIX . "forum` SET `views`=`views`+1 WHERE `id` = ".(int) $thread_id);
 | 
						$db->query("UPDATE `" . FORUM_TABLE_PREFIX . "forum` SET `views`=`views`+1 WHERE `id` = " . $thread_id);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
$lookaddons = $db->hasColumn('players', 'lookaddons');
 | 
					$lookaddons = $db->hasColumn('players', 'lookaddons');
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -12,11 +12,11 @@ defined('MYAAC') or die('Direct access not allowed!');
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
require __DIR__ . '/base.php';
 | 
					require __DIR__ . '/base.php';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//set rights in guild
 | 
					// set rights in guild
 | 
				
			||||||
$guild_name = isset($_REQUEST['guild']) ? urldecode($_REQUEST['guild']) : null;
 | 
					$guild_name = isset($_REQUEST['guild']) ? urldecode($_REQUEST['guild']) : null;
 | 
				
			||||||
$name = isset($_REQUEST['name']) ? stripslashes($_REQUEST['name']) : null;
 | 
					$name = isset($_REQUEST['name']) ? stripslashes($_REQUEST['name']) : null;
 | 
				
			||||||
if(!$logged) {
 | 
					if(!$logged) {
 | 
				
			||||||
	$errors[] = 'You are not logged in. You can\'t accept invitations.';
 | 
						$errors[] = "You are not logged in. You can't accept invitations.";
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if(!Validator::guildName($guild_name)) {
 | 
					if(!Validator::guildName($guild_name)) {
 | 
				
			||||||
@@ -27,11 +27,11 @@ if(empty($errors)) {
 | 
				
			|||||||
	$guild = new OTS_Guild();
 | 
						$guild = new OTS_Guild();
 | 
				
			||||||
	$guild->find($guild_name);
 | 
						$guild->find($guild_name);
 | 
				
			||||||
	if(!$guild->isLoaded()) {
 | 
						if(!$guild->isLoaded()) {
 | 
				
			||||||
		$errors[] = 'Guild with name <b>'.$guild_name.'</b> doesn\'t exist.';
 | 
							$errors[] = "Guild with name <b>$guild_name</b> doesn't exist.";
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if(isset($_REQUEST['todo']) && $_REQUEST['todo'] == 'save') {
 | 
					if(isset($_POST['todo']) && $_POST['todo'] == 'save') {
 | 
				
			||||||
	if(!Validator::characterName($name)) {
 | 
						if(!Validator::characterName($name)) {
 | 
				
			||||||
		$errors[] = 'Invalid name format.';
 | 
							$errors[] = 'Invalid name format.';
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -51,7 +51,7 @@ if(isset($_REQUEST['todo']) && $_REQUEST['todo'] == 'save') {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if(isset($_REQUEST['todo']) && $_REQUEST['todo'] == 'save') {
 | 
					if(isset($_POST['todo']) && $_POST['todo'] == 'save') {
 | 
				
			||||||
	if(empty($errors)) {
 | 
						if(empty($errors)) {
 | 
				
			||||||
		$is_invited = false;
 | 
							$is_invited = false;
 | 
				
			||||||
		include(SYSTEM . 'libs/pot/InvitesDriver.php');
 | 
							include(SYSTEM . 'libs/pot/InvitesDriver.php');
 | 
				
			||||||
@@ -104,7 +104,7 @@ if(!empty($errors)) {
 | 
				
			|||||||
	));
 | 
						));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
else {
 | 
					else {
 | 
				
			||||||
	if(isset($_REQUEST['todo']) && $_REQUEST['todo'] == 'save') {
 | 
						if(isset($_POST['todo']) && $_POST['todo'] == 'save') {
 | 
				
			||||||
		$guild->acceptInvite($player);
 | 
							$guild->acceptInvite($player);
 | 
				
			||||||
		$twig->display('success.html.twig', array(
 | 
							$twig->display('success.html.twig', array(
 | 
				
			||||||
			'title' => 'Accept invitation',
 | 
								'title' => 'Accept invitation',
 | 
				
			||||||
 
 | 
				
			|||||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user