Compare commits
	
		
			466 Commits
		
	
	
		
			v0.8.23
			...
			v0.9.0-alp
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | c247789adf | ||
|   | cd22f8def5 | ||
|   | 52ac011556 | ||
|   | f34e5f2ac0 | ||
|   | ca8db22639 | ||
|   | 1846bf5255 | ||
|   | dce0ac2f8f | ||
|   | 9cc60983d0 | ||
|   | 7c2c88f780 | ||
|   | 7690811da3 | ||
|   | 7dc2e404ed | ||
|   | 080ab56ea9 | ||
|   | 83915f080c | ||
|   | 2841f17729 | ||
|   | 0187ba4938 | ||
|   | bedfc0a2e0 | ||
|   | ea08c04963 | ||
|   | 067f2af3e5 | ||
|   | 8d98306f8e | ||
|   | 09a045334c | ||
|   | bc8e5fc144 | ||
|   | 77e0d28a9d | ||
|   | 480a054f0c | ||
|   | 26c895d475 | ||
|   | 5cbb55cfb1 | ||
|   | dcb9506a1b | ||
|   | 2acec4df12 | ||
|   | 4bd761c726 | ||
|   | 2f732b8411 | ||
|   | 5aa02055bf | ||
|   | 6ed15565c8 | ||
|   | 77a2c55c87 | ||
|   | 4a9fa01eb7 | ||
|   | bd031d8980 | ||
|   | b76a037a94 | ||
|   | e71daa2520 | ||
|   | f372aeb067 | ||
|   | ef37bbcb81 | ||
|   | 944457463e | ||
|   | 6f7f25bb46 | ||
|   | d60d7f2250 | ||
|   | 2b8c4b3eca | ||
|   | 7039bda359 | ||
|   | d346a8f73f | ||
|   | 523f2dee7c | ||
|   | b33e39491b | ||
|   | 317ebf4387 | ||
|   | 31ba780099 | ||
|   | d1b30619e2 | ||
|   | 3fab52296a | ||
|   | a6e109799a | ||
|   | 80af2cd691 | ||
|   | d911b55e25 | ||
|   | eb73fc4538 | ||
|   | 75f77ec7a3 | ||
|   | a1d969bbfd | ||
|   | 11f1ad6d76 | ||
|   | 7facf0adad | ||
|   | 2b739c2b40 | ||
|   | 269ae323e0 | ||
|   | 0d0e5812dd | ||
|   | 61c2661377 | ||
|   | de710dff94 | ||
|   | 8c524171fb | ||
|   | 946d24690c | ||
|   | bf137189c5 | ||
|   | da4e18cb69 | ||
|   | 85769c1439 | ||
|   | 4d3ad4b6b9 | ||
|   | e900a62e75 | ||
|   | c3969364aa | ||
|   | e9df9f10dc | ||
|   | f78f5b5361 | ||
|   | c061438a35 | ||
|   | 8441dbe007 | ||
|   | e21a741a78 | ||
|   | 955f437e6c | ||
|   | fd419076c2 | ||
|   | 7569536d56 | ||
|   | 3a6102900f | ||
|   | 6dbc694409 | ||
|   | 7a3dcc4dc6 | ||
|   | 23393b5d3e | ||
|   | 863f3ad510 | ||
|   | e6d86ca280 | ||
|   | c22e25e3d2 | ||
|   | 52ffb195ec | ||
|   | 92a51af638 | ||
|   | d7a9158cf2 | ||
|   | f0f84090d2 | ||
|   | 9d78a3b5cf | ||
|   | 2fc163af5a | ||
|   | 10be98e371 | ||
|   | e0eb083e44 | ||
|   | e17cd78153 | ||
|   | 0015f511f8 | ||
|   | f0f71c9f85 | ||
|   | 0002543cca | ||
|   | c1096415aa | ||
|   | 6625768228 | ||
|   | a27f601fe8 | ||
|   | 72a877d9ca | ||
|   | b7ba09a551 | ||
|   | a98cb66c53 | ||
|   | 6785ecad1d | ||
|   | 937af536b6 | ||
|   | 5487314230 | ||
|   | 51e9bb2a7f | ||
|   | 376bb981ae | ||
|   | ed9d78d2f3 | ||
|   | 3c4e50dbda | ||
|   | 523f9dd95a | ||
|   | a43742c8b1 | ||
|   | c49e4fd63d | ||
|   | 905cce7021 | ||
|   | 7a49b5dedc | ||
|   | 3a2870a6bb | ||
|   | 9a475f2c57 | ||
|   | 58598742e8 | ||
|   | d04e44f52f | ||
|   | c7ec1f44e9 | ||
|   | 3ed9a5d3d8 | ||
|   | 61285b6b8c | ||
|   | d17c547bca | ||
|   | 7bc20b0993 | ||
|   | 6c4b3dea96 | ||
|   | 6ae1bf5814 | ||
|   | 8503135ce0 | ||
|   | 590fe0762d | ||
|   | d565b90736 | ||
|   | c88156802a | ||
|   | 7d8dbcbde7 | ||
|   | 66ec66b291 | ||
|   | fc0eb0e793 | ||
|   | ed7e9e1eae | ||
|   | 8985917a96 | ||
|   | 3a3411c117 | ||
|   | 1166ddfe87 | ||
|   | 574e361f90 | ||
|   | f3745a2752 | ||
|   | a2fb9a183b | ||
|   | 295c5de0d6 | ||
|   | d4650afa0e | ||
|   | 07da4ca028 | ||
|   | feffdd1837 | ||
|   | 979532d3df | ||
|   | 3c77c54c8e | ||
|   | 74d013049d | ||
|   | 708aa2d72f | ||
|   | dd6581f7f7 | ||
|   | 8c801dddec | ||
|   | 9de8145f82 | ||
|   | 77460b0832 | ||
|   | 1fb1fb3ae9 | ||
|   | 1d1e927d56 | ||
|   | 036abf83e5 | ||
|   | e737cf612c | ||
|   | 78622fb47a | ||
|   | 9560494ab0 | ||
|   | 8aac3ec2e5 | ||
|   | 269ca501f1 | ||
|   | 20638f430a | ||
|   | acb551c5b0 | ||
|   | 44a6400fcf | ||
|   | 847c3db625 | ||
|   | f30181d485 | ||
|   | 118e8c487e | ||
|   | c73e476e88 | ||
|   | ac5b864ea9 | ||
|   | 42d531838c | ||
|   | 2321cf84b0 | ||
|   | a570363fe0 | ||
|   | 616b8eb61a | ||
|   | e1d486c8c8 | ||
|   | b841c9f631 | ||
|   | e6c72efd18 | ||
|   | 9693fd260c | ||
|   | 717b5fdd15 | ||
|   | 32cf487128 | ||
|   | a9941dea8a | ||
|   | 5c9737f281 | ||
|   | 87a98531d9 | ||
|   | 6d142dcbfe | ||
|   | 90f00e9960 | ||
|   | 8711e178e9 | ||
|   | eb28b38709 | ||
|   | afea618867 | ||
|   | 0abb9384a6 | ||
|   | 2563583f84 | ||
|   | 6acbbe3fa1 | ||
|   | 6c157f3f6c | ||
|   | c4737eca72 | ||
|   | 5428f5e2cf | ||
|   | 7d6d77cfbc | ||
|   | 87eacd17c5 | ||
|   | dd4420dcfd | ||
|   | b8843a29eb | ||
|   | a12262df55 | ||
|   | 091828e8f1 | ||
|   | 8bca099037 | ||
|   | a43d641b5f | ||
|   | 46c058df25 | ||
|   | fa7c6497e6 | ||
|   | 82b41d4df5 | ||
|   | fd2c2d552a | ||
|   | 78ae456b45 | ||
|   | 7e5528b7e1 | ||
|   | a97f55e189 | ||
|   | 50dd65c6de | ||
|   | 16aeb12111 | ||
|   | 96a7c43cb5 | ||
|   | ee20ee2ecd | ||
|   | efdd156d5e | ||
|   | be41023005 | ||
|   | d143f05bb1 | ||
|   | fdc229b196 | ||
|   | f6a5552296 | ||
|   | 62a4b4d3ec | ||
|   | ef24d6739a | ||
|   | 1831198349 | ||
|   | ddf764e308 | ||
|   | 988c757ca6 | ||
|   | cedcd14550 | ||
|   | 0ff290f868 | ||
|   | 1764ce0519 | ||
|   | f3b49d7cba | ||
|   | 6d19d69d20 | ||
|   | 9ad367370a | ||
|   | eb091e487d | ||
|   | a5ccc794bc | ||
|   | 1427dc3ede | ||
|   | e47bb11883 | ||
|   | 6f3ba9c34b | ||
|   | 0f3d2424ce | ||
|   | 8ecd8a10c0 | ||
|   | 3cc3e3a8e9 | ||
|   | be1086bcba | ||
|   | f9abe9a8e3 | ||
|   | 632ecb6d20 | ||
|   | db554df041 | ||
|   | 7300e4f1ad | ||
|   | 9b84532e57 | ||
|   | 14870d74df | ||
|   | 9c7794fe13 | ||
|   | d9526d4021 | ||
|   | 454e09ec3d | ||
|   | c687f64ced | ||
|   | 80623580f2 | ||
|   | 135f393fc4 | ||
|   | e03da2876c | ||
|   | 44fff9dcd1 | ||
|   | 02f993baea | ||
|   | f9302d4f9d | ||
|   | 780f8d193f | ||
|   | 4e85f857a4 | ||
|   | ea035136e1 | ||
|   | 9d8f398d9f | ||
|   | 31f0050f4e | ||
|   | 7ce005341e | ||
|   | 84447ef178 | ||
|   | b99d3b4960 | ||
|   | 0fc64478e0 | ||
|   | e7a3d563aa | ||
|   | bda020ef93 | ||
|   | f0c136c421 | ||
|   | 5fa1321619 | ||
|   | 792ec17d18 | ||
|   | 19ffd57b34 | ||
|   | ebda456862 | ||
|   | 5bd5aa0edf | ||
|   | 6b07d56627 | ||
|   | 15d381adfd | ||
|   | 23b44d6c8a | ||
|   | e3f2abc06e | ||
|   | 3d73de13d8 | ||
|   | 71f7bb2e75 | ||
|   | ebe900fca8 | ||
|   | 5a8bcec014 | ||
|   | a1c7c2768c | ||
|   | 565e6e3a3d | ||
|   | 855e9aa3b9 | ||
|   | a271edec47 | ||
|   | 81b293a5a6 | ||
|   | 8b41e144f8 | ||
|   | a41f653e05 | ||
|   | f24ff295e8 | ||
|   | b399bee3ac | ||
|   | 8f88c82a13 | ||
|   | d8ac88b7d9 | ||
|   | 443c5a80b4 | ||
|   | ba56ef5e33 | ||
|   | b24370e7ed | ||
|   | b2b0b31168 | ||
|   | 1e969f8d8a | ||
|   | bca098e074 | ||
|   | 98bd51436b | ||
|   | 1fa4b1e660 | ||
|   | 04a36b1d11 | ||
|   | 611d6f505d | ||
|   | 62b485abf9 | ||
|   | 61eae7d7c4 | ||
|   | af161b5143 | ||
|   | d5880eac8c | ||
|   | 02d6ab5fe7 | ||
|   | 5547ccffd6 | ||
|   | 8c06bd1738 | ||
|   | 469a8c1017 | ||
|   | bb3602073c | ||
|   | 6c6af59b22 | ||
|   | a8a36c73e6 | ||
|   | 98b1d854f9 | ||
|   | 1ada2317fd | ||
|   | 40722c8c30 | ||
|   | ff9e255f1b | ||
|   | fbe9c31d10 | ||
|   | 0aed705a6a | ||
|   | 06e864c954 | ||
|   | 1d68d013df | ||
|   | 8e6bc73ca6 | ||
|   | 7e0fded595 | ||
|   | c8443228fb | ||
|   | 64fe0062ee | ||
|   | 3b78516ef2 | ||
|   | 8f345126f7 | ||
|   | daaa472dfe | ||
|   | 87f35da3b6 | ||
|   | 6f42a60e59 | ||
|   | 3beedc1747 | ||
|   | 6603815a81 | ||
|   | c1027d3663 | ||
|   | 6cec5ba5bf | ||
|   | d70b70b63c | ||
|   | 7d73e3cd98 | ||
|   | 5087fc4a00 | ||
|   | 30cdb1ba73 | ||
|   | 0f6612904e | ||
|   | e5b5b4d3ef | ||
|   | 9bc63bb55c | ||
|   | dcf83d5608 | ||
|   | 8fe82bb5c0 | ||
|   | 6f74029d76 | ||
|   | 01e3d366ba | ||
|   | 41d5b4a22f | ||
|   | 7814636caf | ||
|   | cf2c5e36bc | ||
|   | 5d5875d540 | ||
|   | 95c2adc02e | ||
|   | 73f1ba10f9 | ||
|   | 9fe419cfe7 | ||
|   | 41e24ca535 | ||
|   | 42a628731d | ||
|   | 2ba702df21 | ||
|   | 0171962306 | ||
|   | 2daa42e124 | ||
|   | abfd2c94f5 | ||
|   | fd51fa7779 | ||
|   | 1a36aa8904 | ||
|   | 881a28138a | ||
|   | 26fb1698b8 | ||
|   | 13d7dd98bd | ||
|   | 672a9f1712 | ||
|   | 2e560ac081 | ||
|   | 39d1127cf1 | ||
|   | 13586e664f | ||
|   | 6e6db543f7 | ||
|   | ea8ae2372e | ||
|   | 928de13459 | ||
|   | e213c3e7d8 | ||
|   | 65b4b2d183 | ||
|   | 94b145b215 | ||
|   | 6c9e6af154 | ||
|   | b5736ad559 | ||
|   | ab3912b378 | ||
|   | 3090989dea | ||
|   | 92314b8dac | ||
|   | a52396008d | ||
|   | ae7350e3a0 | ||
|   | c30300c368 | ||
|   | ed3d415c05 | ||
|   | bb353d617a | ||
|   | d7f41748ad | ||
|   | 915ae47971 | ||
|   | 40b151b4c5 | ||
|   | 1992410a7b | ||
|   | 48874f5b07 | ||
|   | 2144a4eb7c | ||
|   | cbdbf11edc | ||
|   | 515db04023 | ||
|   | d3811f1bf1 | ||
|   | 815fedf8e7 | ||
|   | 929a7b9cfa | ||
|   | f85361dbc5 | ||
|   | cb6509d09d | ||
|   | f09c129c6d | ||
|   | 602a4aa835 | ||
|   | 14d5c6311b | ||
|   | 289dd3c170 | ||
|   | 60eac97945 | ||
|   | de1d6b9629 | ||
|   | 722264a083 | ||
|   | 357d487af7 | ||
|   | 1b802b040d | ||
|   | 25afbd935c | ||
|   | e61bfd2722 | ||
|   | fe571cbef3 | ||
|   | a7c5cb8f5a | ||
|   | dedb96ef4a | ||
|   | ee49efd215 | ||
|   | 56a35eb864 | ||
|   | d478fe0c71 | ||
|   | 03467ea64e | ||
|   | 3368fbd058 | ||
|   | e84c6f7a24 | ||
|   | a0006bad73 | ||
|   | 2458393d22 | ||
|   | 787416e552 | ||
|   | 1c6b241239 | ||
|   | 7469d520c9 | ||
|   | 7e00e62427 | ||
|   | 0e39a969c3 | ||
|   | 0ad1647930 | ||
|   | d7fc45a72d | ||
|   | 54dfb642b1 | ||
|   | 40626d0f42 | ||
|   | 523afccb51 | ||
|   | 1087aefe0a | ||
|   | 9b66edc148 | ||
|   | 2c09b0ae86 | ||
|   | 8de8ad13bf | ||
|   | 70bd442bb0 | ||
|   | 5250b3189b | ||
|   | 2534651e20 | ||
|   | f46a42023f | ||
|   | e2ab301340 | ||
|   | 700f835243 | ||
|   | 9ce7162a04 | ||
|   | af85a8b711 | ||
|   | cd58008a0f | ||
|   | 1f6bd975d0 | ||
|   | b3556c008e | ||
|   | dbe83f8a74 | ||
|   | d1c50f00a0 | ||
|   | bd9d3154db | ||
|   | 1f0b4425a4 | ||
|   | 47bfea4c56 | ||
|   | 416de6b584 | ||
|   | 3d3d141b25 | ||
|   | 2ff56c17e3 | ||
|   | fb326d0354 | ||
|   | e84933cf26 | ||
|   | 8e04328482 | ||
|   | d148b71f0f | ||
|   | 4e68838172 | ||
|   | d281fc588b | ||
|   | 1799ef42a7 | ||
|   | a0d5a863e0 | ||
|   | df59b104db | ||
|   | e7e327c238 | ||
|   | ee6e68d0bf | ||
|   | d7333b3f21 | ||
|   | 375bd58a0c | ||
|   | cddd915adf | ||
|   | 9e0ad271f6 | ||
|   | a0afeb2a7a | ||
|   | 7c208b38ed | ||
|   | eaa11c68f3 | 
| @@ -11,4 +11,9 @@ insert_final_newline = true | |||||||
|  |  | ||||||
| [*.md] | [*.md] | ||||||
| trim_trailing_whitespace = false | trim_trailing_whitespace = false | ||||||
| indent_style = tab |  | ||||||
|  | [{composer.json,package.json}] | ||||||
|  | indent_style = space | ||||||
|  |  | ||||||
|  | [package.json] | ||||||
|  | indent_size = 2 | ||||||
							
								
								
									
										7
									
								
								.gitattributes
									
									
									
									
										vendored
									
									
								
							
							
						
						| @@ -3,9 +3,12 @@ | |||||||
| .gitignore export-ignore | .gitignore export-ignore | ||||||
| .github export-ignore | .github export-ignore | ||||||
| .editorconfig export-ignore | .editorconfig export-ignore | ||||||
| .travis.yml export-ignore |  | ||||||
| _config.yml export-ignore | _config.yml export-ignore | ||||||
| release.sh export-ignore | release.sh export-ignore | ||||||
|  |  | ||||||
|  | # cypress | ||||||
|  | cypress export-ignore | ||||||
|  | cypress.config.js export-ignore | ||||||
|  | cypress.env.json | ||||||
|  |  | ||||||
| *.sh text eol=lf | *.sh text eol=lf | ||||||
| VERSION text eol=lf |  | ||||||
|   | |||||||
							
								
								
									
										120
									
								
								.github/workflows/cypress.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,120 @@ | |||||||
|  | name: Cypress | ||||||
|  | on: | ||||||
|  |   pull_request: | ||||||
|  |     branches: [develop] | ||||||
|  |   push: | ||||||
|  |     branches: [develop] | ||||||
|  |  | ||||||
|  | jobs: | ||||||
|  |   cypress: | ||||||
|  |     runs-on: ubuntu-latest | ||||||
|  |     services: | ||||||
|  |       mysql: | ||||||
|  |         image: mysql:8.0 | ||||||
|  |         env: | ||||||
|  |           MYSQL_ROOT_PASSWORD: root | ||||||
|  |           MYSQL_DATABASE: myaac | ||||||
|  |           MYSQL_USER: myaac | ||||||
|  |           MYSQL_PASSWORD: myaac | ||||||
|  |         ports: | ||||||
|  |           - 3306/tcp | ||||||
|  |         options: --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=3 | ||||||
|  |     strategy: | ||||||
|  |       fail-fast: false | ||||||
|  |       matrix: | ||||||
|  |         php-versions: [ '7.4', '8.0', '8.1' ] | ||||||
|  |     name: MyAAC on PHP ${{ matrix.php-versions }} | ||||||
|  |     steps: | ||||||
|  |         - name: 📌 MySQL Start & init & show db | ||||||
|  |           run: | | ||||||
|  |             sudo /etc/init.d/mysql start | ||||||
|  |             mysql -e 'CREATE DATABASE myaac;' -uroot -proot | ||||||
|  |             mysql -e "SHOW DATABASES" -uroot -proot | ||||||
|  |  | ||||||
|  |         - name: Checkout MyAAC | ||||||
|  |           uses: actions/checkout@v3 | ||||||
|  |           with: | ||||||
|  |             ref: develop | ||||||
|  |  | ||||||
|  |         - name: Checkout TFS | ||||||
|  |           uses: actions/checkout@v3 | ||||||
|  |           with: | ||||||
|  |             repository: otland/forgottenserver | ||||||
|  |             ref: 1.4 | ||||||
|  |             path: tfs | ||||||
|  |  | ||||||
|  |         - name: Import TFS Schema | ||||||
|  |           run: | | ||||||
|  |               mysql -uroot -proot myaac < tfs/schema.sql | ||||||
|  |  | ||||||
|  |         - name: Rename config.lua | ||||||
|  |           run: mv tfs/config.lua.dist tfs/config.lua | ||||||
|  |  | ||||||
|  |         - name: Replace mysqlUser | ||||||
|  |           uses: jacobtomlinson/gha-find-replace@v2 | ||||||
|  |           with: | ||||||
|  |             find: 'mysqlUser = "forgottenserver"' | ||||||
|  |             replace: 'mysqlUser = "root"' | ||||||
|  |             regex: false | ||||||
|  |             include: 'tfs/config.lua' | ||||||
|  |  | ||||||
|  |         - name: Replace mysqlPass | ||||||
|  |           uses: jacobtomlinson/gha-find-replace@v2 | ||||||
|  |           with: | ||||||
|  |               find: 'mysqlPass = ""' | ||||||
|  |               replace: 'mysqlPass = "root"' | ||||||
|  |               regex: false | ||||||
|  |               include: 'tfs/config.lua' | ||||||
|  |  | ||||||
|  |         - name: Replace mysqlDatabase | ||||||
|  |           uses: jacobtomlinson/gha-find-replace@v2 | ||||||
|  |           with: | ||||||
|  |               find: 'mysqlDatabase = "forgottenserver"' | ||||||
|  |               replace: 'mysqlDatabase = "myaac"' | ||||||
|  |               regex: false | ||||||
|  |               include: 'tfs/config.lua' | ||||||
|  |  | ||||||
|  |         - name: Setup PHP | ||||||
|  |           uses: shivammathur/setup-php@v2 | ||||||
|  |           with: | ||||||
|  |             php-version: ${{ matrix.php-versions }} | ||||||
|  |             extensions: mbstring, dom, fileinfo, mysql, json, xml, pdo, pdo_mysql | ||||||
|  |  | ||||||
|  |         - name: Get composer cache directory | ||||||
|  |           id: composer-cache | ||||||
|  |           run: echo "dir=$(composer config cache-files-dir)" >> $GITHUB_OUTPUT | ||||||
|  |  | ||||||
|  |         - name: Cache composer dependencies | ||||||
|  |           uses: actions/cache@v3 | ||||||
|  |           with: | ||||||
|  |             path: ${{ steps.composer-cache.outputs.dir }} | ||||||
|  |             # Use composer.json for key, if composer.lock is not committed. | ||||||
|  |             # key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }} | ||||||
|  |             key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} | ||||||
|  |             restore-keys: ${{ runner.os }}-composer- | ||||||
|  |  | ||||||
|  |         - name: Install Composer dependencies | ||||||
|  |           run: composer install --no-progress --prefer-dist --optimize-autoloader | ||||||
|  |  | ||||||
|  |         - name: Run PHP server | ||||||
|  |           run: nohup php -S localhost:8080 > php.log 2>&1 & | ||||||
|  |  | ||||||
|  |         - name: Cypress Run | ||||||
|  |           uses: cypress-io/github-action@v5 | ||||||
|  |           env: | ||||||
|  |             CYPRESS_URL: http://localhost:8080 | ||||||
|  |             CYPRESS_SERVER_PATH: /home/runner/work/myaac/myaac/tfs | ||||||
|  |  | ||||||
|  |         - name: Save screenshots | ||||||
|  |           uses: actions/upload-artifact@v3 | ||||||
|  |           if: always() | ||||||
|  |           with: | ||||||
|  |             name: cypress-screenshots | ||||||
|  |             path: cypress/screenshots | ||||||
|  |  | ||||||
|  |         - name: Upload Cypress Videos | ||||||
|  |           uses: actions/upload-artifact@v3 | ||||||
|  |           if: always() | ||||||
|  |           with: | ||||||
|  |             name: cypress-videos | ||||||
|  |             path: cypress/videos | ||||||
							
								
								
									
										8
									
								
								.github/workflows/phplint.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						| @@ -1,16 +1,16 @@ | |||||||
| name: PHP Linting | name: PHP Linting | ||||||
| on: | on: | ||||||
|   pull_request: |   pull_request: | ||||||
|     branches: [master] |     branches: [develop] | ||||||
|   push: |   push: | ||||||
|     branches: [master] |     branches: [develop] | ||||||
|  |  | ||||||
| jobs: | jobs: | ||||||
|   phplint: |   phplint: | ||||||
|     runs-on: ubuntu-latest |     runs-on: ubuntu-latest | ||||||
|     steps: |     steps: | ||||||
|       - uses: actions/checkout@v3 |       - uses: actions/checkout@v3 | ||||||
|       - uses: overtrue/phplint@3.4.0 |       - uses: overtrue/phplint@8.2 | ||||||
|         with: |         with: | ||||||
|           path: . |           path: . | ||||||
|           options: --exclude="system/libs/polyfill-mbstring/bootstrap80.php" |           options: --exclude=*.log | ||||||
|   | |||||||
							
								
								
									
										23
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						| @@ -2,22 +2,16 @@ Thumbs.db | |||||||
| .DS_Store | .DS_Store | ||||||
| .idea | .idea | ||||||
|  |  | ||||||
| # |  | ||||||
| /.htaccess |  | ||||||
| lua |  | ||||||
|  |  | ||||||
| # composer | # composer | ||||||
| composer.lock | composer.lock | ||||||
| vendor | vendor | ||||||
|  |  | ||||||
| # npm | # npm | ||||||
| node_modules | node_modules | ||||||
| tools/ext |  | ||||||
|  |  | ||||||
| # cypress | # cypress | ||||||
| cypress.env.json | cypress.env.json | ||||||
| cypress/e2e/2-advanced-examples | cypress/e2e/2-advanced-examples | ||||||
| cypress/screenshots |  | ||||||
|  |  | ||||||
| # created by release.sh | # created by release.sh | ||||||
| releases | releases | ||||||
| @@ -38,12 +32,6 @@ images/guilds/* | |||||||
| images/editor/* | images/editor/* | ||||||
| !images/editor/index.html | !images/editor/index.html | ||||||
|  |  | ||||||
| # gallery images |  | ||||||
| images/gallery/* |  | ||||||
| !images/gallery/index.html |  | ||||||
| !images/gallery/demon.jpg |  | ||||||
| !images/gallery/demon_thumb.gif |  | ||||||
|  |  | ||||||
| # cache | # cache | ||||||
| system/cache/* | system/cache/* | ||||||
| !system/cache/index.html | !system/cache/index.html | ||||||
| @@ -51,10 +39,6 @@ system/cache/* | |||||||
| !system/cache/signatures/index.html | !system/cache/signatures/index.html | ||||||
| !system/cache/plugins/index.html | !system/cache/plugins/index.html | ||||||
|  |  | ||||||
| # php sessions |  | ||||||
| system/php_sessions/* |  | ||||||
| !system/php_sessions/index.html |  | ||||||
|  |  | ||||||
| # logs | # logs | ||||||
| system/logs/* | system/logs/* | ||||||
| !system/logs/index.html | !system/logs/index.html | ||||||
| @@ -63,6 +47,10 @@ system/logs/* | |||||||
| system/data/* | system/data/* | ||||||
| !system/data/index.html | !system/data/index.html | ||||||
|  |  | ||||||
|  | # php sessions | ||||||
|  | system/php_sessions/* | ||||||
|  | !system/php_sessions/index.html | ||||||
|  |  | ||||||
| # plugins | # plugins | ||||||
| plugins/* | plugins/* | ||||||
| !plugins/.htaccess | !plugins/.htaccess | ||||||
| @@ -73,5 +61,8 @@ plugins/* | |||||||
| !plugins/email-confirmed-reward | !plugins/email-confirmed-reward | ||||||
| landing | landing | ||||||
|  |  | ||||||
|  | # system | ||||||
|  | system/functions_custom.php | ||||||
|  |  | ||||||
| # others/rest | # others/rest | ||||||
| system/pages/downloads.php | system/pages/downloads.php | ||||||
|   | |||||||
| @@ -6,12 +6,14 @@ | |||||||
| 	Options -MultiViews | 	Options -MultiViews | ||||||
| </IfModule> | </IfModule> | ||||||
| 
 | 
 | ||||||
|  | <FilesMatch "^(CHANGELOG\.md|README\.md|composer\.json|composer\.lock|package\.json|package-lock\.json|cypress\.env\.json)$"> | ||||||
|  | 	Require all denied | ||||||
|  | </FilesMatch> | ||||||
|  | 
 | ||||||
| <IfModule mod_rewrite.c> | <IfModule mod_rewrite.c> | ||||||
| 	RewriteEngine On | 	RewriteEngine On | ||||||
| 
 | 
 | ||||||
| 	# you can put here your myaac root folder | 	#RewriteBase /myaac/ | ||||||
| 	# path relative to web root |  | ||||||
|     #RewriteBase /myaac/ |  | ||||||
| 
 | 
 | ||||||
| 	RewriteCond %{REQUEST_FILENAME} !-f | 	RewriteCond %{REQUEST_FILENAME} !-f | ||||||
| 	RewriteCond %{REQUEST_FILENAME} !-d | 	RewriteCond %{REQUEST_FILENAME} !-d | ||||||
							
								
								
									
										20
									
								
								.travis.yml
									
									
									
									
									
								
							
							
						
						| @@ -1,20 +0,0 @@ | |||||||
|  |  | ||||||
| language: php |  | ||||||
| php: |  | ||||||
|   - 5.6 |  | ||||||
|   - 7.0 |  | ||||||
|   - 7.1 |  | ||||||
|   - 7.2 |  | ||||||
|   - 7.3 |  | ||||||
|   - 7.4 |  | ||||||
|   - 8.0 |  | ||||||
|  |  | ||||||
| cache: |  | ||||||
|   directories: |  | ||||||
|     - $HOME/.composer/cache |  | ||||||
|  |  | ||||||
| before_script: |  | ||||||
|   - composer require php-parallel-lint/php-parallel-lint --no-suggest --no-progress --no-interaction --no-ansi --quiet --optimize-autoloader |  | ||||||
|  |  | ||||||
| script: |  | ||||||
|   - php vendor/bin/parallel-lint --no-progress --no-colors --exclude vendor --exclude "system/libs/pot/OTS_DB_PDOQuery_PHP71.php" . |  | ||||||
							
								
								
									
										1044
									
								
								CHANGELOG.md
									
									
									
									
									
								
							
							
						
						
							
								
								
									
										53
									
								
								README.md
									
									
									
									
									
								
							
							
						
						| @@ -1,36 +1,24 @@ | |||||||
| # [MyAAC](https://my-aac.org) | # [MyAAC](https://my-aac.org) | ||||||
|  |  | ||||||
|  | [](https://travis-ci.org/github/slawkens/myaac) | ||||||
|  | [](https://opensource.org/licenses/gpl-license) | ||||||
|  | [](https://github.com/slawkens/myaac/releases) | ||||||
|  | [](https://github.com/slawkens/myaac/blob/d8b3b4135827ee17e3c6d41f08a925e718c587ed/.travis.yml#L3) | ||||||
|  | [](https://discord.gg/2J39Wus) | ||||||
|  | [](https://github.com/slawkens/myaac/issues?q=is%3Aissue+is%3Aclosed) | ||||||
|  |  | ||||||
| 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) 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 | ||||||
|  |  | ||||||
| [](https://github.com/slawkens/myaac/actions) |  | ||||||
| [](https://opensource.org/licenses/gpl-license) |  | ||||||
| [](https://github.com/slawkens/myaac/releases) |  | ||||||
| [](https://discord.gg/2J39Wus) |  | ||||||
| [](https://github.com/slawkens/myaac/issues?q=is%3Aissue+is%3Aclosed) |  | ||||||
|  |  | ||||||
| | Version | Status                 | Branch  | Requirements   | |  | ||||||
| |:--------|:-----------------------|:--------|:---------------| |  | ||||||
| | 2.x     | Experimental features  | develop | PHP >= 8.1     | |  | ||||||
| | **1.x** | **Active development** | main    | **PHP >= 8.1** | |  | ||||||
| | 0.9.x   | Not developed anymore  | 0.9     | PHP >= 7.2.5   | |  | ||||||
| | 0.8.x   | Active support         | 0.8     | PHP >= 7.2.5   | |  | ||||||
| | 0.7.x   | End Of Life            | 0.7     | PHP >= 5.3.3   | |  | ||||||
|  |  | ||||||
| The recommended version to install is 1.x, which can be found at releases page - [https://github.com/slawkens/myaac/releases](https://github.com/slawkens/myaac/releases). |  | ||||||
|  |  | ||||||
| ### Documentation |  | ||||||
| * [docs.my-aac.org](https://docs.my-aac.org) |  | ||||||
| * [my-aac.org - FAQ](https://my-aac.org/faqs/) |  | ||||||
|  |  | ||||||
| ### Requirements | ### Requirements | ||||||
|  |  | ||||||
|  | 	- PHP 5.6 or later | ||||||
| 	- MySQL database | 	- MySQL database | ||||||
| 	- PHP Extensions: pdo, xml, json | 	- PDO PHP Extension | ||||||
| 	- (optional) apache2 mod_rewrite (to use friendly_urls) | 	- XML PHP Extension | ||||||
| 	- (optional) zip PHP Extension (to install plugins) | 	- ZIP PHP Extension | ||||||
| 	- (optional) gd PHP Extension (for generating signature images) | 	- (optional) mod_rewrite to use friendly_urls | ||||||
|  |  | ||||||
| ### Installation | ### Installation | ||||||
|  |  | ||||||
| @@ -54,23 +42,22 @@ The recommended version to install is 1.x, which can be found at releases page - | |||||||
|  |  | ||||||
| ### Configuration | ### Configuration | ||||||
|  |  | ||||||
| Check *config.php* to get more information. (Notice: MyAAC 1.0+ doesn't use config.php anymore, it has been moved to Admin Panel - Settings page). | Check *config.php* to get more informations. | ||||||
|  |  | ||||||
| Use *config.local.php* for your local configuration changes. | Use *config.local.php* for your local configuration changes. | ||||||
|  |  | ||||||
| ### Branches | ### Branches | ||||||
|  |  | ||||||
| This repository follows the Git Flow Workflow. | This repository follows the Git Flow Workflow. | ||||||
| Cheatsheet: [Git-Flow-Cheatsheet](https://danielkummer.github.io/git-flow-cheatsheet) | Cheatsheet: [Git-Flow-Cheetsheet](https://danielkummer.github.io/git-flow-cheatsheet) | ||||||
|  |  | ||||||
| That means, we use: | That means, we use: | ||||||
| * main branch, for current stable release | * master branch, for current stable release | ||||||
| * develop branch, for development version (next release) | * develop branch, for development version (next release) | ||||||
| * feature branches, for features etc. | * feature branches, for features etc. | ||||||
|  |  | ||||||
| ### Known Problems | ### Known Problems | ||||||
|  |  | ||||||
| - Some compatibility issues with some exotic distributions. | - Some compatibility issues with some exotical distibutions. | ||||||
|  |  | ||||||
| ### Contributing | ### Contributing | ||||||
|  |  | ||||||
| @@ -84,13 +71,7 @@ Look: [Contributing](https://github.com/otsoft/myaac/wiki/Contributing) in our w | |||||||
|  |  | ||||||
| ### Other Notes | ### Other Notes | ||||||
|  |  | ||||||
| If you have a great idea or want to contribute to the project - visit our website at https://www.my-aac.org | 	If you have a great idea or want contribute to the project - visit our website at https://www.my-aac.org | ||||||
|  |  | ||||||
| ## Project supported by JetBrains |  | ||||||
|  |  | ||||||
| Many thanks to Jetbrains for kindly providing a license for me to work on this and other open-source projects. |  | ||||||
|  |  | ||||||
| [](https://www.jetbrains.com/?from=https://github.com/slawkens) |  | ||||||
|  |  | ||||||
| ### License | ### License | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										16
									
								
								SECURITY.md
									
									
									
									
									
								
							
							
						
						| @@ -1,16 +0,0 @@ | |||||||
| # Security Policy |  | ||||||
|  |  | ||||||
| ## Supported Versions |  | ||||||
|  |  | ||||||
| | Version | Supported          | |  | ||||||
| | ------- | ------------------ | |  | ||||||
| | 1.x.y   | :white_check_mark: | |  | ||||||
| | 0.9.x   | :x:                | |  | ||||||
| | 0.8.x   | :white_check_mark: | |  | ||||||
| | < 0.7   | :x:                | |  | ||||||
|  |  | ||||||
| ## Reporting a Vulnerability |  | ||||||
|  |  | ||||||
| If you found a security vulnerability, please write an email to security@my-aac.org |  | ||||||
|  |  | ||||||
| All reports will be taken very seriously, and a fix will be posted as soon as possible. |  | ||||||
							
								
								
									
										
											BIN
										
									
								
								admin/images/logo.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 4.3 KiB | 
| @@ -1,2 +1 @@ | |||||||
| <?php | <?php | ||||||
| // nothing yet here |  | ||||||
| @@ -1,9 +1,10 @@ | |||||||
| <?php | <?php | ||||||
|  |  | ||||||
| // few things we'll need | // few things we'll need | ||||||
| require '../common.php'; | require '../common.php'; | ||||||
|  |  | ||||||
| define('ADMIN_PANEL', true); | const ADMIN_PANEL = true; | ||||||
| define('MYAAC_ADMIN', true); | const MYAAC_ADMIN = true; | ||||||
|  |  | ||||||
| if(file_exists(BASE . 'config.local.php')) { | if(file_exists(BASE . 'config.local.php')) { | ||||||
| 	require_once BASE . 'config.local.php'; | 	require_once BASE . 'config.local.php'; | ||||||
| @@ -18,8 +19,8 @@ if(file_exists(BASE . 'install') && (!isset($config['installed']) || !$config['i | |||||||
| $content = ''; | $content = ''; | ||||||
|  |  | ||||||
| // validate page | // validate page | ||||||
| $page = isset($_GET['p']) ? $_GET['p'] : ''; | $page = $_GET['p'] ?? ''; | ||||||
| if(empty($page) || preg_match("/[^a-zA-Z0-9_\-]/", $page)) | if(empty($page) || preg_match("/[^a-zA-Z0-9_\-\/.]/", $page)) | ||||||
| 	$page = 'dashboard'; | 	$page = 'dashboard'; | ||||||
|  |  | ||||||
| $page = strtolower($page); | $page = strtolower($page); | ||||||
| @@ -28,6 +29,11 @@ define('PAGE', $page); | |||||||
| require SYSTEM . 'functions.php'; | require SYSTEM . 'functions.php'; | ||||||
| require SYSTEM . 'init.php'; | require SYSTEM . 'init.php'; | ||||||
|  |  | ||||||
|  | // verify myaac tables exists in database | ||||||
|  | if(!$db->hasTable('myaac_account_actions')) { | ||||||
|  | 	throw new RuntimeException('Seems that the table <strong>myaac_account_actions</strong> of MyAAC doesn\'t exist in the database. This is a fatal error. You can try to reinstall MyAAC by visiting <a href="' . BASE_URL . 'install">this</a> url.'); | ||||||
|  | } | ||||||
|  |  | ||||||
| if(config('env') === 'dev') { | if(config('env') === 'dev') { | ||||||
| 	ini_set('display_errors', 1); | 	ini_set('display_errors', 1); | ||||||
| 	ini_set('display_startup_errors', 1); | 	ini_set('display_startup_errors', 1); | ||||||
| @@ -42,30 +48,40 @@ $hooks->load(); | |||||||
| require SYSTEM . 'status.php'; | require SYSTEM . 'status.php'; | ||||||
| require SYSTEM . 'login.php'; | require SYSTEM . 'login.php'; | ||||||
| require SYSTEM . 'migrate.php'; | require SYSTEM . 'migrate.php'; | ||||||
| require ADMIN . 'includes/functions.php'; | require __DIR__ . '/includes/functions.php'; | ||||||
|  |  | ||||||
| $twig->addGlobal('config', $config); | $twig->addGlobal('config', $config); | ||||||
| $twig->addGlobal('status', $status); | $twig->addGlobal('status', $status); | ||||||
|  |  | ||||||
|  | if (ACTION == 'logout') { | ||||||
|  | 	require SYSTEM . 'logout.php'; | ||||||
|  | } | ||||||
|  |  | ||||||
| // if we're not logged in - show login box | // if we're not logged in - show login box | ||||||
| if(!$logged || !admin()) { | if(!$logged || !admin()) { | ||||||
| 	$page = 'login'; | 	$page = 'login'; | ||||||
| } | } | ||||||
|  |  | ||||||
| // include our page | // include our page | ||||||
| $file = ADMIN . 'pages/' . $page . '.php'; | $file = __DIR__ . '/pages/' . $page . '.php'; | ||||||
| if(!@file_exists($file)) { | if(!@file_exists($file)) { | ||||||
| 	$page = '404'; | 	if (strpos($page, 'plugins/') !== false) { | ||||||
| 	$file = SYSTEM . 'pages/404.php'; | 		$file = BASE . $page; | ||||||
|  | 	} | ||||||
|  | 	else { | ||||||
|  | 		$page = '404'; | ||||||
|  | 		$file = SYSTEM . 'pages/404.php'; | ||||||
|  | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
| ob_start(); | ob_start(); | ||||||
| include($file); | if($hooks->trigger(HOOK_ADMIN_BEFORE_PAGE)) { | ||||||
|  | 	require $file; | ||||||
|  | } | ||||||
|  |  | ||||||
| $content .= ob_get_contents(); | $content .= ob_get_contents(); | ||||||
| ob_end_clean(); | ob_end_clean(); | ||||||
|  |  | ||||||
| // template | // template | ||||||
| $template_path = 'template/'; | $template_path = 'template/'; | ||||||
| require ADMIN . $template_path . 'template.php'; | require __DIR__ . '/' . $template_path . 'template.php'; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,26 +1,139 @@ | |||||||
| <?php | <?php | ||||||
| /** | /** | ||||||
|  * CHANGELOG viewer |  * CHANGELOG modifier | ||||||
|  * |  * | ||||||
|  * @package   MyAAC |  * @package   MyAAC | ||||||
|  * @author    Slawkens <slawkens@gmail.com> |  * @author    Slawkens <slawkens@gmail.com> | ||||||
|  * @copyright 2019 MyAAC |  * @author    Lee | ||||||
|  |  * @copyright 2020 MyAAC | ||||||
|  * @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 = 'MyAAC Changelog'; |  | ||||||
|  |  | ||||||
| if (!file_exists(BASE . 'CHANGELOG.md')) { | if (!hasFlag(FLAG_CONTENT_PAGES) && !superAdmin()) { | ||||||
| 	echo 'File CHANGELOG.md doesn\'t exist.'; | 	echo 'Access denied.'; | ||||||
| 	return; | 	return; | ||||||
| } | } | ||||||
|  |  | ||||||
| require LIBS . 'Parsedown.php'; | $title = 'Changelog'; | ||||||
|  | $use_datatable = true; | ||||||
|  | const CL_LIMIT = 600; // maximum changelog body length | ||||||
|  | ?> | ||||||
|  |  | ||||||
| $changelog = file_get_contents(BASE . 'CHANGELOG.md'); | <link rel="stylesheet" type="text/css" href="<?php echo BASE_URL; ?>tools/css/jquery.datetimepicker.css"/ > | ||||||
|  | <script src="<?php echo BASE_URL; ?>tools/js/jquery.datetimepicker.js"></script> | ||||||
|  | <?php | ||||||
|  | $id = $_GET['id'] ?? 0; | ||||||
|  | require_once LIBS . 'changelog.php'; | ||||||
|  |  | ||||||
| $Parsedown = new Parsedown(); | if(!empty($action)) | ||||||
|  | { | ||||||
|  | 	$id = $_REQUEST['id'] ?? null; | ||||||
|  | 	$body = isset($_REQUEST['body']) ? stripslashes($_REQUEST['body']) : null; | ||||||
|  | 	$create_date = isset($_REQUEST['createdate']) ? (int)strtotime($_REQUEST['createdate'] ): null; | ||||||
|  | 	$player_id = isset($_REQUEST['player_id']) ? (int)$_REQUEST['player_id'] : null; | ||||||
|  | 	$type = isset($_REQUEST['type']) ? (int)$_REQUEST['type'] : null; | ||||||
|  | 	$where = isset($_REQUEST['where']) ? (int)$_REQUEST['where'] : null; | ||||||
|  |  | ||||||
| $changelog = $Parsedown->text($changelog); # prints: <p>Hello <em>Parsedown</em>!</p> | 	$errors = array(); | ||||||
|  |  | ||||||
| echo '<div>' . $changelog . '</div>'; | 	if($action == 'new') { | ||||||
|  |  | ||||||
|  | 		if(isset($body) && Changelog::add($body, $type, $where, $player_id, $create_date, $errors)) { | ||||||
|  | 			$body = ''; | ||||||
|  | 			$type = $where = $player_id = $create_date = 0; | ||||||
|  |  | ||||||
|  | 			success("Added successful."); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	else if($action == 'delete') { | ||||||
|  | 		Changelog::delete($id, $errors); | ||||||
|  | 		success("Deleted successful."); | ||||||
|  | 	} | ||||||
|  | 	else if($action == 'edit') | ||||||
|  | 	{ | ||||||
|  | 		if(isset($id) && !isset($body)) { | ||||||
|  | 			$cl = Changelog::get($id); | ||||||
|  | 			$body = $cl['body']; | ||||||
|  | 			$type = $cl['type']; | ||||||
|  | 			$where = $cl['where']; | ||||||
|  | 			$create_date = $cl['date']; | ||||||
|  | 			$player_id = $cl['player_id']; | ||||||
|  | 		} | ||||||
|  | 		else { | ||||||
|  | 			if(Changelog::update($id, $body, $type, $where, $player_id, $create_date,$errors)) { | ||||||
|  | 				$action = $body = ''; | ||||||
|  | 				$type = $where = $player_id = $create_date = 0; | ||||||
|  |  | ||||||
|  | 				success("Updated successful."); | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	else if($action == 'hide') { | ||||||
|  | 		Changelog::toggleHidden($id, $errors, $status); | ||||||
|  | 		success(($status == 1 ? 'Show' : 'Hide') . " successful."); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	if(!empty($errors)) | ||||||
|  | 		error(implode(", ", $errors)); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | $changelogs = $db->query('SELECT * FROM `' . TABLE_PREFIX . 'changelog' . '` ORDER BY `id` DESC')->fetchAll(); | ||||||
|  |  | ||||||
|  | $i = 0; | ||||||
|  |  | ||||||
|  | $log_type = [ | ||||||
|  | 	['id' => 1, 'icon' => 'added'], | ||||||
|  | 	['id' => 2, 'icon' => 'removed'], | ||||||
|  | 	['id' => 3, 'icon' => 'changed'], | ||||||
|  | 	['id' => 4, 'icon' => 'fixed'], | ||||||
|  | ]; | ||||||
|  |  | ||||||
|  | $log_where = [ | ||||||
|  | 	['id' => 1, 'icon' => 'server'], | ||||||
|  | 	['id' => 2, 'icon' => 'website'], | ||||||
|  | ]; | ||||||
|  |  | ||||||
|  | foreach($changelogs as $key => &$log) | ||||||
|  | { | ||||||
|  | 	$log['type'] = getChangelogType($log['type']); | ||||||
|  | 	$log['where'] = getChangelogWhere($log['where']); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | if($action == 'edit' || $action == 'new') { | ||||||
|  | 	if($action == 'edit') { | ||||||
|  | 		$player = new OTS_Player(); | ||||||
|  | 		$player->load($player_id); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	$account_players = $account_logged->getPlayersList(); | ||||||
|  | 	$account_players->orderBy('group_id', POT::ORDER_DESC); | ||||||
|  | 	$twig->display('admin.changelog.form.html.twig', array( | ||||||
|  | 		'action' => $action, | ||||||
|  | 		'cl_link_form' => constant('ADMIN_URL').'?p=changelog&action=' . ($action == 'edit' ? 'edit' : 'new'), | ||||||
|  | 		'cl_id' => $id ?? null, | ||||||
|  | 		'body' => isset($body) ? escapeHtml($body) : '', | ||||||
|  | 		'create_date' => $create_date ?? '', | ||||||
|  | 		'player_id' => $player_id ?? null, | ||||||
|  | 		'account_players' => $account_players, | ||||||
|  | 		'type' => $type ?? 0, | ||||||
|  | 		'where' => $where ?? 0, | ||||||
|  | 		'log_type' => $log_type, | ||||||
|  | 		'log_where' => $log_where, | ||||||
|  | 	)); | ||||||
|  | } | ||||||
|  | $twig->display('admin.changelog.html.twig', array( | ||||||
|  | 	'changelogs' => $changelogs, | ||||||
|  | )); | ||||||
|  |  | ||||||
|  | ?> | ||||||
|  | <script> | ||||||
|  | 	$(document).ready(function () { | ||||||
|  | 		$('#createdate').datetimepicker({format: "M d Y, H:i:s",}); | ||||||
|  |  | ||||||
|  | 		$('.tb_datatable').DataTable({ | ||||||
|  | 			"order": [[0, "desc"]], | ||||||
|  | 			"columnDefs": [{targets: [1, 2,4,5],orderable: false}] | ||||||
|  | 		}); | ||||||
|  | 	}); | ||||||
|  | </script> | ||||||
|   | |||||||
							
								
								
									
										25
									
								
								admin/pages/clmd.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,25 @@ | |||||||
|  | <?php | ||||||
|  | /** | ||||||
|  |  * CHANGELOG viewer | ||||||
|  |  * | ||||||
|  |  * @package   MyAAC | ||||||
|  |  * @author    Slawkens <slawkens@gmail.com> | ||||||
|  |  * @author    Lee | ||||||
|  |  * @copyright 2020 MyAAC | ||||||
|  |  * @link      https://my-aac.org | ||||||
|  |  */ | ||||||
|  | defined('MYAAC') or die('Direct access not allowed!'); | ||||||
|  | $title = 'MyAAC Changelog'; | ||||||
|  |  | ||||||
|  | if (!file_exists(BASE . 'CHANGELOG.md')) { | ||||||
|  | 	echo 'File CHANGELOG.md doesn\'t exist.'; | ||||||
|  | 	return; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | $changelog = file_get_contents(BASE . 'CHANGELOG.md'); | ||||||
|  |  | ||||||
|  | $Parsedown = new Parsedown(); | ||||||
|  |  | ||||||
|  | $changelog = $Parsedown->text($changelog); # prints: <p>Hello <em>Parsedown</em>!</p> | ||||||
|  |  | ||||||
|  | echo '<div>' . $changelog . '</div>'; | ||||||
| @@ -19,8 +19,10 @@ if (isset($_GET['clear_cache'])) { | |||||||
| } | } | ||||||
|  |  | ||||||
| if (isset($_GET['maintenance'])) { | if (isset($_GET['maintenance'])) { | ||||||
| 	$_status = (int)$_POST['status']; | 	$message = (!empty($_POST['message']) ? $_POST['message'] : null); | ||||||
| 	$message = $_POST['message']; | 	$_status = (isset($_POST['status']) && $_POST['status'] == 'true'); | ||||||
|  | 	$_status = ($_status ? '0' : '1'); | ||||||
|  |  | ||||||
| 	if (empty($message)) { | 	if (empty($message)) { | ||||||
| 		error('Message cannot be empty.'); | 		error('Message cannot be empty.'); | ||||||
| 	} else if (strlen($message) > 255) { | 	} else if (strlen($message) > 255) { | ||||||
| @@ -45,47 +47,16 @@ $tmp = ''; | |||||||
| if (fetchDatabaseConfig('site_closed_message', $tmp)) | if (fetchDatabaseConfig('site_closed_message', $tmp)) | ||||||
| 	$closed_message = $tmp; | 	$closed_message = $tmp; | ||||||
|  |  | ||||||
| $query = $db->query('SELECT count(*) as `how_much` FROM `accounts`;'); |  | ||||||
| $query = $query->fetch(); |  | ||||||
| $total_accounts = $query['how_much']; |  | ||||||
|  |  | ||||||
| $query = $db->query('SELECT count(*) as `how_much` FROM `players`;'); |  | ||||||
| $query = $query->fetch(); |  | ||||||
| $total_players = $query['how_much']; |  | ||||||
|  |  | ||||||
| $query = $db->query('SELECT count(*) as `how_much` FROM `guilds`;'); |  | ||||||
| $query = $query->fetch(); |  | ||||||
| $total_guilds = $query['how_much']; |  | ||||||
|  |  | ||||||
| $query = $db->query('SELECT count(*) as `how_much` FROM `houses`;'); |  | ||||||
| $query = $query->fetch(); |  | ||||||
| $total_houses = $query['how_much']; |  | ||||||
|  |  | ||||||
| $twig->display('admin.statistics.html.twig', array( |  | ||||||
| 	'total_accounts' => $total_accounts, |  | ||||||
| 	'total_players' => $total_players, |  | ||||||
| 	'total_guilds' => $total_guilds, |  | ||||||
| 	'total_houses' => $total_houses |  | ||||||
| )); |  | ||||||
|  |  | ||||||
| $twig->display('admin.dashboard.html.twig', array( |  | ||||||
| 	'is_closed' => $is_closed, |  | ||||||
| 	'closed_message' => $closed_message, |  | ||||||
| 	'status' => $status, |  | ||||||
| 	'account_type' => USE_ACCOUNT_NAME ? 'name' : 'number' |  | ||||||
| )); |  | ||||||
|  |  | ||||||
| echo '<div class="row">'; |  | ||||||
|  |  | ||||||
| $configAdminPanelModules = config('admin_panel_modules'); | $configAdminPanelModules = config('admin_panel_modules'); | ||||||
| if(isset($configAdminPanelModules)) | if (isset($configAdminPanelModules)) { | ||||||
|  | 	echo '<div class="row">'; | ||||||
| 	$configAdminPanelModules = explode(',', $configAdminPanelModules); | 	$configAdminPanelModules = explode(',', $configAdminPanelModules); | ||||||
|  | 	$twig_loader->prependPath(__DIR__ . '/modules/templates'); | ||||||
| $twig_loader->prependPath(__DIR__ . '/modules/templates'); | 	foreach ($configAdminPanelModules as $box) { | ||||||
| foreach($configAdminPanelModules as $box) { | 		$file = __DIR__ . '/modules/' . $box . '.php'; | ||||||
| 	$file = __DIR__ . '/modules/' . $box . '.php'; | 		if (file_exists($file)) { | ||||||
| 	if(file_exists($file)) { | 			include($file); | ||||||
| 		include($file); | 		} | ||||||
| 	} | 	} | ||||||
| } |  | ||||||
| echo '</div>'; | echo '</div>'; | ||||||
|  | } | ||||||
|   | |||||||
| @@ -1,7 +1,6 @@ | |||||||
| <?php | <?php | ||||||
| /** | /** | ||||||
|  * Account confirm mail |  * Load items.xml | ||||||
|  * Keept for compatibility |  | ||||||
|  * |  * | ||||||
|  * @package   MyAAC |  * @package   MyAAC | ||||||
|  * @author    Slawkens <slawkens@gmail.com> |  * @author    Slawkens <slawkens@gmail.com> | ||||||
| @@ -9,7 +8,6 @@ | |||||||
|  * @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 = 'Server Data'; | ||||||
| 
 | 
 | ||||||
| if($action == 'confirm_email') { | $twig->display('admin.data.html.twig'); | ||||||
| 	require_once PAGES . 'account/confirm_email.php'; |  | ||||||
| } |  | ||||||
| @@ -1,35 +0,0 @@ | |||||||
| <?php |  | ||||||
| /** |  | ||||||
|  * Load items.xml |  | ||||||
|  * |  | ||||||
|  * @package   MyAAC |  | ||||||
|  * @author    Slawkens <slawkens@gmail.com> |  | ||||||
|  * @copyright 2019 MyAAC |  | ||||||
|  * @link      https://my-aac.org |  | ||||||
|  */ |  | ||||||
| defined('MYAAC') or die('Direct access not allowed!'); |  | ||||||
| $title = 'Load items.xml'; |  | ||||||
|  |  | ||||||
| require_once LIBS . 'items.php'; |  | ||||||
| require_once LIBS . 'weapons.php'; |  | ||||||
|  |  | ||||||
| $twig->display('admin.items.html.twig'); |  | ||||||
|  |  | ||||||
| $reload = isset($_REQUEST['reload']) && (int)$_REQUEST['reload'] === 1; |  | ||||||
| if ($reload) { |  | ||||||
| 	$items_start_time = microtime(true); |  | ||||||
| 	if (Items::loadFromXML(true)) { |  | ||||||
| 		success('Successfully loaded items (in ' . round(microtime(true) - $items_start_time, 4) . ' seconds).'); |  | ||||||
| 	} |  | ||||||
| 	else { |  | ||||||
| 		error(Items::getError()); |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	$weapons_start_time = microtime(true); |  | ||||||
| 	if (Weapons::loadFromXML(true)) { |  | ||||||
| 		success('Successfully loaded weapons (in ' . round(microtime(true) - $weapons_start_time, 4) . ' seconds).'); |  | ||||||
| 	} |  | ||||||
| 	else { |  | ||||||
| 		error(Weapons::getError()); |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| @@ -9,18 +9,16 @@ | |||||||
|  */ |  */ | ||||||
| defined('MYAAC') or die('Direct access not allowed!'); | defined('MYAAC') or die('Direct access not allowed!'); | ||||||
| $title = 'Login'; | $title = 'Login'; | ||||||
| $logout = ''; |  | ||||||
| if ($action == 'logout') { | require PAGES . 'account/login.php'; | ||||||
| 	$logout = "You have  been logged out!"; | if ($logged) { | ||||||
|  | 	header('Location: ' . ADMIN_URL); | ||||||
|  | 	return; | ||||||
| } | } | ||||||
|  |  | ||||||
| if (isset($errors)) { | $twig->display('admin.login.html.twig', [ | ||||||
| 	foreach ($errors as $error) { | 	'logout' => (ACTION == 'logout' ? 'You have  been logged out!'  : ''), | ||||||
| 		error($error); |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
|  |  | ||||||
| $twig->display('admin.login.html.twig', array( |  | ||||||
| 	'logout' => $logout, |  | ||||||
| 	'account' => USE_ACCOUNT_NAME ? 'Name' : 'Number', | 	'account' => USE_ACCOUNT_NAME ? 'Name' : 'Number', | ||||||
| )); | 	'account_login_by' => getAccountLoginByLabel(), | ||||||
|  | 	'errors' => $errors ?? '' | ||||||
|  | ]); | ||||||
|   | |||||||
| @@ -4,56 +4,56 @@ | |||||||
|  * |  * | ||||||
|  * @package   MyAAC |  * @package   MyAAC | ||||||
|  * @author    Slawkens <slawkens@gmail.com> |  * @author    Slawkens <slawkens@gmail.com> | ||||||
|  * @copyright 2019 MyAAC |  * @copyright 2020 MyAAC | ||||||
|  * @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 = 'Logs Viewer'; | $title = 'Logs Viewer'; | ||||||
|  | $use_datatable = true; | ||||||
|  |  | ||||||
| $files = array(); | $files = array(); | ||||||
| $aac_path_logs = BASE . 'system/logs/'; | $aac_path_logs = BASE . 'system/logs/'; | ||||||
| foreach (scandir($aac_path_logs, SCANDIR_SORT_ASCENDING) as $f) { | foreach (scandir($aac_path_logs, SCANDIR_SORT_ASCENDING) as $f) { | ||||||
|     if ($f[0] === '.' || is_dir($aac_path_logs . $f)) { | 	if ($f[0] === '.' || is_dir($aac_path_logs . $f) || $f === 'index.html') { | ||||||
| 	    continue; | 		continue; | ||||||
|     } | 	} | ||||||
|  |  | ||||||
|     $files[] = array($f, $aac_path_logs); | 	$files[] = array($f, $aac_path_logs); | ||||||
| } | } | ||||||
|  |  | ||||||
| $server_path_logs = $config['server_path'] . 'logs/'; | $server_path_logs = $config['server_path'] . 'logs/'; | ||||||
| if (!file_exists($server_path_logs)) { | if (!file_exists($server_path_logs)) { | ||||||
|     $server_path_logs = $config['data_path'] . 'logs/'; | 	$server_path_logs = $config['data_path'] . 'logs/'; | ||||||
| } | } | ||||||
|  |  | ||||||
| if (file_exists($server_path_logs)) { | if (file_exists($server_path_logs)) { | ||||||
|     foreach (scandir($server_path_logs, SCANDIR_SORT_ASCENDING) as $f) { | 	foreach (scandir($server_path_logs, SCANDIR_SORT_ASCENDING) as $f) { | ||||||
|         if ($f[0] === '.') { | 		if ($f[0] === '.') { | ||||||
| 	        continue; | 			continue; | ||||||
|         } | 		} | ||||||
|  |  | ||||||
|         if (is_dir($server_path_logs . $f)) { | 		if (is_dir($server_path_logs . $f)) { | ||||||
|             foreach (scandir($server_path_logs . $f, SCANDIR_SORT_ASCENDING) as $f2) { | 			foreach (scandir($server_path_logs . $f, SCANDIR_SORT_ASCENDING) as $f2) { | ||||||
|                 if ($f2[0] === '.') { | 				if ($f2[0] === '.') { | ||||||
| 	                continue; | 					continue; | ||||||
|                 } | 				} | ||||||
|  |  | ||||||
|                 $files[] = array($f . '/' . $f2, $server_path_logs); | 				$files[] = array($f . '/' . $f2, $server_path_logs); | ||||||
|             } | 			} | ||||||
|  |  | ||||||
|             continue; | 			continue; | ||||||
|         } | 		} | ||||||
|  |  | ||||||
|         $files[] = array($f, $server_path_logs); | 		$files[] = array($f, $server_path_logs); | ||||||
|     } | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
| foreach ($files as &$f) { | foreach ($files as &$f) { | ||||||
|     $f['mtime'] = filemtime($f[1] . $f[0]); | 	$f['mtime'] = filemtime($f[1] . $f[0]); | ||||||
|     $f['name'] = $f[0]; | 	$f['name'] = $f[0]; | ||||||
| } | } | ||||||
| unset($f); | unset($f); | ||||||
|  |  | ||||||
| $twig->display('admin.logs.html.twig', array('files' => $files)); |  | ||||||
|  |  | ||||||
| define('EXIST_NONE', 0); | define('EXIST_NONE', 0); | ||||||
| define('EXIST_SERVER_LOG', 1); | define('EXIST_SERVER_LOG', 1); | ||||||
| @@ -72,10 +72,12 @@ if (!empty($file)) { | |||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		if ($exist !== EXIST_NONE) { | 		if ($exist !== EXIST_NONE) { | ||||||
| 			$content = nl2br(file_get_contents(($exist === EXIST_SERVER_LOG ? $server_path_logs : $aac_path_logs) . $file)); | 			$file_content = nl2br(file_get_contents(($exist === EXIST_SERVER_LOG ? $server_path_logs : $aac_path_logs) . $file)); | ||||||
| 			$twig->display('admin.logs.view.html.twig', array('file' => $file, 'content' => $content)); | 			$twig->display('admin.logs.view.html.twig', array('file' => $file, 'content' => $file_content)); | ||||||
| 		} | 		} | ||||||
| 	} else { | 	} else { | ||||||
| 		echo 'Invalid file name specified.'; | 		echo 'Invalid file name specified.'; | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
|  | $twig->display('admin.logs.html.twig', array('files' => $files)); | ||||||
|   | |||||||
| @@ -15,55 +15,69 @@ if (!hasFlag(FLAG_CONTENT_MAILER) && !superAdmin()) { | |||||||
| 	return; | 	return; | ||||||
| } | } | ||||||
|  |  | ||||||
| if (!$config['mail_enabled']) { | if (!config('mail_enabled')) { | ||||||
| 	echo 'Mail support disabled.'; | 	echo 'Mail support disabled in config.'; | ||||||
| 	return; | 	return; | ||||||
| } | } | ||||||
|  |  | ||||||
| $mail_content = isset($_POST['mail_content']) ? stripslashes($_POST['mail_content']) : 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; | ||||||
| $preview = isset($_REQUEST['preview']); | $mail_content = isset($_POST['mail_content']) ? stripslashes($_POST['mail_content']) : null; | ||||||
|  |  | ||||||
| $preview_done = false; | if (isset($_POST['submit'])) { | ||||||
| if ($preview) { | 	if (empty($mail_subject)) { | ||||||
| 	if (!empty($mail_content) && !empty($mail_subject)) { | 		warning('Please enter subject of the message.'); | ||||||
| 		$preview_done = _mail($account_logged->getCustomField('email'), $mail_subject, $mail_content); | 	} | ||||||
|  |  | ||||||
| 		if (!$preview_done) | 	if (empty($mail_content)) { | ||||||
| 			error('Error while sending preview mail. More info can be found in system/logs/mailer-error.log'); | 		warning('Please enter content of the message.'); | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  | if (!empty($mail_to)) { | ||||||
|  | 	if(!Validator::email($mail_to)) { | ||||||
| $twig->display('admin.mailer.html.twig', array( | 		warning('E-Mail is invalid.'); | ||||||
| 	'mail_subject' => $mail_subject, | 	} | ||||||
| 	'mail_content' => $mail_content, |  | ||||||
| 	'preview_done' => $preview_done |  | ||||||
| )); |  | ||||||
|  |  | ||||||
| if (empty($mail_content) || empty($mail_subject) || $preview) |  | ||||||
| 	return; |  | ||||||
|  |  | ||||||
| $success = 0; |  | ||||||
| $failed = 0; |  | ||||||
|  |  | ||||||
| $add = ''; |  | ||||||
| if ($config['account_mail_verify']) { |  | ||||||
| 	note('Note: Sending only to users with verified E-Mail.'); |  | ||||||
| 	$add = ' AND ' . $db->fieldName('email_verified') . ' = 1'; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| $query = $db->query('SELECT ' . $db->fieldName('email') . ' FROM ' . $db->tableName('accounts') . ' WHERE ' . $db->fieldName('email') . ' != ""' . $add); |  | ||||||
| foreach ($query as $email) { |  | ||||||
| 	if (_mail($email['email'], $mail_subject, $mail_content)) |  | ||||||
| 		$success++; |  | ||||||
| 	else { | 	else { | ||||||
| 		$failed++; | 		if (!empty($mail_content) && !empty($mail_subject)) { | ||||||
| 		echo '<br />'; | 			if (_mail($mail_to, $mail_subject, $mail_content)) { | ||||||
| 		error('An error occorred while sending email to <b>' . $email['email'] . '</b>. For Admin: More info can be found in system/logs/mailer-error.log'); | 				success("Successfully mailed <strong>$mail_to</strong>"); | ||||||
|  | 			} | ||||||
|  | 			else { | ||||||
|  | 				error("Error while sending mail to <strong>$mail_to</strong>. More info can be found in system/logs/mailer-error.log"); | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
| success('Mailing finished.'); | if (!empty($mail_content) && !empty($mail_subject) && empty($mail_to)) { | ||||||
| success("$success emails delivered."); | 	$success = 0; | ||||||
| warning("$failed emails failed."); | 	$failed = 0; | ||||||
|  |  | ||||||
|  | 	$add = ''; | ||||||
|  | 	if (config('account_mail_verify')) { | ||||||
|  | 		note('Note: Sending only to users with verified E-Mail.'); | ||||||
|  | 		$add = ' AND `email_verified` = 1'; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	$query = $db->query('SELECT `email` FROM `accounts` WHERE `email` != ""' . $add); | ||||||
|  | 	foreach ($query as $email) { | ||||||
|  | 		if (_mail($email['email'], $mail_subject, $mail_content)) { | ||||||
|  | 			$success++; | ||||||
|  | 		} | ||||||
|  | 		else { | ||||||
|  | 			$failed++; | ||||||
|  | 			echo '<br />'; | ||||||
|  | 			error('An error occorred while sending email to <b>' . $email['email'] . '</b>. For Admin: More info can be found in system/logs/mailer-error.log'); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	success('Mailing finished.'); | ||||||
|  | 	success("$success emails delivered."); | ||||||
|  | 	warning("$failed emails failed."); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | $twig->display('admin.mailer.html.twig', [ | ||||||
|  | 	'mail_to' => $mail_to, | ||||||
|  | 	'mail_subject' => $mail_subject, | ||||||
|  | 	'mail_content' => $mail_content | ||||||
|  | ]); | ||||||
|   | |||||||
							
								
								
									
										215
									
								
								admin/pages/mass_account.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,215 @@ | |||||||
|  | <?php | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * Account Admin Tool | ||||||
|  |  * | ||||||
|  |  * @package   MyAAC | ||||||
|  |  * @author    Slawkens <slawkens@gmail.com> | ||||||
|  |  * @author    Lee | ||||||
|  |  * @copyright 2020 MyAAC | ||||||
|  |  * @link      https://my-aac.org | ||||||
|  |  */ | ||||||
|  | defined('MYAAC') or die('Direct access not allowed!'); | ||||||
|  |  | ||||||
|  | $title = 'Mass Account Actions'; | ||||||
|  |  | ||||||
|  | $hasCoinsColumn = $db->hasColumn('accounts', 'coins'); | ||||||
|  | $hasPointsColumn = $db->hasColumn('accounts', 'premium_points'); | ||||||
|  | $freePremium = $config['lua']['freePremium']; | ||||||
|  |  | ||||||
|  | function admin_give_points($points) | ||||||
|  | { | ||||||
|  | 	global $db, $hasPointsColumn; | ||||||
|  |  | ||||||
|  | 	if (!$hasPointsColumn) { | ||||||
|  | 		displayMessage('Points not supported.'); | ||||||
|  | 		return; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	$statement = $db->prepare('UPDATE `accounts` SET `premium_points` = `premium_points` + :points'); | ||||||
|  | 	if (!$statement) { | ||||||
|  | 		displayMessage('Failed to prepare query statement.'); | ||||||
|  | 		return; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	if (!$statement->execute([ | ||||||
|  | 		'points' => $points | ||||||
|  | 	])) { | ||||||
|  | 		displayMessage('Failed to add points.'); | ||||||
|  | 		return; | ||||||
|  | 	} | ||||||
|  | 	displayMessage($points . ' points added to all accounts.', true); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function admin_give_coins($coins) | ||||||
|  | { | ||||||
|  | 	global $db, $hasCoinsColumn; | ||||||
|  |  | ||||||
|  | 	if (!$hasCoinsColumn) { | ||||||
|  | 		displayMessage('Coins not supported.'); | ||||||
|  | 		return; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	$statement = $db->prepare('UPDATE `accounts` SET `coins` = `coins` + :coins'); | ||||||
|  | 	if (!$statement) { | ||||||
|  | 		displayMessage('Failed to prepare query statement.'); | ||||||
|  | 		return; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	if (!$statement->execute([ | ||||||
|  | 		'coins' => $coins | ||||||
|  | 	])) { | ||||||
|  | 		displayMessage('Failed to add coins.'); | ||||||
|  | 		return; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	displayMessage($coins . ' coins added to all accounts.', true); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function query_add_premium($column, $value_query, $condition_query = '1=1', $params = []) | ||||||
|  | { | ||||||
|  | 	global $db; | ||||||
|  |  | ||||||
|  | 	$statement = $db->prepare("UPDATE `accounts` SET `{$column}` = $value_query WHERE $condition_query"); | ||||||
|  | 	if (!$statement) { | ||||||
|  | 		displayMessage('Failed to prepare query statement.'); | ||||||
|  | 		return false; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	if (!$statement->execute($params)) { | ||||||
|  | 		displayMessage('Failed to add premium days.'); | ||||||
|  | 		return false; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return true; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function admin_give_premdays($days) | ||||||
|  | { | ||||||
|  | 	global $db, $freePremium; | ||||||
|  |  | ||||||
|  | 	if ($freePremium) { | ||||||
|  | 		displayMessage('Premium days not supported. Free Premium enabled.'); | ||||||
|  | 		return; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	$value = $days * 86400; | ||||||
|  | 	$now = time(); | ||||||
|  | 	// othire | ||||||
|  | 	if ($db->hasColumn('accounts', 'premend')) { | ||||||
|  | 		// append premend | ||||||
|  | 		if (query_add_premium('premend', '`premend` + :value', '`premend` > :now', ['value' => $value, 'now' => $now])) { | ||||||
|  | 			// set premend | ||||||
|  | 			if (query_add_premium('premend', ':value', '`premend` <= :now', ['value' => $now + $value, 'now' => $now])) { | ||||||
|  | 				displayMessage($days . ' premium days added to all accounts.', true); | ||||||
|  | 				return; | ||||||
|  | 			} else { | ||||||
|  | 				displayMessage('Failed to execute set query.'); | ||||||
|  | 				return; | ||||||
|  | 			} | ||||||
|  | 		} else { | ||||||
|  | 			displayMessage('Failed to execute append query.'); | ||||||
|  | 			return; | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		return; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// tfs 0.x | ||||||
|  | 	if ($db->hasColumn('accounts', 'premdays')) { | ||||||
|  | 		// append premdays | ||||||
|  | 		if (query_add_premium('premdays', '`premdays` + :value', '1=1', ['value' => $days])) { | ||||||
|  | 			// append lastday | ||||||
|  | 			if (query_add_premium('lastday', '`lastday` + :value', '`lastday` > :now', ['value' => $value, 'now' => $now])) { | ||||||
|  | 				// set lastday | ||||||
|  | 				if (query_add_premium('lastday', ':value', '`lastday` <= :now', ['value' => $now + $value, 'now' => $now])) { | ||||||
|  | 					displayMessage($days . ' premium days added to all accounts.', true); | ||||||
|  | 					return; | ||||||
|  | 				} else { | ||||||
|  | 					displayMessage('Failed to execute set query.'); | ||||||
|  | 					return; | ||||||
|  | 				} | ||||||
|  |  | ||||||
|  | 				return; | ||||||
|  | 			} else { | ||||||
|  | 				displayMessage('Failed to execute append query.'); | ||||||
|  | 				return; | ||||||
|  | 			} | ||||||
|  | 		} else { | ||||||
|  | 			displayMessage('Failed to execute set days query.'); | ||||||
|  | 			return; | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		return; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// tfs 1.x | ||||||
|  | 	if ($db->hasColumn('accounts', 'premium_ends_at')) { | ||||||
|  | 		// append premium_ends_at | ||||||
|  | 		if (query_add_premium('premium_ends_at', '`premium_ends_at` + :value', '`premium_ends_at` > :now', ['value' => $value, 'now' => $now])) { | ||||||
|  | 			// set premium_ends_at | ||||||
|  | 			if (query_add_premium('premium_ends_at', ':value', '`premium_ends_at` <= :now', ['value' => $now + $value, 'now' => $now])) { | ||||||
|  | 				displayMessage($days . ' premium days added to all accounts.', true); | ||||||
|  | 				return; | ||||||
|  | 			} else { | ||||||
|  | 				displayMessage('Failed to execute set query.'); | ||||||
|  | 				return; | ||||||
|  | 			} | ||||||
|  | 		} else { | ||||||
|  | 			displayMessage('Failed to execute append query.'); | ||||||
|  | 			return; | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		return; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	displayMessage('Premium Days not supported.'); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | if (isset($_POST['action']) && $_POST['action']) { | ||||||
|  |  | ||||||
|  | 	$action = $_POST['action']; | ||||||
|  |  | ||||||
|  | 	if (preg_match("/[^A-z0-9_\-]/", $action)) { | ||||||
|  | 		displayMessage('Invalid action.'); | ||||||
|  | 	} else { | ||||||
|  | 		$value = isset($_POST['value']) ? intval($_POST['value']) : 0; | ||||||
|  |  | ||||||
|  | 		if (!$value) { | ||||||
|  | 			displayMessage('Please fill all inputs'); | ||||||
|  | 		} else { | ||||||
|  | 			switch ($action) { | ||||||
|  | 				case 'give-points': | ||||||
|  | 					admin_give_points($value); | ||||||
|  | 					break; | ||||||
|  | 				case 'give-coins': | ||||||
|  | 					admin_give_coins($value); | ||||||
|  | 					break; | ||||||
|  | 				case 'give-premdays': | ||||||
|  | 					admin_give_premdays($value); | ||||||
|  | 					break; | ||||||
|  | 				default: | ||||||
|  | 					displayMessage('Action ' . $action . 'not found.'); | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | else { | ||||||
|  | 	$twig->display('admin.tools.account.html.twig', array( | ||||||
|  | 		'hasCoinsColumn' => $hasCoinsColumn, | ||||||
|  | 		'hasPointsColumn' => $hasPointsColumn, | ||||||
|  | 		'freePremium' => $freePremium, | ||||||
|  | 	)); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function displayMessage($message, $success = false) { | ||||||
|  | 	global $twig, $hasCoinsColumn, $hasPointsColumn, $freePremium; | ||||||
|  |  | ||||||
|  | 	$success ? success($message): error($message); | ||||||
|  |  | ||||||
|  | 	$twig->display('admin.tools.account.html.twig', array( | ||||||
|  | 		'hasCoinsColumn' => $hasCoinsColumn, | ||||||
|  | 		'hasPointsColumn' => $hasPointsColumn, | ||||||
|  | 		'freePremium' => $freePremium, | ||||||
|  | 	)); | ||||||
|  | } | ||||||
							
								
								
									
										116
									
								
								admin/pages/mass_teleport.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,116 @@ | |||||||
|  | <?php | ||||||
|  | /** | ||||||
|  |  * Teleport Admin Tool | ||||||
|  |  * | ||||||
|  |  * @package   MyAAC | ||||||
|  |  * @author    Slawkens <slawkens@gmail.com> | ||||||
|  |  * @author    Lee | ||||||
|  |  * @copyright 2020 MyAAC | ||||||
|  |  * @link      https://my-aac.org | ||||||
|  |  */ | ||||||
|  | defined('MYAAC') or die('Direct access not allowed!'); | ||||||
|  |  | ||||||
|  | $title = 'Mass Teleport Actions'; | ||||||
|  |  | ||||||
|  | function admin_teleport_position($x, $y, $z) { | ||||||
|  | 	global $db; | ||||||
|  | 	$statement = $db->prepare('UPDATE `players` SET `posx` = :x, `posy` = :y, `posz` = :z'); | ||||||
|  | 	if (!$statement) { | ||||||
|  | 		displayMessage('Failed to prepare query statement.'); | ||||||
|  | 		return; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	if (!$statement->execute([ | ||||||
|  | 		'x' => $x, 'y' => $y, 'z' => $z | ||||||
|  | 	])) { | ||||||
|  | 		displayMessage('Failed to execute query.'); | ||||||
|  | 		return; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	displayMessage('Player\'s position updated.', true); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function admin_teleport_town($town_id) { | ||||||
|  | 	global $db; | ||||||
|  | 	$statement = $db->prepare('UPDATE `players` SET `town_id` = :town_id'); | ||||||
|  | 	if (!$statement) { | ||||||
|  | 		displayMessage('Failed to prepare query statement.'); | ||||||
|  | 		return; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	if (!$statement->execute([ | ||||||
|  | 		'town_id' => $town_id | ||||||
|  | 	])) { | ||||||
|  | 		displayMessage('Failed to execute query.'); | ||||||
|  | 		return; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	displayMessage('Player\'s town updated.', true); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | if (isset($_POST['action']) && $_POST['action'])    { | ||||||
|  |  | ||||||
|  | 	$action = $_POST['action']; | ||||||
|  |  | ||||||
|  | 	if (preg_match("/[^A-z0-9_\-]/", $action)) { | ||||||
|  | 		displayMessage('Invalid action.'); | ||||||
|  | 	} else { | ||||||
|  |  | ||||||
|  | 		$playersOnline = 0; | ||||||
|  | 		if($db->hasTable('players_online')) {// tfs 1.0 | ||||||
|  | 			$query = $db->query('SELECT count(*) AS `count` FROM `players_online`'); | ||||||
|  | 		} else { | ||||||
|  | 			$query = $db->query('SELECT count(*) AS `count` FROM `players` WHERE `players`.`online` > 0'); | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		$playersOnline = $query->fetch(PDO::FETCH_ASSOC); | ||||||
|  | 		if ($playersOnline['count'] > 0) { | ||||||
|  | 			displayMessage('Please, close the server before execute this action otherwise players will not be affected.'); | ||||||
|  | 			return; | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		$town_id = isset($_POST['town_id']) ? intval($_POST['town_id']) : null; | ||||||
|  | 		$posx = isset($_POST['posx']) ? intval($_POST['posx']) : null; | ||||||
|  | 		$posy = isset($_POST['posy']) ? intval($_POST['posy']) : null; | ||||||
|  | 		$posz = isset($_POST['posz']) ? intval($_POST['posz']) : null; | ||||||
|  | 		$to_temple = $_POST['to_temple'] ?? null; | ||||||
|  |  | ||||||
|  | 		switch ($action) { | ||||||
|  | 			case 'set-town': | ||||||
|  | 				if (!$town_id) { | ||||||
|  | 					displayMessage('Please fill all inputs'); | ||||||
|  | 					return; | ||||||
|  | 				} | ||||||
|  |  | ||||||
|  | 				if (!isset($config['towns'][$town_id])) { | ||||||
|  | 					displayMessage('Specified town does not exist'); | ||||||
|  | 					return; | ||||||
|  | 				} | ||||||
|  |  | ||||||
|  | 				admin_teleport_town($town_id); | ||||||
|  | 				break; | ||||||
|  | 			case 'set-position': | ||||||
|  | 				if (!$to_temple &&  ($posx < 0 || $posx > 65535 || $posy < 0 || $posy > 65535|| $posz < 0 || $posz > 16)) { | ||||||
|  | 					displayMessage('Invalid Position'); | ||||||
|  | 					return; | ||||||
|  | 				} | ||||||
|  |  | ||||||
|  | 				admin_teleport_position($posx, $posy, $posz); | ||||||
|  | 				break; | ||||||
|  | 			default: | ||||||
|  | 				displayMessage('Action ' . $action . 'not found.'); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | } | ||||||
|  | else { | ||||||
|  | 	$twig->display('admin.tools.teleport.html.twig', array()); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | function displayMessage($message, $success = false) { | ||||||
|  | 	global $twig; | ||||||
|  |  | ||||||
|  | 	$success ? success($message): error($message); | ||||||
|  | 	$twig->display('admin.tools.teleport.html.twig', array()); | ||||||
|  | } | ||||||
| @@ -46,7 +46,6 @@ if (isset($_REQUEST['template'])) { | |||||||
| 		if ($cache->enabled()) { | 		if ($cache->enabled()) { | ||||||
| 			$cache->delete('template_menus'); | 			$cache->delete('template_menus'); | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		success('Saved at ' . date('H:i')); | 		success('Saved at ' . date('H:i')); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| @@ -57,70 +56,73 @@ if (isset($_REQUEST['template'])) { | |||||||
| 		echo 'Cannot find template config.php file.'; | 		echo 'Cannot find template config.php file.'; | ||||||
| 		return; | 		return; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	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; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	echo 'Hint: You can drag menu items.<br/> | 	$title = 'Menus - ' . $template; | ||||||
| 	Hint: Add links to external sites using: <b>http://</b> or <b>https://</b> prefix.<br/> | 	?> | ||||||
| 	Not all templates support blank and colorful links.<br/><br/> | 	<div align="center" class="text-center"> | ||||||
|     <div class="row">'; | 		<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> | ||||||
|  | 	</div> | ||||||
|  | 	<?php | ||||||
| 	$menus = array(); | 	$menus = array(); | ||||||
| 	$menus_db = $db->query('SELECT `name`, `link`, `blank`, `color`, `category`, `ordering` FROM `' . TABLE_PREFIX . 'menu` WHERE `enabled` = 1 AND `template` = ' . $db->quote($template) . ' ORDER BY `ordering` ASC;')->fetchAll(); | 	$menus_db = $db->query('SELECT `name`, `link`, `blank`, `color`, `category`, `ordering` FROM `' . TABLE_PREFIX . 'menu` WHERE `enabled` = 1 AND `template` = ' . $db->quote($template) . ' ORDER BY `ordering` ASC;')->fetchAll(); | ||||||
| 	foreach ($menus_db as $menu) { | 	foreach ($menus_db as $menu) { | ||||||
| 		$menus[$menu['category']][] = array('name' => $menu['name'], 'link' => $menu['link'], 'blank' => $menu['blank'], 'color' => $menu['color'], 'ordering' => $menu['ordering']); | 		$menus[$menu['category']][] = array('name' => $menu['name'], 'link' => $menu['link'], 'blank' => $menu['blank'], 'color' => $menu['color'], 'ordering' => $menu['ordering']); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	$last_id = array(); | 	$last_id = array(); | ||||||
| 	echo '<form method="post" id="menus-form" action="?p=menus">'; | 	?> | ||||||
| 	echo '<input type="hidden" name="template" value="' . $template . '"/>'; | 	<form method="post" id="menus-form" action="?p=menus"> | ||||||
| 	foreach ($config['menu_categories'] as $id => $cat) { | 		<input type="hidden" name="template" value="<?php echo $template ?>"/> | ||||||
| 		echo '        <div class="col-md-12 col-lg-6"> | 		<div class="row"> | ||||||
|             <div class="box box-danger"> | 			<?php foreach ($config['menu_categories'] as $id => $cat): ?> | ||||||
|                 <div class="box-header with-border"> | 				<div class="col-md-12 col-lg-6"> | ||||||
|                     <h3 class="box-title">' . $cat['name'] . ' <img class="add-button" id="add-button-' . $id . '" src="' . BASE_URL . 'images/plus.png" width="16" height="16"/></h3> | 					<div class="card card-info card-outline"> | ||||||
|                 </div> | 						<div class="card-header"> | ||||||
|                 <div class="box-body">'; | 							<h5 class="m-0"><?php echo $cat['name'] ?> <i class="far fa-plus-square add-button" id="add-button-<?php echo $id ?>"></i></h5> | ||||||
|  | 						</div> | ||||||
|  | 						<div class="card-body"> | ||||||
| 		echo '<ul class="sortable" id="sortable-' . $id . '">'; | 							<ul class="sortable" id="sortable-<?php echo $id ?>"> | ||||||
| 		if (isset($menus[$id])) { | 								<?php | ||||||
| 			$i = 0; | 								if (isset($menus[$id])) { | ||||||
| 			foreach ($menus[$id] as $menu) { | 									foreach ($menus[$id] as $i => $menu): | ||||||
| 				echo '<li class="ui-state-default" id="list-' . $id . '-' . $i . '"><label>Name:</label><input type="text" name="menu[' . $id . '][]" value="' . escapeHtml($menu['name']) . '"/> | 										?> | ||||||
| 				<label>Link:</label><input type="text" name="menu_link[' . $id . '][]" value="' . $menu['link'] . '"/> | 										<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']); ?>"/> | ||||||
| 				<input type="hidden" name="menu_blank[' . $id . '][]" value="0" /> | 											<label>Link:</label> <input type="text" name="menu_link[<?php echo $id ?>][]" value="<?php echo $menu['link'] ?>"/> | ||||||
| 				<label><input class="blank-checkbox" type="checkbox" ' . ($menu['blank'] == 1 ? 'checked' : '') . '/><span title="Open in New Window">Open in New Window</span></label> | 											<input type="hidden" name="menu_blank[<?php echo $id ?>][]" value="0"/> | ||||||
| 				 | 											<label><input class="blank-checkbox" type="checkbox" <?php echo($menu['blank'] == 1 ? 'checked' : '') ?>/><span title="Open in New Window">New Window</span></label> | ||||||
| 				<input class="color-picker" type="text" name="menu_color[' . $id . '][]" value="#' . $menu['color'] . '" /> | 											<input class="color-picker" type="text" name="menu_color[<?php echo $id ?>][]" value="#<?php echo $menu['color'] ?>"/> | ||||||
| 				 | 											<a class="remove-button" id="remove-button-<?php echo $id ?>-<?php echo $i ?>"><i class="fas fa-trash"></a></i></li> | ||||||
| 				<a class="remove-button" id="remove-button-' . $id . '-' . $i . '"><img src="' . BASE_URL . 'images/del.png"/></a></li>'; | 										<?php $last_id[$id] = $i; | ||||||
|  | 									endforeach; | ||||||
| 				$i++; | 								} ?> | ||||||
| 				$last_id[$id] = $i; | 							</ul> | ||||||
| 			} | 						</div> | ||||||
| 		} | 					</div> | ||||||
|  | 				</div> | ||||||
| 		echo '</ul>'; | 			<?php endforeach ?> | ||||||
| 		echo '                </div> | 		</div> | ||||||
|             </div> | 		<div class="row pb-2"> | ||||||
|         </div> | 			<div class="col-md-12"> | ||||||
| '; | 				<button type="submit" class="btn btn-info"><i class="fas fa-update"></i> Save</button> | ||||||
| 	} | 				<?php | ||||||
| 	echo ' </div><div class="row"><div class="col-md-6">'; | 				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 '<input type="submit" class="btn btn-info" value="Save">'; | 				?> | ||||||
| 	echo '<input type="button" class="btn btn-default pull-right" value="Cancel" onclick="window.location = \'' . ADMIN_URL . '?p=menus&template=' . $template . '\';">'; | 			</div> | ||||||
| 	echo '</div></div>'; | 		</div> | ||||||
| 	echo '</form>'; | 	</form> | ||||||
|  | 	<?php | ||||||
| 	$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 | ||||||
| 	)); | 	)); | ||||||
| 	?> | 	?> | ||||||
|  |  | ||||||
| 	<?php | 	<?php | ||||||
| } else { | } else { | ||||||
| 	$templates = $db->query('SELECT `template` FROM `' . TABLE_PREFIX . 'menu` GROUP BY `template`;')->fetchAll(); | 	$templates = $db->query('SELECT `template` FROM `' . TABLE_PREFIX . 'menu` GROUP BY `template`;')->fetchAll(); | ||||||
|   | |||||||
							
								
								
									
										6
									
								
								admin/pages/modules/balance.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,6 @@ | |||||||
|  | <?php | ||||||
|  | $balance = ($db->hasColumn('players', 'balance') ? $db->query('SELECT `balance`, `id`, `name`,`level` FROM `players` ORDER BY `balance` DESC LIMIT 10;') : 0); | ||||||
|  |  | ||||||
|  | $twig->display('balance.html.twig', array( | ||||||
|  | 	'balance' => $balance | ||||||
|  | )); | ||||||
| @@ -1,10 +1,5 @@ | |||||||
| <?php | <?php | ||||||
|  | $coins = ($db->hasColumn('accounts', 'coins') ?  $db->query('SELECT `coins`, `' . (USE_ACCOUNT_NAME ? 'name' : 'id') . '` as `name` FROM `accounts` ORDER BY `coins` DESC LIMIT 10;') : 0); | ||||||
| if ($db->hasColumn('accounts', 'coins')) { |  | ||||||
| 	$coins = $db->query('SELECT `coins`, `' . (USE_ACCOUNT_NAME ? 'name' : 'id') . '` as `name` FROM `accounts` ORDER BY `coins` DESC LIMIT 10;'); |  | ||||||
| } else { |  | ||||||
| 	$coins = 0; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| $twig->display('coins.html.twig', array( | $twig->display('coins.html.twig', array( | ||||||
| 	'coins' => $coins | 	'coins' => $coins | ||||||
|   | |||||||
							
								
								
									
										6
									
								
								admin/pages/modules/created.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,6 @@ | |||||||
|  | <?php | ||||||
|  | $players = ($db->hasColumn('accounts', 'created') ? $db->query('SELECT `created`, `' . (USE_ACCOUNT_NAME ? 'name' : 'id') . '` as `name` FROM `accounts` ORDER BY `created` DESC LIMIT 10;') : 0); | ||||||
|  |  | ||||||
|  | $twig->display('created.html.twig', array( | ||||||
|  | 	'players' => $players, | ||||||
|  | )); | ||||||
| @@ -1,11 +1,5 @@ | |||||||
| <?php | <?php | ||||||
|  | $players = ($db->hasColumn('players', 'lastlogin') ? $db->query('SELECT name, level, lastlogin FROM players ORDER BY lastlogin DESC LIMIT 10;') : 0); | ||||||
| if ($db->hasColumn('players', 'lastlogin')) { |  | ||||||
| 	$players = $db->query('SELECT name, level, lastlogin FROM players ORDER BY lastlogin DESC LIMIT 10;'); |  | ||||||
| } else { |  | ||||||
| 	$players = 0; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| $twig->display('lastlogin.html.twig', array( | $twig->display('lastlogin.html.twig', array( | ||||||
| 	'players' => $players, | 	'players' => $players, | ||||||
| )); | )); | ||||||
| @@ -1,9 +1,5 @@ | |||||||
| <?php | <?php | ||||||
| if ($db->hasColumn('accounts', 'premium_points')) { | $points = ($db->hasColumn('accounts', 'premium_points') ? $db->query('SELECT `premium_points`, `' . (USE_ACCOUNT_NAME ? 'name' : 'id') . '` as `name` FROM `accounts` ORDER BY `premium_points` DESC LIMIT 10;') : 0); | ||||||
| 	$points = $db->query('SELECT `premium_points`, `' . (USE_ACCOUNT_NAME ? 'name' : 'id') . '` as `name` FROM `accounts` ORDER BY `premium_points` DESC LIMIT 10;'); |  | ||||||
| } else { |  | ||||||
| 	$points = 0; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| $twig->display('points.html.twig', array( | $twig->display('points.html.twig', array( | ||||||
| 	'points' => $points, | 	'points' => $points, | ||||||
|   | |||||||
							
								
								
									
										46
									
								
								admin/pages/modules/server_status.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,46 @@ | |||||||
|  | <?php | ||||||
|  | defined('MYAAC') or die('Direct access not allowed!'); | ||||||
|  | if (isset($status)) { | ||||||
|  |  | ||||||
|  | 	$error_icon = '<i class="fas fa-exclamation-circle text-danger"></i>'; ?> | ||||||
|  | 	<div class=" col-md-6 col-lg-6"> | ||||||
|  | 		<div class="card card-info card-outline"> | ||||||
|  | 			<div class="card-header border-bottom-0"> | ||||||
|  | 				<span class="font-weight-bold m-0">Server Status</span> <span class="float-right small"><b>Last checked</b>: <?php echo(isset($status['lastCheck']) ? date("l, d.m.Y H:i:s", $status['lastCheck']) : $error_icon); ?></span> | ||||||
|  | 			</div> | ||||||
|  | 			<div class="card-body p-0 "> | ||||||
|  | 				<table class="table"> | ||||||
|  | 					<tbody> | ||||||
|  | 					<tr> | ||||||
|  | 						<th width="30%">Server</th> | ||||||
|  | 						<td><?php echo(isset($status['server']) & isset($status['serverVersion']) ? $status['server'] . ' x ' . $status['serverVersion'] : $error_icon) ?></td> | ||||||
|  |  | ||||||
|  | 					</tr> | ||||||
|  | 					<tr> | ||||||
|  | 						<th>Client</th> | ||||||
|  | 						<td><?php echo(isset($status['clientVersion']) ? $status['clientVersion'] : $error_icon) ?></td> | ||||||
|  | 					</tr> | ||||||
|  | 					<tr> | ||||||
|  | 						<th>Map</th> | ||||||
|  | 						<td> | ||||||
|  | 							<?php if (isset($status['mapName']) & isset($status['mapAuthor']) & isset($status['mapWidth']) & isset($status['mapHeight'])) { | ||||||
|  | 								echo $status['mapName'] . ' by <b>' . $status['mapAuthor'] . '</b><br/>' . $status['mapWidth'] . ' x ' . $status['mapHeight']; | ||||||
|  | 							} else { | ||||||
|  | 								echo $error_icon; | ||||||
|  | 							} ?> | ||||||
|  | 						</td> | ||||||
|  | 					</tr> | ||||||
|  | 					<tr> | ||||||
|  | 						<th>Monsters</th> | ||||||
|  | 						<td><?php echo (isset($status['monsters']) ? $status['monsters'] : $error_icon); ?></td> | ||||||
|  | 					</tr> | ||||||
|  | 					<tr> | ||||||
|  | 						<th>MOTD:</th> | ||||||
|  | 						<td><?php echo(isset($status['motd']) ? $status['motd'] : $error_icon); ?></td> | ||||||
|  | 					</tr> | ||||||
|  | 					</tbody> | ||||||
|  | 				</table> | ||||||
|  | 			</div> | ||||||
|  | 		</div> | ||||||
|  | 	</div> | ||||||
|  | <?php } ?> | ||||||
							
								
								
									
										12
									
								
								admin/pages/modules/statistics.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,12 @@ | |||||||
|  | <?php | ||||||
|  | defined('MYAAC') or die('Direct access not allowed!'); | ||||||
|  | $count = $db->query('SELECT | ||||||
|  |   (SELECT COUNT(*) FROM `accounts`) as total_accounts,  | ||||||
|  |   (SELECT COUNT(*) FROM `players`) as total_players, | ||||||
|  |   (SELECT COUNT(*) FROM `guilds`) as total_guilds, | ||||||
|  |   (SELECT COUNT(*) FROM `' . TABLE_PREFIX . 'monsters`) as total_monsters, | ||||||
|  |   (SELECT COUNT(*) FROM `houses`) as total_houses;')->fetch(); | ||||||
|  |  | ||||||
|  | $twig->display('statistics.html.twig', array( | ||||||
|  | 	'count' => $count, | ||||||
|  | )); | ||||||
							
								
								
									
										31
									
								
								admin/pages/modules/templates/balance.html.twig
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,31 @@ | |||||||
|  | {% if balance is iterable %} | ||||||
|  | 	<div class=" col-md-6 col-lg-3"> | ||||||
|  | 		<div class="card card-info card-outline"> | ||||||
|  | 			<div class="card-header"> | ||||||
|  | 				<h5 class="m-0">Top 10 - Balance</h5> | ||||||
|  | 			</div> | ||||||
|  | 			<div class="card-body p-0"> | ||||||
|  | 				<table class="table table-striped table-condensed"> | ||||||
|  | 					<thead> | ||||||
|  | 					<tr> | ||||||
|  | 						<th>#</th> | ||||||
|  | 						<th>Player</th> | ||||||
|  | 						<th>Balance</th> | ||||||
|  | 					</tr> | ||||||
|  | 					</thead> | ||||||
|  | 					<tbody> | ||||||
|  | 					{% set i = 0 %} | ||||||
|  | 					{% for result in balance %} | ||||||
|  | 						{% set i = i + 1 %} | ||||||
|  | 						<tr> | ||||||
|  | 							<th>{{ i }}</th> | ||||||
|  | 							<td><a href="?p=players&search_name={{ result.name }}">{{ result.name }}</a></td> | ||||||
|  | 							<td>{{ result.balance }}</td> | ||||||
|  | 						</tr> | ||||||
|  | 					{% endfor %} | ||||||
|  | 					</tbody> | ||||||
|  | 				</table> | ||||||
|  | 			</div> | ||||||
|  | 		</div> | ||||||
|  | 	</div> | ||||||
|  | {% endif %} | ||||||
| @@ -1,23 +1,25 @@ | |||||||
| {% if coins is iterable %} | {% if coins is iterable %} | ||||||
| 	<div class="col-md-3"> | 	<div class=" col-md-6 col-lg-3"> | ||||||
| 		<div class="box"> | 		<div class="card card-info card-outline"> | ||||||
| 			<div class="box-header"> | 			<div class="card-header"> | ||||||
| 				<h3 class="box-title">Top 10 - Most coins</h3> | 				<h5 class="m-0">Top 10 - Most coins</h5> | ||||||
| 			</div> | 			</div> | ||||||
| 			<div class="box-body no-padding"> | 			<div class="card-body p-0"> | ||||||
| 				<table class="table table-condensed"> | 				<table class="table table-striped table-condensed"> | ||||||
| 					<tbody> | 					<thead> | ||||||
| 					<tr> | 					<tr> | ||||||
| 						<th>#</th> | 						<th>#</th> | ||||||
| 						<th>Account {{ account_type }}</th> | 						<th>Account</th> | ||||||
| 						<th>Tibia coins</th> | 						<th>Tibia coins</th> | ||||||
| 					</tr> | 					</tr> | ||||||
|  | 					</thead> | ||||||
|  | 					<tbody> | ||||||
| 					{% set i = 0 %} | 					{% set i = 0 %} | ||||||
| 					{% for result in coins %} | 					{% for result in coins %} | ||||||
| 						{% set i = i + 1 %} | 						{% set i = i + 1 %} | ||||||
| 						<tr> | 						<tr> | ||||||
| 							<td>{{ i }}</td> | 							<th>{{ i }}</th> | ||||||
| 							<td>{{ result.name }}</td> | 							<td><a href="?p=accounts&search_name={{ result.name }}">{{ result.name }}</a></td> | ||||||
| 							<td>{{ result.coins }}</td> | 							<td>{{ result.coins }}</td> | ||||||
| 						</tr> | 						</tr> | ||||||
| 					{% endfor %} | 					{% endfor %} | ||||||
|   | |||||||
							
								
								
									
										31
									
								
								admin/pages/modules/templates/created.html.twig
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,31 @@ | |||||||
|  | {% if players is iterable %} | ||||||
|  | 	<div class=" col-md-6 col-lg-3"> | ||||||
|  | 		<div class="card card-info card-outline"> | ||||||
|  | 			<div class="card-header"> | ||||||
|  | 				<h5 class="m-0">Last 10 created</h5> | ||||||
|  | 			</div> | ||||||
|  | 			<div class="card-body p-0"> | ||||||
|  | 				<table class="table table-striped table-condensed"> | ||||||
|  | 					<thead> | ||||||
|  | 					<tr> | ||||||
|  | 						<th>#</th> | ||||||
|  | 						<th>Account</th> | ||||||
|  | 						<th>Creation Date</th> | ||||||
|  | 					</tr> | ||||||
|  | 					</thead> | ||||||
|  | 					<tbody> | ||||||
|  | 					{% set i = 0 %} | ||||||
|  | 					{% for result in players %} | ||||||
|  | 						{% set i = i + 1 %} | ||||||
|  | 						<tr> | ||||||
|  | 							<th>{{ i }}</th> | ||||||
|  | 							<td><a href="?p=accounts&search_name={{ result.name }}">{{ result.name }}</a></td> | ||||||
|  | 							<td>{{ result.created|date("M d Y, H:i:s") }}</td> | ||||||
|  | 						</tr> | ||||||
|  | 					{% endfor %} | ||||||
|  | 					</tbody> | ||||||
|  | 				</table> | ||||||
|  | 			</div> | ||||||
|  | 		</div> | ||||||
|  | 	</div> | ||||||
|  | {% endif %} | ||||||
| @@ -1,23 +1,25 @@ | |||||||
| {% if players is iterable %} | {% if players is iterable %} | ||||||
| 	<div class="col-md-3"> | 	<div class=" col-md-6 col-lg-3"> | ||||||
| 		<div class="box"> | 		<div class="card card-info card-outline"> | ||||||
| 			<div class="box-header"> | 			<div class="card-header"> | ||||||
| 				<h3 class="box-title">Last 10 Logins</h3> | 				<h5 class="m-0">Last 10 logins</h5> | ||||||
| 			</div> | 			</div> | ||||||
| 			<div class="box-body no-padding"> | 			<div class="card-body p-0"> | ||||||
| 				<table class="table table-condensed"> | 				<table class="table table-striped table-condensed"> | ||||||
| 					<tbody> | 					<thead> | ||||||
| 					<tr> | 					<tr> | ||||||
| 						<th>#</th> | 						<th>#</th> | ||||||
| 						<th>Player</th> | 						<th>Player</th> | ||||||
| 						<th>Login Date</th> | 						<th>Login Date</th> | ||||||
| 					</tr> | 					</tr> | ||||||
|  | 					</thead> | ||||||
|  | 					<tbody> | ||||||
| 					{% set i = 0 %} | 					{% set i = 0 %} | ||||||
| 					{% for result in players %} | 					{% for result in players %} | ||||||
| 						{% set i = i + 1 %} | 						{% set i = i + 1 %} | ||||||
| 						<tr> | 						<tr> | ||||||
| 							<td>{{ i }}</td> | 							<th>{{ i }}</th> | ||||||
| 							<td>{{ result.name }}</td> | 							<td><a href="?p=players&search_name={{ result.name }}">{{ result.name }}</a></td> | ||||||
| 							<td>{{ result.lastlogin|date("M d Y, H:i:s") }}</td> | 							<td>{{ result.lastlogin|date("M d Y, H:i:s") }}</td> | ||||||
| 						</tr> | 						</tr> | ||||||
| 					{% endfor %} | 					{% endfor %} | ||||||
|   | |||||||
| @@ -1,23 +1,25 @@ | |||||||
| {% if points is iterable %} | {% if points is iterable %} | ||||||
| 	<div class="col-md-3"> | 	<div class=" col-md-6 col-lg-3"> | ||||||
| 		<div class="box"> | 		<div class="card card-info card-outline"> | ||||||
| 			<div class="box-header"> | 			<div class="card-header"> | ||||||
| 				<h3 class="box-title">Top 10 - Most premium points</h3> | 				<h5 class="m-0">Top 10 - Most premium points</h5> | ||||||
| 			</div> | 			</div> | ||||||
| 			<div class="box-body no-padding"> | 			<div class="card-body p-0"> | ||||||
| 				<table class="table table-condensed"> | 				<table class="table table-striped table-condensed"> | ||||||
| 					<tbody> | 					<thead> | ||||||
| 					<tr> | 					<tr> | ||||||
| 						<th>#</th> | 						<th>#</th> | ||||||
| 						<th>Account {{ account_type }}</th> | 						<th>Account</th> | ||||||
| 						<th>Premium points</th> | 						<th>Premium points</th> | ||||||
| 					</tr> | 					</tr> | ||||||
|  | 					</thead> | ||||||
|  | 					<tbody> | ||||||
| 					{% set i = 0 %} | 					{% set i = 0 %} | ||||||
| 					{% for result in points %} | 					{% for result in points %} | ||||||
| 						{% set i = i + 1 %} | 						{% set i = i + 1 %} | ||||||
| 						<tr> | 						<tr> | ||||||
| 							<td>{{ i }}</td> | 							<th>{{ i }}</th> | ||||||
| 							<td>{{ result.name }}</td> | 							<td><a href="?p=accounts&search_name={{ result.name }}">{{ result.name }}</a></td> | ||||||
| 							<td>{{ result.premium_points }}</td> | 							<td>{{ result.premium_points }}</td> | ||||||
| 						</tr> | 						</tr> | ||||||
| 					{% endfor %} | 					{% endfor %} | ||||||
|   | |||||||
							
								
								
									
										45
									
								
								admin/pages/modules/templates/statistics.html.twig
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,45 @@ | |||||||
|  | <div class="col"> | ||||||
|  | 	<div class="info-box"> | ||||||
|  | 		<span class="info-box-icon bg-info elevation-1"><i class="fas fa-user-plus"></i></span> | ||||||
|  | 		<div class="info-box-content"> | ||||||
|  | 			<span class="info-box-text">Accounts:</span> | ||||||
|  | 			<span class="info-box-number">{{ count.total_accounts }}</span> | ||||||
|  | 		</div> | ||||||
|  | 	</div> | ||||||
|  | </div> | ||||||
|  | <div class="col"> | ||||||
|  | 	<div class="info-box"> | ||||||
|  | 		<span class="info-box-icon bg-red elevation-1"><i class="fas fa-user-plus"></i></span> | ||||||
|  | 		<div class="info-box-content"> | ||||||
|  | 			<span class="info-box-text">Players:</span> | ||||||
|  | 			<span class="info-box-number">{{ count.total_players }}</span> | ||||||
|  | 		</div> | ||||||
|  | 	</div> | ||||||
|  | </div> | ||||||
|  | <div class="col"> | ||||||
|  | 	<div class="info-box"> | ||||||
|  | 		<span class="info-box-icon bg-teal elevation-1"><i class="fas fa-pastafarianism"></i></span> | ||||||
|  | 		<div class="info-box-content"> | ||||||
|  | 			<span class="info-box-text">Monsters:</span> | ||||||
|  | 			<span class="info-box-number">{{ count.total_monsters }}</span> | ||||||
|  | 		</div> | ||||||
|  | 	</div> | ||||||
|  | </div> | ||||||
|  | <div class="col"> | ||||||
|  | 	<div class="info-box"> | ||||||
|  | 		<span class="info-box-icon bg-green elevation-1"><i class="fas fa-chart-pie"></i></span> | ||||||
|  | 		<div class="info-box-content"> | ||||||
|  | 			<span class="info-box-text">Guilds:</span> | ||||||
|  | 			<span class="info-box-number">{{ count.total_guilds }}</span> | ||||||
|  | 		</div> | ||||||
|  | 	</div> | ||||||
|  | </div> | ||||||
|  | <div class="col"> | ||||||
|  | 	<div class="info-box"> | ||||||
|  | 		<span class="info-box-icon bg-yellow elevation-1"><i class="fas fa-home"></i></span> | ||||||
|  | 		<div class="info-box-content"> | ||||||
|  | 			<span class="info-box-text">Houses:</span> | ||||||
|  | 			<span class="info-box-number">{{ count.total_houses }}</span> | ||||||
|  | 		</div> | ||||||
|  | 	</div> | ||||||
|  | </div> | ||||||
							
								
								
									
										39
									
								
								admin/pages/modules/templates/web_status.twig
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,39 @@ | |||||||
|  | <div class="col-12 col-md-6"> | ||||||
|  | 	<div class="card card-warning card-outline"> | ||||||
|  | 		<form action="?p=dashboard&maintenance" method="post" class="form-horizontal"> | ||||||
|  | 			<div class="card-header"> | ||||||
|  | 				<span class="m-0">Website Status<span class="float-right"> | ||||||
|  | 				<div class="custom-control custom-switch custom-switch-off-danger custom-switch-on-success"> | ||||||
|  | 					<input type="checkbox" class="custom-control-input" name="status" id="status" value="true" {% if not is_closed %} checked{% endif %}> | ||||||
|  | 					<label id="status-label" class="custom-control-label" for="status"> {% if is_closed %}Closed{% else %}Open{% endif %}</label> | ||||||
|  | 				</div></span> | ||||||
|  | 				</span> | ||||||
|  | 			</div> | ||||||
|  | 			<div class="card-body p-2"> | ||||||
|  | 				<div class="col-sm-12"> | ||||||
|  | 					<label for="message" class="col-form-label">Maintenance Message</label> | ||||||
|  | 					<textarea name="message" class="form-control" cols="40" rows="3" maxlength="255" placeholder="Enter ...">{{ closed_message }}</textarea> | ||||||
|  | 					<small>(only visible if closed)</small> | ||||||
|  | 				</div> | ||||||
|  | 			</div> | ||||||
|  | 			<div class="card-footer"> | ||||||
|  | 				<button type="submit" class="btn btn-info"><i class="far fa-update"></i> Update</button> | ||||||
|  | 				<a href="?p=dashboard&clear_cache" onclick="return confirm('Are you sure?');" class="float-right"> | ||||||
|  | 					<span class="btn btn-danger"><i class="fas fa-clear"></i>Clear cache</span> | ||||||
|  | 				</a> | ||||||
|  | 			</div> | ||||||
|  | 		</form> | ||||||
|  | 	</div> | ||||||
|  | </div> | ||||||
|  |  | ||||||
|  | <script> | ||||||
|  | 	$(function() { | ||||||
|  | 		$("#status").change(function() { | ||||||
|  | 			$statusLabel = $("#status-label"); | ||||||
|  | 			$statusLabel.html("Closed"); | ||||||
|  | 			if ($(this).is(':checked')) { | ||||||
|  | 				$statusLabel.html("Open"); | ||||||
|  | 			} | ||||||
|  | 		}); | ||||||
|  | 	}); | ||||||
|  | </script> | ||||||
							
								
								
									
										10
									
								
								admin/pages/modules/web_status.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,10 @@ | |||||||
|  | <?php | ||||||
|  | defined('MYAAC') or die('Direct access not allowed!'); | ||||||
|  |  | ||||||
|  | $twig->display('web_status.twig', array( | ||||||
|  | 	'is_closed' => $is_closed, | ||||||
|  | 	'closed_message' => $closed_message, | ||||||
|  | 	'status' => $status, | ||||||
|  | 	'account_type' => USE_ACCOUNT_NAME ? 'name' : 'number' | ||||||
|  | )); | ||||||
|  | ?> | ||||||
| @@ -13,6 +13,7 @@ require_once LIBS . 'forum.php'; | |||||||
| require_once LIBS . 'news.php'; | require_once LIBS . 'news.php'; | ||||||
|  |  | ||||||
| $title = 'News Panel'; | $title = 'News Panel'; | ||||||
|  | $use_datatable = true; | ||||||
|  |  | ||||||
| if (!hasFlag(FLAG_CONTENT_PAGES) && !superAdmin()) { | if (!hasFlag(FLAG_CONTENT_PAGES) && !superAdmin()) { | ||||||
| 	echo 'Access denied.'; | 	echo 'Access denied.'; | ||||||
| @@ -22,8 +23,8 @@ if (!hasFlag(FLAG_CONTENT_PAGES) && !superAdmin()) { | |||||||
| header('X-XSS-Protection:0'); | header('X-XSS-Protection:0'); | ||||||
|  |  | ||||||
| // some constants, used mainly by database (cannot by modified without schema changes) | // some constants, used mainly by database (cannot by modified without schema changes) | ||||||
| define('TITLE_LIMIT', 100); | define('NEWS_TITLE_LIMIT', 100); | ||||||
| define('BODY_LIMIT', 65535); // maximum news body length | define('NEWS_BODY_LIMIT', 65535); // maximum news body length | ||||||
| define('ARTICLE_TEXT_LIMIT', 300); | define('ARTICLE_TEXT_LIMIT', 300); | ||||||
| define('ARTICLE_IMAGE_LIMIT', 100); | define('ARTICLE_IMAGE_LIMIT', 100); | ||||||
|  |  | ||||||
| @@ -42,12 +43,12 @@ if(!empty($action)) | |||||||
| 	$forum_section = isset($_REQUEST['forum_section']) ? $_REQUEST['forum_section'] : null; | 	$forum_section = isset($_REQUEST['forum_section']) ? $_REQUEST['forum_section'] : null; | ||||||
| 	$errors = array(); | 	$errors = array(); | ||||||
|  |  | ||||||
| 	if($action == 'add') { | 	if($action == 'new') { | ||||||
| 		if(isset($forum_section) && $forum_section != '-1') { | 		if(isset($forum_section) && $forum_section != '-1') { | ||||||
| 			$forum_add = Forum::add_thread($p_title, $body, $forum_section, $player_id, $account_logged->getId(), $errors); | 			$forum_add = Forum::add_thread($p_title, $body, $forum_section, $player_id, $account_logged->getId(), $errors); | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		if(News::add($p_title, $body, $type, $category, $player_id, isset($forum_add) && $forum_add != 0 ? $forum_add : 0, $article_text, $article_image, $errors)) { | 		if(isset($p_title) && News::add($p_title, $body, $type, $category, $player_id, isset($forum_add) && $forum_add != 0 ? $forum_add : 0, $article_text, $article_image, $errors)) { | ||||||
| 			$p_title = $body = $comments = $article_text = $article_image = ''; | 			$p_title = $body = $comments = $article_text = $article_image = ''; | ||||||
| 			$type = $category = $player_id = 0; | 			$type = $category = $player_id = 0; | ||||||
|  |  | ||||||
| @@ -114,21 +115,21 @@ if($action == 'edit' || $action == 'new') { | |||||||
| 	$twig->display('admin.news.form.html.twig', array( | 	$twig->display('admin.news.form.html.twig', array( | ||||||
| 		'action' => $action, | 		'action' => $action, | ||||||
| 		'news_link' => getLink(PAGE), | 		'news_link' => getLink(PAGE), | ||||||
| 		'news_link_form' => '?p=news&action=' . ($action == 'edit' ? 'edit' : 'add'), | 		'news_link_form' => '?p=news&action=' . ($action == 'edit' ? 'edit' : 'new'), | ||||||
| 		'news_id' => isset($id) ? $id : null, | 		'news_id' => $id ?? null, | ||||||
| 		'title' => isset($p_title) ? $p_title : '', | 		'title' => $p_title ?? '', | ||||||
| 		'body' => isset($body) ? escapeHtml($body) : '', | 		'body' => isset($body) ? escapeHtml($body) : '', | ||||||
| 		'type' => isset($type) ? $type : null, | 		'type' => $type ?? null, | ||||||
| 		'player' => isset($player) && $player->isLoaded() ? $player : null, | 		'player' => isset($player) && $player->isLoaded() ? $player : null, | ||||||
| 		'player_id' => isset($player_id) ? $player_id : null, | 		'player_id' => $player_id ?? null, | ||||||
| 		'account_players' => $account_players, | 		'account_players' => $account_players, | ||||||
| 		'category' => isset($category) ? $category : 0, | 		'category' => $category ?? 0, | ||||||
| 		'categories' => $categories, | 		'categories' => $categories, | ||||||
| 		'forum_boards' => getForumBoards(), | 		'forum_boards' => getForumBoards(), | ||||||
| 		'forum_section' => isset($forum_section) ? $forum_section : null, | 		'forum_section' => $forum_section ?? null, | ||||||
| 		'comments' => isset($comments) ? $comments : null, | 		'comments' => $comments ?? null, | ||||||
| 		'article_text' => isset($article_text) ? $article_text : null, | 		'article_text' => $article_text ?? null, | ||||||
| 		'article_image' => isset($article_image) ? $article_image : null | 		'article_image' => $article_image ?? null | ||||||
| 	)); | 	)); | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										14
									
								
								admin/pages/open_source.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,14 @@ | |||||||
|  | <?php | ||||||
|  | /** | ||||||
|  |  * Open Source libraries | ||||||
|  |  * | ||||||
|  |  * @package   MyAAC | ||||||
|  |  * @author    Slawkens <slawkens@gmail.com> | ||||||
|  |  * @copyright 2023 MyAAC | ||||||
|  |  * @link      https://my-aac.org | ||||||
|  |  */ | ||||||
|  | defined('MYAAC') or die('Direct access not allowed!'); | ||||||
|  |  | ||||||
|  | $title = 'Open Source'; | ||||||
|  |  | ||||||
|  | $twig->display('admin.open_source.html.twig'); | ||||||
| @@ -9,6 +9,7 @@ | |||||||
|  */ |  */ | ||||||
| defined('MYAAC') or die('Direct access not allowed!'); | defined('MYAAC') or die('Direct access not allowed!'); | ||||||
| $title = 'Pages'; | $title = 'Pages'; | ||||||
|  | $use_datatable = true; | ||||||
|  |  | ||||||
| if (!hasFlag(FLAG_CONTENT_PAGES) && !superAdmin()) { | if (!hasFlag(FLAG_CONTENT_PAGES) && !superAdmin()) { | ||||||
| 	echo 'Access denied.'; | 	echo 'Access denied.'; | ||||||
| @@ -17,13 +18,18 @@ if (!hasFlag(FLAG_CONTENT_PAGES) && !superAdmin()) { | |||||||
|  |  | ||||||
| header('X-XSS-Protection:0'); | header('X-XSS-Protection:0'); | ||||||
|  |  | ||||||
| $name = $p_title = ''; | $name = $p_title = null; | ||||||
| $groups = new OTS_Groups_List(); | $groups = new OTS_Groups_List(); | ||||||
|  |  | ||||||
| $php = false; | $php = false; | ||||||
| $enable_tinymce = true; | $enable_tinymce = true; | ||||||
| $access = 0; | $access = 0; | ||||||
|  |  | ||||||
|  | // some constants, used mainly by database (cannot by modified without schema changes) | ||||||
|  | define('PAGE_TITLE_LIMIT', 30); | ||||||
|  | define('PAGE_NAME_LIMIT', 30); | ||||||
|  | define('PAGE_BODY_LIMIT', 65535); // maximum page body length | ||||||
|  |  | ||||||
| if (!empty($action)) { | if (!empty($action)) { | ||||||
| 	if ($action == 'delete' || $action == 'edit' || $action == 'hide') | 	if ($action == 'delete' || $action == 'edit' || $action == 'hide') | ||||||
| 		$id = $_REQUEST['id']; | 		$id = $_REQUEST['id']; | ||||||
| @@ -49,12 +55,13 @@ if (!empty($action)) { | |||||||
| 	$errors = array(); | 	$errors = array(); | ||||||
| 	$player_id = 1; | 	$player_id = 1; | ||||||
|  |  | ||||||
| 	if ($action == 'add') { | 	if ($action == 'new') { | ||||||
| 		if (Pages::add($name, $p_title, $body, $player_id, $php, $enable_tinymce, $access, $errors)) { | 		if (isset($p_title) && Pages::add($name, $p_title, $body, $player_id, $php, $enable_tinymce, $access, $errors)) { | ||||||
| 			$name = $p_title = $body = ''; | 			$name = $p_title = $body = ''; | ||||||
| 			$player_id = $access = 0; | 			$player_id = $access = 0; | ||||||
| 			$php = false; | 			$php = false; | ||||||
| 			$enable_tinymce = true; | 			$enable_tinymce = true; | ||||||
|  | 			success('Added successful.'); | ||||||
| 		} | 		} | ||||||
| 	} else if ($action == 'delete') { | 	} else if ($action == 'delete') { | ||||||
| 		if (Pages::delete($id, $errors)) | 		if (Pages::delete($id, $errors)) | ||||||
| @@ -69,15 +76,18 @@ if (!empty($action)) { | |||||||
| 			$enable_tinymce = $_page['enable_tinymce'] == '1'; | 			$enable_tinymce = $_page['enable_tinymce'] == '1'; | ||||||
| 			$access = $_page['access']; | 			$access = $_page['access']; | ||||||
| 		} else { | 		} else { | ||||||
| 			Pages::update($id, $name, $p_title, $body, $player_id, $php, $enable_tinymce, $access); | 			if(Pages::update($id, $name, $p_title, $body, $player_id, $php, $enable_tinymce, $access, $errors)) { | ||||||
| 			$action = $name = $p_title = $body = ''; | 				$action = $name = $p_title = $body = ''; | ||||||
| 			$player_id = 1; | 				$player_id = 1; | ||||||
| 			$access = 0; | 				$access = 0; | ||||||
| 			$php = false; | 				$php = false; | ||||||
| 			$enable_tinymce = true; | 				$enable_tinymce = true; | ||||||
|  | 				success('Updated successful.'); | ||||||
|  | 			} | ||||||
| 		} | 		} | ||||||
| 	} else if ($action == 'hide') { | 	} else if ($action == 'hide') { | ||||||
| 		Pages::toggleHidden($id, $errors); | 		Pages::toggleHidden($id, $errors, $status); | ||||||
|  | 		success(($status == 1 ? 'Show' : 'Hide') . ' successful.'); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if (!empty($errors)) | 	if (!empty($errors)) | ||||||
| @@ -116,6 +126,48 @@ $twig->display('admin.pages.html.twig', array( | |||||||
|  |  | ||||||
| class Pages | class Pages | ||||||
| { | { | ||||||
|  | 	static public function verify($name, $title, $body, $player_id, $php, $enable_tinymce, $access, &$errors) | ||||||
|  | 	{ | ||||||
|  | 		if(!isset($title[0]) || !isset($body[0])) { | ||||||
|  | 			$errors[] = 'Please fill all inputs.'; | ||||||
|  | 			return false; | ||||||
|  | 		} | ||||||
|  | 		if(strlen($name) > PAGE_NAME_LIMIT) { | ||||||
|  | 			$errors[] = 'Page name cannot be longer than ' . PAGE_NAME_LIMIT . ' characters.'; | ||||||
|  | 			return false; | ||||||
|  | 		} | ||||||
|  | 		if(strlen($title) > PAGE_TITLE_LIMIT) { | ||||||
|  | 			$errors[] = 'Page title cannot be longer than ' . PAGE_TITLE_LIMIT . ' characters.'; | ||||||
|  | 			return false; | ||||||
|  | 		} | ||||||
|  | 		if(strlen($body) > PAGE_BODY_LIMIT) { | ||||||
|  | 			$errors[] = 'Page content cannot be longer than ' . PAGE_BODY_LIMIT . ' characters.'; | ||||||
|  | 			return false; | ||||||
|  | 		} | ||||||
|  | 		if(!isset($player_id) || $player_id == 0) { | ||||||
|  | 			$errors[] = 'Player ID is wrong.'; | ||||||
|  | 			return false; | ||||||
|  | 		} | ||||||
|  | 		if(!isset($php) || ($php != 0 && $php != 1)) { | ||||||
|  | 			$errors[] = 'Enable PHP is wrong.'; | ||||||
|  | 			return false; | ||||||
|  | 		} | ||||||
|  | 		if ($php == 1 && !getBoolean(config('admin_pages_php_enable'))) { | ||||||
|  | 			$errors[] = 'PHP pages disabled on this server. To enable go to config.php and change admin_pages_php_enable to "yes".'; | ||||||
|  | 			return false; | ||||||
|  | 		} | ||||||
|  | 		if(!isset($enable_tinymce) || ($enable_tinymce != 0 && $enable_tinymce != 1)) { | ||||||
|  | 			$errors[] = 'Enable TinyMCE is wrong.'; | ||||||
|  | 			return false; | ||||||
|  | 		} | ||||||
|  | 		if(!isset($access) || $access < 0 || $access > PHP_INT_MAX) { | ||||||
|  | 			$errors[] = 'Access is wrong.'; | ||||||
|  | 			return false; | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		return true; | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	static public function get($id) | 	static public function get($id) | ||||||
| 	{ | 	{ | ||||||
| 		global $db; | 		global $db; | ||||||
| @@ -128,31 +180,36 @@ class Pages | |||||||
|  |  | ||||||
| 	static public function add($name, $title, $body, $player_id, $php, $enable_tinymce, $access, &$errors) | 	static public function add($name, $title, $body, $player_id, $php, $enable_tinymce, $access, &$errors) | ||||||
| 	{ | 	{ | ||||||
|  | 		if(!self::verify($name, $title, $body, $player_id, $php, $enable_tinymce, $access, $errors)) { | ||||||
|  | 			return false; | ||||||
|  | 		} | ||||||
|  |  | ||||||
| 		global $db; | 		global $db; | ||||||
| 		if (isset($name[0]) && isset($title[0]) && isset($body[0]) && $player_id != 0) { | 		$query = $db->select(TABLE_PREFIX . 'pages', array('name' => $name)); | ||||||
| 			$query = $db->select(TABLE_PREFIX . 'pages', array('name' => $name)); | 		if ($query === false) | ||||||
| 			if ($query === false) | 			$db->insert(TABLE_PREFIX . 'pages', | ||||||
| 				$db->insert(TABLE_PREFIX . 'pages', | 				array( | ||||||
| 					array( | 					'name' => $name, | ||||||
| 						'name' => $name, | 					'title' => $title, | ||||||
| 						'title' => $title, | 					'body' => $body, | ||||||
| 						'body' => $body, | 					'player_id' => $player_id, | ||||||
| 						'player_id' => $player_id, | 					'php' => $php ? '1' : '0', | ||||||
| 						'php' => $php ? '1' : '0', | 					'enable_tinymce' => $enable_tinymce ? '1' : '0', | ||||||
| 						'enable_tinymce' => $enable_tinymce ? '1' : '0', | 					'access' => $access | ||||||
| 						'access' => $access | 				) | ||||||
| 					) | 			); | ||||||
| 				); | 		else | ||||||
| 			else | 			$errors[] = 'Page with this link already exists.'; | ||||||
| 				$errors[] = 'Page with this link already exists.'; |  | ||||||
| 		} else |  | ||||||
| 			$errors[] = 'Please fill all inputs.'; |  | ||||||
|  |  | ||||||
| 		return !count($errors); | 		return !count($errors); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	static public function update($id, $name, $title, $body, $player_id, $php, $enable_tinymce, $access) | 	static public function update($id, $name, $title, $body, $player_id, $php, $enable_tinymce, $access, &$errors) | ||||||
| 	{ | 	{ | ||||||
|  | 		if(!self::verify($name, $title, $body, $player_id, $php, $enable_tinymce, $access, $errors)) { | ||||||
|  | 			return false; | ||||||
|  | 		} | ||||||
|  |  | ||||||
| 		global $db; | 		global $db; | ||||||
| 		$db->update(TABLE_PREFIX . 'pages', | 		$db->update(TABLE_PREFIX . 'pages', | ||||||
| 			array( | 			array( | ||||||
| @@ -165,6 +222,8 @@ class Pages | |||||||
| 				'access' => $access | 				'access' => $access | ||||||
| 			), | 			), | ||||||
| 			array('id' => $id)); | 			array('id' => $id)); | ||||||
|  |  | ||||||
|  | 		return true; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	static public function delete($id, &$errors) | 	static public function delete($id, &$errors) | ||||||
| @@ -181,18 +240,23 @@ class Pages | |||||||
| 		return !count($errors); | 		return !count($errors); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	static public function toggleHidden($id, &$errors) | 	static public function toggleHidden($id, &$errors, &$status) | ||||||
| 	{ | 	{ | ||||||
| 		global $db; | 		global $db; | ||||||
| 		if (isset($id)) { | 		if (isset($id)) { | ||||||
| 			$query = $db->select(TABLE_PREFIX . 'pages', array('id' => $id)); | 			$query = $db->select(TABLE_PREFIX . 'pages', array('id' => $id)); | ||||||
| 			if ($query !== false) | 			if ($query !== false) { | ||||||
| 				$db->update(TABLE_PREFIX . 'pages', array('hidden' => ($query['hidden'] == 1 ? 0 : 1)), array('id' => $id)); | 				$db->update(TABLE_PREFIX . 'pages', array('hidden' => ($query['hidden'] == 1 ? 0 : 1)), array('id' => $id)); | ||||||
| 			else | 				$status = $query['hidden']; | ||||||
|  | 			} | ||||||
|  | 			else { | ||||||
| 				$errors[] = 'Page with id ' . $id . ' does not exists.'; | 				$errors[] = 'Page with id ' . $id . ' does not exists.'; | ||||||
|  | 			} | ||||||
| 		} else | 		} else | ||||||
| 			$errors[] = 'id not set'; | 			$errors[] = 'id not set'; | ||||||
|  |  | ||||||
| 		return !count($errors); | 		return !count($errors); | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
|  | ?> | ||||||
|   | |||||||
| @@ -16,4 +16,4 @@ if (!function_exists('phpinfo')) { ?> | |||||||
| 	<?php return; | 	<?php return; | ||||||
| } | } | ||||||
| ?> | ?> | ||||||
| <iframe src="<?php echo BASE_URL; ?>admin/tools/phpinfo.php" width="1024" height="550"/> | <iframe src="<?php echo ADMIN_URL; ?>tools/phpinfo.php" width="1024" height="550"></iframe> | ||||||
|   | |||||||
| @@ -9,99 +9,123 @@ | |||||||
|  */ |  */ | ||||||
| defined('MYAAC') or die('Direct access not allowed!'); | defined('MYAAC') or die('Direct access not allowed!'); | ||||||
| $title = 'Plugin manager'; | $title = 'Plugin manager'; | ||||||
|  | $use_datatable = true; | ||||||
|  |  | ||||||
| $twig->display('admin.plugins.form.html.twig'); | require_once LIBS . 'plugins.php'; | ||||||
|  |  | ||||||
| if (isset($_REQUEST['uninstall'])) { | if (!getBoolean(config('admin_plugins_manage_enable'))) { | ||||||
| 	$uninstall = $_REQUEST['uninstall']; | 	warning('Plugin installation and management is disabled in config.<br/>If you wish to enable, go to config.php and change <b>admin_plugins_manage_enable</b> to "yes".'); | ||||||
|  | } | ||||||
|  | else { | ||||||
|  | 	$twig->display('admin.plugins.form.html.twig'); | ||||||
|  |  | ||||||
| 	if (Plugins::uninstall($uninstall)) { | 	if (isset($_REQUEST['uninstall'])) { | ||||||
| 		success('Successfully uninstalled plugin ' . $uninstall); | 		$uninstall = $_REQUEST['uninstall']; | ||||||
| 	} else { |  | ||||||
| 		error('Error while uninstalling plugin ' . $uninstall . ': ' . Plugins::getError()); |  | ||||||
| 	} |  | ||||||
| } else if (isset($_FILES["plugin"]["name"])) { |  | ||||||
| 	$file = $_FILES["plugin"]; |  | ||||||
| 	$filename = $file["name"]; |  | ||||||
| 	$tmp_name = $file["tmp_name"]; |  | ||||||
| 	$type = $file["type"]; |  | ||||||
|  |  | ||||||
| 	$name = explode(".", $filename); | 		if (Plugins::uninstall($uninstall)) { | ||||||
| 	$accepted_types = array('application/zip', 'application/x-zip-compressed', 'multipart/x-zip', 'application/x-compressed', 'application/octet-stream', 'application/zip-compressed'); | 			success('Successfully uninstalled plugin ' . $uninstall); | ||||||
|  | 		} else { | ||||||
| 	if (isset($file['error'])) { | 			error('Error while uninstalling plugin ' . $uninstall . ': ' . Plugins::getError()); | ||||||
| 		$error = 'Error uploading file'; |  | ||||||
| 		switch ($file['error']) { |  | ||||||
| 			case UPLOAD_ERR_OK: |  | ||||||
| 				$error = false; |  | ||||||
| 				break; |  | ||||||
| 			case UPLOAD_ERR_INI_SIZE: |  | ||||||
| 			case UPLOAD_ERR_FORM_SIZE: |  | ||||||
| 				$error .= ' - file too large (limit of ' . ini_get('upload_max_filesize') . ' bytes). You can enlarge the limits by changing "upload_max_filesize" in php.ini'; |  | ||||||
| 				break; |  | ||||||
| 			case UPLOAD_ERR_PARTIAL: |  | ||||||
| 				$error .= ' - file upload was not completed.'; |  | ||||||
| 				break; |  | ||||||
| 			case UPLOAD_ERR_NO_FILE: |  | ||||||
| 				$error .= ' - zero-length file uploaded.'; |  | ||||||
| 				break; |  | ||||||
| 			default: |  | ||||||
| 				$error .= ' - internal error #' . $file['error']; |  | ||||||
| 				break; |  | ||||||
| 		} | 		} | ||||||
| 	} | 	} else if (isset($_REQUEST['enable'])) { | ||||||
|  | 		$enable = $_REQUEST['enable']; | ||||||
|  | 		if (Plugins::enable($enable)) { | ||||||
|  | 			success('Successfully enabled plugin ' . $enable); | ||||||
|  | 		} else { | ||||||
|  | 			error('Error while enabling plugin ' . $enable . ': ' . Plugins::getError()); | ||||||
|  | 		} | ||||||
|  | 	} else if (isset($_REQUEST['disable'])) { | ||||||
|  | 		$disable = $_REQUEST['disable']; | ||||||
|  | 		if (Plugins::disable($disable)) { | ||||||
|  | 			success('Successfully disabled plugin ' . $disable); | ||||||
|  | 		} else { | ||||||
|  | 			error('Error while disabling plugin ' . $disable . ': ' . Plugins::getError()); | ||||||
|  | 		} | ||||||
|  | 	} else if (isset($_FILES['plugin']['name'])) { | ||||||
|  | 		$file = $_FILES['plugin']; | ||||||
|  | 		$filename = $file['name']; | ||||||
|  | 		$tmp_name = $file['tmp_name']; | ||||||
|  | 		$type = $file['type']; | ||||||
|  |  | ||||||
| 	if (isset($error) && $error != false) { | 		$name = explode('.', $filename); | ||||||
| 		error($error); | 		$accepted_types = array('application/zip', 'application/x-zip-compressed', 'multipart/x-zip', 'application/x-compressed', 'application/octet-stream', 'application/zip-compressed'); | ||||||
| 	} else { |  | ||||||
| 		if (is_uploaded_file($file['tmp_name'])) { |  | ||||||
| 			$filetype = strtolower(pathinfo($filename, PATHINFO_EXTENSION)); |  | ||||||
| 			if ($filetype == 'zip') // check if it is zipped/compressed file |  | ||||||
| 			{ |  | ||||||
| 				$tmp_filename = pathinfo($filename, PATHINFO_FILENAME); |  | ||||||
| 				$targetzip = BASE . 'plugins/' . $tmp_filename . '.zip'; |  | ||||||
|  |  | ||||||
| 				if (move_uploaded_file($tmp_name, $targetzip)) { // move uploaded file | 		if (isset($file['error'])) { | ||||||
| 					if (Plugins::install($targetzip)) { | 			$error = 'Error uploading file'; | ||||||
| 						foreach (Plugins::getWarnings() as $warning) { | 			switch ($file['error']) { | ||||||
| 							warning($warning); | 				case UPLOAD_ERR_OK: | ||||||
|  | 					$error = false; | ||||||
|  | 					break; | ||||||
|  | 				case UPLOAD_ERR_INI_SIZE: | ||||||
|  | 				case UPLOAD_ERR_FORM_SIZE: | ||||||
|  | 					$error .= ' - file too large (limit of ' . ini_get('upload_max_filesize') . ' bytes). You can enlarge the limits by changing "upload_max_filesize" in php.ini'; | ||||||
|  | 					break; | ||||||
|  | 				case UPLOAD_ERR_PARTIAL: | ||||||
|  | 					$error .= ' - file upload was not completed.'; | ||||||
|  | 					break; | ||||||
|  | 				case UPLOAD_ERR_NO_FILE: | ||||||
|  | 					$error .= ' - zero-length file uploaded.'; | ||||||
|  | 					break; | ||||||
|  | 				default: | ||||||
|  | 					$error .= ' - internal error #' . $file['error']; | ||||||
|  | 					break; | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		if (isset($error) && $error != false) { | ||||||
|  | 			error($error); | ||||||
|  | 		} else { | ||||||
|  | 			if (is_uploaded_file($file['tmp_name'])) { | ||||||
|  | 				$filetype = strtolower(pathinfo($filename, PATHINFO_EXTENSION)); | ||||||
|  | 				if ($filetype == 'zip') // check if it is zipped/compressed file | ||||||
|  | 				{ | ||||||
|  | 					$tmp_filename = pathinfo($filename, PATHINFO_FILENAME); | ||||||
|  | 					$targetzip = BASE . 'plugins/' . $tmp_filename . '.zip'; | ||||||
|  |  | ||||||
|  | 					if (move_uploaded_file($tmp_name, $targetzip)) { // move uploaded file | ||||||
|  | 						if (Plugins::install($targetzip)) { | ||||||
|  | 							foreach (Plugins::getWarnings() as $warning) { | ||||||
|  | 								warning($warning); | ||||||
|  | 							} | ||||||
|  |  | ||||||
|  | 							$info = Plugins::getPluginJson(); | ||||||
|  | 							success((isset($info['name']) ? '<strong>' . $info['name'] . '</strong> p' : 'P') . 'lugin has been successfully installed.'); | ||||||
|  | 						} else { | ||||||
|  | 							$error = Plugins::getError(); | ||||||
|  | 							error(!empty($error) ? $error : 'Unexpected error happened while installing plugin. Please try again later.'); | ||||||
| 						} | 						} | ||||||
|  |  | ||||||
| 						$info = Plugins::getPluginJson(); | 						unlink($targetzip); // delete the Zipped file | ||||||
| 						success((isset($info['name']) ? '<strong>' . $info['name'] . '</strong> p' : 'P') . 'lugin has been successfully installed.'); | 					} else | ||||||
| 					} else { | 						error('There was a problem with the upload. Please try again.'); | ||||||
| 						$error = Plugins::getError(); | 				} else { | ||||||
| 						error(!empty($error) ? $error : 'Unexpected error happened while installing plugin. Please try again later.'); | 					error('The file you are trying to upload is not a .zip file. Please try again.'); | ||||||
| 					} | 				} | ||||||
|  |  | ||||||
| 					unlink($targetzip); // delete the Zipped file |  | ||||||
| 				} else |  | ||||||
| 					error('There was a problem with the upload. Please try again.'); |  | ||||||
| 			} else { | 			} else { | ||||||
| 				error('The file you are trying to upload is not a .zip file. Please try again.'); | 				error('Error uploading file - unknown error.'); | ||||||
| 			} | 			} | ||||||
| 		} else { |  | ||||||
| 			error('Error uploading file - unknown error.'); |  | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
| $plugins = array(); | $plugins = array(); | ||||||
| foreach (get_plugins() as $plugin) { | foreach (get_plugins(true) as $plugin) { | ||||||
| 	$string = file_get_contents(BASE . 'plugins/' . $plugin . '.json'); | 	$string = file_get_contents(BASE . 'plugins/' . $plugin . '.json'); | ||||||
| 	$string = Plugins::removeComments($string); |  | ||||||
| 	$plugin_info = json_decode($string, true); | 	$plugin_info = json_decode($string, true); | ||||||
|  |  | ||||||
| 	if ($plugin_info == false) { | 	if (!$plugin_info) { | ||||||
| 		warning('Cannot load plugin info ' . $plugin . '.json'); | 		warning('Cannot load plugin info ' . $plugin . '.json'); | ||||||
| 	} else { | 	} else { | ||||||
|  | 		$disabled = (strpos($plugin, 'disabled.') !== false); | ||||||
|  | 		$pluginOriginal = ($disabled ? str_replace('disabled.', '', $plugin) : $plugin); | ||||||
| 		$plugins[] = array( | 		$plugins[] = array( | ||||||
| 			'name' => isset($plugin_info['name']) ? $plugin_info['name'] : '', | 			'name' => $plugin_info['name'] ?? '', | ||||||
| 			'description' => isset($plugin_info['description']) ? $plugin_info['description'] : '', | 			'description' => $plugin_info['description'] ?? '', | ||||||
| 			'version' => isset($plugin_info['version']) ? $plugin_info['version'] : '', | 			'version' => $plugin_info['version'] ?? '', | ||||||
| 			'author' => isset($plugin_info['author']) ? $plugin_info['author'] : '', | 			'author' => $plugin_info['author'] ?? '', | ||||||
| 			'contact' => isset($plugin_info['contact']) ? $plugin_info['contact'] : '', | 			'contact' => $plugin_info['contact'] ?? '', | ||||||
| 			'file' => $plugin, | 			'file' => $pluginOriginal, | ||||||
|  | 			'enabled' => !$disabled, | ||||||
| 			'uninstall' => isset($plugin_info['uninstall']) | 			'uninstall' => isset($plugin_info['uninstall']) | ||||||
| 		); | 		); | ||||||
| 	} | 	} | ||||||
|   | |||||||
| @@ -4,35 +4,36 @@ | |||||||
|  * |  * | ||||||
|  * @package   MyAAC |  * @package   MyAAC | ||||||
|  * @author    Lee |  * @author    Lee | ||||||
|  * @copyright 2019 MyAAC |  * @copyright 2020 MyAAC | ||||||
|  * @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 = 'Report Viewer'; | $title = 'Report Viewer'; | ||||||
|  | $use_datatable = true; | ||||||
|  |  | ||||||
| $files = array(); | $files = array(); | ||||||
| $server_path_reports = $config['data_path'] . 'reports/'; | $server_path_reports = $config['data_path'] . 'reports/'; | ||||||
|  |  | ||||||
| if (file_exists($server_path_reports)) { | if (file_exists($server_path_reports)) { | ||||||
|     foreach (scandir($server_path_reports, SCANDIR_SORT_ASCENDING) as $f) { | 	foreach (scandir($server_path_reports, SCANDIR_SORT_ASCENDING) as $f) { | ||||||
|         if ($f[0] === '.') { | 		if ($f[0] === '.') { | ||||||
| 	        continue; | 			continue; | ||||||
|         } | 		} | ||||||
|  |  | ||||||
|         if (is_dir($server_path_reports . $f)) { | 		if (is_dir($server_path_reports . $f)) { | ||||||
|             foreach (scandir($server_path_reports . $f, SCANDIR_SORT_ASCENDING) as $f2) { | 			foreach (scandir($server_path_reports . $f, SCANDIR_SORT_ASCENDING) as $f2) { | ||||||
|                 if ($f2[0] === '.') { | 				if ($f2[0] === '.') { | ||||||
| 	                continue; | 					continue; | ||||||
|                 } | 				} | ||||||
|  |  | ||||||
|                 $files[] = array($f . '/' . $f2, $server_path_reports); | 				$files[] = array($f . '/' . $f2, $server_path_reports); | ||||||
|             } | 			} | ||||||
|  |  | ||||||
|             continue; | 			continue; | ||||||
|         } | 		} | ||||||
|  |  | ||||||
|         $files[] = array($f, $server_path_reports); | 		$files[] = array($f, $server_path_reports); | ||||||
|     } | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
| foreach ($files as &$f) { | foreach ($files as &$f) { | ||||||
| @@ -42,16 +43,13 @@ foreach ($files as &$f) { | |||||||
|  |  | ||||||
| unset($f); | unset($f); | ||||||
|  |  | ||||||
| $twig->display('admin.reports.html.twig', array('files' => $files)); |  | ||||||
|  |  | ||||||
|  |  | ||||||
| $file = isset($_GET['file']) ? $_GET['file'] : NULL; | $file = isset($_GET['file']) ? $_GET['file'] : NULL; | ||||||
| if (!empty($file)) { | if (!empty($file)) { | ||||||
| 	if (!preg_match('/[^A-z0-9\' _\/\-\.]/', $file)) { | 	if (!preg_match('/[^A-z0-9\' _\/\-\.]/', $file)) { | ||||||
| 		if (file_exists($server_path_reports . $file)) { | 		if (file_exists($server_path_reports . $file)) { | ||||||
| 			$content = nl2br(file_get_contents($server_path_reports . $file)); | 			$file_content = nl2br(file_get_contents($server_path_reports . $file)); | ||||||
|  |  | ||||||
| 			$twig->display('admin.logs.view.html.twig', array('file' => $file, 'content' => $content)); | 			$twig->display('admin.logs.view.html.twig', array('file' => $file, 'content' => $file_content)); | ||||||
| 		} else { | 		} else { | ||||||
| 			echo 'Specified file does not exist.'; | 			echo 'Specified file does not exist.'; | ||||||
| 		} | 		} | ||||||
| @@ -59,3 +57,5 @@ if (!empty($file)) { | |||||||
| 		echo 'Invalid file name specified.'; | 		echo 'Invalid file name specified.'; | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
|  | $twig->display('admin.reports.html.twig', array('files' => $files)); | ||||||
|   | |||||||
| @@ -36,3 +36,4 @@ $twig->display('admin.statistics.html.twig', array( | |||||||
| 	'account_type' => (USE_ACCOUNT_NAME ? 'name' : 'number'), | 	'account_type' => (USE_ACCOUNT_NAME ? 'name' : 'number'), | ||||||
| 	'points' => $points | 	'points' => $points | ||||||
| )); | )); | ||||||
|  | ?> | ||||||
| @@ -10,18 +10,24 @@ | |||||||
| defined('MYAAC') or die('Direct access not allowed!'); | defined('MYAAC') or die('Direct access not allowed!'); | ||||||
| $title = 'Tools'; | $title = 'Tools'; | ||||||
|  |  | ||||||
| $tool = $_GET['tool']; | if (!isset($_GET['tool'])) { | ||||||
| if (!isset($tool)) { |  | ||||||
| 	echo 'Tool not set.'; | 	echo 'Tool not set.'; | ||||||
| 	return; | 	return; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | $tool = $_GET['tool']; | ||||||
| if (preg_match("/[^A-z0-9_\-]/", $tool)) { | if (preg_match("/[^A-z0-9_\-]/", $tool)) { | ||||||
| 	echo 'Invalid tool.'; | 	echo 'Invalid tool.'; | ||||||
| 	return; | 	return; | ||||||
| } | } | ||||||
|  |  | ||||||
| $file = BASE . 'admin/pages/tools/' . $tool . '.php'; | $file = ADMIN . 'tools/' . $tool . '.php'; | ||||||
| if (!@file_exists($file)) |  | ||||||
|  | if (@file_exists($file)) { | ||||||
| 	require $file; | 	require $file; | ||||||
|  | 	return; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | echo 'Tool <strong>' . $tool . '</strong> not found.'; | ||||||
|  |  | ||||||
| ?> | ?> | ||||||
|   | |||||||
| @@ -24,10 +24,10 @@ if (!$myaac_version) { | |||||||
| $version_compare = version_compare($myaac_version, MYAAC_VERSION); | $version_compare = version_compare($myaac_version, MYAAC_VERSION); | ||||||
| if ($version_compare == 0) { | if ($version_compare == 0) { | ||||||
| 	success('MyAAC latest version is ' . $myaac_version . '. You\'re using the latest version. | 	success('MyAAC latest version is ' . $myaac_version . '. You\'re using the latest version. | ||||||
| 	<br/>View CHANGELOG ' . generateLink(ADMIN_URL . '?p=changelog', 'here')); | 	<br/>View CHANGELOG ' . generateLink(ADMIN_URL . '?p=clmd', 'here')); | ||||||
| } else if ($version_compare < 0) { | } else if ($version_compare < 0) { | ||||||
| 	success('Woah, seems you\'re using newer version as latest released one! MyAAC latest released version is ' . $myaac_version . ', and you\'re using version ' . MYAAC_VERSION . '. | 	success('Woah, seems you\'re using newer version as latest released one! MyAAC latest released version is ' . $myaac_version . ', and you\'re using version ' . MYAAC_VERSION . '. | ||||||
| 	<br/>View CHANGELOG ' . generateLink(ADMIN_URL . '?p=changelog', 'here')); | 	<br/>View CHANGELOG ' . generateLink(ADMIN_URL . '?p=clmd', 'here')); | ||||||
| } else { | } else { | ||||||
| 	warning('You\'re using outdated version.<br/> | 	warning('You\'re using outdated version.<br/> | ||||||
| 		Your version: <b>' . MYAAC_VERSION . '</b><br/> | 		Your version: <b>' . MYAAC_VERSION . '</b><br/> | ||||||
| @@ -47,3 +47,4 @@ function version_revert($version) | |||||||
| 	$release = $version; | 	$release = $version; | ||||||
| 	return $major . '.' . $minor . '.' . $release; | 	return $major . '.' . $minor . '.' . $release; | ||||||
| }*/ | }*/ | ||||||
|  | ?> | ||||||
|   | |||||||
| @@ -8,7 +8,13 @@ | |||||||
|  * @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!'); | ||||||
|  |  | ||||||
|  | use DeviceDetector\DeviceDetector; | ||||||
|  | use DeviceDetector\Parser\Client\Browser; | ||||||
|  | use DeviceDetector\Parser\OperatingSystem; | ||||||
|  |  | ||||||
| $title = 'Visitors'; | $title = 'Visitors'; | ||||||
|  | $use_datatable = true; | ||||||
|  |  | ||||||
| if (!$config['visitors_counter']): ?> | if (!$config['visitors_counter']): ?> | ||||||
| 	Visitors counter is disabled.<br/> | 	Visitors counter is disabled.<br/> | ||||||
| @@ -29,6 +35,31 @@ function compare($a, $b) | |||||||
| $tmp = $visitors->getVisitors(); | $tmp = $visitors->getVisitors(); | ||||||
| usort($tmp, 'compare'); | usort($tmp, 'compare'); | ||||||
|  |  | ||||||
|  | foreach ($tmp as &$visitor) { | ||||||
|  | 	$userAgent = $visitor['user_agent'] ?? ''; | ||||||
|  | 	if (!strlen($userAgent) || $userAgent == 'unknown') { | ||||||
|  | 		$browser = 'Unknown'; | ||||||
|  | 	} | ||||||
|  | 	else { | ||||||
|  | 		$dd = new DeviceDetector($userAgent); | ||||||
|  | 		$dd->parse(); | ||||||
|  |  | ||||||
|  | 		if ($dd->isBot()) { | ||||||
|  | 			$bot = $dd->getBot(); | ||||||
|  | 			$message = '(Bot) %s, <a href="%s" target="_blank">%s</a>'; | ||||||
|  | 			$browser = sprintf($message, $bot['category'], $bot['url'], $bot['name']); | ||||||
|  | 		} | ||||||
|  | 		else { | ||||||
|  | 			$osFamily = OperatingSystem::getOsFamily($dd->getOs('name')); | ||||||
|  | 			$browserFamily = Browser::getBrowserFamily($dd->getClient('name')); | ||||||
|  |  | ||||||
|  | 			$browser = $osFamily . ', ' . $browserFamily; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	$visitor['browser'] = $browser; | ||||||
|  | } | ||||||
|  |  | ||||||
| $twig->display('admin.visitors.html.twig', array( | $twig->display('admin.visitors.html.twig', array( | ||||||
| 	'config_visitors_counter_ttl' => $config['visitors_counter_ttl'], | 	'config_visitors_counter_ttl' => $config['visitors_counter_ttl'], | ||||||
| 	'visitors' => $tmp | 	'visitors' => $tmp | ||||||
|   | |||||||
							
								
								
									
										66
									
								
								admin/template/menus.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,66 @@ | |||||||
|  | <?php | ||||||
|  |  | ||||||
|  | $menus = [ | ||||||
|  | 	['name' => 'Dashboard', 'icon' => 'tachometer-alt', 'order' => 10, 'link' => 'dashboard'], | ||||||
|  | 	['name' => 'News', 'icon' => 'newspaper', 'order' => 20, 'link' => | ||||||
|  | 		[ | ||||||
|  | 			['name' => 'View', 'link' => 'news', 'icon' => 'list', 'order' => 10], | ||||||
|  | 			['name' => 'Add news', 'link' => 'news&action=new&type=1', 'icon' => 'plus', 'order' => 20], | ||||||
|  | 			['name' => 'Add ticker', 'link' => 'news&action=new&type=2', 'icon' => 'plus', 'order' => 30], | ||||||
|  | 			['name' => 'Add article', 'link' => 'news&action=new&type=3', 'icon' => 'plus', 'order' => 40], | ||||||
|  | 		], | ||||||
|  | 	], | ||||||
|  | 	['name' => 'Changelogs', 'icon' => 'newspaper', 'order' => 30, 'link' => | ||||||
|  | 		[ | ||||||
|  | 			['name' => 'View', 'link' => 'changelog', 'icon' => 'list', 'order' => 10], | ||||||
|  | 			['name' => 'Add', 'link' => 'changelog&action=new', 'icon' => 'plus', 'order' => 20], | ||||||
|  | 		], | ||||||
|  | 	], | ||||||
|  | 	['name' => 'Mailer', 'icon' => 'envelope', 'order' => 40, 'link' => 'mailer', 'disabled' => !config('mail_enabled')], | ||||||
|  | 	['name' => 'Pages', 'icon' => 'book', 'order' => 50, 'link' => | ||||||
|  | 		[ | ||||||
|  | 			['name' => 'View', 'link' => 'pages', 'icon' => 'list', 'order' => 10], | ||||||
|  | 			['name' => 'Add', 'link' => 'pages&action=new', 'icon' => 'plus', 'order' => 20], | ||||||
|  | 		], | ||||||
|  | 	], | ||||||
|  | 	['name' => 'Menus', 'icon' => 'list', 'order' => 60, 'link' => 'menus'], | ||||||
|  | 	['name' => 'Plugins', 'icon' => 'plug', 'order' => 70, 'link' => 'plugins'], | ||||||
|  | 	['name' => 'Server Data', 'icon' => 'gavel', 'order' => 80, 'link' => 'data'], | ||||||
|  | 	['name' => 'Editor', 'icon' => 'edit', 'order' => 90, 'link' => | ||||||
|  | 		[ | ||||||
|  | 			['name' => 'Accounts', 'link' => 'accounts', 'icon' => 'users', 'order' => 10], | ||||||
|  | 			['name' => 'Players', 'link' => 'players', 'icon' => 'user-astronaut', 'order' => 20], | ||||||
|  | 		], | ||||||
|  | 	], | ||||||
|  | 	['name' => 'Tools', 'icon' => 'tools', 'order' => 100, 'link' => | ||||||
|  | 		[ | ||||||
|  | 			['name' => 'Mass Account Actions', 'link' => 'mass_account', 'icon' => 'globe', 'order' => 10], | ||||||
|  | 			['name' => 'Mass Teleport Actions', 'link' => 'mass_teleport', 'icon' => 'globe', 'order' => 20], | ||||||
|  | 			['name' => 'Notepad', 'link' => 'notepad', 'icon' => 'marker', 'order' => 30], | ||||||
|  | 			['name' => 'phpinfo', 'link' => 'phpinfo', 'icon' => 'server', 'order' => 40], | ||||||
|  | 		], | ||||||
|  | 	], | ||||||
|  | 	['name' => 'Logs', 'icon' => 'bug', 'order' => 110, 'link' => | ||||||
|  | 		[ | ||||||
|  | 			['name' => 'Logs', 'link' => 'logs', 'icon' => 'book', 'order' => 10], | ||||||
|  | 			['name' => 'Reports', 'link' => 'reports', 'icon' => 'book', 'order' => 20], | ||||||
|  | 			['name' => 'Visitors', 'link' => 'visitors', 'icon' => 'user', 'order' => 30], | ||||||
|  | 		], | ||||||
|  | 	], | ||||||
|  | ]; | ||||||
|  |  | ||||||
|  | $hooks->trigger(HOOK_ADMIN_MENU); | ||||||
|  |  | ||||||
|  | usort($menus, function ($a, $b) { | ||||||
|  | 	return $a['order'] - $b['order']; | ||||||
|  | }); | ||||||
|  |  | ||||||
|  | foreach ($menus as $i => $menu) { | ||||||
|  | 	if (isset($menu['link']) && is_array($menu['link'])) { | ||||||
|  | 		usort($menus[$i]['link'], function ($a, $b) { | ||||||
|  | 			return $a['order'] - $b['order']; | ||||||
|  | 		}); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | return $menus; | ||||||
| @@ -1,44 +1,10 @@ | |||||||
| .slidecontainer { | .menu-text-li {color: #4b646f; background: #1a2226;} | ||||||
| 	width: 100%; | .menu-text { | ||||||
|  | 	display: block; | ||||||
|  | 	padding: .5rem 1rem; | ||||||
|  | 	white-space: nowrap; | ||||||
| } | } | ||||||
|  |  | ||||||
| .slider { | .sidebar-mini.sidebar-collapse .menu-text { | ||||||
| 	-webkit-appearance: none; | 	display: none; | ||||||
| 	width: 100%; |  | ||||||
|  |  | ||||||
| 	outline: none; |  | ||||||
| 	opacity: 0.7; |  | ||||||
| 	-webkit-transition: .2s; |  | ||||||
| 	transition: opacity .2s; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| .slider:hover { |  | ||||||
| 	opacity: 1; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| .slider::-webkit-slider-thumb { |  | ||||||
| 	-webkit-appearance: none; |  | ||||||
| 	appearance: none; |  | ||||||
| 	width: 15px; |  | ||||||
| 	height: 25px; |  | ||||||
| 	background: #3c8dbc; |  | ||||||
| 	cursor: pointer; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| .slider::-moz-range-thumb { |  | ||||||
| 	width: 25px; |  | ||||||
| 	height: 25px; |  | ||||||
| 	background: #3c8dbc; |  | ||||||
| 	cursor: pointer; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| td.details-control { |  | ||||||
| 	text-align: center; |  | ||||||
| 	color: forestgreen; |  | ||||||
| 	cursor: pointer; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| tr.shown td.details-control { |  | ||||||
| 	text-align: center; |  | ||||||
| 	color: red; |  | ||||||
| } | } | ||||||
| @@ -1,229 +1,203 @@ | |||||||
| <?php defined('MYAAC') or die('Direct access not allowed!'); ?> | <?php defined('MYAAC') or die('Direct access not allowed!'); ?> | ||||||
| <!DOCTYPE html> | <!doctype html> | ||||||
| <html> | <html lang="en"> | ||||||
| <head> | <head> | ||||||
| 	<?php echo template_header(true); | 	<?php $hooks->trigger(HOOK_ADMIN_HEAD_START); ?> | ||||||
| 	$title_full =  (isset($title) ? $title . $config['title_separator'] : '') . $config['lua']['serverName']; | 	<?php echo template_header(true); ?> | ||||||
| 	?> | 	<title><?php echo (isset($title) ? $title . ' - ' : '') . $config['lua']['serverName'];?></title> | ||||||
|  | 	<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> | ||||||
| 	<title><?php echo $title_full ?></title> | 	<link rel="stylesheet" href="<?php echo BASE_URL; ?>tools/css/adminlte.min.css"> | ||||||
| 	<link rel="shortcut icon" href="<?php echo BASE_URL; ?>images/favicon.ico" type="image/x-icon" /> |  | ||||||
| 	<link rel="icon" href="<?php echo BASE_URL; ?>images/favicon.ico" type="image/x-icon" /> |  | ||||||
| 	<meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport"> |  | ||||||
|  |  | ||||||
| 	<link rel="stylesheet" href="<?php echo BASE_URL; ?>tools/css/bootstrap.min.css"> |  | ||||||
| 	<link rel="stylesheet" href="<?php echo BASE_URL; ?>tools/css/AdminLTE.min.css"> |  | ||||||
| 	<link rel="stylesheet" href="<?php echo BASE_URL; ?>tools/css/skins/skin-blue.min.css"> |  | ||||||
| 	<link rel="stylesheet" href="<?php echo BASE_URL; ?>tools/css/font-awesome.min.css"> | 	<link rel="stylesheet" href="<?php echo BASE_URL; ?>tools/css/font-awesome.min.css"> | ||||||
| 	<link rel="stylesheet" href="<?php echo BASE_URL; ?>tools/css/ionicons.min.css"> | 	<?php if (isset($use_datatable)) { ?> | ||||||
| 	<link rel="stylesheet" href="<?php echo BASE_URL; ?>tools/css/jquery.dataTables.min.css"> | 	<link rel="stylesheet" href="<?php echo BASE_URL; ?>tools/css/datatables.bs.min.css"> | ||||||
|  | 	<?php } ?> | ||||||
| 	<link rel="stylesheet" type="text/css" href="<?php echo $template_path; ?>style.css"/> | 	<link rel="stylesheet" type="text/css" href="<?php echo $template_path; ?>style.css"/> | ||||||
| 	<!--[if lt IE 9]> | 	<!--[if lt IE 9]> | ||||||
| 	<script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script> | 	<script src="<?php echo BASE_URL; ?>tools/js/html5shiv.min.js"></script> | ||||||
| 	<script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script> | 	<script src="<?php echo BASE_URL; ?>tools/js/respond.min.js"></script> | ||||||
| 	<![endif]--> | 	<![endif]--> | ||||||
| 	<link rel="stylesheet" | 	<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,600,700,300italic,400italic,600italic"> | ||||||
| 		  href="https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,600,700,300italic,400italic,600italic"> | 	<?php $hooks->trigger(HOOK_ADMIN_HEAD_END); ?> | ||||||
| </head> | </head> | ||||||
| <body class="hold-transition skin-blue sidebar-mini"> | <body class="sidebar-mini "> | ||||||
| <div class="wrapper"> | <?php $hooks->trigger(HOOK_ADMIN_BODY_START); ?> | ||||||
| 	<?php | <?php if ($logged && admin()) { ?> | ||||||
| 	if ($logged && admin()) { | 	<div class="wrapper"> | ||||||
| 	?> | 		<nav class="main-header navbar navbar-expand navbar-white navbar-light"> | ||||||
| 	<header class="main-header"> | 			<ul class="navbar-nav"> | ||||||
| 		<a href="." class="logo"> | 				<li class="nav-item"> | ||||||
| 			<span class="logo-mini"><b>M</b>A</span> | 					<a class="nav-link" data-widget="pushmenu" href="#"><i class="fas fa-bars"></i></a> | ||||||
| 			<span class="logo-lg"><b>My</b>AAC</span> | 				</li> | ||||||
| 		</a> | 				<li class="nav-item d-none d-sm-inline-block"> | ||||||
|  | 					<a href="<?php echo ADMIN_URL; ?>" class="nav-link">Home</a> | ||||||
| 		<nav class="navbar navbar-static-top" role="navigation"> | 				</li> | ||||||
| 			<a href="#" class="sidebar-toggle" data-toggle="push-menu" role="button"> | 			</ul> | ||||||
| 				<span class="sr-only">Toggle navigation</span> | 			<ul class="navbar-nav ml-auto"> | ||||||
| 			</a> | 				<li class="nav-item"> | ||||||
| 			<div class="navbar-custom-menu"> | 					<a class="nav-link" data-widget="control-sidebar" data-slide="true" href="#"><i class="fas fa-th-large"></i></a> | ||||||
| 				<ul class="nav navbar-nav"> | 				</li> | ||||||
| 					<li> | 			</ul> | ||||||
| 						<a href="#" data-toggle="control-sidebar"><i class="fa fa-gears"></i></a> |  | ||||||
| 					</li> |  | ||||||
| 				</ul> |  | ||||||
| 			</div> |  | ||||||
| 		</nav> | 		</nav> | ||||||
| 	</header> | 		<aside class="main-sidebar sidebar-dark-info elevation-4"> | ||||||
| 	<aside class="main-sidebar"> | 			<a href="<?php echo ADMIN_URL; ?>" class="brand-link navbar-info"> | ||||||
| 		<section class="sidebar"> | 				<img src="<?php echo ADMIN_URL; ?>images/logo.png" class="brand-image img-circle elevation-3" style="opacity: .8"> | ||||||
| 			<ul class="sidebar-menu" data-widget="tree"> | 				<span class="brand-text"><b>My</b>AAC</span> | ||||||
| 				<li class="header">MyAAC</li> | 			</a> | ||||||
|  | 			<div class="sidebar"> | ||||||
|  | 				<nav class="mt-1"> | ||||||
|  | 					<ul class="nav nav-pills nav-sidebar flex-column nav-legacy nav-child-indent" data-widget="treeview" data-accordion="false"> | ||||||
|  | 						<li class="menu-text-li"> | ||||||
|  | 							<span class="menu-text"> | ||||||
|  | 								<a class="text-info" href="<?php echo BASE_URL; ?>" target="_blank"> | ||||||
|  | 									<?php echo $config['lua']['serverName'] ?> | ||||||
|  | 								</a> | ||||||
|  | 							</span> | ||||||
|  | 						</li> | ||||||
|  | 						<?php | ||||||
|  | 						// name = Display name of link | ||||||
|  | 						// icon = fontawesome icon name without "fas fa-" | ||||||
|  | 						// link = Page link or use as array for sub items | ||||||
|  | 						$menus = require __DIR__ . '/menus.php'; | ||||||
|  |  | ||||||
| 				<?php | 						foreach ($menus as $category => $menu) { | ||||||
| 				$icons_a = array( | 							if (isset($menu['disabled']) && $menu['disabled']) { | ||||||
|                     'dashboard','newspaper-o', 'envelope', | 								continue; | ||||||
|                     'book', 'list', | 							} | ||||||
|                     'plug', 'user', |  | ||||||
|                     'edit', 'gavel', | 							$has_child = is_array($menu['link']); | ||||||
|                     'wrench', 'edit', 'book', 'book', | 							if (!$has_child) { ?> | ||||||
|                 ); | 								<li class="nav-item"> | ||||||
|  | 									<a class="nav-link<?php echo(strpos($menu['link'], $page) !== false ? ' active' : '') ?>" href="?p=<?php echo $menu['link'] ?>"> | ||||||
| 				$menus = array( | 										<i class="nav-icon fas fa-<?php echo(isset($menu['icon']) ? $menu['icon'] : 'link') ?>"></i> | ||||||
| 					'Dashboard' => 'dashboard', | 										<p><?php echo $menu['name'] ?></p> | ||||||
| 					'News' => 'news', | 									</a> | ||||||
| 					'Mailer' => 'mailer', | 								</li> | ||||||
| 					'Pages' => 'pages', | 								<?php | ||||||
| 					'Menus' => 'menus', | 							} else if ($has_child) { | ||||||
| 					'Plugins' => 'plugins', | 								$used_menu = null; | ||||||
| 					'Visitors' => 'visitors', | 								$nav_construct = ''; | ||||||
| 					'Editor' => array( | 								foreach ($menu['link'] as $category => $sub_menu) { | ||||||
| 						'Accounts' => 'accounts', | 									$nav_construct .= '<li class="nav-item"><a href="?p=' . $sub_menu['link'] . '" class="nav-link'; | ||||||
| 						'Players' => 'players', | 									if ($page == $sub_menu['link']) { | ||||||
| 					), | 										$nav_construct .= ' active'; | ||||||
| 					'Items' => 'items', | 										$used_menu = true; | ||||||
| 					'Tools' => array( | 									} | ||||||
| 						'Notepad' => 'notepad', | 									$nav_construct .= '"><i class="fas fa-' . ($sub_menu['icon'] ?? 'circle') . ' nav-icon"></i><p>' . $sub_menu['name'] . '</p></a></li>'; | ||||||
| 						'phpinfo' => 'phpinfo', | 								} | ||||||
| 					), | 								?> | ||||||
| 					'Logs' => array( | 								<li class="nav-item has-treeview<?php echo($used_menu ? ' menu-open' : '') ?>"> | ||||||
| 						'Logs' => 'logs', | 									<a href="#" class="nav-link<?php echo($used_menu ? ' active' : '') ?>"> | ||||||
| 						'Reports' => 'reports', | 										<i class="nav-icon fas fa-<?php echo($menu['icon'] ?? 'link') ?>"></i> | ||||||
| 					), | 										<p><?php echo $menu['name'] ?></p><i class="right fas fa-angle-left"></i> | ||||||
| 				); | 									</a> | ||||||
|  | 									<ul class="nav nav-treeview"> | ||||||
| 				$i = 0; | 										<?php echo $nav_construct; ?> | ||||||
| 				foreach ($menus as $_name => $_page) { | 									</ul> | ||||||
| 					$has_child = is_array($_page); | 								</li> | ||||||
| 					if (!$has_child) { | 								<?php | ||||||
| 						echo '<li '; |  | ||||||
| 						if ($page == $_page) echo ' class="active"'; |  | ||||||
| 						echo ">"; |  | ||||||
| 						echo '<a href="?p=' . $_page . '"><i class="fa fa-' . (isset($icons_a[$i]) ? $icons_a[$i] : 'link') . '"></i> <span>' . $_name . '</span></a></li>'; |  | ||||||
| 					} |  | ||||||
|  |  | ||||||
| 					if ($has_child) { |  | ||||||
| 						$used_menu = ""; |  | ||||||
| 						$nav_construct = ''; |  | ||||||
| 						foreach ($_page as $__name => $__page) { |  | ||||||
| 							$nav_construct = $nav_construct . '<li'; |  | ||||||
|  |  | ||||||
| 							if ($page == $__page) { |  | ||||||
| 								$nav_construct = $nav_construct . ' class="active"'; |  | ||||||
| 								$used_menu = true; |  | ||||||
| 							} | 							} | ||||||
| 							$nav_construct = $nav_construct . '><a href="?p=' . $__page . '"><i class="fa fa-circle-o"></i> ' . $__name . '</a></li>'; |  | ||||||
| 						} | 						} | ||||||
|  |  | ||||||
| 						echo '<li class="treeview' . (($used_menu) ? ' menu-open' : '') . '"> | 						$query = $db->query('SELECT `name`, `page`, `flags` FROM `' . TABLE_PREFIX . 'admin_menu` ORDER BY `ordering`'); | ||||||
|                                       <a href="#"><i class="fa fa-' . (isset($icons_a[$i]) ? $icons_a[$i] : 'link') . '"></i> <span>' . $_name . '</span> | 						$menu_db = $query->fetchAll(); | ||||||
| 						              <span class="pull-right-container"><i class="fa fa-angle-left pull-right"></i></span></a> | 						foreach ($menu_db as $item) { | ||||||
| 						              <ul class="treeview-menu" style="' . (($used_menu) ? '  display: block' : ' display: none') . '">'; | 							if ($item['flags'] == 0 || hasFlag($item['flags'])) { ?> | ||||||
| 						echo $nav_construct; | 								<li class="nav-item"> | ||||||
| 						echo '</ul> | 									<a class="nav-link<?php echo($page == $item['page'] ? ' active' : '') ?>" href="?p=<?php echo $item['page'] ?>"> | ||||||
|                                 </li>'; | 										<i class="nav-icon fas fa-link"></i> | ||||||
| 					} | 										<p><?php echo $item['name'] ?></p> | ||||||
| 					$i++; | 									</a> | ||||||
| 				} | 								</li> | ||||||
|  | 								<?php | ||||||
|  | 							} | ||||||
|  | 						} | ||||||
|  | 						?> | ||||||
|  | 					</ul> | ||||||
|  | 				</nav> | ||||||
|  | 			</div> | ||||||
|  | 		</aside> | ||||||
|  |  | ||||||
| 				$query = $db->query('SELECT `name`, `page`, `flags` FROM `' . TABLE_PREFIX . 'admin_menu` ORDER BY `ordering`'); | 		<div class="content-wrapper" style="min-height: 823px;"> | ||||||
| 				$menu_db = $query->fetchAll(); | 			<div class="content-header"> | ||||||
| 				foreach ($menu_db as $item) { | 				<div class="container-fluid"> | ||||||
| 					if ($item['flags'] == 0 || hasFlag($item['flags'])) { | 					<div class="row mb-2"> | ||||||
| 						echo '<li '; | 						<div class="col-sm-6"> | ||||||
| 						if ($page == $item['page']) echo ' class="active"'; | 							<h3 class="m-0 text-dark"><?php echo(isset($title) ? $title : ''); ?><small> - Admin Panel</small></h3> | ||||||
| 						echo ">"; | 						</div> | ||||||
| 						echo '<a href="?p=' . $item['page'] . '"><i class="fa fa-link"></i> <span>' . $item['name'] . '</span></a></li>'; | 						<div class="col-sm-6"> | ||||||
| 					} | 							<div class="float-sm-right d-none d-sm-inline"> | ||||||
| 				} | 								<span class="p-2 right badge badge-<?php echo((isset($status['online']) and $status['online']) ? 'success' : 'danger'); ?>"><?php echo $config['lua']['serverName'] ?></span> | ||||||
| 				?> | 							</div> | ||||||
| 			</ul> | 						</div> | ||||||
| 		</section> | 					</div> | ||||||
| 	</aside> |  | ||||||
|  |  | ||||||
| 	<div class="content-wrapper"> |  | ||||||
| 		<section class="content-header"> |  | ||||||
| 			<h1><?php echo(isset($title) ? $title : ''); ?> |  | ||||||
| 				<small> - Admin Panel</small> |  | ||||||
| 				<div class="pull-right"> |  | ||||||
| 					<span class="label label-<?php echo(($status['online']) ? 'success' : 'danger'); ?>"><?php echo $config['lua']['serverName'] ?></span> |  | ||||||
| 				</div> | 				</div> | ||||||
| 			</h1> | 			</div> | ||||||
| 		</section> | 			<div class="content"> | ||||||
| 		<section class="content"> | 				<div class="container-fluid"> | ||||||
| 			<?php echo $content; ?> | 					<?php echo $content; ?> | ||||||
| 		</section> | 				</div> | ||||||
|  | 			</div> | ||||||
|  | 		</div> | ||||||
|  |  | ||||||
|  | 		<aside class="control-sidebar control-sidebar-dark"> | ||||||
|  | 			<div class="p-3"> | ||||||
|  | 				<h4>Account:</h4> | ||||||
|  | 				<p><h5><a href="?action=logout"><i class="fas fa-sign-out-alt text-danger"></i> Log out</h5></a> | ||||||
|  | 				<small>This will log you out</small></p> | ||||||
|  | 			</div> | ||||||
|  | 			<div class="p-3"> | ||||||
|  | 				<h4>Site:</h4> | ||||||
|  | 				<p><h5><a href="<?php echo BASE_URL; ?>" target="_blank"><i class="far fa-eye text-blue"></i> Preview</a></h5> | ||||||
|  | 				<small>This will open a new tab</small></p> | ||||||
|  | 			</div> | ||||||
|  | 			<div class="p-3"> | ||||||
|  | 				<h4>Version:</h4> | ||||||
|  | 				<p><h5><a href="?p=version"><i class="fas fa-code-branch"></i> <?php echo MYAAC_VERSION; ?></a></h5> | ||||||
|  | 				<small>Check for updates</small></p> | ||||||
|  | 			</div> | ||||||
|  | 			<div class="p-3"> | ||||||
|  | 				<h4>Site:</h4> | ||||||
|  | 				<p><h5><a href="https://github.com/slawkens/myaac" target="_blank"><i class="fab fa-github"></i> Github</a></h5> | ||||||
|  | 				<small>Goto GitHub Page</small></p> | ||||||
|  |  | ||||||
|  | 				<p><h5><a href="http://my-aac.org/" target="_blank"><i class="fas fa-shoe-prints"></i> MyAAC Official</a></h5> | ||||||
|  | 				<small>Goto MyAAC Official Website</small></p> | ||||||
|  |  | ||||||
|  | 				<p><h5><a href="?p=open_source"><i class="fas fa-wrench"></i> Open Source</a></h5> | ||||||
|  | 				<small>View Open Source Software MyAAC is using</small></p> | ||||||
|  | 			</div> | ||||||
|  | 		</aside> | ||||||
|  |  | ||||||
|  | 		<footer class="main-footer"> | ||||||
|  | 			<div class="float-sm-right d-none d-sm-inline"> | ||||||
|  | 				<span class="p-2 right badge badge-<?php echo((isset($status['online']) and $status['online']) ? 'success' : 'danger'); ?>"><?php echo $config['lua']['serverName'] ?></span> | ||||||
|  | 			</div> | ||||||
|  | 			<?php echo base64_decode('UG93ZXJlZCBieSA8YSBocmVmPSJodHRwOi8vbXktYWFjLm9yZyIgdGFyZ2V0PSJfYmxhbmsiPk15QUFDLjwvYT4='); ?> | ||||||
|  | 		</footer> | ||||||
|  | 		<div id="sidebar-overlay"></div> | ||||||
| 	</div> | 	</div> | ||||||
|  |  | ||||||
| 	<footer class="main-footer"> | <?php } else if (!$logged && !admin()) { | ||||||
|  |  | ||||||
| 		<div class="pull-right hidden-xs"> |  | ||||||
| 			<div id="status"> |  | ||||||
| 				<?php if ($status['online']): ?> |  | ||||||
| 					<p class="success" style="width: 120px; text-align: center;">Server Online</p> |  | ||||||
| 				<?php else: ?> |  | ||||||
| 					<p class="error" style="width: 120px; text-align: center;">Server Offline</p> |  | ||||||
| 				<?php endif; ?> |  | ||||||
| 			</div> |  | ||||||
| 		</div> |  | ||||||
| 		<?php echo base64_decode('UG93ZXJlZCBieSA8YSBocmVmPSJodHRwOi8vbXktYWFjLm9yZyIgdGFyZ2V0PSJfYmxhbmsiPk15QUFDLjwvYT4='); ?> |  | ||||||
| 	</footer> |  | ||||||
|  |  | ||||||
| 	<aside class="control-sidebar control-sidebar-dark"> |  | ||||||
| 		<ul class="nav nav-tabs nav-justified control-sidebar-tabs"> |  | ||||||
| 			<li class="active"><a href="#control-sidebar-home-tab" data-toggle="tab"><i class="fa fa-home"></i></a></li> |  | ||||||
| 			<li><a href="#control-sidebar-settings-tab" data-toggle="tab"><i class="fa fa-gears"></i></a></li> |  | ||||||
| 		</ul> |  | ||||||
| 		<div class="tab-content"> |  | ||||||
| 			<div class="tab-pane active" id="control-sidebar-home-tab"> |  | ||||||
| 				<h3 class="control-sidebar-heading">Account</h3> |  | ||||||
| 				<ul class="control-sidebar-menu"> |  | ||||||
| 					<li> |  | ||||||
| 						<a href="?action=logout"> |  | ||||||
| 							<i class="menu-icon fa  fa-sign-out bg-red"></i> |  | ||||||
| 							<div class="menu-info"> |  | ||||||
| 								<h4 class="control-sidebar-subheading">Log out</h4> |  | ||||||
| 								<p>This will log you out |  | ||||||
| 									of <?php echo(USE_ACCOUNT_NAME ? $account_logged->getName() : $account_logged->getId()); ?></p> |  | ||||||
| 							</div> |  | ||||||
| 						</a> |  | ||||||
| 					</li> |  | ||||||
| 				</ul> |  | ||||||
| 				<h3 class="control-sidebar-heading">Site</h3> |  | ||||||
| 				<ul class="control-sidebar-menu"> |  | ||||||
| 					<li> |  | ||||||
| 						<a href="<?php echo BASE_URL; ?>" target="_blank"> |  | ||||||
| 							<i class="menu-icon fa  fa-eye bg-blue"></i> |  | ||||||
| 							<div class="menu-info"> |  | ||||||
| 								<h4 class="control-sidebar-subheading">Preview</h4> |  | ||||||
| 								<p>This will open a new tab</p> |  | ||||||
| 							</div> |  | ||||||
| 						</a> |  | ||||||
| 					</li> |  | ||||||
| 				</ul> |  | ||||||
| 			</div> |  | ||||||
| 			<div class="tab-pane" id="control-sidebar-settings-tab"> |  | ||||||
| 				<form method="post"> |  | ||||||
| 					<h3 class="control-sidebar-heading">Version</h3> |  | ||||||
|  |  | ||||||
| 					<div class="form-group"> |  | ||||||
| 						<label class="control-sidebar-subheading"> |  | ||||||
| 							<?php echo MYAAC_VERSION; ?> (<a href="?p=version">Check for updates</a>)<br/> |  | ||||||
| 						</label> |  | ||||||
| 						<label class="control-sidebar-subheading"> |  | ||||||
| 							<p><a href="https://github.com/slawkens/myaac" target="_blank">Github</a></p> |  | ||||||
| 					</div> |  | ||||||
| 				</form> |  | ||||||
| 			</div> |  | ||||||
| 		</div> |  | ||||||
| 	</aside> |  | ||||||
| 	<div class="control-sidebar-bg"></div> |  | ||||||
| </div> |  | ||||||
|  |  | ||||||
| <?php } |  | ||||||
| if (!$logged && !admin()) { |  | ||||||
| 	echo $content; | 	echo $content; | ||||||
| } | } | ||||||
| ?> | ?> | ||||||
|  | <?php | ||||||
|  | /** | ||||||
|  |  * @var OTS_Account $account_logged | ||||||
|  |  */ | ||||||
|  | if ($logged && admin()) { | ||||||
|  | 	$twig->display('admin-bar.html.twig', [ | ||||||
|  | 		'username' => USE_ACCOUNT_NAME ? $account_logged->getName() : $account_logged->getId() | ||||||
|  | 	]); | ||||||
|  | } | ||||||
|  | ?> | ||||||
| <script src="<?php echo BASE_URL; ?>tools/js/bootstrap.min.js"></script> | <script src="<?php echo BASE_URL; ?>tools/js/bootstrap.min.js"></script> | ||||||
| <script src="<?php echo BASE_URL; ?>tools/js/jquery-ui.min.js"></script> | <script src="<?php echo BASE_URL; ?>tools/js/jquery-ui.min.js"></script> | ||||||
| <script src="<?php echo BASE_URL; ?>tools/js/jquery.dataTables.min.js"></script> | <?php if (isset($use_datatable))  { ?> | ||||||
|  | <script src="<?php echo BASE_URL; ?>tools/js/datatables.min.js"></script> | ||||||
|  | <script src="<?php echo BASE_URL; ?>tools/js/datatables.bs.min.js"></script> | ||||||
|  | <?php } ?> | ||||||
| <script src="<?php echo BASE_URL; ?>tools/js/adminlte.min.js"></script> | <script src="<?php echo BASE_URL; ?>tools/js/adminlte.min.js"></script> | ||||||
|  | <?php $hooks->trigger(HOOK_ADMIN_BODY_END); ?> | ||||||
| </body> | </body> | ||||||
| </html> | </html> | ||||||
| @@ -13,3 +13,4 @@ if(!function_exists('phpinfo')) | |||||||
| 	die('phpinfo() disabled on this web server.'); | 	die('phpinfo() disabled on this web server.'); | ||||||
|  |  | ||||||
| phpinfo(); | phpinfo(); | ||||||
|  | ?> | ||||||
|   | |||||||
							
								
								
									
										46
									
								
								admin/tools/reload_data.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,46 @@ | |||||||
|  | <?php | ||||||
|  | /** | ||||||
|  |  * Project: MyAAC | ||||||
|  |  *     Automatic Account Creator for Open Tibia Servers | ||||||
|  |  * | ||||||
|  |  * This is free software; you can redistribute it and/or | ||||||
|  |  * modify it under the terms of the GNU Lesser General Public | ||||||
|  |  * License as published by the Free Software Foundation; either | ||||||
|  |  * version 2.1 of the License, or (at your option) any later version. | ||||||
|  |  * | ||||||
|  |  * This software is distributed in the hope that it will be useful, | ||||||
|  |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | ||||||
|  |  * Lesser General Public License for more details. | ||||||
|  |  * | ||||||
|  |  * You should have received a copy of the GNU Lesser General Public | ||||||
|  |  * License along with this library; if not, write to the Free Software | ||||||
|  |  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA | ||||||
|  |  * | ||||||
|  |  * @package   MyAAC | ||||||
|  |  * @author    Slawkens <slawkens@gmail.com> | ||||||
|  |  * @copyright 2020 MyAAC | ||||||
|  |  * @link      https://my-aac.org | ||||||
|  |  */ | ||||||
|  | define('MYAAC_ADMIN', true); | ||||||
|  |  | ||||||
|  | require '../../common.php'; | ||||||
|  | require SYSTEM . 'functions.php'; | ||||||
|  | require SYSTEM . 'init.php'; | ||||||
|  | require SYSTEM . 'login.php'; | ||||||
|  |  | ||||||
|  | if (!admin()) | ||||||
|  | 	die('Access denied.'); | ||||||
|  |  | ||||||
|  | ini_set('max_execution_time', 300); | ||||||
|  | ob_implicit_flush(); | ||||||
|  | ob_end_flush(); | ||||||
|  | header('X-Accel-Buffering: no'); | ||||||
|  |  | ||||||
|  | require LIBS . 'DataLoader.php'; | ||||||
|  |  | ||||||
|  | require LOCALE . 'en/main.php'; | ||||||
|  | require LOCALE . 'en/install.php'; | ||||||
|  |  | ||||||
|  | DataLoader::setLocale($locale); | ||||||
|  | DataLoader::load(); | ||||||
							
								
								
									
										53
									
								
								admin/tools/upload_image.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,53 @@ | |||||||
|  | <?php | ||||||
|  | define('MYAAC_ADMIN', true); | ||||||
|  |  | ||||||
|  | require '../../common.php'; | ||||||
|  | require SYSTEM . 'functions.php'; | ||||||
|  | require SYSTEM . 'init.php'; | ||||||
|  | require SYSTEM . 'login.php'; | ||||||
|  |  | ||||||
|  | if(!admin()) | ||||||
|  | 	die('Access denied.'); | ||||||
|  |  | ||||||
|  | // Don't attempt to process the upload on an OPTIONS request | ||||||
|  | if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') { | ||||||
|  | 	header('Access-Control-Allow-Methods: POST, OPTIONS'); | ||||||
|  | 	return; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | $imageFolder = BASE . EDITOR_IMAGES_DIR; | ||||||
|  |  | ||||||
|  | reset ($_FILES); | ||||||
|  | $temp = current($_FILES); | ||||||
|  | if (is_uploaded_file($temp['tmp_name'])) { | ||||||
|  | 	header('Access-Control-Allow-Credentials: true'); | ||||||
|  | 	header('P3P: CP="There is no P3P policy."'); | ||||||
|  |  | ||||||
|  | 	// Sanitize input | ||||||
|  | 	if (preg_match("/([^\w\s\d\-_~,;:\[\]\(\).])|([\.]{2,})/", $temp['name'])) { | ||||||
|  | 		header('HTTP/1.1 400 Invalid file name.'); | ||||||
|  | 		return; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// Verify extension | ||||||
|  | 	$ext = strtolower(pathinfo($temp['name'], PATHINFO_EXTENSION)); | ||||||
|  | 	if (!in_array($ext, ['gif', 'jpg', 'png'])) { | ||||||
|  | 		header('HTTP/1.1 400 Invalid extension.'); | ||||||
|  | 		return; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	do { | ||||||
|  | 		$randomName = generateRandomString(8). ".$ext"; | ||||||
|  | 		$fileToWrite = $imageFolder . $randomName; | ||||||
|  | 	} while (file_exists($fileToWrite)); | ||||||
|  |  | ||||||
|  | 	move_uploaded_file($temp['tmp_name'], $fileToWrite); | ||||||
|  |  | ||||||
|  | 	$returnPathToImage = BASE_URL . EDITOR_IMAGES_DIR . $randomName; | ||||||
|  | 	echo json_encode(['location' => $returnPathToImage]); | ||||||
|  | } else { | ||||||
|  | 	// Notify editor that the upload failed | ||||||
|  | 	header('HTTP/1.1 500 Server Error'); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
							
								
								
									
										144
									
								
								common.php
									
									
									
									
									
								
							
							
						
						| @@ -25,68 +25,93 @@ | |||||||
|  */ |  */ | ||||||
| if (version_compare(phpversion(), '7.2.5', '<')) die('PHP version 7.2.5 or higher is required.'); | if (version_compare(phpversion(), '7.2.5', '<')) die('PHP version 7.2.5 or higher is required.'); | ||||||
|  |  | ||||||
| define('MYAAC', true); | const MYAAC = true; | ||||||
| define('MYAAC_VERSION', '0.8.23'); | const MYAAC_VERSION = '0.9.0-alpha'; | ||||||
| define('DATABASE_VERSION', 33); | const DATABASE_VERSION = 35; | ||||||
| define('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')); | ||||||
| define('IS_CLI', in_array(php_sapi_name(), ['cli', 'phpdb'])); | define('IS_CLI', in_array(php_sapi_name(), ['cli', 'phpdb'])); | ||||||
|  |  | ||||||
| // account flags | // account flags | ||||||
| define('FLAG_ADMIN', 1); | const FLAG_NONE = 0; | ||||||
| define('FLAG_SUPER_ADMIN', 2); | const FLAG_ADMIN = 1; | ||||||
| define('FLAG_CONTENT_PAGES', 4); | const FLAG_SUPER_ADMIN = 2; | ||||||
| define('FLAG_CONTENT_MAILER', 8); | const FLAG_SUPER_BOTH = 3; | ||||||
| define('FLAG_CONTENT_NEWS', 16); | const FLAG_CONTENT_PAGES = 4; | ||||||
| define('FLAG_CONTENT_FORUM', 32); | const FLAG_CONTENT_MAILER = 8; | ||||||
| define('FLAG_CONTENT_COMMANDS', 64); | const FLAG_CONTENT_NEWS = 16; | ||||||
| define('FLAG_CONTENT_SPELLS', 128); | const FLAG_CONTENT_FORUM = 32; | ||||||
| define('FLAG_CONTENT_MONSTERS', 256); | const FLAG_CONTENT_COMMANDS = 64; | ||||||
| define('FLAG_CONTENT_GALLERY', 512); | const FLAG_CONTENT_SPELLS = 128; | ||||||
| define('FLAG_CONTENT_VIDEOS', 1024); | const FLAG_CONTENT_MONSTERS = 256; | ||||||
| define('FLAG_CONTENT_FAQ', 2048); | const FLAG_CONTENT_GALLERY = 512; | ||||||
| define('FLAG_CONTENT_MENUS', 4096); | const FLAG_CONTENT_VIDEOS = 1024; | ||||||
| define('FLAG_CONTENT_PLAYERS', 8192); | const FLAG_CONTENT_FAQ = 2048; | ||||||
|  | const FLAG_CONTENT_MENUS = 4096; | ||||||
|  | const FLAG_CONTENT_PLAYERS = 8192; | ||||||
|  |  | ||||||
|  | // account access types | ||||||
|  | const ACCOUNT_WEB_FLAGS = [ | ||||||
|  | 	FLAG_NONE => 'None', | ||||||
|  | 	FLAG_ADMIN =>'Admin', | ||||||
|  | 	FLAG_SUPER_ADMIN => 'Super Admin', | ||||||
|  | 	FLAG_SUPER_BOTH =>'(Admin + Super Admin)', | ||||||
|  | ]; | ||||||
|  |  | ||||||
| // news | // news | ||||||
| define('NEWS', 1); | const NEWS = 1; | ||||||
| define('TICKER', 2); | const TICKER = 2; | ||||||
| define('ARTICLE', 3); | const ARTICLE = 3; | ||||||
|  |  | ||||||
|  | // here you can change location of admin panel | ||||||
|  | // you need also to rename folder "admin" | ||||||
|  | // this may improve security | ||||||
|  | const ADMIN_PANEL_FOLDER = 'admin'; | ||||||
|  |  | ||||||
| // directories | // directories | ||||||
| define('BASE', __DIR__ . '/'); | const BASE = __DIR__ . '/'; | ||||||
| define('ADMIN', BASE . 'admin/'); | const ADMIN = BASE . ADMIN_PANEL_FOLDER . '/'; | ||||||
| define('SYSTEM', BASE . 'system/'); | const SYSTEM = BASE . 'system/'; | ||||||
| define('CACHE', SYSTEM . 'cache/'); | const CACHE = SYSTEM . 'cache/'; | ||||||
| define('LOCALE', SYSTEM . 'locale/'); | const LOCALE = SYSTEM . 'locale/'; | ||||||
| define('LIBS', SYSTEM . 'libs/'); | const LIBS = SYSTEM . 'libs/'; | ||||||
| define('LOGS', SYSTEM . 'logs/'); | const LOGS = SYSTEM . 'logs/'; | ||||||
| define('PAGES', SYSTEM . 'pages/'); | const PAGES = SYSTEM . 'pages/'; | ||||||
| define('PLUGINS', BASE . 'plugins/'); | const PLUGINS = BASE . 'plugins/'; | ||||||
| define('TEMPLATES', BASE . 'templates/'); | const TEMPLATES = BASE . 'templates/'; | ||||||
| define('TOOLS', BASE . 'tools/'); | const TOOLS = BASE . 'tools/'; | ||||||
|  | const VENDOR = BASE . 'vendor/'; | ||||||
|  |  | ||||||
|  | // other dirs | ||||||
|  | const SESSIONS_DIR = SYSTEM . 'php_sessions'; | ||||||
|  | const GUILD_IMAGES_DIR = 'images/guilds/'; | ||||||
|  | const EDITOR_IMAGES_DIR = 'images/editor/'; | ||||||
|  | const GALLERY_DIR = 'images/gallery/'; | ||||||
|  |  | ||||||
| // menu categories | // menu categories | ||||||
| define('MENU_CATEGORY_NEWS', 1); | const MENU_CATEGORY_NEWS = 1; | ||||||
| define('MENU_CATEGORY_ACCOUNT', 2); | const MENU_CATEGORY_ACCOUNT = 2; | ||||||
| define('MENU_CATEGORY_COMMUNITY', 3); | const MENU_CATEGORY_COMMUNITY = 3; | ||||||
| define('MENU_CATEGORY_FORUM', 4); | const MENU_CATEGORY_FORUM = 4; | ||||||
| define('MENU_CATEGORY_LIBRARY', 5); | const MENU_CATEGORY_LIBRARY = 5; | ||||||
| define('MENU_CATEGORY_SHOP', 6); | const MENU_CATEGORY_SHOP = 6; | ||||||
|  |  | ||||||
| // otserv versions | // otserv versions | ||||||
| define('OTSERV', 1); | const OTSERV = 1; | ||||||
| define('OTSERV_06', 2); | const OTSERV_06 = 2; | ||||||
| define('OTSERV_FIRST', OTSERV); | const OTSERV_FIRST = OTSERV; | ||||||
| define('OTSERV_LAST', OTSERV_06); | const OTSERV_LAST = OTSERV_06; | ||||||
| define('TFS_02', 3); | const TFS_02 = 3; | ||||||
| define('TFS_03', 4); | const TFS_03 = 4; | ||||||
| define('TFS_FIRST', TFS_02); | const TFS_FIRST = TFS_02; | ||||||
| define('TFS_LAST', TFS_03); | const TFS_LAST = TFS_03; | ||||||
|  |  | ||||||
|  | // other definitions | ||||||
|  | const ACCOUNT_NUMBER_LENGTH = 8; | ||||||
|  |  | ||||||
| if (!IS_CLI) { | if (!IS_CLI) { | ||||||
| 	session_save_path(SYSTEM . 'php_sessions'); | 	session_save_path(SESSIONS_DIR); | ||||||
| 	session_start(); | 	session_start(); | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -97,13 +122,9 @@ $size = count($tmp) - 1; | |||||||
| for($i = 1; $i < $size; $i++) | for($i = 1; $i < $size; $i++) | ||||||
| 	$basedir .= '/' . $tmp[$i]; | 	$basedir .= '/' . $tmp[$i]; | ||||||
|  |  | ||||||
| $basedir = str_replace(array('/admin', '/install', '/tools'), '', $basedir); | $basedir = str_replace(['/' . ADMIN_PANEL_FOLDER, '/install', '/tools'], '', $basedir); | ||||||
| define('BASE_DIR', $basedir); | define('BASE_DIR', $basedir); | ||||||
|  |  | ||||||
| if (file_exists(BASE . 'config.local.php') && !defined('MYAAC_INSTALL')) { |  | ||||||
| 	require BASE . 'config.local.php'; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| if(!IS_CLI) { | if(!IS_CLI) { | ||||||
| 	if (isset($_SERVER['HTTP_HOST'][0])) { | 	if (isset($_SERVER['HTTP_HOST'][0])) { | ||||||
| 		$baseHost = $_SERVER['HTTP_HOST']; | 		$baseHost = $_SERVER['HTTP_HOST']; | ||||||
| @@ -115,21 +136,16 @@ if(!IS_CLI) { | |||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	define('SERVER_URL', 'http' . (isHttps() ? 's' : '') . '://' . $baseHost); | 	define('SERVER_URL', 'http' . (isset($_SERVER['HTTPS'][0]) && strtolower($_SERVER['HTTPS']) === 'on' ? 's' : '') . '://' . $baseHost); | ||||||
| 	define('BASE_URL', SERVER_URL . BASE_DIR . '/'); | 	define('BASE_URL', SERVER_URL . BASE_DIR . '/'); | ||||||
| 	define('ADMIN_URL', SERVER_URL . BASE_DIR . '/admin/'); | 	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(@$config['env'] === 'dev') { |  | ||||||
| 		require SYSTEM . 'exception.php'; |  | ||||||
| 	} |  | ||||||
| } | } | ||||||
| require SYSTEM . 'autoload.php'; |  | ||||||
|  |  | ||||||
| function isHttps(): bool | $autoloadFile = VENDOR . 'autoload.php'; | ||||||
| { | if (!is_file($autoloadFile)) { | ||||||
| 	return | 	throw new RuntimeException('The vendor folder is missing. Please download Composer: <a href="https://getcomposer.org/download">https://getcomposer.org/download</a>, install it and execute in the main MyAAC directory this command: <b>composer install</b>. Or download MyAAC from <a href="https://github.com/slawkens/myaac/releases">GitHub releases</a>, which includes Vendor folder.'); | ||||||
| 		(!empty($_SERVER['HTTP_X_FORWARDED_PROTO']) && strtolower($_SERVER['HTTP_X_FORWARDED_PROTO']) === 'https') |  | ||||||
| 		|| (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') |  | ||||||
| 		|| (isset($_SERVER['SERVER_PORT']) && (int) $_SERVER['SERVER_PORT'] === 443); |  | ||||||
| } | } | ||||||
|  |  | ||||||
|  | require $autoloadFile; | ||||||
|   | |||||||
							
								
								
									
										19
									
								
								composer.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,19 @@ | |||||||
|  | { | ||||||
|  |     "require": { | ||||||
|  |         "php": "^7.2.5 || ^8.0", | ||||||
|  |         "ext-pdo": "*", | ||||||
|  |         "ext-pdo_mysql": "*", | ||||||
|  |         "ext-json": "*", | ||||||
|  |         "ext-xml": "*", | ||||||
|  |         "ext-dom": "*", | ||||||
|  |         "phpmailer/phpmailer": "^6.1", | ||||||
|  |         "composer/semver": "^3.2", | ||||||
|  |         "twig/twig": "^2.0", | ||||||
|  |         "erusev/parsedown": "^1.7", | ||||||
|  |         "nikic/fast-route": "^1.3", | ||||||
|  |         "matomo/device-detector": "^6.0" | ||||||
|  |     }, | ||||||
|  |     "require-dev": { | ||||||
|  |         "filp/whoops": "^2.15" | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										68
									
								
								config.php
									
									
									
									
									
								
							
							
						
						| @@ -52,7 +52,6 @@ $config = array( | |||||||
| 	// head options (html) | 	// head options (html) | ||||||
| 	'meta_description' => 'Tibia is a free massive multiplayer online role playing game (MMORPG).', // description of the site | 	'meta_description' => 'Tibia is a free massive multiplayer online role playing game (MMORPG).', // description of the site | ||||||
| 	'meta_keywords' => 'free online game, free multiplayer game, ots, open tibia server', // keywords list separated by commas | 	'meta_keywords' => 'free online game, free multiplayer game, ots, open tibia server', // keywords list separated by commas | ||||||
| 	'title_separator' => ' - ', |  | ||||||
|  |  | ||||||
| 	// footer | 	// footer | ||||||
| 	'footer' => ''/*'<br/>Your Server © 2016. All rights reserved.'*/, | 	'footer' => ''/*'<br/>Your Server © 2016. All rights reserved.'*/, | ||||||
| @@ -74,10 +73,9 @@ $config = array( | |||||||
| 	'database_user' => '', | 	'database_user' => '', | ||||||
| 	'database_password' => '', | 	'database_password' => '', | ||||||
| 	'database_name' => '', | 	'database_name' => '', | ||||||
| 	'database_log' => false, // should database queries be logged and and saved into system/logs/database.log? | 	'database_log' => false, // should database queries be logged and saved into system/logs/database.log? | ||||||
| 	'database_socket' => '', // set if you want to connect to database through socket (example: /var/run/mysqld/mysqld.sock) | 	'database_socket' => '', // set if you want to connect to database through socket (example: /var/run/mysqld/mysqld.sock) | ||||||
| 	'database_persistent' => false, // use database permanent connection (like server), may speed up your site | 	'database_persistent' => false, // use database permanent connection (like server), may speed up your site | ||||||
| 	'database_encryption' => 'sha1', |  | ||||||
|  |  | ||||||
| 	// multiworld system (only TFS 0.3) | 	// multiworld system (only TFS 0.3) | ||||||
| 	'multiworld' => false, // use multiworld system? | 	'multiworld' => false, // use multiworld system? | ||||||
| @@ -88,10 +86,21 @@ $config = array( | |||||||
|  |  | ||||||
| 	// images | 	// images | ||||||
| 	'outfit_images_url' => 'https://outfit-images.ots.me/outfit.php', // set to animoutfit.php for animated outfit | 	'outfit_images_url' => 'https://outfit-images.ots.me/outfit.php', // set to animoutfit.php for animated outfit | ||||||
|  | 	'outfit_images_wrong_looktypes' => [75, 126, 127, 266, 302], // this looktypes needs to have different margin-top and margin-left because they are wrong positioned | ||||||
| 	'item_images_url' => 'https://item-images.ots.me/1092/', // set to images/items if you host your own items in images folder | 	'item_images_url' => 'https://item-images.ots.me/1092/', // set to images/items if you host your own items in images folder | ||||||
|  | 	'item_images_extension' => '.gif', | ||||||
|  |  | ||||||
|  | 	// creatures | ||||||
|  | 	'creatures_images_url' => 'images/monsters/', // set to images/monsters if you host your own creatures in images folder | ||||||
|  | 	'creatures_images_extension' => '.gif', | ||||||
|  | 	'creatures_images_preview' => false,  // set to true to allow picture previews for creatures | ||||||
|  | 	'creatures_items_url' => 'https://tibia.fandom.com/wiki/', // set to website which shows details about items. | ||||||
|  | 	'creatures_loot_percentage' => true, // set to true to show the loot tooltip percent | ||||||
|  |  | ||||||
| 	// account | 	// account | ||||||
| 	'account_management' => true, // disable if you're using other method to manage users (fe. tfs account manager) | 	'account_management' => true, // disable if you're using other method to manage users (fe. tfs account manager) | ||||||
|  | 	'account_login_by_email' => false, // use email instead of Account Name like in latest Tibia | ||||||
|  | 	'account_login_by_email_fallback' => false, // allow also additionally login by Account Name/Number (for users that might forget their email) | ||||||
| 	'account_create_auto_login' => false, // auto login after creating account? | 	'account_create_auto_login' => false, // auto login after creating account? | ||||||
| 	'account_create_character_create' => true, // allow directly to create character on create account page? | 	'account_create_character_create' => true, // allow directly to create character on create account page? | ||||||
| 	'account_mail_verify' => false, // force users to confirm their email addresses when registering | 	'account_mail_verify' => false, // force users to confirm their email addresses when registering | ||||||
| @@ -103,6 +112,7 @@ $config = array( | |||||||
| 		'message' => 'You received %d %s for confirming your E-Mail address.' // example: You received 20 premium points for confirming your E-Mail address. | 		'message' => 'You received %d %s for confirming your E-Mail address.' // example: You received 20 premium points for confirming your E-Mail address. | ||||||
| 	], | 	], | ||||||
| 	'account_mail_unique' => true, // email addresses cannot be duplicated? (one account = one email) | 	'account_mail_unique' => true, // email addresses cannot be duplicated? (one account = one email) | ||||||
|  | 	'account_mail_block_plus_sign' => true, // block email with '+' signs like test+box@gmail.com (help protect against spamming accounts) | ||||||
| 	'account_premium_days' => 0, // default premium days on new account | 	'account_premium_days' => 0, // default premium days on new account | ||||||
| 	'account_premium_points' => 0, // default premium points on new account | 	'account_premium_points' => 0, // default premium points on new account | ||||||
| 	'account_welcome_mail' => true, // send welcome email when user registers | 	'account_welcome_mail' => true, // send welcome email when user registers | ||||||
| @@ -132,18 +142,24 @@ $config = array( | |||||||
| 	'smtp_secure' => '', // What kind of encryption to use on the SMTP connection. Options: '', 'ssl' (GMail) or 'tls' (Microsoft Outlook) | 	'smtp_secure' => '', // What kind of encryption to use on the SMTP connection. Options: '', 'ssl' (GMail) or 'tls' (Microsoft Outlook) | ||||||
| 	'smtp_debug' => false, // set true to debug (you will see more info in error.log) | 	'smtp_debug' => false, // set true to debug (you will see more info in error.log) | ||||||
|  |  | ||||||
| 	// reCAPTCHA (prevent spam bots) |  | ||||||
| 	'recaptcha_enabled' => false, // enable recaptcha verification code |  | ||||||
| 	'recaptcha_site_key' => '', // get your own site and secret keys at https://www.google.com/recaptcha |  | ||||||
| 	'recaptcha_secret_key' => '', |  | ||||||
| 	'recaptcha_theme' => 'light', // light, dark |  | ||||||
|  |  | ||||||
| 	// | 	// | ||||||
| 	'generate_new_reckey' => true,				// let player generate new recovery key, he will receive e-mail with new rec key (not display on page, hacker can't generate rec key) | 	'generate_new_reckey' => true,				// let player generate new recovery key, he will receive e-mail with new rec key (not display on page, hacker can't generate rec key) | ||||||
| 	'generate_new_reckey_price' => 20,			// price for new recovery key | 	'generate_new_reckey_price' => 20,			// price for new recovery key | ||||||
| 	'send_mail_when_change_password' => true,	// send e-mail with new password when change password to account | 	'send_mail_when_change_password' => true,	// send e-mail with new password when change password to account | ||||||
| 	'send_mail_when_generate_reckey' => true,	// send e-mail with rec key (key is displayed on page anyway when generate) | 	'send_mail_when_generate_reckey' => true,	// send e-mail with rec key (key is displayed on page anyway when generate) | ||||||
|  |  | ||||||
|  | 	// you may need to adjust this for older tfs versions | ||||||
|  | 	// by removing Community Manager | ||||||
|  | 	'account_types' => [ | ||||||
|  | 		'None', | ||||||
|  | 		'Normal', | ||||||
|  | 		'Tutor', | ||||||
|  | 		'Senior Tutor', | ||||||
|  | 		'Gamemaster', | ||||||
|  | 		'Community Manager', | ||||||
|  | 		'God', | ||||||
|  | 	], | ||||||
|  |  | ||||||
| 	// genders (aka sex) | 	// genders (aka sex) | ||||||
| 	'genders' => array( | 	'genders' => array( | ||||||
| 		0 => 'Female', | 		0 => 'Female', | ||||||
| @@ -172,9 +188,12 @@ $config = array( | |||||||
| 	// This is the minimum and the maximum length that a player can create a character. It is highly recommend the maximum length to be 21. | 	// This is the minimum and the maximum length that a player can create a character. It is highly recommend the maximum length to be 21. | ||||||
| 	'character_name_min_length' => 4, | 	'character_name_min_length' => 4, | ||||||
| 	'character_name_max_length' => 21, | 	'character_name_max_length' => 21, | ||||||
|  | 	'character_name_npc_check' => true, | ||||||
|  |  | ||||||
| 	// list of towns | 	// list of towns | ||||||
| 	// if you use TFS 1.3 with support for 'towns' table in database, then you can ignore this - it will be configured automatically (generated from your .OTBM map) | 	// if you use TFS 1.3 with support for 'towns' table in database, then you can ignore this - it will be configured automatically (from MySQL database - Table - towns) | ||||||
|  | 	// otherwise it will try to load from your .OTBM map file | ||||||
|  | 	// if you don't see towns on website, then you need to fill this out | ||||||
| 	'towns' => array( | 	'towns' => array( | ||||||
| 		0 => 'No town', | 		0 => 'No town', | ||||||
| 		1 => 'Sample town' | 		1 => 'Sample town' | ||||||
| @@ -185,6 +204,7 @@ $config = array( | |||||||
| 	'guild_need_level' => 1, // min. level to form a guild | 	'guild_need_level' => 1, // min. level to form a guild | ||||||
| 	'guild_need_premium' => true, // require premium account to form a guild? | 	'guild_need_premium' => true, // require premium account to form a guild? | ||||||
| 	'guild_image_size_kb' => 80, // maximum size of the guild logo image in KB (kilobytes) | 	'guild_image_size_kb' => 80, // maximum size of the guild logo image in KB (kilobytes) | ||||||
|  | 	'guild_description_default' => 'New guild. Leader must edit this text :)', | ||||||
| 	'guild_description_chars_limit' => 1000, // limit of guild description | 	'guild_description_chars_limit' => 1000, // limit of guild description | ||||||
| 	'guild_description_lines_limit' => 6, // limit of lines, if description has more lines it will be showed as long text, without 'enters' | 	'guild_description_lines_limit' => 6, // limit of lines, if description has more lines it will be showed as long text, without 'enters' | ||||||
| 	'guild_motd_chars_limit' => 150, // limit of MOTD (message of the day) that is shown later in the game on the guild channel | 	'guild_motd_chars_limit' => 150, // limit of MOTD (message of the day) that is shown later in the game on the guild channel | ||||||
| @@ -205,19 +225,19 @@ $config = array( | |||||||
| 	'team_display_outfit' => true, | 	'team_display_outfit' => true, | ||||||
|  |  | ||||||
| 	// bans page | 	// bans page | ||||||
| 	'bans_limit' => 50, | 	'bans_per_page' => 20, | ||||||
| 	'bans_display_all' => true, // should all bans be displayed? (sorted page by page) |  | ||||||
|  |  | ||||||
| 	// highscores page | 	// highscores page | ||||||
| 	'highscores_vocation_box' => true, // show 'Choose a vocation' box on the highscores (allowing peoples to sort highscores by vocation)? | 	'highscores_vocation_box' => true, // show 'Choose a vocation' box on the highscores (allowing peoples to sort highscores by vocation)? | ||||||
| 	'highscores_vocation' => true, // show player vocation under his nickname? | 	'highscores_vocation' => true, // show player vocation under his nickname? | ||||||
| 	'highscores_frags' => false, // show 'Frags' tab (best fraggers on the server)? Only 0.3 | 	'highscores_frags' => false, // show 'Frags' tab (best fraggers on the server)? | ||||||
| 	'highscores_balance' => false, // show 'Balance' tab (richest players on the server) | 	'highscores_balance' => false, // show 'Balance' tab (richest players on the server) | ||||||
| 	'highscores_outfit' => true, // show player outfit? | 	'highscores_outfit' => true, // show player outfit? | ||||||
| 	'highscores_country_box' => false, // doesnt work yet! (not implemented) | 	'highscores_country_box' => false, // doesnt work yet! (not implemented) | ||||||
| 	'highscores_groups_hidden' => 3, // this group id and higher won't be shown on the highscores | 	'highscores_groups_hidden' => 3, // this group id and higher won't be shown on the highscores | ||||||
| 	'highscores_ids_hidden' => array(0), // this ids of players will be hidden on the highscores (should be ids of samples) | 	'highscores_ids_hidden' => array(0), // this ids of players will be hidden on the highscores (should be ids of samples) | ||||||
| 	'highscores_length' => 100, // how many records per page on highscores | 	'highscores_per_page' => 100, // how many records per page on highscores | ||||||
|  | 	'highscores_cache_ttl' => 15, // how often to update highscores from database in minutes (default 15 minutes) | ||||||
|  |  | ||||||
| 	// characters page | 	// characters page | ||||||
| 	'characters' => array( // what things to display on character view page (true/false in each option) | 	'characters' => array( // what things to display on character view page (true/false in each option) | ||||||
| @@ -269,9 +289,9 @@ $config = array( | |||||||
|  |  | ||||||
| 	// status, took automatically from config file if empty | 	// status, took automatically from config file if empty | ||||||
| 	'status_enabled' => true, // you can disable status checking by settings this to "false" | 	'status_enabled' => true, // you can disable status checking by settings this to "false" | ||||||
| 	'status_ip' => '127.0.0.1', | 	'status_ip' => '', | ||||||
| 	'status_port' => '', | 	'status_port' => '', | ||||||
| 	'status_timeout' => 1.0, // how long to wait for the initial response from the server (default: 1 second) | 	'status_timeout' => 2.0, // how long to wait for the initial response from the server (default: 2 seconds) | ||||||
|  |  | ||||||
| 	// how often to connect to server and update status (default: every minute) | 	// how often to connect to server and update status (default: every minute) | ||||||
| 	// if your status timeout in config.lua is bigger, that it will be used instead | 	// if your status timeout in config.lua is bigger, that it will be used instead | ||||||
| @@ -279,7 +299,11 @@ $config = array( | |||||||
| 	'status_interval' => 60, | 	'status_interval' => 60, | ||||||
|  |  | ||||||
| 	// admin panel | 	// admin panel | ||||||
| 	'admin_panel_modules' => 'lastlogin,points,coins', | 	'admin_plugins_manage_enable' => 'yes', // you can disable possibility to upload and uninstall plugins, for security | ||||||
|  | 	// enable support for plain php pages in admin panel, for security | ||||||
|  | 	// existing pages still will be working, so you need to delete them manually | ||||||
|  | 	'admin_pages_php_enable' => 'no', | ||||||
|  | 	'admin_panel_modules' => 'statistics,web_status,server_status,lastlogin,created,points,coins,balance',    // default - statistics,web_status,server_status,lastlogin,created,points,coins,balance | ||||||
|  |  | ||||||
| 	// other | 	// other | ||||||
| 	'anonymous_usage_statistics' => true, | 	'anonymous_usage_statistics' => true, | ||||||
| @@ -290,13 +314,5 @@ $config = array( | |||||||
| 	'date_timezone' => 'Europe/Berlin', // more info at http://php.net/manual/en/timezones.php | 	'date_timezone' => 'Europe/Berlin', // more info at http://php.net/manual/en/timezones.php | ||||||
| 	'footer_show_load_time' => true, // display load time of the page in the footer | 	'footer_show_load_time' => true, // display load time of the page in the footer | ||||||
|  |  | ||||||
| 	'npc' => array(), | 	'npc' => array() | ||||||
|  |  | ||||||
| 	// character name blocked |  | ||||||
| 	'character_name_blocked' => array( |  | ||||||
| 		'prefix' => array(), |  | ||||||
| 		'names' => array(), |  | ||||||
| 		'words' => array(), |  | ||||||
| 	), |  | ||||||
|  |  | ||||||
| ); | ); | ||||||
|   | |||||||
							
								
								
									
										9
									
								
								cypress.config.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,9 @@ | |||||||
|  | const { defineConfig } = require("cypress"); | ||||||
|  |  | ||||||
|  | module.exports = defineConfig({ | ||||||
|  |   e2e: { | ||||||
|  |     setupNodeEvents(on, config) { | ||||||
|  |       // implement node event listeners here | ||||||
|  |     }, | ||||||
|  |   }, | ||||||
|  | }); | ||||||
							
								
								
									
										75
									
								
								cypress/e2e/1-install.cy.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,75 @@ | |||||||
|  | describe('Install MyAAC', () => { | ||||||
|  | 	beforeEach(() => { | ||||||
|  | 		// Cypress starts out with a blank slate for each test | ||||||
|  | 		// so we must tell it to visit our website with the `cy.visit()` command. | ||||||
|  | 		// Since we want to visit the same URL at the start of all our tests, | ||||||
|  | 		// we include it in our beforeEach function so that it runs before each test | ||||||
|  | 		cy.visit(Cypress.env('URL')) | ||||||
|  | 	}) | ||||||
|  |  | ||||||
|  | 	it('Go through installer', () => { | ||||||
|  | 		cy.visit(Cypress.env('URL') + '/install/?step=welcome') | ||||||
|  | 		cy.wait(1000) | ||||||
|  |  | ||||||
|  | 		cy.screenshot('install-welcome') | ||||||
|  |  | ||||||
|  | 		// step 1 - Welcome | ||||||
|  | 		cy.get('select[name="lang"]').select('en') | ||||||
|  |  | ||||||
|  | 		//cy.get('input[type=button]').contains('Next »').click() | ||||||
|  |  | ||||||
|  | 		cy.get('form').submit() | ||||||
|  |  | ||||||
|  | 		// step 2 - License | ||||||
|  | 		// just skip | ||||||
|  | 		cy.contains('GNU/GPL License'); | ||||||
|  | 		cy.get('form').submit() | ||||||
|  |  | ||||||
|  | 		// step 3 - Requirements | ||||||
|  | 		cy.contains('Requirements check'); | ||||||
|  |  | ||||||
|  | 		cy.get('#step').then(elem => { | ||||||
|  | 			elem.val('config'); | ||||||
|  | 		}); | ||||||
|  |  | ||||||
|  | 		cy.get('form').submit() | ||||||
|  |  | ||||||
|  | 		// step 4 - Configuration | ||||||
|  | 		cy.contains('Basic configuration'); | ||||||
|  |  | ||||||
|  | 		cy.get('#vars_server_path').click().clear().type(Cypress.env('SERVER_PATH')) | ||||||
|  | 		cy.get('#vars_mail_admin').click().clear().type('noone@example.net') | ||||||
|  |  | ||||||
|  | 		cy.get('[type="checkbox"]').uncheck() // usage statistics uncheck | ||||||
|  |  | ||||||
|  | 		cy.wait(1000) | ||||||
|  |  | ||||||
|  | 		cy.get('form').submit() | ||||||
|  |  | ||||||
|  | 		// check if there is any error | ||||||
|  |  | ||||||
|  |  | ||||||
|  | 		// step 5 - Import Schema | ||||||
|  | 		cy.contains('Import MySQL schema'); | ||||||
|  |  | ||||||
|  | 		// AAC is not installed yet, this message should not come | ||||||
|  | 		cy.contains('Seems AAC is already installed. Skipping importing MySQL schema..').should('not.exist') | ||||||
|  |  | ||||||
|  | 		cy.contains('[class="alert alert-success"]', 'Local configuration has been saved into file: config.local.php').should('be.visible') | ||||||
|  |  | ||||||
|  | 		cy.get('form').submit() | ||||||
|  |  | ||||||
|  | 		// step 6 - Admin Account | ||||||
|  | 		cy.get('#vars_email').click().clear().type('admin@my-aac.org') | ||||||
|  | 		cy.get('#vars_account').click().clear().type('admin') | ||||||
|  | 		cy.get('#vars_password').click().clear().type('test1234') | ||||||
|  | 		cy.get('#vars_password_confirm').click().clear().type('test1234') | ||||||
|  | 		cy.get('#vars_player_name').click().clear().type('Admin') | ||||||
|  |  | ||||||
|  | 		cy.get('form').submit() | ||||||
|  |  | ||||||
|  | 		cy.contains('[class="alert alert-success"]', 'Congratulations', { timeout: 30000 }).should('be.visible') | ||||||
|  |  | ||||||
|  | 		cy.screenshot('install-finish') | ||||||
|  | 	}) | ||||||
|  | }) | ||||||
							
								
								
									
										33
									
								
								cypress/e2e/2-create-account.cy.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,33 @@ | |||||||
|  | describe('Create Account Page', () => { | ||||||
|  | 	beforeEach(() => { | ||||||
|  | 		// Cypress starts out with a blank slate for each test | ||||||
|  | 		// so we must tell it to visit our website with the `cy.visit()` command. | ||||||
|  | 		// Since we want to visit the same URL at the start of all our tests, | ||||||
|  | 		// we include it in our beforeEach function so that it runs before each test | ||||||
|  | 		cy.visit(Cypress.env('URL') + '/index.php/account/create') | ||||||
|  | 	}) | ||||||
|  |  | ||||||
|  | 	it('Create Test Account', () => { | ||||||
|  | 		cy.screenshot('create-account-page') | ||||||
|  |  | ||||||
|  | 		cy.get('#account_input').type('tester') | ||||||
|  | 		cy.get('#email').type('tester@example.com') | ||||||
|  |  | ||||||
|  | 		cy.get('#password').type('test1234') | ||||||
|  | 		cy.get('#password2').type('test1234') | ||||||
|  |  | ||||||
|  | 		cy.get('#character_name').type('Slaw') | ||||||
|  |  | ||||||
|  | 		cy.get('#sex1').check() | ||||||
|  | 		cy.get('#vocation1').check() | ||||||
|  | 		cy.get('#accept_rules').check() | ||||||
|  |  | ||||||
|  | 		cy.get('#createaccount').submit() | ||||||
|  |  | ||||||
|  | 		// no errors please | ||||||
|  | 		cy.contains('The Following Errors Have Occurred:').should('not.exist') | ||||||
|  |  | ||||||
|  | 		// ss of post page | ||||||
|  | 		cy.screenshot('create-account-page-post') | ||||||
|  | 	}) | ||||||
|  | }) | ||||||
							
								
								
									
										5
									
								
								cypress/fixtures/example.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,5 @@ | |||||||
|  | { | ||||||
|  |   "name": "Using fixtures to represent data", | ||||||
|  |   "email": "hello@cypress.io", | ||||||
|  |   "body": "Fixtures are a great way to mock data for responses to routes" | ||||||
|  | } | ||||||
							
								
								
									
										25
									
								
								cypress/support/commands.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,25 @@ | |||||||
|  | // *********************************************** | ||||||
|  | // This example commands.js shows you how to | ||||||
|  | // create various custom commands and overwrite | ||||||
|  | // existing commands. | ||||||
|  | // | ||||||
|  | // For more comprehensive examples of custom | ||||||
|  | // commands please read more here: | ||||||
|  | // https://on.cypress.io/custom-commands | ||||||
|  | // *********************************************** | ||||||
|  | // | ||||||
|  | // | ||||||
|  | // -- This is a parent command -- | ||||||
|  | // Cypress.Commands.add('login', (email, password) => { ... }) | ||||||
|  | // | ||||||
|  | // | ||||||
|  | // -- This is a child command -- | ||||||
|  | // Cypress.Commands.add('drag', { prevSubject: 'element'}, (subject, options) => { ... }) | ||||||
|  | // | ||||||
|  | // | ||||||
|  | // -- This is a dual command -- | ||||||
|  | // Cypress.Commands.add('dismiss', { prevSubject: 'optional'}, (subject, options) => { ... }) | ||||||
|  | // | ||||||
|  | // | ||||||
|  | // -- This will overwrite an existing command -- | ||||||
|  | // Cypress.Commands.overwrite('visit', (originalFn, url, options) => { ... }) | ||||||
							
								
								
									
										20
									
								
								cypress/support/e2e.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,20 @@ | |||||||
|  | // *********************************************************** | ||||||
|  | // This example support/e2e.js is processed and | ||||||
|  | // loaded automatically before your test files. | ||||||
|  | // | ||||||
|  | // This is a great place to put global configuration and | ||||||
|  | // behavior that modifies Cypress. | ||||||
|  | // | ||||||
|  | // You can change the location of this file or turn off | ||||||
|  | // automatically serving support files with the | ||||||
|  | // 'supportFile' configuration option. | ||||||
|  | // | ||||||
|  | // You can read more here: | ||||||
|  | // https://on.cypress.io/configuration | ||||||
|  | // *********************************************************** | ||||||
|  |  | ||||||
|  | // Import commands.js using ES2015 syntax: | ||||||
|  | import './commands' | ||||||
|  |  | ||||||
|  | // Alternatively you can use CommonJS syntax: | ||||||
|  | // require('./commands') | ||||||
							
								
								
									
										
											BIN
										
									
								
								images/del.png
									
									
									
									
									
								
							
							
						
						| Before Width: | Height: | Size: 433 B After Width: | Height: | Size: 318 B | 
							
								
								
									
										
											BIN
										
									
								
								images/druid.png
									
									
									
									
									
								
							
							
						
						| Before Width: | Height: | Size: 38 KiB After Width: | Height: | Size: 10 KiB | 
							
								
								
									
										
											BIN
										
									
								
								images/edit.png
									
									
									
									
									
								
							
							
						
						| Before Width: | Height: | Size: 450 B After Width: | Height: | Size: 363 B | 
							
								
								
									
										
											BIN
										
									
								
								images/error.png
									
									
									
									
									
								
							
							
						
						| Before Width: | Height: | Size: 706 B After Width: | Height: | Size: 592 B | 
							
								
								
									
										
											BIN
										
									
								
								images/false.png
									
									
									
									
									
								
							
							
						
						| Before Width: | Height: | Size: 1004 B After Width: | Height: | Size: 845 B | 
							
								
								
									
										
											BIN
										
									
								
								images/hist.png
									
									
									
									
									
								
							
							
						
						| Before Width: | Height: | Size: 117 B After Width: | Height: | Size: 110 B | 
							
								
								
									
										
											BIN
										
									
								
								images/info.png
									
									
									
									
									
								
							
							
						
						| Before Width: | Height: | Size: 783 B After Width: | Height: | Size: 631 B | 
| Before Width: | Height: | Size: 38 KiB After Width: | Height: | Size: 12 KiB | 
| Before Width: | Height: | Size: 30 KiB After Width: | Height: | Size: 1005 B | 
| Before Width: | Height: | Size: 789 B After Width: | Height: | Size: 735 B | 
| Before Width: | Height: | Size: 33 KiB After Width: | Height: | Size: 8.2 KiB | 
							
								
								
									
										
											BIN
										
									
								
								images/plus.png
									
									
									
									
									
								
							
							
						
						| Before Width: | Height: | Size: 9.1 KiB After Width: | Height: | Size: 6.6 KiB | 
| Before Width: | Height: | Size: 615 B After Width: | Height: | Size: 463 B | 
| Before Width: | Height: | Size: 34 KiB After Width: | Height: | Size: 10 KiB | 
| Before Width: | Height: | Size: 816 B After Width: | Height: | Size: 633 B | 
							
								
								
									
										
											BIN
										
									
								
								images/trash.png
									
									
									
									
									
								
							
							
						
						| Before Width: | Height: | Size: 476 B After Width: | Height: | Size: 474 B | 
							
								
								
									
										
											BIN
										
									
								
								images/true.png
									
									
									
									
									
								
							
							
						
						| Before Width: | Height: | Size: 809 B After Width: | Height: | Size: 709 B | 
							
								
								
									
										242
									
								
								index.php
									
									
									
									
									
								
							
							
						
						| @@ -24,23 +24,26 @@ | |||||||
|  * @link      https://my-aac.org |  * @link      https://my-aac.org | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
| ob_start(); |  | ||||||
| require_once 'common.php'; | 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')) { | ||||||
|  | 	$uri = str_replace_first('/index.php', '', $uri); | ||||||
|  | } | ||||||
|  |  | ||||||
| $tmp = BASE_DIR; | if(0 === strpos($uri, '/')) { | ||||||
| if(!empty($tmp)) |  | ||||||
| 	$uri = str_replace(BASE_DIR . '/', '', $uri); |  | ||||||
| else |  | ||||||
| 	$uri = str_replace_first('/', '', $uri); | 	$uri = str_replace_first('/', '', $uri); | ||||||
|  | } | ||||||
|  |  | ||||||
| $uri = str_replace(array('index.php/', '?'), '', $uri); | if(preg_match("/^[A-Za-z0-9-_%'+\/]+\.png$/i", $uri)) { | ||||||
| define('URI', $uri); | 	if (!empty(BASE_DIR)) { | ||||||
|  | 		$tmp = explode('.', str_replace_first(str_replace_first('/', '', BASE_DIR) . '/', '', $uri)); | ||||||
|  | 	} | ||||||
|  | 	else { | ||||||
|  | 		$tmp = explode('.', $uri); | ||||||
|  | 	} | ||||||
|  |  | ||||||
| if(preg_match("/^[A-Za-z0-9-_%'+]+\.png$/i", $uri)) { |  | ||||||
| 	$tmp = explode('.', $uri); |  | ||||||
| 	$_REQUEST['name'] = urldecode($tmp[0]); | 	$_REQUEST['name'] = urldecode($tmp[0]); | ||||||
|  |  | ||||||
| 	chdir(TOOLS . 'signature'); | 	chdir(TOOLS . 'signature'); | ||||||
| @@ -48,7 +51,7 @@ if(preg_match("/^[A-Za-z0-9-_%'+]+\.png$/i", $uri)) { | |||||||
| 	exit(); | 	exit(); | ||||||
| } | } | ||||||
|  |  | ||||||
| if(preg_match("/^(.*)\.(gif|jpg|png|jpeg|tiff|bmp|css|js|less|map|html|php|zip|rar|gz|ttf|woff|ico)$/i", $_SERVER['REQUEST_URI'])) { | if(preg_match("/^(.*)\.(gif|jpg|png|jpeg|tiff|bmp|css|js|less|map|html|zip|rar|gz|ttf|woff|ico)$/i", $_SERVER['REQUEST_URI'])) { | ||||||
| 	http_response_code(404); | 	http_response_code(404); | ||||||
| 	exit; | 	exit; | ||||||
| } | } | ||||||
| @@ -75,134 +78,28 @@ if((!isset($config['installed']) || !$config['installed']) && file_exists(BASE . | |||||||
| 	throw new RuntimeException('Setup detected that <b>install/</b> directory exists. Please visit <a href="' . BASE_URL . 'install">this</a> url to start MyAAC Installation.<br/>Delete <b>install/</b> directory if you already installed MyAAC.<br/>Remember to REFRESH this page when you\'re done!'); | 	throw new RuntimeException('Setup detected that <b>install/</b> directory exists. Please visit <a href="' . BASE_URL . 'install">this</a> url to start MyAAC Installation.<br/>Delete <b>install/</b> directory if you already installed MyAAC.<br/>Remember to REFRESH this page when you\'re done!'); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | $template_place_holders = array(); | ||||||
|  |  | ||||||
| require_once SYSTEM . 'init.php'; | require_once SYSTEM . 'init.php'; | ||||||
| require_once SYSTEM . 'template.php'; |  | ||||||
|  |  | ||||||
| // verify myaac tables exists in database | // verify myaac tables exists in database | ||||||
| if(!$db->hasTable('myaac_account_actions')) { | if(!$db->hasTable('myaac_account_actions')) { | ||||||
| 	throw new RuntimeException('Seems that the table <strong>myaac_account_actions</strong> of MyAAC doesn\'t exist in the database. This is a fatal error. You can try to reinstall MyAAC by visiting <a href="' . BASE_URL . 'install">this</a> url.'); | 	throw new RuntimeException('Seems that the table <strong>myaac_account_actions</strong> of MyAAC doesn\'t exist in the database. This is a fatal error. You can try to reinstall MyAAC by visiting <a href="' . BASE_URL . 'install">this</a> url.'); | ||||||
| } | } | ||||||
|  |  | ||||||
| $found = false; |  | ||||||
| if(empty($uri) || isset($_REQUEST['template'])) { |  | ||||||
| 	$_REQUEST['p'] = 'news'; |  | ||||||
| 	$found = true; |  | ||||||
| } |  | ||||||
| else { |  | ||||||
| 	$tmp = strtolower($uri); |  | ||||||
| 	if (!preg_match('/[^A-z0-9_\-]/', $uri) && file_exists(TEMPLATES . $template_name . '/pages/' . $tmp . '.php')) { |  | ||||||
| 		$_REQUEST['p'] = $uri; |  | ||||||
| 		$found = true; |  | ||||||
| 	} |  | ||||||
| 	else if (!preg_match('/[^A-z0-9_\-]/', $uri) && file_exists(SYSTEM . 'pages/' . $tmp . '.php')) { |  | ||||||
| 		$_REQUEST['p'] = $uri; |  | ||||||
| 		$found = true; |  | ||||||
| 	} |  | ||||||
| 	else { |  | ||||||
| 		$rules = array( |  | ||||||
| 			'/^account\/manage\/?$/' => array('subtopic' => 'accountmanagement'), |  | ||||||
| 			'/^account\/create\/?$/' => array('subtopic' => 'createaccount'), |  | ||||||
| 			'/^account\/lost\/?$/' => array('subtopic' => 'lostaccount'), |  | ||||||
| 			'/^account\/logout\/?$/' => array('subtopic' => 'accountmanagement', 'action' => 'logout'), |  | ||||||
| 			'/^account\/password\/?$/' => array('subtopic' => 'accountmanagement', 'action' => 'change_password'), |  | ||||||
| 			'/^account\/register\/?$/' => array('subtopic' => 'accountmanagement', 'action' => 'register'), |  | ||||||
| 			'/^account\/register\/new\/?$/' => array('subtopic' => 'accountmanagement', 'action' => 'register_new'), |  | ||||||
| 			'/^account\/email\/?$/' => array('subtopic' => 'accountmanagement', 'action' => 'change_email'), |  | ||||||
| 			'/^account\/info\/?$/' => array('subtopic' => 'accountmanagement', 'action' => 'change_info'), |  | ||||||
| 			'/^account\/character\/create\/?$/' => array('subtopic' => 'accountmanagement', 'action' => 'create_character'), |  | ||||||
| 			'/^account\/character\/name\/?$/' => array('subtopic' => 'accountmanagement', 'action' => 'change_name'), |  | ||||||
| 			'/^account\/character\/sex\/?$/' => array('subtopic' => 'accountmanagement', 'action' => 'change_sex'), |  | ||||||
| 			'/^account\/character\/delete\/?$/' => array('subtopic' => 'accountmanagement', 'action' => 'delete_character'), |  | ||||||
| 			'/^account\/character\/comment\/[A-Za-z0-9-_%+\']+\/?$/' => array('subtopic' => 'accountmanagement', 'action' => 'change_comment', 'name' => '$3'), |  | ||||||
| 			'/^account\/character\/comment\/?$/' => array('subtopic' => 'accountmanagement', 'action' => 'change_comment'), |  | ||||||
| 			'/^account\/confirm_email\/[A-Za-z0-9-_]+\/?$/' => array('subtopic' => 'accountmanagement', 'action' => 'confirm_email', 'v' => '$2'), |  | ||||||
| 			'/^characters\/[A-Za-z0-9-_%+\']+$/' => array('subtopic' => 'characters', 'name' => '$1'), |  | ||||||
| 			'/^changelog\/[0-9]+\/?$/' => array('subtopic' => 'changelog', 'page' => '$1'), |  | ||||||
| 			'/^commands\/add\/?$/' => array('subtopic' => 'commands', 'action' => 'add'), |  | ||||||
| 			'/^commands\/edit\/?$/' => array('subtopic' => 'commands', 'action' => 'edit'), |  | ||||||
| 			'/^faq\/add\/?$/' => array('subtopic' => 'faq', 'action' => 'add'), |  | ||||||
| 			'/^faq\/edit\/?$/' => array('subtopic' => 'faq', 'action' => 'edit'), |  | ||||||
| 			'/^forum\/add_board\/?$/' => array('subtopic' => 'forum', 'action' => 'add_board'),# |  | ||||||
| 			'/^forum\/edit_board\/?$/' => array('subtopic' => 'forum', 'action' => 'edit_board'), |  | ||||||
| 			'/^forum\/board\/[0-9]+\/?$/' => array('subtopic' => 'forum', 'action' => 'show_board', 'id' => '$2'), |  | ||||||
| 			'/^forum\/board\/[0-9]+\/[0-9]+\/?$/' => array('subtopic' => 'forum', 'action' => 'show_board', 'id' => '$2', 'page' => '$3'), |  | ||||||
| 			'/^forum\/thread\/[0-9]+\/?$/' => array('subtopic' => 'forum', 'action' => 'show_thread', 'id' => '$2'), |  | ||||||
| 			'/^forum\/thread\/[0-9]+\/[0-9]+\/?$/' => array('subtopic' => 'forum', 'action' => 'show_thread', 'id' => '$2', 'page' => '$3'), |  | ||||||
| 			'/^gallery\/add\/?$/' => array('subtopic' => 'gallery', 'action' => 'add'), |  | ||||||
| 			'/^gallery\/edit\/?$/' => array('subtopic' => 'gallery', 'action' => 'edit'), |  | ||||||
| 			'/^gallery\/[0-9]+\/?$/' => array('subtopic' => 'gallery', 'image' => '$1'), |  | ||||||
| 			'/^gifts\/history\/?$/' => array('subtopic' => 'gifts', 'action' => 'show_history'), |  | ||||||
| 			'/^guilds\/[A-Za-z0-9-_%+\']+$/' => array('subtopic' => 'guilds', 'action' => 'show', 'guild' => '$1'), |  | ||||||
| 			'/^highscores\/[A-Za-z0-9-_]+\/[A-Za-z0-9-_]+\/[0-9]+\/?$/' => array('subtopic' => 'highscores', 'list' => '$1', 'vocation' => '$2', 'page' => '$3'), |  | ||||||
| 			'/^highscores\/[A-Za-z0-9-_]+\/[0-9]+\/?$/' => array('subtopic' => 'highscores', 'list' => '$1', 'page' => '$2'), |  | ||||||
| 			'/^highscores\/[A-Za-z0-9-_]+\/[A-Za-z0-9-_]+\/?$/' => array('subtopic' => 'highscores', 'list' => '$1', 'vocation' => '$2'), |  | ||||||
| 			'/^highscores\/[A-Za-z0-9-_\']+\/?$/' => array('subtopic' => 'highscores', 'list' => '$1'), |  | ||||||
| 			'/^news\/add\/?$/' => array('subtopic' => 'news', 'action' => 'add'), |  | ||||||
| 			'/^news\/edit\/?$/' => array('subtopic' => 'news', 'action' => 'edit'), |  | ||||||
| 			'/^news\/archive\/?$/' => array('subtopic' => 'newsarchive'), |  | ||||||
| 			'/^news\/archive\/[0-9]+\/?$/' => array('subtopic' => 'newsarchive', 'id' => '$2'), |  | ||||||
| 			'/^polls\/[0-9]+\/?$/' => array('subtopic' => 'polls', 'id' => '$1'), |  | ||||||
| 			'/^spells\/[A-Za-z0-9-_%]+\/[A-Za-z0-9-_]+\/?$/' => array('subtopic' => 'spells', 'vocation' => '$1', 'order' => '$2'), |  | ||||||
| 			'/^houses\/view\/?$/' => array('subtopic' => 'houses', 'page' => 'view') |  | ||||||
| 		); |  | ||||||
|  |  | ||||||
| 		foreach ($rules as $rule => $redirect) { |  | ||||||
| 			if (preg_match($rule, $uri)) { |  | ||||||
| 				$tmp = explode('/', $uri); |  | ||||||
| 				/* @var $redirect array */ |  | ||||||
| 				foreach ($redirect as $key => $value) { |  | ||||||
|  |  | ||||||
| 					if (strpos($value, '$') !== false) { |  | ||||||
| 						$value = str_replace('$' . $value[1], $tmp[$value[1]], $value); |  | ||||||
| 					} |  | ||||||
|  |  | ||||||
| 					$_REQUEST[$key] = $value; |  | ||||||
| 					$_GET[$key] = $value; |  | ||||||
| 				} |  | ||||||
|  |  | ||||||
| 				$found = true; |  | ||||||
| 				break; |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // handle ?fbclid=x, etc. (show news page) |  | ||||||
| if (!$found && count($_GET) > 0 && !isset($_REQUEST['subtopic']) && !isset($_REQUEST['p']) && !in_array($_SERVER['QUERY_STRING'], getDatabasePages())) { |  | ||||||
| 	$_REQUEST['p'] = $_REQUEST['subtopic'] = 'news'; |  | ||||||
| 	$found = true; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // define page visited, so it can be used within events system |  | ||||||
| $page = isset($_REQUEST['subtopic']) ? $_REQUEST['subtopic'] : (isset($_REQUEST['p']) ? $_REQUEST['p'] : ''); |  | ||||||
| if(empty($page) || !preg_match('/^[A-z0-9\_\-]+$/', $page)) { |  | ||||||
| 	$tmp = URI; |  | ||||||
| 	if(!empty($tmp)) { |  | ||||||
| 		$page = $tmp; |  | ||||||
| 	} |  | ||||||
| 	else { |  | ||||||
| 		if(!$found) |  | ||||||
| 			$page = '404'; |  | ||||||
| 		else |  | ||||||
| 			$page = 'news'; |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
|  |  | ||||||
| $page = strtolower($page); |  | ||||||
| define('PAGE', $page); |  | ||||||
|  |  | ||||||
| $template_place_holders = array(); |  | ||||||
|  |  | ||||||
| // event system | // event system | ||||||
| require_once SYSTEM . 'hooks.php'; | require_once SYSTEM . 'hooks.php'; | ||||||
| $hooks = new Hooks(); | $hooks = new Hooks(); | ||||||
| $hooks->load(); | $hooks->load(); | ||||||
|  | require_once SYSTEM . 'template.php'; | ||||||
| require_once SYSTEM . 'login.php'; | require_once SYSTEM . 'login.php'; | ||||||
| require_once SYSTEM . 'status.php'; | require_once SYSTEM . 'status.php'; | ||||||
|  |  | ||||||
| $twig->addGlobal('config', $config); | $twig->addGlobal('config', $config); | ||||||
| $twig->addGlobal('status', $status); | $twig->addGlobal('status', $status); | ||||||
|  |  | ||||||
|  | require_once SYSTEM . 'router.php'; | ||||||
|  |  | ||||||
| require SYSTEM . 'migrate.php'; | require SYSTEM . 'migrate.php'; | ||||||
|  |  | ||||||
| $hooks->trigger(HOOK_STARTUP); | $hooks->trigger(HOOK_STARTUP); | ||||||
| @@ -222,7 +119,7 @@ if(isset($config['anonymous_usage_statistics']) && $config['anonymous_usage_stat | |||||||
| 		if(fetchDatabaseConfig('last_usage_report', $value)) { | 		if(fetchDatabaseConfig('last_usage_report', $value)) { | ||||||
| 			$should_report = time() > (int)$value + $report_time; | 			$should_report = time() > (int)$value + $report_time; | ||||||
| 			if($cache->enabled()) { | 			if($cache->enabled()) { | ||||||
| 				$cache->set('last_usage_report', $value, 60 * 60); | 				$cache->set('last_usage_report', $value); | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 		else { | 		else { | ||||||
| @@ -237,7 +134,7 @@ if(isset($config['anonymous_usage_statistics']) && $config['anonymous_usage_stat | |||||||
|  |  | ||||||
| 		updateDatabaseConfig('last_usage_report', time()); | 		updateDatabaseConfig('last_usage_report', time()); | ||||||
| 		if($cache->enabled()) { | 		if($cache->enabled()) { | ||||||
| 			$cache->set('last_usage_report', time(), 60 * 60); | 			$cache->set('last_usage_report', time()); | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| @@ -251,35 +148,6 @@ if($config['visitors_counter']) | |||||||
| 	$visitors = new Visitors($config['visitors_counter_ttl']); | 	$visitors = new Visitors($config['visitors_counter_ttl']); | ||||||
| } | } | ||||||
|  |  | ||||||
| // page content loading |  | ||||||
| if(!isset($content[0])) |  | ||||||
| 	$content = ''; |  | ||||||
| $load_it = true; |  | ||||||
|  |  | ||||||
| // check if site has been closed |  | ||||||
| $site_closed = false; |  | ||||||
| if(fetchDatabaseConfig('site_closed', $site_closed)) { |  | ||||||
| 	$site_closed = ($site_closed == 1); |  | ||||||
| 	if($site_closed) { |  | ||||||
| 		if(!admin()) |  | ||||||
| 		{ |  | ||||||
| 			$title = getDatabaseConfig('site_closed_title'); |  | ||||||
| 			$content .= '<p class="note">' . getDatabaseConfig('site_closed_message') . '</p><br/>'; |  | ||||||
| 			$load_it = false; |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		if(!$logged) |  | ||||||
| 		{ |  | ||||||
| 			ob_start(); |  | ||||||
| 			require SYSTEM . 'pages/accountmanagement.php'; |  | ||||||
| 			$content .= ob_get_contents(); |  | ||||||
| 			ob_end_clean(); |  | ||||||
| 			$load_it = false; |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| define('SITE_CLOSED', $site_closed); |  | ||||||
|  |  | ||||||
| // backward support for gesior | // backward support for gesior | ||||||
| if($config['backward_support']) { | if($config['backward_support']) { | ||||||
| 	define('INITIALIZED', true); | 	define('INITIALIZED', true); | ||||||
| @@ -288,7 +156,6 @@ if($config['backward_support']) { | |||||||
| 	$layout_name = $template_path; | 	$layout_name = $template_path; | ||||||
| 	$news_content = ''; | 	$news_content = ''; | ||||||
| 	$tickers_content = ''; | 	$tickers_content = ''; | ||||||
| 	$subtopic = PAGE; |  | ||||||
| 	$main_content = ''; | 	$main_content = ''; | ||||||
|  |  | ||||||
| 	$config['access_admin_panel'] = 2; | 	$config['access_admin_panel'] = 2; | ||||||
| @@ -299,7 +166,6 @@ if($config['backward_support']) { | |||||||
| 	$config['site'] = &$config; | 	$config['site'] = &$config; | ||||||
| 	$config['server'] = &$config['lua']; | 	$config['server'] = &$config['lua']; | ||||||
| 	$config['site']['shop_system'] = $config['gifts_system']; | 	$config['site']['shop_system'] = $config['gifts_system']; | ||||||
| 	$config['site']['gallery_page'] = true; |  | ||||||
|  |  | ||||||
| 	if(!isset($config['vdarkborder'])) | 	if(!isset($config['vdarkborder'])) | ||||||
| 		$config['vdarkborder'] = '#505050'; | 		$config['vdarkborder'] = '#505050'; | ||||||
| @@ -319,67 +185,15 @@ if($config['backward_support']) { | |||||||
| 		$config['status']['serverStatus_' . $key] = $value; | 		$config['status']['serverStatus_' . $key] = $value; | ||||||
| } | } | ||||||
|  |  | ||||||
| if($load_it) | /** | ||||||
| { |  * @var OTS_Account $account_logged | ||||||
| 	if(SITE_CLOSED && admin()) |  */ | ||||||
| 		$content .= '<p class="note">Site is under maintenance (closed mode). Only privileged users can see it.</p>'; | if ($logged && admin()) { | ||||||
|  | 	$content .= $twig->render('admin-bar.html.twig', [ | ||||||
| 	if($config['backward_support']) { | 		'username' => USE_ACCOUNT_NAME ? $account_logged->getName() : $account_logged->getId() | ||||||
| 		require SYSTEM . 'compat/pages.php'; | 	]); | ||||||
| 		require SYSTEM . 'compat/classes.php'; |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	$ignore = false; |  | ||||||
|  |  | ||||||
| 	$logged_access = 1; |  | ||||||
| 	if($logged && $account_logged && $account_logged->isLoaded()) { |  | ||||||
| 		$logged_access = $account_logged->getAccess(); |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	$success = false; |  | ||||||
| 	$tmp_content = getCustomPage($page, $success); |  | ||||||
| 	if($success) { |  | ||||||
| 		$content .= $tmp_content; |  | ||||||
| 		if(hasFlag(FLAG_CONTENT_PAGES) || superAdmin()) { |  | ||||||
| 			$pageInfo = getCustomPageInfo($page); |  | ||||||
| 			$content = $twig->render('admin.pages.links.html.twig', array( |  | ||||||
| 					'page' => array('id' => $pageInfo !== null ? $pageInfo['id'] : 0, 'hidden' => $pageInfo !== null ? $pageInfo['hidden'] : '0') |  | ||||||
| 				)) . $content; |  | ||||||
| 		} |  | ||||||
| 	} else { |  | ||||||
| 		$file = TEMPLATES . "$template_name/pages/$page.php"; |  | ||||||
| 		if(!@file_exists($file) || preg_match('/[^A-z0-9_\-]/', $page)) { |  | ||||||
| 			$file = SYSTEM . "pages/$page.php"; |  | ||||||
| 			if(!@file_exists($file) || preg_match('/[^A-z0-9_\-]/', $page)) { |  | ||||||
| 				$page = '404'; |  | ||||||
| 				$file = SYSTEM . 'pages/404.php'; |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	ob_start(); |  | ||||||
| 	if($hooks->trigger(HOOK_BEFORE_PAGE)) { |  | ||||||
| 		if(!$ignore) |  | ||||||
| 			require $file; |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	if($config['backward_support'] && isset($main_content[0])) |  | ||||||
| 		$content .= $main_content; |  | ||||||
|  |  | ||||||
| 	$content .= ob_get_contents(); |  | ||||||
| 	ob_end_clean(); |  | ||||||
| 	$hooks->trigger(HOOK_AFTER_PAGE); |  | ||||||
| } | } | ||||||
|  | $title_full =  (isset($title) ? $title . ' - ' : '') . $config['lua']['serverName']; | ||||||
| if($config['backward_support']) { |  | ||||||
| 	$main_content = $content; |  | ||||||
| 	if(!isset($title)) |  | ||||||
| 		$title = ucfirst($page); |  | ||||||
|  |  | ||||||
| 	$topic = $title; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| $title_full =  (isset($title) ? $title . $config['title_separator'] : '') . $config['lua']['serverName']; |  | ||||||
| require $template_path . '/' . $template_index; | require $template_path . '/' . $template_index; | ||||||
|  |  | ||||||
| echo base64_decode('PCEtLSBQb3dlcmVkIGJ5IE15QUFDIDo6IGh0dHBzOi8vd3d3Lm15LWFhYy5vcmcvIC0tPg==') . PHP_EOL; | echo base64_decode('PCEtLSBQb3dlcmVkIGJ5IE15QUFDIDo6IGh0dHBzOi8vd3d3Lm15LWFhYy5vcmcvIC0tPg==') . PHP_EOL; | ||||||
|   | |||||||
| @@ -38,3 +38,4 @@ if(!isset($error) || !$error) { | |||||||
| 		$error = true; | 		$error = true; | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  | ?> | ||||||
| @@ -6,12 +6,18 @@ $ots = POT::getInstance(); | |||||||
| require SYSTEM . 'database.php'; | require SYSTEM . 'database.php'; | ||||||
|  |  | ||||||
| if(!isset($db)) { | if(!isset($db)) { | ||||||
| 	$database_error = $locale['step_database_error_mysql_connect'] . '<br/>' . | 	$database_error = '<p class="lead">' . $locale['step_database_error_mysql_connect'] . '</p>'; | ||||||
| 			$locale['step_database_error_mysql_connect_2'] . | 	 | ||||||
| 			'<ul>' . | 	$database_error .= '<p>' . $locale['step_database_error_mysql_connect_2'] . '</p>'; | ||||||
| 				'<li>' . $locale['step_database_error_mysql_connect_3'] . '</li>' . |  | ||||||
| 				'<li>' . $locale['step_database_error_mysql_connect_4'] . '</li>' . | 	$database_error .= '<ul class="list-group">' . | ||||||
| 			'</ul>' . '<br/>' . $error; | 							'<li class="list-group-item list-group-item-warning">' . $locale['step_database_error_mysql_connect_3'] . '</li>' . | ||||||
|  | 							'<li class="list-group-item list-group-item-warning">' . $locale['step_database_error_mysql_connect_4'] . '</li>' . | ||||||
|  | 						'</ul>'; | ||||||
|  |  | ||||||
|  | 	$database_error .= '<div class="alert alert-danger mt-4"> | ||||||
|  | 							<span>' . $error . '</span> | ||||||
|  | 						</div>'; | ||||||
| } | } | ||||||
| else { | else { | ||||||
| 	if($db->hasTable('accounts')) | 	if($db->hasTable('accounts')) | ||||||
|   | |||||||
| @@ -62,9 +62,9 @@ function next_buttons($previous = true, $next = true) | |||||||
| 		$ret .= '<input class="button" type="submit" onclick="document.getElementById(\'step\').value=\'' . $steps[$i + 1] . '\';" value="' . $locale['next'] . '" />'; | 		$ret .= '<input class="button" type="submit" onclick="document.getElementById(\'step\').value=\'' . $steps[$i + 1] . '\';" value="' . $locale['next'] . '" />'; | ||||||
| */ | */ | ||||||
| 	if($previous) | 	if($previous) | ||||||
| 		$ret .= '<input type="button" class="button" onclick="document.getElementById(\'step\').value=\'' . $steps[$i - 1] . '\'; this.form.submit();" value="« ' . $locale['previous'] . '" />'; | 		$ret .= '<input type="button" class="button btn btn-primary m-2" onclick="document.getElementById(\'step\').value=\'' . $steps[$i - 1] . '\'; this.form.submit();" value="« ' . $locale['previous'] . '" />'; | ||||||
| 	if($next) | 	if($next) | ||||||
| 		$ret .= '<input type="button" class="button" onclick="document.getElementById(\'step\').value=\'' . $steps[$i + 1] . '\'; this.form.submit(); " value="' . $locale['next'] . ' »" />'; | 		$ret .= '<input type="button" class="button btn btn-primary m-2" onclick="document.getElementById(\'step\').value=\'' . $steps[$i + 1] . '\'; this.form.submit(); " value="' . $locale['next'] . ' »" />'; | ||||||
|  |  | ||||||
| 	$ret .= '</div>'; | 	$ret .= '</div>'; | ||||||
| 	return $ret; | 	return $ret; | ||||||
|   | |||||||
| @@ -1,4 +1,4 @@ | |||||||
| SET @myaac_database_version = 33; | SET @myaac_database_version = 35; | ||||||
|  |  | ||||||
| CREATE TABLE `myaac_account_actions` | CREATE TABLE `myaac_account_actions` | ||||||
| ( | ( | ||||||
| @@ -203,25 +203,29 @@ CREATE TABLE `myaac_monsters` ( | |||||||
| 	`mana` int(11) NOT NULL DEFAULT 0, | 	`mana` int(11) NOT NULL DEFAULT 0, | ||||||
| 	`exp` int(11) NOT NULL, | 	`exp` int(11) NOT NULL, | ||||||
| 	`health` int(11) NOT NULL, | 	`health` int(11) NOT NULL, | ||||||
|  | 	`look` VARCHAR(255) NOT NULL DEFAULT '', | ||||||
| 	`speed_lvl` int(11) NOT NULL default 1, | 	`speed_lvl` int(11) NOT NULL default 1, | ||||||
| 	`use_haste` tinyint(1) NOT NULL, | 	`use_haste` tinyint(1) NOT NULL, | ||||||
| 	`voices` text NOT NULL, | 	`voices` text NOT NULL, | ||||||
| 	`immunities` varchar(255) NOT NULL, | 	`immunities` varchar(255) NOT NULL, | ||||||
|  | 	`elements` TEXT NOT NULL, | ||||||
| 	`summonable` tinyint(1) NOT NULL, | 	`summonable` tinyint(1) NOT NULL, | ||||||
| 	`convinceable` tinyint(1) NOT NULL, | 	`convinceable` tinyint(1) NOT NULL, | ||||||
|  | 	`pushable` TINYINT(1) NOT NULL DEFAULT '0', | ||||||
|  | 	`canpushitems` TINYINT(1) NOT NULL DEFAULT '0', | ||||||
|  | 	`canwalkonenergy` TINYINT(1) NOT NULL DEFAULT '0', | ||||||
|  | 	`canwalkonpoison` TINYINT(1) NOT NULL DEFAULT '0', | ||||||
|  | 	`canwalkonfire` TINYINT(1) NOT NULL DEFAULT '0', | ||||||
|  | 	`runonhealth` TINYINT(1) NOT NULL DEFAULT '0', | ||||||
|  | 	`hostile` TINYINT(1) NOT NULL DEFAULT '0', | ||||||
|  | 	`attackable` TINYINT(1) NOT NULL DEFAULT '0', | ||||||
|  | 	`rewardboss` TINYINT(1) NOT NULL DEFAULT '0', | ||||||
|  | 	`defense` INT(11) NOT NULL DEFAULT '0', | ||||||
|  | 	`armor` INT(11) NOT NULL DEFAULT '0', | ||||||
|  | 	`canpushcreatures` TINYINT(1) NOT NULL DEFAULT '0', | ||||||
| 	`race` varchar(255) NOT NULL, | 	`race` varchar(255) NOT NULL, | ||||||
| 	`loot` text NOT NULL, | 	`loot` text NOT NULL, | ||||||
| 	PRIMARY KEY (`id`) | 	`summons` TEXT NOT NULL, | ||||||
| ) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8; |  | ||||||
|  |  | ||||||
| CREATE TABLE `myaac_videos` |  | ||||||
| ( |  | ||||||
| 	`id` INT(11) NOT NULL AUTO_INCREMENT, |  | ||||||
| 	`title` VARCHAR(100) NOT NULL DEFAULT '', |  | ||||||
| 	`youtube_id` VARCHAR(20) NOT NULL, |  | ||||||
| 	`author` VARCHAR(50) NOT NULL DEFAULT '', |  | ||||||
| 	`ordering` INT(11) NOT NULL DEFAULT 0, |  | ||||||
| 	`hidden` TINYINT(1) NOT NULL DEFAULT 0, |  | ||||||
| 	PRIMARY KEY (`id`) | 	PRIMARY KEY (`id`) | ||||||
| ) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8; | ) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8; | ||||||
|  |  | ||||||
| @@ -327,6 +331,7 @@ CREATE TABLE `myaac_visitors` | |||||||
| 	`ip` VARCHAR(45) NOT NULL, | 	`ip` VARCHAR(45) NOT NULL, | ||||||
| 	`lastvisit` INT(11) NOT NULL DEFAULT 0, | 	`lastvisit` INT(11) NOT NULL DEFAULT 0, | ||||||
| 	`page` VARCHAR(2048) NOT NULL, | 	`page` VARCHAR(2048) NOT NULL, | ||||||
|  | 	`user_agent` VARCHAR(255) NOT NULL DEFAULT '', | ||||||
| 	UNIQUE (`ip`) | 	UNIQUE (`ip`) | ||||||
| ) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8; | ) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -26,13 +26,13 @@ $twig = new Twig_Environment($twig_loader, array( | |||||||
| )); | )); | ||||||
|  |  | ||||||
| // load installation status | // load installation status | ||||||
| $step = isset($_POST['step']) ? $_POST['step'] : 'welcome'; | $step = $_REQUEST['step'] ?? 'welcome'; | ||||||
|  |  | ||||||
| $install_status = array(); | $install_status = array(); | ||||||
| if(file_exists(CACHE . 'install.txt')) { | if(file_exists(CACHE . 'install.txt')) { | ||||||
| 	$install_status = unserialize(file_get_contents(CACHE . 'install.txt')); | 	$install_status = unserialize(file_get_contents(CACHE . 'install.txt')); | ||||||
|  |  | ||||||
| 	if(!isset($_POST['step'])) { | 	if(!isset($_REQUEST['step'])) { | ||||||
| 		$step = isset($install_status['step']) ? $install_status['step'] : ''; | 		$step = isset($install_status['step']) ? $install_status['step'] : ''; | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| @@ -70,7 +70,7 @@ if($step == 'database') { | |||||||
|  |  | ||||||
| 		$key = str_replace('var_', '', $key); | 		$key = str_replace('var_', '', $key); | ||||||
|  |  | ||||||
| 		if(in_array($key, array('account', 'account_id', 'password', 'email', 'player_name'))) { | 		if(in_array($key, array('account', 'account_id', 'password', 'password_confirm', 'email', 'player_name'))) { | ||||||
| 			continue; | 			continue; | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| @@ -95,10 +95,6 @@ if($step == 'database') { | |||||||
| 			$errors[] = $locale['step_config_mail_admin_error']; | 			$errors[] = $locale['step_config_mail_admin_error']; | ||||||
| 			break; | 			break; | ||||||
| 		} | 		} | ||||||
| 		else if($key == 'mail_address' && !Validator::email($value)) { |  | ||||||
| 			$errors[] = $locale['step_config_mail_address_error']; |  | ||||||
| 			break; |  | ||||||
| 		} |  | ||||||
| 		else if($key == 'timezone' && !in_array($value, DateTimeZone::listIdentifiers())) { | 		else if($key == 'timezone' && !in_array($value, DateTimeZone::listIdentifiers())) { | ||||||
| 			$errors[] = $locale['step_config_timezone_error']; | 			$errors[] = $locale['step_config_timezone_error']; | ||||||
| 			break; | 			break; | ||||||
| @@ -124,6 +120,7 @@ else if($step == 'admin') { | |||||||
| else if($step == 'finish') { | else if($step == 'finish') { | ||||||
| 	$email = $_SESSION['var_email']; | 	$email = $_SESSION['var_email']; | ||||||
| 	$password = $_SESSION['var_password']; | 	$password = $_SESSION['var_password']; | ||||||
|  | 	$password_confirm = $_SESSION['var_password_confirm']; | ||||||
| 	$player_name = $_SESSION['var_player_name']; | 	$player_name = $_SESSION['var_player_name']; | ||||||
|  |  | ||||||
| 	// email check | 	// email check | ||||||
| @@ -165,6 +162,9 @@ else if($step == 'finish') { | |||||||
| 	else if(!Validator::password($password)) { | 	else if(!Validator::password($password)) { | ||||||
| 		$errors[] = $locale['step_admin_password_error_format']; | 		$errors[] = $locale['step_admin_password_error_format']; | ||||||
| 	} | 	} | ||||||
|  | 	else if($password != $password_confirm) { | ||||||
|  | 		$errors[] = $locale['step_admin_password_confirm_error_not_same']; | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	// player name check | 	// player name check | ||||||
| 	if(empty($player_name)) { | 	if(empty($player_name)) { | ||||||
| @@ -189,14 +189,14 @@ clearstatcache(); | |||||||
| if(is_writable(CACHE) && (MYAAC_OS != 'WINDOWS' || win_is_writable(CACHE))) { | if(is_writable(CACHE) && (MYAAC_OS != 'WINDOWS' || win_is_writable(CACHE))) { | ||||||
| 	if(!file_exists(BASE . 'install/ip.txt')) { | 	if(!file_exists(BASE . 'install/ip.txt')) { | ||||||
| 		$content = warning('AAC installation is disabled. To enable it make file <b>ip.txt</b> in install/ directory and put there your IP.<br/> | 		$content = warning('AAC installation is disabled. To enable it make file <b>ip.txt</b> in install/ directory and put there your IP.<br/> | ||||||
| 		Your IP is:<br /><b>' . get_browser_real_ip() . '</b>', true); | 		Your IP is:<br /><b>' . $_SERVER['REMOTE_ADDR'] . '</b>', true); | ||||||
| 	} | 	} | ||||||
| 	else { | 	else { | ||||||
| 		$file_content = trim(file_get_contents(BASE . 'install/ip.txt')); | 		$file_content = trim(file_get_contents(BASE . 'install/ip.txt')); | ||||||
| 		$allow = false; | 		$allow = false; | ||||||
| 		$listIP = preg_split('/\s+/', $file_content); | 		$listIP = preg_split('/\s+/', $file_content); | ||||||
| 		foreach($listIP as $ip) { | 		foreach($listIP as $ip) { | ||||||
| 			if(get_browser_real_ip() == $ip) { | 			if($_SERVER['REMOTE_ADDR'] == $ip) { | ||||||
| 				$allow = true; | 				$allow = true; | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
|   | |||||||
| @@ -1,7 +1,7 @@ | |||||||
| <?php | <?php | ||||||
| defined('MYAAC') or die('Direct access not allowed!'); | defined('MYAAC') or die('Direct access not allowed!'); | ||||||
| if(isset($config['installed']) && $config['installed'] && !isset($_SESSION['saved'])) { | if(isset($config['installed']) && $config['installed'] && !isset($_SESSION['saved'])) { | ||||||
| 	echo '<p class="warning">' . $locale['already_installed'] . '</p>'; | 	echo '<div class="alert alert-warning"><span>' . $locale['already_installed'] . '</span></div>'; | ||||||
| } | } | ||||||
| else { | else { | ||||||
| 	unset($_SESSION['saved']); | 	unset($_SESSION['saved']); | ||||||
|   | |||||||
| @@ -5,3 +5,4 @@ $twig->display('install.license.html.twig', array( | |||||||
| 	'license' => file_get_contents(BASE . 'LICENSE'), | 	'license' => file_get_contents(BASE . 'LICENSE'), | ||||||
| 	'buttons' => next_buttons() | 	'buttons' => next_buttons() | ||||||
| )); | )); | ||||||
|  | ?> | ||||||
|   | |||||||
| @@ -2,8 +2,21 @@ | |||||||
| defined('MYAAC') or die('Direct access not allowed!'); | defined('MYAAC') or die('Direct access not allowed!'); | ||||||
|  |  | ||||||
| // configuration | // configuration | ||||||
|  | $dirs_required = [ | ||||||
|  | 	'system/logs', | ||||||
|  | 	'system/cache', | ||||||
|  | ]; | ||||||
|  | $dirs_optional = [ | ||||||
|  | 	GUILD_IMAGES_DIR => $locale['step_requirements_warning_images_guilds'], | ||||||
|  | 	GALLERY_DIR => $locale['step_requirements_warning_images_gallery'], | ||||||
|  | ]; | ||||||
|  |  | ||||||
| $extensions_required = [ | $extensions_required = [ | ||||||
| 	'pdo', 'pdo_mysql', 'xml', 'zip' | 	'pdo', 'pdo_mysql', 'json', 'xml' | ||||||
|  | ]; | ||||||
|  | $extensions_optional = [ | ||||||
|  | 	'gd' => $locale['step_requirements_warning_player_signatures'], | ||||||
|  | 	'zip' => $locale['step_requirements_warning_install_plugins'], | ||||||
| ]; | ]; | ||||||
| /* | /* | ||||||
|  * |  * | ||||||
| @@ -14,11 +27,11 @@ $extensions_required = [ | |||||||
| function version_check($name, $ok, $info = '', $warning = false) | function version_check($name, $ok, $info = '', $warning = false) | ||||||
| { | { | ||||||
| 	global $failed; | 	global $failed; | ||||||
| 	echo '<p class="' . ($ok ? 'success' : ($warning ? 'warning' : 'error')) . '">' . $name; | 	echo '<div class="alert alert-' . ($ok ? 'success' : ($warning ? 'warning' : 'danger')) . '">' . $name; | ||||||
| 	if(!empty($info)) | 	if(!empty($info)) | ||||||
| 		echo ': <b>' . $info . '</b>'; | 		echo ': <b>' . $info . '</b>'; | ||||||
|  |  | ||||||
| 	echo '</p>'; | 	echo '</div>'; | ||||||
| 	if(!$ok && !$warning) | 	if(!$ok && !$warning) | ||||||
| 		$failed = true; | 		$failed = true; | ||||||
| } | } | ||||||
| @@ -27,12 +40,18 @@ $failed = false; | |||||||
|  |  | ||||||
| // start validating | // start validating | ||||||
| version_check($locale['step_requirements_php_version'], (PHP_VERSION_ID >= 50500), PHP_VERSION); | version_check($locale['step_requirements_php_version'], (PHP_VERSION_ID >= 50500), PHP_VERSION); | ||||||
| foreach(array('images/guilds', 'images/houses', 'images/gallery') as $value) |  | ||||||
|  | foreach ($dirs_required as $value) | ||||||
| { | { | ||||||
| 	$is_writable = is_writable(BASE . $value); | 	$is_writable = is_writable(BASE . $value) && (MYAAC_OS != 'WINDOWS' || win_is_writable(BASE . $value)); | ||||||
| 	version_check($locale['step_requirements_write_perms'] . ': ' . $value, $is_writable); | 	version_check($locale['step_requirements_write_perms'] . ': ' . $value, $is_writable); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | foreach ($dirs_optional as $dir => $errorMsg) { | ||||||
|  | 	$is_writable = is_writable(BASE . $dir) && (MYAAC_OS != 'WINDOWS' || win_is_writable(BASE . $dir)); | ||||||
|  | 	version_check($locale['step_requirements_write_perms'] . ': ' . $dir, $is_writable, $is_writable ? '' : $errorMsg, true); | ||||||
|  | } | ||||||
|  |  | ||||||
| $ini_register_globals = ini_get_bool('register_globals'); | $ini_register_globals = ini_get_bool('register_globals'); | ||||||
| version_check('register_long_arrays', !$ini_register_globals, $ini_register_globals ? $locale['on'] : $locale['off']); | version_check('register_long_arrays', !$ini_register_globals, $ini_register_globals ? $locale['on'] : $locale['off']); | ||||||
|  |  | ||||||
| @@ -44,12 +63,19 @@ foreach ($extensions_required as $ext) { | |||||||
| 	version_check(str_replace('$EXTENSION$', strtoupper($ext), $locale['step_requirements_extension']) , $loaded, $loaded ? $locale['loaded'] : $locale['not_loaded']); | 	version_check(str_replace('$EXTENSION$', strtoupper($ext), $locale['step_requirements_extension']) , $loaded, $loaded ? $locale['loaded'] : $locale['not_loaded']); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | foreach ($extensions_optional as $ext => $errorMsg) { | ||||||
| if($failed) | 	$loaded = extension_loaded($ext); | ||||||
| { | 	version_check(str_replace('$EXTENSION$', strtoupper($ext), $locale['step_requirements_extension']) , $loaded, $loaded ? $locale['loaded'] : $locale['not_loaded'] . '. ' . $errorMsg, true); | ||||||
| 	echo '<br/><b>' . $locale['step_requirements_failed']; |  | ||||||
| 	echo next_form(true, false); |  | ||||||
| } | } | ||||||
| else |  | ||||||
|  | echo '<div class="text-center m-3">'; | ||||||
|  |  | ||||||
|  | if($failed) { | ||||||
|  | 	echo '<div class="alert alert-warning"><span>' . $locale['step_requirements_failed'] . '</span></div>'; | ||||||
|  | 	echo next_form(true, false); | ||||||
|  | }else { | ||||||
| 	echo next_form(true, true); | 	echo next_form(true, true); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | echo '</div>'; | ||||||
| ?> | ?> | ||||||
| @@ -18,3 +18,4 @@ $twig->display('install.config.html.twig', array( | |||||||
| 	'errors' => isset($errors) ? $errors : null, | 	'errors' => isset($errors) ? $errors : null, | ||||||
| 	'buttons' => next_buttons() | 	'buttons' => next_buttons() | ||||||
| )); | )); | ||||||
|  | ?> | ||||||
| @@ -21,8 +21,6 @@ if(!$error) { | |||||||
| 	// user can disable when he wants | 	// user can disable when he wants | ||||||
| 	$content .= '$config[\'env\'] = \'prod\'; // dev or prod'; | 	$content .= '$config[\'env\'] = \'prod\'; // dev or prod'; | ||||||
| 	$content .= PHP_EOL; | 	$content .= PHP_EOL; | ||||||
| 	$content .= '$config[\'mail_enabled\'] = true;'; |  | ||||||
| 	$content .= PHP_EOL; |  | ||||||
| 	foreach($_SESSION as $key => $value) | 	foreach($_SESSION as $key => $value) | ||||||
| 	{ | 	{ | ||||||
| 		if(strpos($key, 'var_') !== false) | 		if(strpos($key, 'var_') !== false) | ||||||
| @@ -86,11 +84,6 @@ if(!$error) { | |||||||
| 					$error = true; | 					$error = true; | ||||||
| 				} | 				} | ||||||
|  |  | ||||||
| 				if(!Validator::email($_SESSION['var_mail_address'])) { |  | ||||||
| 					error($locale['step_config_mail_address_error']); |  | ||||||
| 					$error = true; |  | ||||||
| 				} |  | ||||||
|  |  | ||||||
| 				$content .= '$config[\'session_prefix\'] = \'myaac_' . generateRandomString(8, true, false, true, false) . '_\';'; | 				$content .= '$config[\'session_prefix\'] = \'myaac_' . generateRandomString(8, true, false, true, false) . '_\';'; | ||||||
| 				$content .= PHP_EOL; | 				$content .= PHP_EOL; | ||||||
| 				$content .= '$config[\'cache_prefix\'] = \'myaac_' . generateRandomString(8, true, false, true, false) . '_\';'; | 				$content .= '$config[\'cache_prefix\'] = \'myaac_' . generateRandomString(8, true, false, true, false) . '_\';'; | ||||||
| @@ -120,8 +113,10 @@ if(!$error) { | |||||||
| } | } | ||||||
| ?> | ?> | ||||||
|  |  | ||||||
| <form action="<?php echo BASE_URL; ?>install/" method="post"> | <div class="text-center m-3"> | ||||||
| 	<input type="hidden" name="step" id="step" value="admin" /> | 	<form action="<?php echo BASE_URL; ?>install/" method="post"> | ||||||
| 	<?php echo next_buttons(true, !$error); | 		<input type="hidden" name="step" id="step" value="admin" /> | ||||||
| 	?> | 		<?php echo next_buttons(true, !$error); | ||||||
| </form> | 		?> | ||||||
|  | 	</form> | ||||||
|  | </div> | ||||||
|   | |||||||
| @@ -8,15 +8,14 @@ if(isset($config['installed']) && $config['installed'] && !isset($_SESSION['save | |||||||
| else { | else { | ||||||
| 	require SYSTEM . 'init.php'; | 	require SYSTEM . 'init.php'; | ||||||
| 	if(!$error) { | 	if(!$error) { | ||||||
| 		if(USE_ACCOUNT_NAME) | 		if(USE_ACCOUNT_NAME || USE_ACCOUNT_NUMBER) | ||||||
| 			$account = isset($_SESSION['var_account']) ? $_SESSION['var_account'] : null; | 			$account = isset($_SESSION['var_account']) ? $_SESSION['var_account'] : null; | ||||||
| 		else | 		else | ||||||
| 			$account_id = isset($_SESSION['var_account_id']) ? $_SESSION['var_account_id'] : null; | 			$account_id = isset($_SESSION['var_account_id']) ? $_SESSION['var_account_id'] : null; | ||||||
|  |  | ||||||
| 		$password = $_SESSION['var_password']; | 		$password = $_SESSION['var_password']; | ||||||
|  |  | ||||||
| 		$config_salt_enabled = $db->hasColumn('accounts', 'salt'); | 		if(USE_ACCOUNT_SALT) | ||||||
| 		if($config_salt_enabled) |  | ||||||
| 		{ | 		{ | ||||||
| 			$salt = generateRandomString(10, false, true, true); | 			$salt = generateRandomString(10, false, true, true); | ||||||
| 			$password = $salt . $password; | 			$password = $salt . $password; | ||||||
| @@ -74,13 +73,11 @@ else { | |||||||
| 			$account_used = &$new_account; | 			$account_used = &$new_account; | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		if($config_salt_enabled) | 		if(USE_ACCOUNT_SALT) | ||||||
| 			$account_used->setCustomField('salt', $salt); | 			$account_used->setCustomField('salt', $salt); | ||||||
|  |  | ||||||
| 		$account_used->setCustomField('web_flags', FLAG_ADMIN + FLAG_SUPER_ADMIN); | 		$account_used->setCustomField('web_flags', FLAG_ADMIN + FLAG_SUPER_ADMIN); | ||||||
| 		$account_used->setCustomField('country', 'us'); | 		$account_used->setCustomField('country', 'us'); | ||||||
| 		$account_used->setCustomField('email_verified', 1); |  | ||||||
|  |  | ||||||
| 		if($db->hasColumn('accounts', 'group_id')) | 		if($db->hasColumn('accounts', 'group_id')) | ||||||
| 			$account_used->setCustomField('group_id', $groups->getHighestId()); | 			$account_used->setCustomField('group_id', $groups->getHighestId()); | ||||||
| 		if($db->hasColumn('accounts', 'type')) | 		if($db->hasColumn('accounts', 'type')) | ||||||
|   | |||||||
| @@ -1,299 +1,13 @@ | |||||||
| * { | @import url('https://fonts.googleapis.com/css2?family=Roboto:wght@100;300;400&display=swap'); | ||||||
| 	margin: 0; padding: 0; |  | ||||||
| } |  | ||||||
| body { | body { | ||||||
| 	text-align: center; |     font-family: 'Roboto', sans-serif; | ||||||
| 	font: 12px Verdana; |  | ||||||
| 	color: #000000; |  | ||||||
| 	background-color: #000000; |  | ||||||
| } |  | ||||||
| img { |  | ||||||
| 	border: 0; |  | ||||||
| } | } | ||||||
|  |  | ||||||
| .break { | h1{ | ||||||
| 	font-size: 0; |     font-weight: 100 !important; | ||||||
| 	width: 0; height: 0; |  | ||||||
| 	clear: both; |  | ||||||
| } |  | ||||||
| .alignleft { |  | ||||||
| 	float: left; |  | ||||||
| 	margin: 4px 10px 5px 0; |  | ||||||
| } |  | ||||||
| .alignright { |  | ||||||
| 	float: right; |  | ||||||
| 	margin: 4px 0 5px 10px; |  | ||||||
| } |  | ||||||
| .aligncenter { |  | ||||||
| 	text-align: center; |  | ||||||
| } | } | ||||||
|  |  | ||||||
| /** BEGIN wrapper **/ | h3 { | ||||||
| #wrapper { |     font-weight: 300 !important; | ||||||
| 	background: #ffffff url(images/background.jpg) repeat-x 0 0; |  | ||||||
| 	width: 980px; |  | ||||||
| } | } | ||||||
|  |  | ||||||
| #header { |  | ||||||
| 	margin-bottom: 10px; |  | ||||||
| 	border-bottom: 1px solid #eee; |  | ||||||
| 	padding-bottom: 15px; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| #footer { |  | ||||||
| 	padding-top: 15px; |  | ||||||
| 	border-top: 1px solid #eee; |  | ||||||
| 	margin-top: 10px; |  | ||||||
| 	text-align: right; |  | ||||||
| 	color: #555; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| #header h1 { |  | ||||||
| 	font-weight: bold; |  | ||||||
| 	margin: 0; |  | ||||||
| 	padding: 0; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| #header span { |  | ||||||
| 	font-size: 25px; |  | ||||||
| 	color: #000; |  | ||||||
| 	font-weight: bold; |  | ||||||
| 	padding-left: 40px; |  | ||||||
| 	line-height: 80px; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| #version { |  | ||||||
| 	float: right; |  | ||||||
| 	color: #000; |  | ||||||
| 	font-size: 17px; |  | ||||||
| 	padding-top: 25px; |  | ||||||
| 	padding-right: 5px; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| /** BEGIN body **/ |  | ||||||
| #body { |  | ||||||
| 	background: url(images/wrapper.gif) repeat-y 0 0; |  | ||||||
| } |  | ||||||
| /** END body **/ |  | ||||||
|  |  | ||||||
| /** BEGIN content **/ |  | ||||||
| #content { |  | ||||||
| 	width: 642px; |  | ||||||
| 	float: left; |  | ||||||
| 	padding: 20px 18px 20px 20px; |  | ||||||
| 	color: #434242; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| 	/** begin headers **/ |  | ||||||
| 	h1, h2, h3, h4, h5, h6 { |  | ||||||
| 		font-family: Tahoma; |  | ||||||
| 		margin-bottom: 10px; |  | ||||||
| 	} |  | ||||||
| 	h2, h3, h4, h5, h6 { |  | ||||||
| 		margin-top: 30px; |  | ||||||
| 	} |  | ||||||
| 	h1 { font-size: 2em; } |  | ||||||
| 	h2 { font-size: 1.6em; } |  | ||||||
| 	h3 { font-size: 1.3em; } |  | ||||||
| 	h4, h5, h6 { font-size: 1em; } |  | ||||||
| 	/** end headers **/ |  | ||||||
| 	 |  | ||||||
| 	/** begin messages **/ |  | ||||||
| 	.error, .success, .note, .warning { |  | ||||||
| 		font-weight: bold; |  | ||||||
| 		font-size: 0.9em; |  | ||||||
| 		padding: 4px 10px 4px 24px; |  | ||||||
| 		background-repeat: no-repeat; |  | ||||||
| 		background-position: 5px 6px; |  | ||||||
| 		border-style: solid; |  | ||||||
| 		border-width: 1px; |  | ||||||
| 		line-height: 1.6em; |  | ||||||
| 		margin-bottom: 10px; |  | ||||||
| 	} |  | ||||||
| 	.error { |  | ||||||
| 		background-color: #FDD9D9; |  | ||||||
| 		background-image: url(images/error.gif); |  | ||||||
| 		border-color: #FBA3A3; |  | ||||||
| 		color: #D80303; |  | ||||||
| 	} |  | ||||||
| 	.success { |  | ||||||
| 		background-color: #E4FCD9; |  | ||||||
| 		background-image: url(images/success.gif); |  | ||||||
| 		border-color: #BFFDA3; |  | ||||||
| 		color: #35A502; |  | ||||||
| 	} |  | ||||||
| 	.note { |  | ||||||
| 		background-color: #DDEAFA; |  | ||||||
| 		background-image: url(images/note.gif); |  | ||||||
| 		border-color: #A3D8FD; |  | ||||||
| 		color: #026DA5; |  | ||||||
| 	} |  | ||||||
| 	.warning { |  | ||||||
| 		background-color: #FBF0B3; |  | ||||||
| 		background-image: url(images/warning.gif); |  | ||||||
| 		border-color: #FBBB95; |  | ||||||
| 		color: #FD6002; |  | ||||||
| 	} |  | ||||||
| 	/** end messages **/ |  | ||||||
| 	 |  | ||||||
| 	/** begin form **/ |  | ||||||
| 	form { |  | ||||||
| 		border: 1px solid #DDDDDD; |  | ||||||
| 		padding: 16px; |  | ||||||
| 	} |  | ||||||
| 		form .input { |  | ||||||
| 			padding-top: 12px; |  | ||||||
| 			clear: both; |  | ||||||
| 		} |  | ||||||
| 		form .first {  |  | ||||||
| 			padding-top: 0; |  | ||||||
| 		} |  | ||||||
| 		form .input p { |  | ||||||
| 			margin-bottom: 7px !important; |  | ||||||
| 		} |  | ||||||
| 		form input { |  | ||||||
| 			margin-right: 5px; |  | ||||||
| 		} |  | ||||||
| 		form label { |  | ||||||
| 			margin-right: 10px; |  | ||||||
| 			color: #8B8B8B; |  | ||||||
| 		} |  | ||||||
| 		form input.text, form textarea { |  | ||||||
| 			border: 1px solid #BEBDBD; |  | ||||||
| 			font-size: 1em; |  | ||||||
| 			font-family: Verdana; |  | ||||||
| 			background-color: #F3F3F3; |  | ||||||
| 			color: #808080; |  | ||||||
| 			padding: 2px; |  | ||||||
| 			max-width: 100%; |  | ||||||
| 		} |  | ||||||
| 		.positive, .negative { |  | ||||||
| 			font-size: 0.9em; |  | ||||||
| 			font-weight: bold; |  | ||||||
| 			padding: 1px 0 0 20px; |  | ||||||
| 			background-repeat: no-repeat; |  | ||||||
| 			background-position: 0 0; |  | ||||||
| 			display: inline; |  | ||||||
| 			margin-top: 2px; |  | ||||||
| 		} |  | ||||||
| 		.positive { |  | ||||||
| 			background-image: url(images/positive.gif); |  | ||||||
| 			color: #35A502; |  | ||||||
| 		} |  | ||||||
| 		.negative { |  | ||||||
| 			background-image: url(images/negative.gif); |  | ||||||
| 			color: #D80303; |  | ||||||
| 		} |  | ||||||
| 		form textarea { |  | ||||||
| 			line-height: 1.6em; |  | ||||||
| 		} |  | ||||||
| 		form button, form input.button { |  | ||||||
| 			font-size: 0.9em; |  | ||||||
| 			font-family: Verdana; |  | ||||||
| 			font-weight: bold; |  | ||||||
| 			color: #ffffff; |  | ||||||
| 			background: #B6B4B4 url(images/button.gif) repeat-x 0 0; |  | ||||||
| 			border: 1px solid #B6B4B4; |  | ||||||
| 			padding: 5px 10px; |  | ||||||
| 		} |  | ||||||
| 	/** end form **/ |  | ||||||
| 	 |  | ||||||
| 	/** begin table **/ |  | ||||||
| 	table { |  | ||||||
| 		 |  | ||||||
| 	} |  | ||||||
| 		table th { |  | ||||||
| 			font-size: 0.9em; |  | ||||||
| 			color: #ffffff; |  | ||||||
| 			background-color: #679BC5; |  | ||||||
| 			padding: 2px 4px; |  | ||||||
| 			line-height: 1.6em; |  | ||||||
| 		} |  | ||||||
| 		table td { |  | ||||||
| 			line-height: 1.6em; |  | ||||||
| 			padding: 2px 4px; |  | ||||||
| 		} |  | ||||||
| 		table tr.odd td { background-color: #EEEEEE; } |  | ||||||
| 		table tr.even td { background-color: #E5E5E5; } |  | ||||||
| 		 |  | ||||||
| 	/** end table **/ |  | ||||||
| 	 |  | ||||||
| 	/** begin paragraphs, lists, etc. **/ |  | ||||||
| 	#content p { |  | ||||||
| 		line-height: 1.6em; |  | ||||||
| 		margin-bottom: 10px; |  | ||||||
| 	} |  | ||||||
| 	#content ul, #content ol { |  | ||||||
| 		list-style-position: inside; |  | ||||||
| 	} |  | ||||||
| 	#content li { |  | ||||||
| 		line-height: 1.6em; |  | ||||||
| 		padding: 2px 0 2px 0; |  | ||||||
| 	} |  | ||||||
| 	a { |  | ||||||
| 		color: #679BC5; |  | ||||||
| 	} |  | ||||||
| 	a:hover { |  | ||||||
| 		color: #ff0000; |  | ||||||
| 		text-decoration: none; |  | ||||||
| 	} |  | ||||||
| 	blockquote { |  | ||||||
| 		padding: 10px; |  | ||||||
| 		background-color: #eeeeee; |  | ||||||
| 		line-height: 1.6em; |  | ||||||
| 		border-width: 2px 0 1px; |  | ||||||
| 		border-style: solid; |  | ||||||
| 		border-color: #e0e0e0; |  | ||||||
| 	} |  | ||||||
| 	/** end paragraphs, lists, etc. **/ |  | ||||||
|  |  | ||||||
| /** END content **/ |  | ||||||
|  |  | ||||||
| /** BEGIN sidebar **/ |  | ||||||
| #sidebar { |  | ||||||
| 	width: 300px; |  | ||||||
| 	float: right; |  | ||||||
| 	padding: 10px 0; |  | ||||||
| } |  | ||||||
| 	#sidebar h2 { |  | ||||||
| 		background: green url(images/sidehead.gif) no-repeat 0 0; |  | ||||||
| 		margin: 0 10px; |  | ||||||
| 		font-size: 1em; |  | ||||||
| 		color: #ffffff; |  | ||||||
| 		padding: 7px 10px; |  | ||||||
| 	} |  | ||||||
| 	#sidebar ul { |  | ||||||
| 		list-style-type: none; |  | ||||||
| 		background: #E0E0E0 url(images/sidebody.gif) no-repeat 0 bottom; |  | ||||||
| 		padding: 10px; |  | ||||||
| 		margin: 0 10px 10px; |  | ||||||
| 	} |  | ||||||
| 	#sidebar ul li { |  | ||||||
| 		padding: 4px 0 4px 14px; |  | ||||||
| 		background: none; |  | ||||||
| 		line-height: 1.6em; |  | ||||||
| 		font-size: 0.9em; |  | ||||||
| 		font-weight: bold; |  | ||||||
| 	} |  | ||||||
| 	#sidebar ul li a { |  | ||||||
| 		color: #000000; |  | ||||||
| 		text-decoration: none; |  | ||||||
| 	} |  | ||||||
| 	#sidebar ul li a:hover { |  | ||||||
| 		text-decoration: none; |  | ||||||
| 		color: #ff0000; |  | ||||||
| 	} |  | ||||||
| 	 |  | ||||||
| 	#sidebar ul li a:active { |  | ||||||
| 		text-decoration: none; |  | ||||||
| 		color: #ff0000; |  | ||||||
| 	} |  | ||||||
| 	 |  | ||||||
| 	#sidebar ul li current { |  | ||||||
| 		text-decoration: none; |  | ||||||
| 		color: #ff0000; |  | ||||||
| 	} |  | ||||||
| 	.current { |  | ||||||
| 		text-decoration: none; |  | ||||||
| 		color: #ff0000; |  | ||||||
| 	} |  | ||||||
| @@ -1,49 +1,74 @@ | |||||||
| <?php defined('MYAAC') or die('Direct access not allowed!'); ?> | <!DOCTYPE html> | ||||||
| <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> | <html dir="<?php echo $locale['direction']; ?>" lang="<?php echo $locale['lang']; ?>" xml:lang="<?php echo $locale['lang']; ?>"> | ||||||
| <html xmlns="http://www.w3.org/1999/xhtml" dir="<?php echo $locale['direction']; ?>" lang="<?php echo $locale['lang']; ?>" xml:lang="<?php echo $locale['lang']; ?>"> |  | ||||||
| <head> | <head> | ||||||
| 	<meta http-equiv="Content-Type" content="text/html; charset=<?php echo $locale['encoding']; ?>" /> | 	<meta http-equiv="Content-Type" content="text/html; charset=<?php echo $locale['encoding']; ?>" /> | ||||||
|  | 	<meta name="viewport" content="width=device-width, initial-scale=1"> | ||||||
| 	<title>MyAAC - <?php echo $locale['installation']; ?></title> | 	<title>MyAAC - <?php echo $locale['installation']; ?></title> | ||||||
|  | 	<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-rbsA2VBKQhggwzxH7pPCaAqO46MgnOM80zW1RWuH61DGLwZJEdK2Kadq2F9CUG65" crossorigin="anonymous"> | ||||||
| 	<link rel="stylesheet" type="text/css" href="template/style.css" /> | 	<link rel="stylesheet" type="text/css" href="template/style.css" /> | ||||||
| 	<script type="text/javascript" src="<?php echo BASE_URL; ?>tools/js/jquery.min.js"></script> | 	<script type="text/javascript" src="<?php echo BASE_URL; ?>tools/js/jquery.min.js"></script> | ||||||
| </head> | </head> | ||||||
| <body> | <body> | ||||||
| 	<div id="wrapper"> |  | ||||||
| 		<!--div class="buffer"--> |  | ||||||
| 			<div id="header"> |  | ||||||
| 				<h1>MyAAC <?php echo $locale['installation']; ?></h1> |  | ||||||
| 			</div> |  | ||||||
|  |  | ||||||
| 			<div id="body"> | 	<div id="body" class="container"> | ||||||
|  |  | ||||||
| 				<div id="sidebar"> | 		<header id="header" class="pt-5 pb-4 pb-sm-5"> | ||||||
| 					<h2><?php echo $locale['steps']; ?></h2> | 			<h1>MyAAC <?php echo $locale['installation']; ?></h1> | ||||||
| 					<ul> | 		</header> | ||||||
| 						<?php |  | ||||||
| 							$i = 0; |  | ||||||
| 							foreach($steps as $key => $value) |  | ||||||
| 								echo '<li' . ($step == $value ? ' class="current"' : '') . '>' . ++$i . '. ' . $locale['step_' . $value] . '</li>'; |  | ||||||
| 						?> |  | ||||||
| 					</ul> |  | ||||||
| 				</div> |  | ||||||
|  |  | ||||||
| 				<div id="content"> | 		<div class="row"> | ||||||
|  |  | ||||||
|  | 			<div id="sidebar" class="col-md-3"> | ||||||
|  | 				<h3><?php echo $locale['steps']; ?></h3> | ||||||
|  | 				<ul class="list-group mt-4"> | ||||||
| 					<?php | 					<?php | ||||||
| 						if(isset($locale['step_' . $step . '_title'])) | 						$i = 0; | ||||||
| 							echo '<h1>' . $locale['step_' . $step . '_title'] . '</h1>'; | 						foreach($steps as $key => $value){ | ||||||
| 						else |  | ||||||
| 							echo '<h1>' . $locale['step_' . $step] . '</h1>'; | 							if ($step == $value) { | ||||||
| 						echo $content; | 								$progress = ($i == 6) ? 100 : $i * 16; | ||||||
|  | 							} | ||||||
|  |  | ||||||
|  | 							echo '<li class="list-group-item' . ($step == $value ? ' active' : '') . '">' . ++$i . '. ' . $locale['step_' . $value] . '</li>'; | ||||||
|  | 						} | ||||||
|  |  | ||||||
| 					?> | 					?> | ||||||
| 				</div> | 				</ul> | ||||||
|  |  | ||||||
| 				<div class="break"></div> |  | ||||||
| 			</div> | 			</div> | ||||||
| 		<!--/div--> |  | ||||||
|  | 			<div id="content" class="col-md-9"> | ||||||
|  |  | ||||||
|  | 				<?php | ||||||
|  | 					if(isset($locale['step_' . $step . '_title'])) | ||||||
|  | 						echo '<h3 class="mb-4 mt-4 mt-md-0">' . $locale['step_' . $step . '_title'] . '</h3>'; | ||||||
|  | 					else | ||||||
|  | 						echo '<h3 class="mb-4 mt-4 mt-md-0">' . $locale['step_' . $step] . '</h3>'; | ||||||
|  | 				?> | ||||||
|  |  | ||||||
|  | 				<?php | ||||||
|  | 				if(!isset($config['installed'])): | ||||||
|  | 				?> | ||||||
|  | 				<div class="row"> | ||||||
|  | 					<div class="col-md-12"> | ||||||
|  | 						<div class="progress mb-2"> | ||||||
|  | 							<div class="progress-bar progress-bar-striped progress-bar-animated" style="width: <?php echo $progress; ?>%" role="progressbar" aria-valuenow="<?php echo $progress; ?>" aria-valuemin="0" aria-valuemax="100"></div> | ||||||
|  | 						</div> | ||||||
|  | 					</div> | ||||||
|  | 				</div> | ||||||
|  | 				<?php endif; ?> | ||||||
|  |  | ||||||
|  | 				<?php echo $content; ?> | ||||||
|  |  | ||||||
|  | 			</div> | ||||||
|  |  | ||||||
|  | 		</div> | ||||||
|  |  | ||||||
|  | 		<hr /> | ||||||
|  |  | ||||||
| 	</div> | 	</div> | ||||||
|  |  | ||||||
| 	<div id="footer"> | 	<footer id="footer" class="p-4"> | ||||||
| 		<p style="text-align: center;"><?php echo base64_decode('UG93ZXJlZCBieSA8YSBocmVmPSJodHRwOi8vbXktYWFjLm9yZyIgdGFyZ2V0PSJfYmxhbmsiPk15QUFDLjwvYT4='); ?></p> | 		<p style="text-align: center;"><?php echo base64_decode('UG93ZXJlZCBieSA8YSBocmVmPSJodHRwOi8vbXktYWFjLm9yZyIgdGFyZ2V0PSJfYmxhbmsiPk15QUFDLjwvYT4='); ?></p> | ||||||
| 	</div> | 	</footer> | ||||||
| </body> | </body> | ||||||
| </html> | </html> | ||||||
|   | |||||||
| @@ -11,10 +11,8 @@ $error = false; | |||||||
| require BASE . 'install/includes/config.php'; | require BASE . 'install/includes/config.php'; | ||||||
|  |  | ||||||
| ini_set('max_execution_time', 300); | ini_set('max_execution_time', 300); | ||||||
|  |  | ||||||
| @ob_end_flush(); |  | ||||||
| ob_implicit_flush(); | ob_implicit_flush(); | ||||||
|  | ob_end_flush(); | ||||||
| header('X-Accel-Buffering: no'); | header('X-Accel-Buffering: no'); | ||||||
|  |  | ||||||
| if(!$error) { | if(!$error) { | ||||||
| @@ -58,7 +56,7 @@ else { | |||||||
| } | } | ||||||
|  |  | ||||||
| if(!$db->hasColumn('accounts', 'created')) { | if(!$db->hasColumn('accounts', 'created')) { | ||||||
| 	if(query("ALTER TABLE `accounts` ADD `created` INT(11) NOT NULL DEFAULT 0 AFTER `" . ($db->hasColumn('accounts', 'group_id') ? 'group_id' : 'email') . "`;")) | 	if(query("ALTER TABLE `accounts` ADD `created` INT(11) NOT NULL DEFAULT 0 AFTER `" . ($db->hasColumn('accounts', 'group_id') ? 'group_id' : 'key') . "`;")) | ||||||
| 		success($locale['step_database_adding_field'] . ' accounts.created...'); | 		success($locale['step_database_adding_field'] . ' accounts.created...'); | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -8,10 +8,8 @@ require BASE . 'install/includes/functions.php'; | |||||||
| require BASE . 'install/includes/locale.php'; | require BASE . 'install/includes/locale.php'; | ||||||
|  |  | ||||||
| ini_set('max_execution_time', 300); | ini_set('max_execution_time', 300); | ||||||
|  |  | ||||||
| @ob_end_flush(); |  | ||||||
| ob_implicit_flush(); | ob_implicit_flush(); | ||||||
|  | ob_end_flush(); | ||||||
| header('X-Accel-Buffering: no'); | header('X-Accel-Buffering: no'); | ||||||
|  |  | ||||||
| if(isset($config['installed']) && $config['installed'] && !isset($_SESSION['saved'])) { | if(isset($config['installed']) && $config['installed'] && !isset($_SESSION['saved'])) { | ||||||
| @@ -47,38 +45,9 @@ if($success) { | |||||||
| 	success($locale['step_database_imported_players']); | 	success($locale['step_database_imported_players']); | ||||||
| } | } | ||||||
|  |  | ||||||
| require LIBS . 'items.php'; | require LIBS . 'DataLoader.php'; | ||||||
| if(Items::loadFromXML()) | DataLoader::setLocale($locale); | ||||||
| 	success($locale['step_database_loaded_items']); | DataLoader::load(); | ||||||
| else |  | ||||||
| 	error(Items::getError()); |  | ||||||
|  |  | ||||||
| require LIBS . 'weapons.php'; |  | ||||||
| if(Weapons::loadFromXML()) |  | ||||||
| 	success($locale['step_database_loaded_weapons']); |  | ||||||
| else |  | ||||||
| 	error(Weapons::getError()); |  | ||||||
|  |  | ||||||
| require LIBS . 'creatures.php'; |  | ||||||
| if(Creatures::loadFromXML()) { |  | ||||||
| 	success($locale['step_database_loaded_monsters']); |  | ||||||
|  |  | ||||||
| 	if(Creatures::getMonstersList()->hasErrors()) { |  | ||||||
| 		$locale['step_database_error_monsters'] = str_replace('$LOG$', 'system/logs/error.log', $locale['step_database_error_monsters']); |  | ||||||
| 		warning($locale['step_database_error_monsters']); |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| else { |  | ||||||
| 	error(Creatures::getLastError()); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| require LIBS . 'spells.php'; |  | ||||||
| if(Spells::loadFromXML()) { |  | ||||||
| 	success($locale['step_database_loaded_spells']); |  | ||||||
| } |  | ||||||
| else { |  | ||||||
| 	error(Spells::getLastError()); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // update config.highscores_ids_hidden | // update config.highscores_ids_hidden | ||||||
| require_once SYSTEM . 'migrations/20.php'; | require_once SYSTEM . 'migrations/20.php'; | ||||||
|   | |||||||