Compare commits
	
		
			624 Commits
		
	
	
		
			v0.8.21
			...
			feature/de
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					94a61f32ae | ||
| 
						 | 
					8227303b89 | ||
| 
						 | 
					7a402ec0e0 | ||
| 
						 | 
					790d85a88a | ||
| 
						 | 
					a04fbde607 | ||
| 
						 | 
					9d119b6279 | ||
| 
						 | 
					7dd9b7764a | ||
| 
						 | 
					3297a7c51a | ||
| 
						 | 
					4a430ae9db | ||
| 
						 | 
					26a80e0741 | ||
| 
						 | 
					3b9feaf3bd | ||
| 
						 | 
					21bff97137 | ||
| 
						 | 
					a2a273cde2 | ||
| 
						 | 
					fc5635bad3 | ||
| 
						 | 
					e01a44f352 | ||
| 
						 | 
					855b05b15f | ||
| 
						 | 
					b3991a8e78 | ||
| 
						 | 
					0ac0f4e7a8 | ||
| 
						 | 
					e9f155fb49 | ||
| 
						 | 
					55b5e3b600 | ||
| 
						 | 
					08339fe8b6 | ||
| 
						 | 
					89c2e84bff | ||
| 
						 | 
					f76615e59b | ||
| 
						 | 
					4c4089a155 | ||
| 
						 | 
					2d02d8d8b3 | ||
| 
						 | 
					95b1460b13 | ||
| 
						 | 
					673e40350a | ||
| 
						 | 
					f7cbe5170d | ||
| 
						 | 
					619b8ba4a0 | ||
| 
						 | 
					8c3b73ca9e | ||
| 
						 | 
					d90810cf84 | ||
| 
						 | 
					fd25e6e881 | ||
| 
						 | 
					63e69c97b7 | ||
| 
						 | 
					574e35ba35 | ||
| 
						 | 
					09627bdb1e | ||
| 
						 | 
					5f10773189 | ||
| 
						 | 
					8a3986932d | ||
| 
						 | 
					9e2a87f448 | ||
| 
						 | 
					0746708743 | ||
| 
						 | 
					3ef53aff6c | ||
| 
						 | 
					f43a5d1221 | ||
| 
						 | 
					43353b4f53 | ||
| 
						 | 
					577725690d | ||
| 
						 | 
					c227fd4e96 | ||
| 
						 | 
					a692607c5e | ||
| 
						 | 
					b72e7a3d96 | ||
| 
						 | 
					e15b57f967 | ||
| 
						 | 
					c3a161e2ee | ||
| 
						 | 
					30fe42939d | ||
| 
						 | 
					627369bbde | ||
| 
						 | 
					7cea023965 | ||
| 
						 | 
					eb416e18cc | ||
| 
						 | 
					fc0d13437a | ||
| 
						 | 
					14c8160020 | ||
| 
						 | 
					1f95a415aa | ||
| 
						 | 
					370cc554ad | ||
| 
						 | 
					2991696a60 | ||
| 
						 | 
					a1ecdd228d | ||
| 
						 | 
					6c8961638e | ||
| 
						 | 
					3dd493b790 | ||
| 
						 | 
					b49c247162 | ||
| 
						 | 
					cfbcabbfdb | ||
| 
						 | 
					0f38a677b1 | ||
| 
						 | 
					0835b69a93 | ||
| 
						 | 
					538723c405 | ||
| 
						 | 
					4f2e410a71 | ||
| 
						 | 
					a70daa8830 | ||
| 
						 | 
					ae600da28b | ||
| 
						 | 
					d8f1bf0a50 | ||
| 
						 | 
					cfc4f3601b | ||
| 
						 | 
					1a533388e7 | ||
| 
						 | 
					9fef84bffe | ||
| 
						 | 
					98335b8cc0 | ||
| 
						 | 
					dedd54286f | ||
| 
						 | 
					7403a24030 | ||
| 
						 | 
					16ebc1f577 | ||
| 
						 | 
					cc7aec8e28 | ||
| 
						 | 
					7bab8f033c | ||
| 
						 | 
					42d97721bf | ||
| 
						 | 
					23266e05ed | ||
| 
						 | 
					a72d1a3c9f | ||
| 
						 | 
					c802d427eb | ||
| 
						 | 
					aacc120360 | ||
| 
						 | 
					757ec28028 | ||
| 
						 | 
					41fa695d8b | ||
| 
						 | 
					b12c30982d | ||
| 
						 | 
					fcb2fc3002 | ||
| 
						 | 
					bb0e621308 | ||
| 
						 | 
					53221a9fd1 | ||
| 
						 | 
					d3b15a0a3e | ||
| 
						 | 
					23047aa608 | ||
| 
						 | 
					beff3e3aa6 | ||
| 
						 | 
					4a629b4418 | ||
| 
						 | 
					3c3ddc4578 | ||
| 
						 | 
					0788dc8848 | ||
| 
						 | 
					5791d1e7f9 | ||
| 
						 | 
					a9cb017def | ||
| 
						 | 
					eaa9d6be43 | ||
| 
						 | 
					7588904372 | ||
| 
						 | 
					712ca30293 | ||
| 
						 | 
					5fa4890b70 | ||
| 
						 | 
					ca56b4f101 | ||
| 
						 | 
					707aea18db | ||
| 
						 | 
					848c5c0887 | ||
| 
						 | 
					e14df529c0 | ||
| 
						 | 
					9f67cab503 | ||
| 
						 | 
					99c53c75f2 | ||
| 
						 | 
					df7c82c571 | ||
| 
						 | 
					ddb093ec48 | ||
| 
						 | 
					714476bf29 | ||
| 
						 | 
					e49690b52b | ||
| 
						 | 
					f9d35b719b | ||
| 
						 | 
					a61cd43c3c | ||
| 
						 | 
					6d1b3235d2 | ||
| 
						 | 
					e7e9d8e3b9 | ||
| 
						 | 
					8cf0e80019 | ||
| 
						 | 
					c392fa7272 | ||
| 
						 | 
					082884baa0 | ||
| 
						 | 
					3a31a0326c | ||
| 
						 | 
					2d561f267d | ||
| 
						 | 
					5eafff737a | ||
| 
						 | 
					8cf4d0cb0f | ||
| 
						 | 
					d1953470d9 | ||
| 
						 | 
					3a52f2c403 | ||
| 
						 | 
					ac40922957 | ||
| 
						 | 
					5aed9ee1a4 | ||
| 
						 | 
					8318169c39 | ||
| 
						 | 
					ad00cf3fc3 | ||
| 
						 | 
					3ff7b21287 | ||
| 
						 | 
					36fbae850d | ||
| 
						 | 
					24ff5684cd | ||
| 
						 | 
					aab62fb724 | ||
| 
						 | 
					a810890614 | ||
| 
						 | 
					a3bfdc1ec8 | ||
| 
						 | 
					a7dc719934 | ||
| 
						 | 
					74433303fb | ||
| 
						 | 
					30d62bda3b | ||
| 
						 | 
					cc7703766e | ||
| 
						 | 
					9d664d3577 | ||
| 
						 | 
					76bfab1303 | ||
| 
						 | 
					7d2fc48437 | ||
| 
						 | 
					171c114b0f | ||
| 
						 | 
					b1d2ac34a2 | ||
| 
						 | 
					c7ce87c4b6 | ||
| 
						 | 
					4e22c42b10 | ||
| 
						 | 
					eabe789bbb | ||
| 
						 | 
					aa1403480c | ||
| 
						 | 
					91c8f1f5bc | ||
| 
						 | 
					b421bf3931 | ||
| 
						 | 
					6e6f4679f4 | ||
| 
						 | 
					5bb3e57b7b | ||
| 
						 | 
					17221f5369 | ||
| 
						 | 
					98d4d3fcf0 | ||
| 
						 | 
					82092338d6 | ||
| 
						 | 
					9868b41a61 | ||
| 
						 | 
					c247789adf | ||
| 
						 | 
					48822b6561 | ||
| 
						 | 
					cd22f8def5 | ||
| 
						 | 
					0f30ebbcea | ||
| 
						 | 
					1a2e46f09b | ||
| 
						 | 
					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]
 | 
			
		||||
trim_trailing_whitespace = false
 | 
			
		||||
indent_style = tab
 | 
			
		||||
 | 
			
		||||
[{composer.json,package.json}]
 | 
			
		||||
indent_style = space
 | 
			
		||||
 | 
			
		||||
[{package.json, *.yml}]
 | 
			
		||||
indent_size = 2
 | 
			
		||||
							
								
								
									
										6
									
								
								.gitattributes
									
									
									
									
										vendored
									
									
								
							
							
						
						@@ -3,9 +3,11 @@
 | 
			
		||||
.gitignore export-ignore
 | 
			
		||||
.github export-ignore
 | 
			
		||||
.editorconfig export-ignore
 | 
			
		||||
.travis.yml export-ignore
 | 
			
		||||
_config.yml export-ignore
 | 
			
		||||
release.sh export-ignore
 | 
			
		||||
 | 
			
		||||
# cypress
 | 
			
		||||
cypress export-ignore
 | 
			
		||||
cypress.config.js export-ignore
 | 
			
		||||
 | 
			
		||||
*.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: 0.9
 | 
			
		||||
 | 
			
		||||
        - 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
 | 
			
		||||
on:
 | 
			
		||||
  pull_request:
 | 
			
		||||
    branches: [master]
 | 
			
		||||
    branches: [develop]
 | 
			
		||||
  push:
 | 
			
		||||
    branches: [master]
 | 
			
		||||
    branches: [develop]
 | 
			
		||||
 | 
			
		||||
jobs:
 | 
			
		||||
  phplint:
 | 
			
		||||
    runs-on: ubuntu-latest
 | 
			
		||||
    steps:
 | 
			
		||||
      - uses: actions/checkout@v3
 | 
			
		||||
      - uses: overtrue/phplint@3.4.0
 | 
			
		||||
      - uses: overtrue/phplint@8.2
 | 
			
		||||
        with:
 | 
			
		||||
          path: .
 | 
			
		||||
          options: --exclude="system/libs/polyfill-mbstring/bootstrap80.php"
 | 
			
		||||
          options: --exclude=*.log
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										13
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						@@ -11,12 +11,10 @@ vendor
 | 
			
		||||
 | 
			
		||||
# npm
 | 
			
		||||
node_modules
 | 
			
		||||
tools/ext
 | 
			
		||||
 | 
			
		||||
# cypress
 | 
			
		||||
cypress.env.json
 | 
			
		||||
cypress/e2e/2-advanced-examples
 | 
			
		||||
cypress/screenshots
 | 
			
		||||
 | 
			
		||||
# created by release.sh
 | 
			
		||||
releases
 | 
			
		||||
@@ -50,10 +48,6 @@ system/cache/*
 | 
			
		||||
!system/cache/signatures/index.html
 | 
			
		||||
!system/cache/plugins/index.html
 | 
			
		||||
 | 
			
		||||
# php sessions
 | 
			
		||||
system/php_sessions/*
 | 
			
		||||
!system/php_sessions/index.html
 | 
			
		||||
 | 
			
		||||
# logs
 | 
			
		||||
system/logs/*
 | 
			
		||||
!system/logs/index.html
 | 
			
		||||
@@ -62,6 +56,10 @@ system/logs/*
 | 
			
		||||
system/data/*
 | 
			
		||||
!system/data/index.html
 | 
			
		||||
 | 
			
		||||
# php sessions
 | 
			
		||||
system/php_sessions/*
 | 
			
		||||
!system/php_sessions/index.html
 | 
			
		||||
 | 
			
		||||
# plugins
 | 
			
		||||
plugins/*
 | 
			
		||||
!plugins/.htaccess
 | 
			
		||||
@@ -72,5 +70,8 @@ plugins/*
 | 
			
		||||
!plugins/email-confirmed-reward
 | 
			
		||||
landing
 | 
			
		||||
 | 
			
		||||
# system
 | 
			
		||||
system/functions_custom.php
 | 
			
		||||
 | 
			
		||||
# others/rest
 | 
			
		||||
system/pages/downloads.php
 | 
			
		||||
 
 | 
			
		||||
@@ -6,12 +6,14 @@
 | 
			
		||||
	Options -MultiViews
 | 
			
		||||
</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>
 | 
			
		||||
	RewriteEngine On
 | 
			
		||||
 | 
			
		||||
	# you can put here your myaac root folder
 | 
			
		||||
	# path relative to web root
 | 
			
		||||
    #RewriteBase /myaac/
 | 
			
		||||
	#RewriteBase /myaac/
 | 
			
		||||
 | 
			
		||||
	RewriteCond %{REQUEST_FILENAME} !-f
 | 
			
		||||
	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" .
 | 
			
		||||
							
								
								
									
										1019
									
								
								CHANGELOG.md
									
									
									
									
									
								
							
							
						
						
							
								
								
									
										24
									
								
								README.md
									
									
									
									
									
								
							
							
						
						@@ -10,20 +10,21 @@ Official website: https://my-aac.org
 | 
			
		||||
[](https://discord.gg/2J39Wus)
 | 
			
		||||
[](https://github.com/slawkens/myaac/issues?q=is%3Aissue+is%3Aclosed)
 | 
			
		||||
 | 
			
		||||
| Version | Status                 | Branch  | Requirements   |
 | 
			
		||||
|:--------|:-----------------------|:--------|:---------------|
 | 
			
		||||
| **1.x** | **Active development** | develop | **PHP >= 8.1** |
 | 
			
		||||
| 0.9.x   | Not developed anymore  | 0.9     | PHP >= 7.2.5   |
 | 
			
		||||
| 0.8.x   | Active support         | master  | PHP >= 7.2.5   |
 | 
			
		||||
| 0.7.x   | End Of Life            | 0.7     | PHP >= 5.3.3   |
 | 
			
		||||
| Version    | Status                                    | Branch  | Requirements   |
 | 
			
		||||
|:-----------|:------------------------------------------|:--------|:---------------|
 | 
			
		||||
| **0.10.x** | **Active development**                    | develop | **PHP >= 8.0** |
 | 
			
		||||
| 0.9.x      | Active support                            | 0.9     | PHP >= 7.2.5   |
 | 
			
		||||
| 0.8.x      | Active support                            | master  | PHP >= 7.2.5   |
 | 
			
		||||
| 0.7.x      | End Of Life                               | 0.7     | PHP >= 5.3.3   |
 | 
			
		||||
 | 
			
		||||
### Requirements
 | 
			
		||||
 | 
			
		||||
	- PHP 8.0 or later
 | 
			
		||||
	- MySQL database
 | 
			
		||||
	- PHP Extensions: pdo, xml, json
 | 
			
		||||
	- (optional) apache2 mod_rewrite (to use friendly_urls)
 | 
			
		||||
	- (optional) zip PHP Extension (to install plugins)
 | 
			
		||||
	- (optional) gd PHP Extension (for generating signature images)
 | 
			
		||||
	- PDO PHP Extension
 | 
			
		||||
	- XML PHP Extension
 | 
			
		||||
	- (optional) ZIP PHP Extension
 | 
			
		||||
	- (optional) mod_rewrite to use friendly_urls
 | 
			
		||||
 | 
			
		||||
### Installation
 | 
			
		||||
 | 
			
		||||
@@ -47,8 +48,7 @@ Official website: https://my-aac.org
 | 
			
		||||
 | 
			
		||||
### Configuration
 | 
			
		||||
 | 
			
		||||
Check *config.php* to get more informations. (Notice: MyAAC 1.0+ doesn't use config.php anymore, it has been moved to Admin Panel - Settings page).
 | 
			
		||||
 | 
			
		||||
Check *config.php* to get more informations.
 | 
			
		||||
Use *config.local.php* for your local configuration changes.
 | 
			
		||||
 | 
			
		||||
### Branches
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										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  | 
							
								
								
									
										35
									
								
								admin/includes/settings_menus.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,35 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
$order = 10;
 | 
			
		||||
 | 
			
		||||
$settingsMenu = [];
 | 
			
		||||
 | 
			
		||||
$settingsMenu[] = [
 | 
			
		||||
	'name' => 'MyAAC',
 | 
			
		||||
	'link' => 'settings&plugin=core',
 | 
			
		||||
	'icon' => 'list',
 | 
			
		||||
	'order' => $order,
 | 
			
		||||
];
 | 
			
		||||
 | 
			
		||||
foreach (Plugins::getAllPluginsSettings() as $setting) {
 | 
			
		||||
	$file = BASE . $setting['settingsFilename'];
 | 
			
		||||
	if (!file_exists($file)) {
 | 
			
		||||
		warning('Plugin setting: ' . $file . ' - cannot be loaded.');
 | 
			
		||||
		continue;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	$order += 10;
 | 
			
		||||
 | 
			
		||||
	$settings = require $file;
 | 
			
		||||
 | 
			
		||||
	$settingsMenu[] = [
 | 
			
		||||
		'name' => $settings['name'],
 | 
			
		||||
		'link' => 'settings&plugin=' . $setting['pluginFilename'],
 | 
			
		||||
		'icon' => 'list',
 | 
			
		||||
		'order' => $order,
 | 
			
		||||
	];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
unset($settings, $file, $order);
 | 
			
		||||
 | 
			
		||||
return $settingsMenu;
 | 
			
		||||
@@ -1,13 +1,10 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
// few things we'll need
 | 
			
		||||
require '../common.php';
 | 
			
		||||
 | 
			
		||||
define('ADMIN_PANEL', true);
 | 
			
		||||
define('MYAAC_ADMIN', true);
 | 
			
		||||
 | 
			
		||||
if(file_exists(BASE . 'config.local.php')) {
 | 
			
		||||
	require_once BASE . 'config.local.php';
 | 
			
		||||
}
 | 
			
		||||
const ADMIN_PANEL = true;
 | 
			
		||||
const MYAAC_ADMIN = true;
 | 
			
		||||
 | 
			
		||||
if(file_exists(BASE . 'install') && (!isset($config['installed']) || !$config['installed']))
 | 
			
		||||
{
 | 
			
		||||
@@ -18,8 +15,8 @@ if(file_exists(BASE . 'install') && (!isset($config['installed']) || !$config['i
 | 
			
		||||
$content = '';
 | 
			
		||||
 | 
			
		||||
// validate page
 | 
			
		||||
$page = isset($_GET['p']) ? $_GET['p'] : '';
 | 
			
		||||
if(empty($page) || preg_match("/[^a-zA-Z0-9_\-]/", $page))
 | 
			
		||||
$page = $_GET['p'] ?? '';
 | 
			
		||||
if(empty($page) || preg_match("/[^a-zA-Z0-9_\-\/.]/", $page))
 | 
			
		||||
	$page = 'dashboard';
 | 
			
		||||
 | 
			
		||||
$page = strtolower($page);
 | 
			
		||||
@@ -28,44 +25,68 @@ define('PAGE', $page);
 | 
			
		||||
require SYSTEM . 'functions.php';
 | 
			
		||||
require SYSTEM . 'init.php';
 | 
			
		||||
 | 
			
		||||
if(config('env') === 'dev') {
 | 
			
		||||
	ini_set('display_errors', 1);
 | 
			
		||||
	ini_set('display_startup_errors', 1);
 | 
			
		||||
	error_reporting(E_ALL);
 | 
			
		||||
// 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.');
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// event system
 | 
			
		||||
require_once SYSTEM . 'hooks.php';
 | 
			
		||||
$hooks = new Hooks();
 | 
			
		||||
$hooks->load();
 | 
			
		||||
$hooks->register('debugbar_admin_head_end', HOOK_ADMIN_HEAD_END, function ($params) {
 | 
			
		||||
	global $debugBar;
 | 
			
		||||
 | 
			
		||||
	if (!isset($debugBar)) {
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	$debugBarRenderer = $debugBar->getJavascriptRenderer();
 | 
			
		||||
	echo $debugBarRenderer->renderHead();
 | 
			
		||||
});
 | 
			
		||||
$hooks->register('debugbar_admin_body_end', HOOK_ADMIN_BODY_END, function ($params) {
 | 
			
		||||
	global $debugBar;
 | 
			
		||||
 | 
			
		||||
	if (!isset($debugBar)) {
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	$debugBarRenderer = $debugBar->getJavascriptRenderer();
 | 
			
		||||
	echo $debugBarRenderer->render();
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
require SYSTEM . 'status.php';
 | 
			
		||||
require SYSTEM . 'login.php';
 | 
			
		||||
require SYSTEM . 'migrate.php';
 | 
			
		||||
require ADMIN . 'includes/functions.php';
 | 
			
		||||
require __DIR__ . '/includes/functions.php';
 | 
			
		||||
 | 
			
		||||
$twig->addGlobal('config', $config);
 | 
			
		||||
$twig->addGlobal('status', $status);
 | 
			
		||||
 | 
			
		||||
if (ACTION == 'logout') {
 | 
			
		||||
	require SYSTEM . 'logout.php';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// if we're not logged in - show login box
 | 
			
		||||
if(!$logged || !admin()) {
 | 
			
		||||
	$page = 'login';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// include our page
 | 
			
		||||
$file = ADMIN . 'pages/' . $page . '.php';
 | 
			
		||||
$file = __DIR__ . '/pages/' . $page . '.php';
 | 
			
		||||
if(!@file_exists($file)) {
 | 
			
		||||
	$page = '404';
 | 
			
		||||
	$file = SYSTEM . 'pages/404.php';
 | 
			
		||||
	if (strpos($page, 'plugins/') !== false) {
 | 
			
		||||
		$file = BASE . $page;
 | 
			
		||||
	}
 | 
			
		||||
	else {
 | 
			
		||||
		$page = '404';
 | 
			
		||||
		$file = SYSTEM . 'pages/404.php';
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ob_start();
 | 
			
		||||
include($file);
 | 
			
		||||
if($hooks->trigger(HOOK_ADMIN_BEFORE_PAGE)) {
 | 
			
		||||
	require $file;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
$content .= ob_get_contents();
 | 
			
		||||
ob_end_clean();
 | 
			
		||||
 | 
			
		||||
// template
 | 
			
		||||
$template_path = 'template/';
 | 
			
		||||
require ADMIN . $template_path . 'template.php';
 | 
			
		||||
 | 
			
		||||
require __DIR__ . '/' . $template_path . 'template.php';
 | 
			
		||||
 
 | 
			
		||||
@@ -1,26 +1,131 @@
 | 
			
		||||
<?php
 | 
			
		||||
/**
 | 
			
		||||
 * CHANGELOG viewer
 | 
			
		||||
 * CHANGELOG modifier
 | 
			
		||||
 *
 | 
			
		||||
 * @package   MyAAC
 | 
			
		||||
 * @author    Slawkens <slawkens@gmail.com>
 | 
			
		||||
 * @copyright 2019 MyAAC
 | 
			
		||||
 * @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.';
 | 
			
		||||
use MyAAC\Models\Changelog as ModelsChangelog;
 | 
			
		||||
 | 
			
		||||
defined('MYAAC') or die('Direct access not allowed!');
 | 
			
		||||
 | 
			
		||||
$title = 'Changelog';
 | 
			
		||||
 | 
			
		||||
csrfProtect();
 | 
			
		||||
 | 
			
		||||
if (!hasFlag(FLAG_CONTENT_PAGES) && !superAdmin()) {
 | 
			
		||||
	echo 'Access denied.';
 | 
			
		||||
	return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
require LIBS . 'Parsedown.php';
 | 
			
		||||
$use_datatable = true;
 | 
			
		||||
const CL_LIMIT = 600; // maximum changelog body length
 | 
			
		||||
 | 
			
		||||
$changelog = file_get_contents(BASE . 'CHANGELOG.md');
 | 
			
		||||
$id = $_GET['id'] ?? 0;
 | 
			
		||||
require_once LIBS . 'changelog.php';
 | 
			
		||||
 | 
			
		||||
$Parsedown = new Parsedown();
 | 
			
		||||
if(!empty($action))
 | 
			
		||||
{
 | 
			
		||||
	$id = $_POST['id'] ?? null;
 | 
			
		||||
	$body = isset($_POST['body']) ? stripslashes($_POST['body']) : null;
 | 
			
		||||
	$create_date = isset($_POST['createdate']) ? (int)strtotime($_POST['createdate'] ): null;
 | 
			
		||||
	$player_id = isset($_POST['player_id']) ? (int)$_POST['player_id'] : null;
 | 
			
		||||
	$type = isset($_POST['type']) ? (int)$_POST['type'] : null;
 | 
			
		||||
	$where = isset($_POST['where']) ? (int)$_POST['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') {
 | 
			
		||||
		if (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') {
 | 
			
		||||
		if (Changelog::toggleHidden($id, $errors, $status)) {
 | 
			
		||||
			success(($status == 1 ? 'Hide' : 'Show') . ' successful.');
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if(!empty($errors))
 | 
			
		||||
		error(implode(", ", $errors));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
$changelogs = ModelsChangelog::orderBy('id')->get()->toArray();
 | 
			
		||||
 | 
			
		||||
$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',
 | 
			
		||||
		'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,
 | 
			
		||||
));
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										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>';
 | 
			
		||||
@@ -10,7 +10,9 @@
 | 
			
		||||
defined('MYAAC') or die('Direct access not allowed!');
 | 
			
		||||
$title = 'Dashboard';
 | 
			
		||||
 | 
			
		||||
if (isset($_GET['clear_cache'])) {
 | 
			
		||||
csrfProtect();
 | 
			
		||||
 | 
			
		||||
if (isset($_POST['clear_cache'])) {
 | 
			
		||||
	if (clearCache()) {
 | 
			
		||||
		success('Cache cleared.');
 | 
			
		||||
	} else {
 | 
			
		||||
@@ -18,9 +20,11 @@ if (isset($_GET['clear_cache'])) {
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
if (isset($_GET['maintenance'])) {
 | 
			
		||||
	$_status = (int)$_POST['status'];
 | 
			
		||||
	$message = $_POST['message'];
 | 
			
		||||
if (isset($_POST['maintenance'])) {
 | 
			
		||||
	$message = (!empty($_POST['message']) ? $_POST['message'] : null);
 | 
			
		||||
	$_status = (isset($_POST['status']) && $_POST['status'] == 'true');
 | 
			
		||||
	$_status = ($_status ? '0' : '1');
 | 
			
		||||
 | 
			
		||||
	if (empty($message)) {
 | 
			
		||||
		error('Message cannot be empty.');
 | 
			
		||||
	} else if (strlen($message) > 255) {
 | 
			
		||||
@@ -45,47 +49,15 @@ $tmp = '';
 | 
			
		||||
if (fetchDatabaseConfig('site_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');
 | 
			
		||||
if(isset($configAdminPanelModules))
 | 
			
		||||
	$configAdminPanelModules = explode(',', $configAdminPanelModules);
 | 
			
		||||
 | 
			
		||||
$twig_loader->prependPath(__DIR__ . '/modules/templates');
 | 
			
		||||
foreach($configAdminPanelModules as $box) {
 | 
			
		||||
	$file = __DIR__ . '/modules/' . $box . '.php';
 | 
			
		||||
	if(file_exists($file)) {
 | 
			
		||||
		include($file);
 | 
			
		||||
$settingAdminPanelModules = setting('core.admin_panel_modules');
 | 
			
		||||
if (count($settingAdminPanelModules) > 0) {
 | 
			
		||||
	echo '<div class="row">';
 | 
			
		||||
	$twig_loader->prependPath(__DIR__ . '/modules/templates');
 | 
			
		||||
	foreach ($settingAdminPanelModules as $box) {
 | 
			
		||||
		$file = __DIR__ . '/modules/' . $box . '.php';
 | 
			
		||||
		if (file_exists($file)) {
 | 
			
		||||
			include($file);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
echo '</div>';
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,6 @@
 | 
			
		||||
<?php
 | 
			
		||||
/**
 | 
			
		||||
 * Account confirm mail
 | 
			
		||||
 * Keept for compatibility
 | 
			
		||||
 * Load items.xml
 | 
			
		||||
 *
 | 
			
		||||
 * @package   MyAAC
 | 
			
		||||
 * @author    Slawkens <slawkens@gmail.com>
 | 
			
		||||
@@ -9,7 +8,6 @@
 | 
			
		||||
 * @link      https://my-aac.org
 | 
			
		||||
 */
 | 
			
		||||
defined('MYAAC') or die('Direct access not allowed!');
 | 
			
		||||
$title = 'Server Data';
 | 
			
		||||
 | 
			
		||||
if($action == 'confirm_email') {
 | 
			
		||||
	require_once PAGES . 'account/confirm_email.php';
 | 
			
		||||
}
 | 
			
		||||
$twig->display('admin.data.html.twig');
 | 
			
		||||
@@ -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,18 @@
 | 
			
		||||
 */
 | 
			
		||||
defined('MYAAC') or die('Direct access not allowed!');
 | 
			
		||||
$title = 'Login';
 | 
			
		||||
$logout = '';
 | 
			
		||||
if ($action == 'logout') {
 | 
			
		||||
	$logout = "You have  been logged out!";
 | 
			
		||||
 | 
			
		||||
csrfProtect();
 | 
			
		||||
 | 
			
		||||
require PAGES . 'account/login.php';
 | 
			
		||||
if ($logged) {
 | 
			
		||||
	header('Location: ' . (admin() ? ADMIN_URL : BASE_URL));
 | 
			
		||||
	return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
if (isset($errors)) {
 | 
			
		||||
	foreach ($errors as $error) {
 | 
			
		||||
		error($error);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
$twig->display('admin.login.html.twig', array(
 | 
			
		||||
	'logout' => $logout,
 | 
			
		||||
$twig->display('admin.login.html.twig', [
 | 
			
		||||
	'logout' => (ACTION == 'logout' ? 'You have  been logged out!'  : ''),
 | 
			
		||||
	'account' => USE_ACCOUNT_NAME ? 'Name' : 'Number',
 | 
			
		||||
));
 | 
			
		||||
	'account_login_by' => getAccountLoginByLabel(),
 | 
			
		||||
	'errors' => $errors ?? ''
 | 
			
		||||
]);
 | 
			
		||||
 
 | 
			
		||||
@@ -4,56 +4,56 @@
 | 
			
		||||
 *
 | 
			
		||||
 * @package   MyAAC
 | 
			
		||||
 * @author    Slawkens <slawkens@gmail.com>
 | 
			
		||||
 * @copyright 2019 MyAAC
 | 
			
		||||
 * @copyright 2020 MyAAC
 | 
			
		||||
 * @link      https://my-aac.org
 | 
			
		||||
 */
 | 
			
		||||
defined('MYAAC') or die('Direct access not allowed!');
 | 
			
		||||
$title = 'Logs Viewer';
 | 
			
		||||
$use_datatable = true;
 | 
			
		||||
 | 
			
		||||
$files = array();
 | 
			
		||||
$aac_path_logs = BASE . 'system/logs/';
 | 
			
		||||
foreach (scandir($aac_path_logs, SCANDIR_SORT_ASCENDING) as $f) {
 | 
			
		||||
    if ($f[0] === '.' || is_dir($aac_path_logs . $f)) {
 | 
			
		||||
	    continue;
 | 
			
		||||
    }
 | 
			
		||||
	if ($f[0] === '.' || is_dir($aac_path_logs . $f) || $f === 'index.html') {
 | 
			
		||||
		continue;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
    $files[] = array($f, $aac_path_logs);
 | 
			
		||||
	$files[] = array($f, $aac_path_logs);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
$server_path_logs = $config['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)) {
 | 
			
		||||
    foreach (scandir($server_path_logs, SCANDIR_SORT_ASCENDING) as $f) {
 | 
			
		||||
        if ($f[0] === '.') {
 | 
			
		||||
	        continue;
 | 
			
		||||
        }
 | 
			
		||||
	foreach (scandir($server_path_logs, SCANDIR_SORT_ASCENDING) as $f) {
 | 
			
		||||
		if ($f[0] === '.') {
 | 
			
		||||
			continue;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
        if (is_dir($server_path_logs . $f)) {
 | 
			
		||||
            foreach (scandir($server_path_logs . $f, SCANDIR_SORT_ASCENDING) as $f2) {
 | 
			
		||||
                if ($f2[0] === '.') {
 | 
			
		||||
	                continue;
 | 
			
		||||
                }
 | 
			
		||||
		if (is_dir($server_path_logs . $f)) {
 | 
			
		||||
			foreach (scandir($server_path_logs . $f, SCANDIR_SORT_ASCENDING) as $f2) {
 | 
			
		||||
				if ($f2[0] === '.') {
 | 
			
		||||
					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) {
 | 
			
		||||
    $f['mtime'] = filemtime($f[1] . $f[0]);
 | 
			
		||||
    $f['name'] = $f[0];
 | 
			
		||||
	$f['mtime'] = filemtime($f[1] . $f[0]);
 | 
			
		||||
	$f['name'] = $f[0];
 | 
			
		||||
}
 | 
			
		||||
unset($f);
 | 
			
		||||
 | 
			
		||||
$twig->display('admin.logs.html.twig', array('files' => $files));
 | 
			
		||||
 | 
			
		||||
define('EXIST_NONE', 0);
 | 
			
		||||
define('EXIST_SERVER_LOG', 1);
 | 
			
		||||
@@ -72,10 +72,12 @@ if (!empty($file)) {
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if ($exist !== EXIST_NONE) {
 | 
			
		||||
			$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));
 | 
			
		||||
			$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' => $file_content));
 | 
			
		||||
		}
 | 
			
		||||
	} else {
 | 
			
		||||
		echo 'Invalid file name specified.';
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
$twig->display('admin.logs.html.twig', array('files' => $files));
 | 
			
		||||
 
 | 
			
		||||
@@ -10,60 +10,76 @@
 | 
			
		||||
defined('MYAAC') or die('Direct access not allowed!');
 | 
			
		||||
$title = 'Mailer';
 | 
			
		||||
 | 
			
		||||
csrfProtect();
 | 
			
		||||
 | 
			
		||||
if (!hasFlag(FLAG_CONTENT_MAILER) && !superAdmin()) {
 | 
			
		||||
	echo 'Access denied.';
 | 
			
		||||
	return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
if (!$config['mail_enabled']) {
 | 
			
		||||
	echo 'Mail support disabled.';
 | 
			
		||||
if (!setting('core.mail_enabled')) {
 | 
			
		||||
	echo 'Mail support disabled in config.';
 | 
			
		||||
	return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
$mail_content = isset($_POST['mail_content']) ? stripslashes($_POST['mail_content']) : NULL;
 | 
			
		||||
$mail_subject = isset($_POST['mail_subject']) ? stripslashes($_POST['mail_subject']) : NULL;
 | 
			
		||||
$preview = isset($_REQUEST['preview']);
 | 
			
		||||
$mail_to = isset($_POST['mail_to']) ? stripslashes(trim($_POST['mail_to'])) : null;
 | 
			
		||||
$mail_subject = isset($_POST['mail_subject']) ? stripslashes($_POST['mail_subject']) : null;
 | 
			
		||||
$mail_content = isset($_POST['mail_content']) ? stripslashes($_POST['mail_content']) : null;
 | 
			
		||||
 | 
			
		||||
$preview_done = false;
 | 
			
		||||
if ($preview) {
 | 
			
		||||
	if (!empty($mail_content) && !empty($mail_subject)) {
 | 
			
		||||
		$preview_done = _mail($account_logged->getCustomField('email'), $mail_subject, $mail_content);
 | 
			
		||||
if (isset($_POST['submit'])) {
 | 
			
		||||
	if (empty($mail_subject)) {
 | 
			
		||||
		warning('Please enter subject of the message.');
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
		if (!$preview_done)
 | 
			
		||||
			error('Error while sending preview mail. More info can be found in system/logs/mailer-error.log');
 | 
			
		||||
	if (empty($mail_content)) {
 | 
			
		||||
		warning('Please enter content of the message.');
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
$twig->display('admin.mailer.html.twig', array(
 | 
			
		||||
	'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++;
 | 
			
		||||
if (!empty($mail_to)) {
 | 
			
		||||
	if(!Validator::email($mail_to)) {
 | 
			
		||||
		warning('E-Mail is invalid.');
 | 
			
		||||
	}
 | 
			
		||||
	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');
 | 
			
		||||
		if (!empty($mail_content) && !empty($mail_subject)) {
 | 
			
		||||
			if (_mail($mail_to, $mail_subject, $mail_content)) {
 | 
			
		||||
				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.');
 | 
			
		||||
success("$success emails delivered.");
 | 
			
		||||
warning("$failed emails failed.");
 | 
			
		||||
if (!empty($mail_content) && !empty($mail_subject) && empty($mail_to)) {
 | 
			
		||||
	$success = 0;
 | 
			
		||||
	$failed = 0;
 | 
			
		||||
 | 
			
		||||
	$add = '';
 | 
			
		||||
	if (setting('core.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
 | 
			
		||||
]);
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										211
									
								
								admin/pages/mass_account.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,211 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Account Admin Tool
 | 
			
		||||
 *
 | 
			
		||||
 * @package   MyAAC
 | 
			
		||||
 * @author    Slawkens <slawkens@gmail.com>
 | 
			
		||||
 * @author    Lee
 | 
			
		||||
 * @copyright 2020 MyAAC
 | 
			
		||||
 * @link      https://my-aac.org
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
use MyAAC\Models\Account;
 | 
			
		||||
 | 
			
		||||
defined('MYAAC') or die('Direct access not allowed!');
 | 
			
		||||
 | 
			
		||||
$title = 'Mass Account Actions';
 | 
			
		||||
 | 
			
		||||
csrfProtect();
 | 
			
		||||
 | 
			
		||||
$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 (!Account::query()->increment('premium_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;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (!Account::query()->increment('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,
 | 
			
		||||
	));
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										107
									
								
								admin/pages/mass_teleport.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,107 @@
 | 
			
		||||
<?php
 | 
			
		||||
/**
 | 
			
		||||
 * Teleport Admin Tool
 | 
			
		||||
 *
 | 
			
		||||
 * @package   MyAAC
 | 
			
		||||
 * @author    Slawkens <slawkens@gmail.com>
 | 
			
		||||
 * @author    Lee
 | 
			
		||||
 * @copyright 2020 MyAAC
 | 
			
		||||
 * @link      https://my-aac.org
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
use MyAAC\Models\Player;
 | 
			
		||||
use MyAAC\Models\PlayerOnline;
 | 
			
		||||
 | 
			
		||||
defined('MYAAC') or die('Direct access not allowed!');
 | 
			
		||||
 | 
			
		||||
$title = 'Mass Teleport Actions';
 | 
			
		||||
 | 
			
		||||
csrfProtect();
 | 
			
		||||
 | 
			
		||||
function admin_teleport_position($x, $y, $z) {
 | 
			
		||||
	if (!Player::query()->update([
 | 
			
		||||
		'posx' => $x, 'posy' => $y, 'posz' => $z
 | 
			
		||||
	])) {
 | 
			
		||||
		displayMessage('Failed to execute query. Probably already updated.');
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	displayMessage('Player\'s position updated.', true);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function admin_teleport_town($town_id) {
 | 
			
		||||
	if (!Player::query()->update([
 | 
			
		||||
		'town_id' => $town_id,
 | 
			
		||||
	])) {
 | 
			
		||||
		displayMessage('Failed to execute query. Probably already updated.');
 | 
			
		||||
		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
 | 
			
		||||
			$playersOnline = PlayerOnline::count();
 | 
			
		||||
		} else {
 | 
			
		||||
			$playersOnline = Player::online()->count();
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if ($playersOnline > 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());
 | 
			
		||||
}
 | 
			
		||||
@@ -7,35 +7,48 @@
 | 
			
		||||
 * @copyright 2019 MyAAC
 | 
			
		||||
 * @link      https://my-aac.org
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
use MyAAC\Models\Menu;
 | 
			
		||||
 | 
			
		||||
defined('MYAAC') or die('Direct access not allowed!');
 | 
			
		||||
$title = 'Menus';
 | 
			
		||||
 | 
			
		||||
csrfProtect();
 | 
			
		||||
 | 
			
		||||
if (!hasFlag(FLAG_CONTENT_MENUS) && !superAdmin()) {
 | 
			
		||||
	echo 'Access denied.';
 | 
			
		||||
	return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
if (isset($_REQUEST['template'])) {
 | 
			
		||||
	$template = $_REQUEST['template'];
 | 
			
		||||
if (isset($_POST['template'])) {
 | 
			
		||||
	$template = $_POST['template'];
 | 
			
		||||
 | 
			
		||||
	if (isset($_REQUEST['menu'])) {
 | 
			
		||||
		$post_menu = $_REQUEST['menu'];
 | 
			
		||||
		$post_menu_link = $_REQUEST['menu_link'];
 | 
			
		||||
		$post_menu_blank = $_REQUEST['menu_blank'];
 | 
			
		||||
		$post_menu_color = $_REQUEST['menu_color'];
 | 
			
		||||
	if (isset($_POST['menu'])) {
 | 
			
		||||
		$post_menu = $_POST['menu'];
 | 
			
		||||
		$post_menu_link = $_POST['menu_link'];
 | 
			
		||||
		$post_menu_blank = $_POST['menu_blank'];
 | 
			
		||||
		$post_menu_color = $_POST['menu_color'];
 | 
			
		||||
		if (count($post_menu) != count($post_menu_link)) {
 | 
			
		||||
			echo 'Menu count is not equal menu links. Something went wrong when sending form.';
 | 
			
		||||
			return;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		$db->query('DELETE FROM `' . TABLE_PREFIX . 'menu` WHERE `template` = ' . $db->quote($template));
 | 
			
		||||
		Menu::where('template', $template)->delete();
 | 
			
		||||
		foreach ($post_menu as $category => $menus) {
 | 
			
		||||
			foreach ($menus as $i => $menu) {
 | 
			
		||||
				if (empty($menu)) // don't save empty menu item
 | 
			
		||||
					continue;
 | 
			
		||||
 | 
			
		||||
				try {
 | 
			
		||||
					$db->insert(TABLE_PREFIX . 'menu', array('template' => $template, 'name' => $menu, 'link' => $post_menu_link[$category][$i], 'blank' => $post_menu_blank[$category][$i] == 'on' ? 1 : 0, 'color' => str_replace('#', '', $post_menu_color[$category][$i]), 'category' => $category, 'ordering' => $i));
 | 
			
		||||
					Menu::create([
 | 
			
		||||
						'template' => $template,
 | 
			
		||||
						'name' => $menu,
 | 
			
		||||
						'link' => $post_menu_link[$category][$i],
 | 
			
		||||
						'blank' => $post_menu_blank[$category][$i] == 'on' ? 1 : 0,
 | 
			
		||||
						'color' => str_replace('#', '', $post_menu_color[$category][$i]),
 | 
			
		||||
						'category' => $category,
 | 
			
		||||
						'ordering' => $i
 | 
			
		||||
					]);
 | 
			
		||||
				} catch (PDOException $error) {
 | 
			
		||||
					warning('Error while adding menu item (' . $menu . '): ' . $error->getMessage());
 | 
			
		||||
				}
 | 
			
		||||
@@ -58,72 +71,102 @@ if (isset($_REQUEST['template'])) {
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (isset($_GET['reset_colors'])) {
 | 
			
		||||
		if (isset($config['menu_default_color'])) {
 | 
			
		||||
			Menu::where('template', $template)->update(['color' => str_replace('#', '', $config['menu_default_color'])]);
 | 
			
		||||
			success('Colors has been reset.');
 | 
			
		||||
		}
 | 
			
		||||
		else {
 | 
			
		||||
			warning('There is no default color defined, cannot reset colors.');
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (!isset($config['menu_categories'])) {
 | 
			
		||||
		echo "No menu categories set in template config.php.<br/>This template doesn't support dynamic menus.";
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	echo '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.<br/><br/>
 | 
			
		||||
    <div class="row">';
 | 
			
		||||
	$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();
 | 
			
		||||
	foreach ($menus_db as $menu) {
 | 
			
		||||
		$menus[$menu['category']][] = array('name' => $menu['name'], 'link' => $menu['link'], 'blank' => $menu['blank'], 'color' => $menu['color'], 'ordering' => $menu['ordering']);
 | 
			
		||||
	}
 | 
			
		||||
	$title = 'Menus - ' . $template;
 | 
			
		||||
	?>
 | 
			
		||||
	<div align="center" class="text-center">
 | 
			
		||||
		<p class="note">You are editing: <?= $template ?><br/><br/>
 | 
			
		||||
			Hint: You can drag menu items.<br/>
 | 
			
		||||
			Hint: Add links to external sites using: <b>http://</b> or <b>https://</b> prefix.<br/>
 | 
			
		||||
			Not all templates support blank and colorful links.
 | 
			
		||||
		</p>
 | 
			
		||||
		<?php if (isset($config['menu_default_color'])) {?>
 | 
			
		||||
		<form method="post" action="?p=menus&reset_colors" onsubmit="return confirm('Do you really want to reset colors?');">
 | 
			
		||||
			<?php csrf(); ?>
 | 
			
		||||
			<input type="hidden" name="template" value="<?php echo $template ?>"/>
 | 
			
		||||
			<button type="submit" class="btn btn-danger">Reset Colors to default</button>
 | 
			
		||||
		</form>
 | 
			
		||||
		<br/>
 | 
			
		||||
		<?php } ?>
 | 
			
		||||
	</div>
 | 
			
		||||
	<?php
 | 
			
		||||
	$menus = Menu::query()
 | 
			
		||||
		->select('name', 'link', 'blank', 'color', 'category', 'ordering')
 | 
			
		||||
		->where('enabled', 1)
 | 
			
		||||
		->where('template', $template)
 | 
			
		||||
		->orderBy('ordering')
 | 
			
		||||
		->get()
 | 
			
		||||
		->groupBy('category')
 | 
			
		||||
		->toArray();
 | 
			
		||||
 | 
			
		||||
	$last_id = array();
 | 
			
		||||
	echo '<form method="post" id="menus-form" action="?p=menus">';
 | 
			
		||||
	echo '<input type="hidden" name="template" value="' . $template . '"/>';
 | 
			
		||||
	foreach ($config['menu_categories'] as $id => $cat) {
 | 
			
		||||
		echo '        <div class="col-md-12 col-lg-6">
 | 
			
		||||
            <div class="box box-danger">
 | 
			
		||||
                <div class="box-header with-border">
 | 
			
		||||
                    <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>
 | 
			
		||||
                <div class="box-body">';
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		echo '<ul class="sortable" id="sortable-' . $id . '">';
 | 
			
		||||
		if (isset($menus[$id])) {
 | 
			
		||||
			$i = 0;
 | 
			
		||||
			foreach ($menus[$id] as $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'] . '"/>
 | 
			
		||||
				<input type="hidden" name="menu_blank[' . $id . '][]" value="0" />
 | 
			
		||||
				<label><input class="blank-checkbox" type="checkbox" ' . ($menu['blank'] == 1 ? 'checked' : '') . '/><span title="Open in New Window">Open in New Window</span></label>
 | 
			
		||||
				
 | 
			
		||||
				<input class="color-picker" type="text" name="menu_color[' . $id . '][]" value="#' . $menu['color'] . '" />
 | 
			
		||||
				
 | 
			
		||||
				<a class="remove-button" id="remove-button-' . $id . '-' . $i . '"><img src="' . BASE_URL . 'images/del.png"/></a></li>';
 | 
			
		||||
 | 
			
		||||
				$i++;
 | 
			
		||||
				$last_id[$id] = $i;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		echo '</ul>';
 | 
			
		||||
		echo '                </div>
 | 
			
		||||
            </div>
 | 
			
		||||
        </div>
 | 
			
		||||
';
 | 
			
		||||
	}
 | 
			
		||||
	echo ' </div><div class="row"><div class="col-md-6">';
 | 
			
		||||
	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 . '\';">';
 | 
			
		||||
	echo '</div></div>';
 | 
			
		||||
	echo '</form>';
 | 
			
		||||
 | 
			
		||||
	?>
 | 
			
		||||
	<form method="post" id="menus-form" action="?p=menus">
 | 
			
		||||
		<?php csrf(); ?>
 | 
			
		||||
		<input type="hidden" name="template" value="<?php echo $template ?>"/>
 | 
			
		||||
		<button type="submit" class="btn btn-info">Save</button><br/><br/>
 | 
			
		||||
		<div class="row">
 | 
			
		||||
			<?php foreach ($config['menu_categories'] as $id => $cat): ?>
 | 
			
		||||
				<div class="col-md-12 col-lg-6">
 | 
			
		||||
					<div class="card card-info card-outline">
 | 
			
		||||
						<div class="card-header">
 | 
			
		||||
							<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">
 | 
			
		||||
							<ul class="sortable" id="sortable-<?php echo $id ?>">
 | 
			
		||||
								<?php
 | 
			
		||||
								if (isset($menus[$id])) {
 | 
			
		||||
									$i = 0;
 | 
			
		||||
									foreach ($menus[$id] as $menu):
 | 
			
		||||
										?>
 | 
			
		||||
										<li class="ui-state-default" id="list-<?php echo $id ?>-<?php echo $i ?>"><label>Name:</label> <input type="text" name="menu[<?php echo $id ?>][]" value="<?php echo escapeHtml($menu['name']); ?>"/>
 | 
			
		||||
											<label>Link:</label> <input type="text" name="menu_link[<?php echo $id ?>][]" value="<?php echo $menu['link'] ?>"/>
 | 
			
		||||
											<input type="hidden" name="menu_blank[<?php echo $id ?>][]" value="0"/>
 | 
			
		||||
											<label><input class="blank-checkbox" type="checkbox" <?php echo($menu['blank'] == 1 ? 'checked' : '') ?>/><span title="Open in New Window">New Window</span></label>
 | 
			
		||||
											<input class="color-picker" type="text" name="menu_color[<?php echo $id ?>][]" value="<?php echo (empty($menu['color']) ? ($config['menu_default_color'] ?? '#ffffff') : $menu['color']); ?>"/>
 | 
			
		||||
											<a class="remove-button" id="remove-button-<?php echo $id ?>-<?php echo $i ?>"><i class="fas fa-trash"></a></i></li>
 | 
			
		||||
										<?php $i++; $last_id[$id] = $i;
 | 
			
		||||
									endforeach;
 | 
			
		||||
								} ?>
 | 
			
		||||
							</ul>
 | 
			
		||||
						</div>
 | 
			
		||||
					</div>
 | 
			
		||||
				</div>
 | 
			
		||||
			<?php endforeach ?>
 | 
			
		||||
		</div>
 | 
			
		||||
		<div class="row pb-2">
 | 
			
		||||
			<div class="col-md-12">
 | 
			
		||||
				<button type="submit" class="btn btn-info">Save</button>
 | 
			
		||||
				<?php
 | 
			
		||||
				echo '<button type="button" class="btn btn-danger float-right" value="Cancel" onclick="window.location = \'' . ADMIN_URL . '?p=menus\';"><i class="fas fa-cancel"></i> Cancel</button>';
 | 
			
		||||
				?>
 | 
			
		||||
			</div>
 | 
			
		||||
		</div>
 | 
			
		||||
	</form>
 | 
			
		||||
	<?php
 | 
			
		||||
	$twig->display('admin.menus.js.html.twig', array(
 | 
			
		||||
		'menus' => $menus,
 | 
			
		||||
		'last_id' => $last_id
 | 
			
		||||
		'last_id' => $last_id,
 | 
			
		||||
		'menu_default_color' => $config['menu_default_color'] ?? '#ffffff'
 | 
			
		||||
	));
 | 
			
		||||
	?>
 | 
			
		||||
 | 
			
		||||
	<?php
 | 
			
		||||
} else {
 | 
			
		||||
	$templates = $db->query('SELECT `template` FROM `' . TABLE_PREFIX . 'menu` GROUP BY `template`;')->fetchAll();
 | 
			
		||||
	$templates = Menu::select('template')->distinct()->get()->toArray();
 | 
			
		||||
	foreach ($templates as $key => $value) {
 | 
			
		||||
		$file = TEMPLATES . $value['template'] . '/config.php';
 | 
			
		||||
		if (!file_exists($file)) {
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										15
									
								
								admin/pages/modules/balance.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,15 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
use MyAAC\Models\Player;
 | 
			
		||||
 | 
			
		||||
defined('MYAAC') or die('Direct access not allowed!');
 | 
			
		||||
 | 
			
		||||
$balance = 0;
 | 
			
		||||
 | 
			
		||||
if ($db->hasColumn('players', 'balance')) {
 | 
			
		||||
	$balance = Player::orderByDesc('balance')->limit(10)->get(['balance', 'id','name', 'level'])->toArray();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
$twig->display('balance.html.twig', array(
 | 
			
		||||
	'balance' => $balance
 | 
			
		||||
));
 | 
			
		||||
@@ -1,9 +1,13 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
use MyAAC\Models\Account;
 | 
			
		||||
 | 
			
		||||
defined('MYAAC') or die('Direct access not allowed!');
 | 
			
		||||
 | 
			
		||||
$coins = 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;
 | 
			
		||||
	$coins = Account::orderByDesc('coins')->limit(10)->get(['coins', (USE_ACCOUNT_NAME ? 'name' : 'id')])->toArray();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
$twig->display('coins.html.twig', array(
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										15
									
								
								admin/pages/modules/created.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,15 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
use MyAAC\Models\Account;
 | 
			
		||||
 | 
			
		||||
defined('MYAAC') or die('Direct access not allowed!');
 | 
			
		||||
 | 
			
		||||
$accounts = 0;
 | 
			
		||||
 | 
			
		||||
if ($db->hasColumn('accounts', 'created')) {
 | 
			
		||||
	$accounts = Account::orderByDesc('created')->limit(10)->get(['created', (USE_ACCOUNT_NAME ? 'name' : 'id')])->toArray();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
$twig->display('created.html.twig', array(
 | 
			
		||||
	'accounts' => $accounts,
 | 
			
		||||
));
 | 
			
		||||
@@ -1,9 +1,13 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
use MyAAC\Models\Player;
 | 
			
		||||
 | 
			
		||||
defined('MYAAC') or die('Direct access not allowed!');
 | 
			
		||||
 | 
			
		||||
$players = 0;
 | 
			
		||||
 | 
			
		||||
if ($db->hasColumn('players', 'lastlogin')) {
 | 
			
		||||
	$players = $db->query('SELECT name, level, lastlogin FROM players ORDER BY lastlogin DESC LIMIT 10;');
 | 
			
		||||
} else {
 | 
			
		||||
	$players = 0;
 | 
			
		||||
	$players = Player::orderByDesc('lastlogin')->limit(10)->get(['name', 'level', 'lastlogin'])->toArray();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
$twig->display('lastlogin.html.twig', array(
 | 
			
		||||
 
 | 
			
		||||
@@ -1,8 +1,13 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
use MyAAC\Models\Account;
 | 
			
		||||
 | 
			
		||||
defined('MYAAC') or die('Direct access not allowed!');
 | 
			
		||||
 | 
			
		||||
$points = 0;
 | 
			
		||||
 | 
			
		||||
if ($db->hasColumn('accounts', 'premium_points')) {
 | 
			
		||||
	$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;
 | 
			
		||||
	$coins = Account::orderByDesc('premium_points')->limit(10)->get(['premium_points', (USE_ACCOUNT_NAME ? 'name' : 'id')])->toArray();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
$twig->display('points.html.twig', array(
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										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 } ?>
 | 
			
		||||
							
								
								
									
										21
									
								
								admin/pages/modules/statistics.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,21 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
use MyAAC\Models\Account;
 | 
			
		||||
use MyAAC\Models\Guild;
 | 
			
		||||
use MyAAC\Models\House;
 | 
			
		||||
use MyAAC\Models\Monster;
 | 
			
		||||
use MyAAC\Models\Player;
 | 
			
		||||
 | 
			
		||||
defined('MYAAC') or die('Direct access not allowed!');
 | 
			
		||||
$count = $eloquentConnection->query()
 | 
			
		||||
	->select([
 | 
			
		||||
		'total_accounts' => Account::selectRaw('COUNT(id)'),
 | 
			
		||||
		'total_players' => Player::selectRaw('COUNT(id)'),
 | 
			
		||||
		'total_guilds' => Guild::selectRaw('COUNT(id)'),
 | 
			
		||||
		'total_monsters' => Monster::selectRaw('COUNT(id)'),
 | 
			
		||||
		'total_houses' => House::selectRaw('COUNT(id)'),
 | 
			
		||||
	])->first();
 | 
			
		||||
 | 
			
		||||
$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 %}
 | 
			
		||||
	<div class="col-md-3">
 | 
			
		||||
		<div class="box">
 | 
			
		||||
			<div class="box-header">
 | 
			
		||||
				<h3 class="box-title">Top 10 - Most coins</h3>
 | 
			
		||||
	<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 - Most coins</h5>
 | 
			
		||||
			</div>
 | 
			
		||||
			<div class="box-body no-padding">
 | 
			
		||||
				<table class="table table-condensed">
 | 
			
		||||
					<tbody>
 | 
			
		||||
			<div class="card-body p-0">
 | 
			
		||||
				<table class="table table-striped table-condensed">
 | 
			
		||||
					<thead>
 | 
			
		||||
					<tr>
 | 
			
		||||
						<th>#</th>
 | 
			
		||||
						<th>Account {{ account_type }}</th>
 | 
			
		||||
						<th>Account</th>
 | 
			
		||||
						<th>Tibia coins</th>
 | 
			
		||||
					</tr>
 | 
			
		||||
					</thead>
 | 
			
		||||
					<tbody>
 | 
			
		||||
					{% set i = 0 %}
 | 
			
		||||
					{% for result in coins %}
 | 
			
		||||
						{% set i = i + 1 %}
 | 
			
		||||
						<tr>
 | 
			
		||||
							<td>{{ i }}</td>
 | 
			
		||||
							<td>{{ result.name }}</td>
 | 
			
		||||
							<th>{{ i }}</th>
 | 
			
		||||
							<td><a href="?p=accounts&search_name={{ result.name }}">{{ result.name }}</a></td>
 | 
			
		||||
							<td>{{ result.coins }}</td>
 | 
			
		||||
						</tr>
 | 
			
		||||
					{% endfor %}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										31
									
								
								admin/pages/modules/templates/created.html.twig
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,31 @@
 | 
			
		||||
{% if accounts 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 accounts %}
 | 
			
		||||
						{% 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 %}
 | 
			
		||||
	<div class="col-md-3">
 | 
			
		||||
		<div class="box">
 | 
			
		||||
			<div class="box-header">
 | 
			
		||||
				<h3 class="box-title">Last 10 Logins</h3>
 | 
			
		||||
	<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 logins</h5>
 | 
			
		||||
			</div>
 | 
			
		||||
			<div class="box-body no-padding">
 | 
			
		||||
				<table class="table table-condensed">
 | 
			
		||||
					<tbody>
 | 
			
		||||
			<div class="card-body p-0">
 | 
			
		||||
				<table class="table table-striped table-condensed">
 | 
			
		||||
					<thead>
 | 
			
		||||
					<tr>
 | 
			
		||||
						<th>#</th>
 | 
			
		||||
						<th>Player</th>
 | 
			
		||||
						<th>Login Date</th>
 | 
			
		||||
					</tr>
 | 
			
		||||
					</thead>
 | 
			
		||||
					<tbody>
 | 
			
		||||
					{% set i = 0 %}
 | 
			
		||||
					{% for result in players %}
 | 
			
		||||
						{% set i = i + 1 %}
 | 
			
		||||
						<tr>
 | 
			
		||||
							<td>{{ i }}</td>
 | 
			
		||||
							<td>{{ result.name }}</td>
 | 
			
		||||
							<th>{{ i }}</th>
 | 
			
		||||
							<td><a href="?p=players&search_name={{ result.name }}">{{ result.name }}</a></td>
 | 
			
		||||
							<td>{{ result.lastlogin|date("M d Y, H:i:s") }}</td>
 | 
			
		||||
						</tr>
 | 
			
		||||
					{% endfor %}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,23 +1,25 @@
 | 
			
		||||
{% if points is iterable %}
 | 
			
		||||
	<div class="col-md-3">
 | 
			
		||||
		<div class="box">
 | 
			
		||||
			<div class="box-header">
 | 
			
		||||
				<h3 class="box-title">Top 10 - Most premium points</h3>
 | 
			
		||||
	<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 - Most premium points</h5>
 | 
			
		||||
			</div>
 | 
			
		||||
			<div class="box-body no-padding">
 | 
			
		||||
				<table class="table table-condensed">
 | 
			
		||||
					<tbody>
 | 
			
		||||
			<div class="card-body p-0">
 | 
			
		||||
				<table class="table table-striped table-condensed">
 | 
			
		||||
					<thead>
 | 
			
		||||
					<tr>
 | 
			
		||||
						<th>#</th>
 | 
			
		||||
						<th>Account {{ account_type }}</th>
 | 
			
		||||
						<th>Account</th>
 | 
			
		||||
						<th>Premium points</th>
 | 
			
		||||
					</tr>
 | 
			
		||||
					</thead>
 | 
			
		||||
					<tbody>
 | 
			
		||||
					{% set i = 0 %}
 | 
			
		||||
					{% for result in points %}
 | 
			
		||||
						{% set i = i + 1 %}
 | 
			
		||||
						<tr>
 | 
			
		||||
							<td>{{ i }}</td>
 | 
			
		||||
							<td>{{ result.name }}</td>
 | 
			
		||||
							<th>{{ i }}</th>
 | 
			
		||||
							<td><a href="?p=accounts&search_name={{ result.name }}">{{ result.name }}</a></td>
 | 
			
		||||
							<td>{{ result.premium_points }}</td>
 | 
			
		||||
						</tr>
 | 
			
		||||
					{% 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>
 | 
			
		||||
							
								
								
									
										43
									
								
								admin/pages/modules/templates/web_status.twig
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,43 @@
 | 
			
		||||
<div class="col-12 col-md-6">
 | 
			
		||||
	<div class="card card-warning card-outline">
 | 
			
		||||
		<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 form="maintenance-form" 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 form="maintenance-form" 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">
 | 
			
		||||
			<form id="maintenance-form" method="post" action="?p=dashboard" class="float-left">
 | 
			
		||||
				{{ csrf() }}
 | 
			
		||||
				<input type="hidden" name="maintenance" value="1" />
 | 
			
		||||
				<button type="submit" class="btn btn-info"><i class="far fa-update"></i> Update</button>
 | 
			
		||||
			</form>
 | 
			
		||||
			<form method="post" action="?p=dashboard" class="float-right">
 | 
			
		||||
				{{ csrf() }}
 | 
			
		||||
				<input type="hidden" name="clear_cache" value="1" />
 | 
			
		||||
				<button type="submit" onclick="return confirm('Are you sure that you want to clear cache?');" class="btn btn-danger" title="Clear Cache"><i class="fas fa-clear"></i>Clear cache</button>
 | 
			
		||||
			</form>
 | 
			
		||||
		</div>
 | 
			
		||||
	</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'
 | 
			
		||||
));
 | 
			
		||||
?>
 | 
			
		||||
@@ -9,11 +9,15 @@
 | 
			
		||||
 */
 | 
			
		||||
defined('MYAAC') or die('Direct access not allowed!');
 | 
			
		||||
 | 
			
		||||
$title = 'News Panel';
 | 
			
		||||
 | 
			
		||||
csrfProtect();
 | 
			
		||||
 | 
			
		||||
$use_datatable = true;
 | 
			
		||||
 | 
			
		||||
require_once LIBS . 'forum.php';
 | 
			
		||||
require_once LIBS . 'news.php';
 | 
			
		||||
 | 
			
		||||
$title = 'News Panel';
 | 
			
		||||
 | 
			
		||||
if (!hasFlag(FLAG_CONTENT_PAGES) && !superAdmin()) {
 | 
			
		||||
	echo 'Access denied.';
 | 
			
		||||
	return;
 | 
			
		||||
@@ -22,41 +26,42 @@ if (!hasFlag(FLAG_CONTENT_PAGES) && !superAdmin()) {
 | 
			
		||||
header('X-XSS-Protection:0');
 | 
			
		||||
 | 
			
		||||
// some constants, used mainly by database (cannot by modified without schema changes)
 | 
			
		||||
define('TITLE_LIMIT', 100);
 | 
			
		||||
define('BODY_LIMIT', 65535); // maximum news body length
 | 
			
		||||
define('ARTICLE_TEXT_LIMIT', 300);
 | 
			
		||||
define('ARTICLE_IMAGE_LIMIT', 100);
 | 
			
		||||
const NEWS_TITLE_LIMIT = 100;
 | 
			
		||||
const NEWS_BODY_LIMIT = 65535; // maximum news body length
 | 
			
		||||
const ARTICLE_TEXT_LIMIT = 300;
 | 
			
		||||
const ARTICLE_IMAGE_LIMIT = 100;
 | 
			
		||||
 | 
			
		||||
$name = $p_title = '';
 | 
			
		||||
if(!empty($action))
 | 
			
		||||
{
 | 
			
		||||
	$id = isset($_REQUEST['id']) ? $_REQUEST['id'] : null;
 | 
			
		||||
	$p_title = isset($_REQUEST['title']) ? $_REQUEST['title'] : null;
 | 
			
		||||
	$body = isset($_REQUEST['body']) ? stripslashes($_REQUEST['body']) : null;
 | 
			
		||||
	$comments = isset($_REQUEST['comments']) ? $_REQUEST['comments'] : null;
 | 
			
		||||
	$type = isset($_REQUEST['type']) ? (int)$_REQUEST['type'] : null;
 | 
			
		||||
	$category = isset($_REQUEST['category']) ? (int)$_REQUEST['category'] : null;
 | 
			
		||||
	$player_id = isset($_REQUEST['player_id']) ? (int)$_REQUEST['player_id'] : null;
 | 
			
		||||
	$article_text = isset($_REQUEST['article_text']) ? $_REQUEST['article_text'] : null;
 | 
			
		||||
	$article_image = isset($_REQUEST['article_image']) ? $_REQUEST['article_image'] : null;
 | 
			
		||||
	$forum_section = isset($_REQUEST['forum_section']) ? $_REQUEST['forum_section'] : null;
 | 
			
		||||
	$errors = array();
 | 
			
		||||
	$id = $_POST['id'] ?? null;
 | 
			
		||||
	$p_title = $_POST['title'] ?? null;
 | 
			
		||||
	$body = isset($_POST['body']) ? stripslashes($_POST['body']) : null;
 | 
			
		||||
	$comments = $_POST['comments'] ?? null;
 | 
			
		||||
	$type = isset($_REQUEST['type']) ? (int)$_REQUEST['type'] : 1;
 | 
			
		||||
	$category = isset($_POST['category']) ? (int)$_POST['category'] : null;
 | 
			
		||||
	$player_id = isset($_POST['player_id']) ? (int)$_POST['player_id'] : null;
 | 
			
		||||
	$article_text = $_POST['article_text'] ?? null;
 | 
			
		||||
	$article_image = $_POST['article_image'] ?? null;
 | 
			
		||||
	$forum_section = $_POST['forum_section'] ?? null;
 | 
			
		||||
	$errors = [];
 | 
			
		||||
 | 
			
		||||
	if($action == 'add') {
 | 
			
		||||
	if($action == 'new') {
 | 
			
		||||
		if(isset($forum_section) && $forum_section != '-1') {
 | 
			
		||||
			$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 = '';
 | 
			
		||||
			$type = $category = $player_id = 0;
 | 
			
		||||
 | 
			
		||||
			success("Added successful.");
 | 
			
		||||
			success('Added successful.');
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	else if($action == 'delete') {
 | 
			
		||||
		News::delete($id, $errors);
 | 
			
		||||
		success("Deleted successful.");
 | 
			
		||||
		if (News::delete($id, $errors)) {
 | 
			
		||||
			success('Deleted successful.');
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	else if($action == 'edit')
 | 
			
		||||
	{
 | 
			
		||||
@@ -81,13 +86,14 @@ if(!empty($action))
 | 
			
		||||
				$action = $p_title = $body = $comments = $article_text = $article_image = '';
 | 
			
		||||
				$type = $category = $player_id = 0;
 | 
			
		||||
 | 
			
		||||
				success("Updated successful.");
 | 
			
		||||
				success('Updated successful.');
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	else if($action == 'hide') {
 | 
			
		||||
		News::toggleHidden($id, $errors, $status);
 | 
			
		||||
		success(($status == 1 ? 'Show' : 'Hide') . " successful.");
 | 
			
		||||
		if (News::toggleHidden($id, $errors, $status)) {
 | 
			
		||||
			success(($status == 1 ? 'Hide' : 'Show') . ' successful.');
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if(!empty($errors))
 | 
			
		||||
@@ -113,22 +119,20 @@ if($action == 'edit' || $action == 'new') {
 | 
			
		||||
	$account_players->orderBy('group_id', POT::ORDER_DESC);
 | 
			
		||||
	$twig->display('admin.news.form.html.twig', array(
 | 
			
		||||
		'action' => $action,
 | 
			
		||||
		'news_link' => getLink(PAGE),
 | 
			
		||||
		'news_link_form' => '?p=news&action=' . ($action == 'edit' ? 'edit' : 'add'),
 | 
			
		||||
		'news_id' => isset($id) ? $id : null,
 | 
			
		||||
		'title' => isset($p_title) ? $p_title : '',
 | 
			
		||||
		'news_id' => $id ?? null,
 | 
			
		||||
		'title' => $p_title ?? '',
 | 
			
		||||
		'body' => isset($body) ? escapeHtml($body) : '',
 | 
			
		||||
		'type' => isset($type) ? $type : null,
 | 
			
		||||
		'type' => $type,
 | 
			
		||||
		'player' => isset($player) && $player->isLoaded() ? $player : null,
 | 
			
		||||
		'player_id' => isset($player_id) ? $player_id : null,
 | 
			
		||||
		'player_id' => $player_id ?? null,
 | 
			
		||||
		'account_players' => $account_players,
 | 
			
		||||
		'category' => isset($category) ? $category : 0,
 | 
			
		||||
		'category' => $category ?? 0,
 | 
			
		||||
		'categories' => $categories,
 | 
			
		||||
		'forum_boards' => getForumBoards(),
 | 
			
		||||
		'forum_section' => isset($forum_section) ? $forum_section : null,
 | 
			
		||||
		'comments' => isset($comments) ? $comments : null,
 | 
			
		||||
		'article_text' => isset($article_text) ? $article_text : null,
 | 
			
		||||
		'article_image' => isset($article_image) ? $article_image : null
 | 
			
		||||
		'forum_section' => $forum_section ?? null,
 | 
			
		||||
		'comments' => $comments ?? null,
 | 
			
		||||
		'article_text' => $article_text ?? null,
 | 
			
		||||
		'article_image' => $article_image ?? null
 | 
			
		||||
	));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -7,46 +7,35 @@
 | 
			
		||||
 * @copyright 2019 MyAAC
 | 
			
		||||
 * @link      https://my-aac.org
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
use MyAAC\Models\Notepad as ModelsNotepad;
 | 
			
		||||
 | 
			
		||||
defined('MYAAC') or die('Direct access not allowed!');
 | 
			
		||||
$title = 'Notepad';
 | 
			
		||||
 | 
			
		||||
$notepad_content = Notepad::get($account_logged->getId());
 | 
			
		||||
csrfProtect();
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @var $account_logged OTS_Account
 | 
			
		||||
 */
 | 
			
		||||
$_content = '';
 | 
			
		||||
$notepad = ModelsNotepad::where('account_id', $account_logged->getId())->first();
 | 
			
		||||
if (isset($_POST['content'])) {
 | 
			
		||||
	$_content = html_entity_decode(stripslashes($_POST['content']));
 | 
			
		||||
	if (!$notepad_content)
 | 
			
		||||
		Notepad::create($account_logged->getId(), $_content);
 | 
			
		||||
	else
 | 
			
		||||
		Notepad::update($account_logged->getId(), $_content);
 | 
			
		||||
	if (!$notepad) {
 | 
			
		||||
		ModelsNotepad::create([
 | 
			
		||||
			'account_id' => $account_logged->getId(),
 | 
			
		||||
			'content' => $_content
 | 
			
		||||
		]);
 | 
			
		||||
	}
 | 
			
		||||
	else {
 | 
			
		||||
		ModelsNotepad::where('account_id', $account_logged->getId())->update(['content' => $_content]);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	echo '<div class="success" style="text-align: center;">Saved at ' . date('H:i') . '</div>';
 | 
			
		||||
	success('Saved at ' . date('H:i'));
 | 
			
		||||
} else {
 | 
			
		||||
	if ($notepad_content !== false)
 | 
			
		||||
		$_content = $notepad_content;
 | 
			
		||||
	if ($notepad)
 | 
			
		||||
		$_content = $notepad->content;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
$twig->display('admin.notepad.html.twig', array('content' => isset($_content) ? $_content : null));
 | 
			
		||||
 | 
			
		||||
class Notepad
 | 
			
		||||
{
 | 
			
		||||
	static public function get($account_id)
 | 
			
		||||
	{
 | 
			
		||||
		global $db;
 | 
			
		||||
		$query = $db->select(TABLE_PREFIX . 'notepad', array('account_id' => $account_id));
 | 
			
		||||
		if ($query !== false)
 | 
			
		||||
			return $query['content'];
 | 
			
		||||
 | 
			
		||||
		return false;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	static public function create($account_id, $content = '')
 | 
			
		||||
	{
 | 
			
		||||
		global $db;
 | 
			
		||||
		$db->insert(TABLE_PREFIX . 'notepad', array('account_id' => $account_id, 'content' => $content));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	static public function update($account_id, $content = '')
 | 
			
		||||
	{
 | 
			
		||||
		global $db;
 | 
			
		||||
		$db->update(TABLE_PREFIX . 'notepad', array('content' => $content), array('account_id' => $account_id));
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
$twig->display('admin.notepad.html.twig', ['content' => $_content]);
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										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');
 | 
			
		||||
@@ -7,8 +7,15 @@
 | 
			
		||||
 * @copyright 2019 MyAAC
 | 
			
		||||
 * @link      https://my-aac.org
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
use MyAAC\Models\Pages as ModelsPages;
 | 
			
		||||
use MyAAC\Admin\Pages;
 | 
			
		||||
 | 
			
		||||
defined('MYAAC') or die('Direct access not allowed!');
 | 
			
		||||
$title = 'Pages';
 | 
			
		||||
$use_datatable = true;
 | 
			
		||||
 | 
			
		||||
csrfProtect();
 | 
			
		||||
 | 
			
		||||
if (!hasFlag(FLAG_CONTENT_PAGES) && !superAdmin()) {
 | 
			
		||||
	echo 'Access denied.';
 | 
			
		||||
@@ -17,50 +24,61 @@ if (!hasFlag(FLAG_CONTENT_PAGES) && !superAdmin()) {
 | 
			
		||||
 | 
			
		||||
header('X-XSS-Protection:0');
 | 
			
		||||
 | 
			
		||||
$name = $p_title = '';
 | 
			
		||||
$name = $p_title = null;
 | 
			
		||||
$groups = new OTS_Groups_List();
 | 
			
		||||
 | 
			
		||||
$php = false;
 | 
			
		||||
$enable_tinymce = true;
 | 
			
		||||
$access = 0;
 | 
			
		||||
 | 
			
		||||
// some constants, used mainly by database (cannot by modified without schema changes)
 | 
			
		||||
const PAGE_TITLE_LIMIT = 30;
 | 
			
		||||
const PAGE_NAME_LIMIT = 30;
 | 
			
		||||
const PAGE_BODY_LIMIT = 65535; // maximum page body length
 | 
			
		||||
 | 
			
		||||
if (!empty($action)) {
 | 
			
		||||
	if ($action == 'delete' || $action == 'edit' || $action == 'hide')
 | 
			
		||||
		$id = $_REQUEST['id'];
 | 
			
		||||
 | 
			
		||||
	if (isset($_REQUEST['name']))
 | 
			
		||||
		$name = $_REQUEST['name'];
 | 
			
		||||
 | 
			
		||||
	if (isset($_REQUEST['title']))
 | 
			
		||||
		$p_title = $_REQUEST['title'];
 | 
			
		||||
 | 
			
		||||
	$php = isset($_REQUEST['php']) && $_REQUEST['php'] == 1;
 | 
			
		||||
	$enable_tinymce = isset($_REQUEST['enable_tinymce']) && $_REQUEST['enable_tinymce'] == 1;
 | 
			
		||||
	if ($php)
 | 
			
		||||
		$body = $_REQUEST['body'];
 | 
			
		||||
	else if (isset($_REQUEST['body'])) {
 | 
			
		||||
		//$body = $_REQUEST['body'];
 | 
			
		||||
		$body = html_entity_decode(stripslashes($_REQUEST['body']));
 | 
			
		||||
	if ($action == 'delete' || $action == 'edit' || $action == 'hide') {
 | 
			
		||||
		$id = $_POST['id'];
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (isset($_REQUEST['access']))
 | 
			
		||||
		$access = $_REQUEST['access'];
 | 
			
		||||
	if (isset($_POST['name'])) {
 | 
			
		||||
		$name = $_POST['name'];
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (isset($_POST['title'])) {
 | 
			
		||||
		$p_title = $_POST['title'];
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	$php = isset($_POST['php']) && $_POST['php'] == 1;
 | 
			
		||||
	$enable_tinymce = isset($_POST['enable_tinymce']) && $_POST['enable_tinymce'] == 1;
 | 
			
		||||
	if ($php) {
 | 
			
		||||
		$body = $_POST['body'];
 | 
			
		||||
	}
 | 
			
		||||
	else if (isset($_POST['body'])) {
 | 
			
		||||
		//$body = $_POST['body'];
 | 
			
		||||
		$body = html_entity_decode(stripslashes($_POST['body']));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (isset($_POST['access'])) {
 | 
			
		||||
		$access = $_POST['access'];
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	$errors = array();
 | 
			
		||||
	$player_id = 1;
 | 
			
		||||
 | 
			
		||||
	if ($action == 'add') {
 | 
			
		||||
		if (Pages::add($name, $p_title, $body, $player_id, $php, $enable_tinymce, $access, $errors)) {
 | 
			
		||||
	if ($action == 'new') {
 | 
			
		||||
		if (isset($p_title) && Pages::add($name, $p_title, $body, $player_id, $php, $enable_tinymce, $access, $errors)) {
 | 
			
		||||
			$name = $p_title = $body = '';
 | 
			
		||||
			$player_id = $access = 0;
 | 
			
		||||
			$php = false;
 | 
			
		||||
			$enable_tinymce = true;
 | 
			
		||||
			success('Added successful.');
 | 
			
		||||
		}
 | 
			
		||||
	} else if ($action == 'delete') {
 | 
			
		||||
		if (Pages::delete($id, $errors))
 | 
			
		||||
			success('Page with id ' . $id . ' has been deleted');
 | 
			
		||||
	} else if ($action == 'edit') {
 | 
			
		||||
		if (isset($id) && !isset($_REQUEST['name'])) {
 | 
			
		||||
		if (isset($id) && !isset($_POST['name'])) {
 | 
			
		||||
			$_page = Pages::get($id);
 | 
			
		||||
			$name = $_page['name'];
 | 
			
		||||
			$p_title = $_page['title'];
 | 
			
		||||
@@ -69,36 +87,36 @@ if (!empty($action)) {
 | 
			
		||||
			$enable_tinymce = $_page['enable_tinymce'] == '1';
 | 
			
		||||
			$access = $_page['access'];
 | 
			
		||||
		} else {
 | 
			
		||||
			Pages::update($id, $name, $p_title, $body, $player_id, $php, $enable_tinymce, $access);
 | 
			
		||||
			$action = $name = $p_title = $body = '';
 | 
			
		||||
			$player_id = 1;
 | 
			
		||||
			$access = 0;
 | 
			
		||||
			$php = false;
 | 
			
		||||
			$enable_tinymce = true;
 | 
			
		||||
			if(Pages::update($id, $name, $p_title, $body, $player_id, $php, $enable_tinymce, $access, $errors)) {
 | 
			
		||||
				$action = $name = $p_title = $body = '';
 | 
			
		||||
				$player_id = 1;
 | 
			
		||||
				$access = 0;
 | 
			
		||||
				$php = false;
 | 
			
		||||
				$enable_tinymce = true;
 | 
			
		||||
				success('Updated successful.');
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	} else if ($action == 'hide') {
 | 
			
		||||
		Pages::toggleHidden($id, $errors);
 | 
			
		||||
		if (Pages::toggleHidden($id, $errors, $status)) {
 | 
			
		||||
			success(($status == 0 ? 'Show' : 'Hide') . ' successful.');
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (!empty($errors))
 | 
			
		||||
		error(implode(", ", $errors));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
$query =
 | 
			
		||||
	$db->query('SELECT * FROM ' . $db->tableName(TABLE_PREFIX . 'pages'));
 | 
			
		||||
$pages = ModelsPages::all()->map(function ($e) {
 | 
			
		||||
	return [
 | 
			
		||||
		'link' => getFullLink($e->name, $e->name, true),
 | 
			
		||||
		'title' => substr($e->title, 0, 20),
 | 
			
		||||
		'php' => $e->php == '1',
 | 
			
		||||
		'id' => $e->id,
 | 
			
		||||
		'hidden' => $e->hidden
 | 
			
		||||
	];
 | 
			
		||||
})->toArray();
 | 
			
		||||
 | 
			
		||||
$pages = array();
 | 
			
		||||
foreach ($query as $_page) {
 | 
			
		||||
	$pages[] = array(
 | 
			
		||||
		'link' => getFullLink($_page['name'], $_page['name'], true),
 | 
			
		||||
		'title' => substr($_page['title'], 0, 20),
 | 
			
		||||
		'php' => $_page['php'] == '1',
 | 
			
		||||
		'id' => $_page['id'],
 | 
			
		||||
		'hidden' => $_page['hidden']
 | 
			
		||||
	);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
$twig->display('admin.pages.form.html.twig', array(
 | 
			
		||||
$twig->display('admin.pages.form.html.twig', [
 | 
			
		||||
	'action' => $action,
 | 
			
		||||
	'id' => $action == 'edit' ? $id : null,
 | 
			
		||||
	'name' => $name,
 | 
			
		||||
@@ -108,91 +126,8 @@ $twig->display('admin.pages.form.html.twig', array(
 | 
			
		||||
	'body' => isset($body) ? escapeHtml($body) : '',
 | 
			
		||||
	'groups' => $groups->getGroups(),
 | 
			
		||||
	'access' => $access
 | 
			
		||||
));
 | 
			
		||||
]);
 | 
			
		||||
 | 
			
		||||
$twig->display('admin.pages.html.twig', array(
 | 
			
		||||
$twig->display('admin.pages.html.twig', [
 | 
			
		||||
	'pages' => $pages
 | 
			
		||||
));
 | 
			
		||||
 | 
			
		||||
class Pages
 | 
			
		||||
{
 | 
			
		||||
	static public function get($id)
 | 
			
		||||
	{
 | 
			
		||||
		global $db;
 | 
			
		||||
		$query = $db->select(TABLE_PREFIX . 'pages', array('id' => $id));
 | 
			
		||||
		if ($query !== false)
 | 
			
		||||
			return $query;
 | 
			
		||||
 | 
			
		||||
		return false;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	static public function add($name, $title, $body, $player_id, $php, $enable_tinymce, $access, &$errors)
 | 
			
		||||
	{
 | 
			
		||||
		global $db;
 | 
			
		||||
		if (isset($name[0]) && isset($title[0]) && isset($body[0]) && $player_id != 0) {
 | 
			
		||||
			$query = $db->select(TABLE_PREFIX . 'pages', array('name' => $name));
 | 
			
		||||
			if ($query === false)
 | 
			
		||||
				$db->insert(TABLE_PREFIX . 'pages',
 | 
			
		||||
					array(
 | 
			
		||||
						'name' => $name,
 | 
			
		||||
						'title' => $title,
 | 
			
		||||
						'body' => $body,
 | 
			
		||||
						'player_id' => $player_id,
 | 
			
		||||
						'php' => $php ? '1' : '0',
 | 
			
		||||
						'enable_tinymce' => $enable_tinymce ? '1' : '0',
 | 
			
		||||
						'access' => $access
 | 
			
		||||
					)
 | 
			
		||||
				);
 | 
			
		||||
			else
 | 
			
		||||
				$errors[] = 'Page with this link already exists.';
 | 
			
		||||
		} else
 | 
			
		||||
			$errors[] = 'Please fill all inputs.';
 | 
			
		||||
 | 
			
		||||
		return !count($errors);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	static public function update($id, $name, $title, $body, $player_id, $php, $enable_tinymce, $access)
 | 
			
		||||
	{
 | 
			
		||||
		global $db;
 | 
			
		||||
		$db->update(TABLE_PREFIX . 'pages',
 | 
			
		||||
			array(
 | 
			
		||||
				'name' => $name,
 | 
			
		||||
				'title' => $title,
 | 
			
		||||
				'body' => $body,
 | 
			
		||||
				'player_id' => $player_id,
 | 
			
		||||
				'php' => $php ? '1' : '0',
 | 
			
		||||
				'enable_tinymce' => $enable_tinymce ? '1' : '0',
 | 
			
		||||
				'access' => $access
 | 
			
		||||
			),
 | 
			
		||||
			array('id' => $id));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	static public function delete($id, &$errors)
 | 
			
		||||
	{
 | 
			
		||||
		global $db;
 | 
			
		||||
		if (isset($id)) {
 | 
			
		||||
			if ($db->select(TABLE_PREFIX . 'pages', array('id' => $id)) !== false)
 | 
			
		||||
				$db->delete(TABLE_PREFIX . 'pages', array('id' => $id));
 | 
			
		||||
			else
 | 
			
		||||
				$errors[] = 'Page with id ' . $id . ' does not exists.';
 | 
			
		||||
		} else
 | 
			
		||||
			$errors[] = 'id not set';
 | 
			
		||||
 | 
			
		||||
		return !count($errors);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	static public function toggleHidden($id, &$errors)
 | 
			
		||||
	{
 | 
			
		||||
		global $db;
 | 
			
		||||
		if (isset($id)) {
 | 
			
		||||
			$query = $db->select(TABLE_PREFIX . 'pages', array('id' => $id));
 | 
			
		||||
			if ($query !== false)
 | 
			
		||||
				$db->update(TABLE_PREFIX . 'pages', array('hidden' => ($query['hidden'] == 1 ? 0 : 1)), array('id' => $id));
 | 
			
		||||
			else
 | 
			
		||||
				$errors[] = 'Page with id ' . $id . ' does not exists.';
 | 
			
		||||
		} else
 | 
			
		||||
			$errors[] = 'id not set';
 | 
			
		||||
 | 
			
		||||
		return !count($errors);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
]);
 | 
			
		||||
 
 | 
			
		||||
@@ -16,4 +16,4 @@ if (!function_exists('phpinfo')) { ?>
 | 
			
		||||
	<?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>
 | 
			
		||||
 
 | 
			
		||||
@@ -10,98 +10,125 @@
 | 
			
		||||
defined('MYAAC') or die('Direct access not allowed!');
 | 
			
		||||
$title = 'Plugin manager';
 | 
			
		||||
 | 
			
		||||
$twig->display('admin.plugins.form.html.twig');
 | 
			
		||||
csrfProtect();
 | 
			
		||||
 | 
			
		||||
if (isset($_REQUEST['uninstall'])) {
 | 
			
		||||
	$uninstall = $_REQUEST['uninstall'];
 | 
			
		||||
$use_datatable = true;
 | 
			
		||||
 | 
			
		||||
	if (Plugins::uninstall($uninstall)) {
 | 
			
		||||
		success('Successfully uninstalled plugin ' . $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"];
 | 
			
		||||
require_once LIBS . 'plugins.php';
 | 
			
		||||
 | 
			
		||||
	$name = explode(".", $filename);
 | 
			
		||||
	$accepted_types = array('application/zip', 'application/x-zip-compressed', 'multipart/x-zip', 'application/x-compressed', 'application/octet-stream', 'application/zip-compressed');
 | 
			
		||||
if (!getBoolean(setting('core.admin_plugins_manage_enable'))) {
 | 
			
		||||
	warning('Plugin installation and management is disabled in Settings.<br/>If you wish to enable, go to Settings and enable <strong>Enable Plugins Manage</strong>.');
 | 
			
		||||
}
 | 
			
		||||
else {
 | 
			
		||||
	$twig->display('admin.plugins.form.html.twig');
 | 
			
		||||
 | 
			
		||||
	if (isset($file['error'])) {
 | 
			
		||||
		$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;
 | 
			
		||||
	if (isset($_POST['uninstall'])) {
 | 
			
		||||
		$uninstall = $_POST['uninstall'];
 | 
			
		||||
 | 
			
		||||
		if (Plugins::uninstall($uninstall)) {
 | 
			
		||||
			success('Successfully uninstalled plugin ' . $uninstall);
 | 
			
		||||
		} else {
 | 
			
		||||
			error('Error while uninstalling plugin ' . $uninstall . ': ' . Plugins::getError());
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	} else if (isset($_POST['enable'])) {
 | 
			
		||||
		$enable = $_POST['enable'];
 | 
			
		||||
		if (Plugins::enable($enable)) {
 | 
			
		||||
			success('Successfully enabled plugin ' . $enable);
 | 
			
		||||
		} else {
 | 
			
		||||
			error('Error while enabling plugin ' . $enable . ': ' . Plugins::getError());
 | 
			
		||||
		}
 | 
			
		||||
	} else if (isset($_POST['disable'])) {
 | 
			
		||||
		$disable = $_POST['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) {
 | 
			
		||||
		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';
 | 
			
		||||
		$name = explode('.', $filename);
 | 
			
		||||
		$accepted_types = array('application/zip', 'application/x-zip-compressed', 'multipart/x-zip', 'application/x-compressed', 'application/octet-stream', 'application/zip-compressed');
 | 
			
		||||
 | 
			
		||||
				if (move_uploaded_file($tmp_name, $targetzip)) { // move uploaded file
 | 
			
		||||
					if (Plugins::install($targetzip)) {
 | 
			
		||||
						foreach (Plugins::getWarnings() as $warning) {
 | 
			
		||||
							warning($warning);
 | 
			
		||||
		if (isset($file['error'])) {
 | 
			
		||||
			$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;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		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();
 | 
			
		||||
						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.');
 | 
			
		||||
					}
 | 
			
		||||
 | 
			
		||||
					unlink($targetzip); // delete the Zipped file
 | 
			
		||||
				} else
 | 
			
		||||
					error('There was a problem with the upload. Please try again.');
 | 
			
		||||
						unlink($targetzip); // delete the Zipped file
 | 
			
		||||
					} else
 | 
			
		||||
						error('There was a problem with the upload. Please try again.');
 | 
			
		||||
				} else {
 | 
			
		||||
					error('The file you are trying to upload is not a .zip file. Please try again.');
 | 
			
		||||
				}
 | 
			
		||||
			} 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();
 | 
			
		||||
foreach (get_plugins() as $plugin) {
 | 
			
		||||
foreach (get_plugins(true) as $plugin) {
 | 
			
		||||
	$string = file_get_contents(BASE . 'plugins/' . $plugin . '.json');
 | 
			
		||||
	$string = Plugins::removeComments($string);
 | 
			
		||||
	$plugin_info = json_decode($string, true);
 | 
			
		||||
 | 
			
		||||
	if ($plugin_info == false) {
 | 
			
		||||
	if (!$plugin_info) {
 | 
			
		||||
		warning('Cannot load plugin info ' . $plugin . '.json');
 | 
			
		||||
	} else {
 | 
			
		||||
		$disabled = (str_contains($plugin, 'disabled.'));
 | 
			
		||||
		$pluginOriginal = ($disabled ? str_replace('disabled.', '', $plugin) : $plugin);
 | 
			
		||||
		$plugins[] = array(
 | 
			
		||||
			'name' => isset($plugin_info['name']) ? $plugin_info['name'] : '',
 | 
			
		||||
			'description' => isset($plugin_info['description']) ? $plugin_info['description'] : '',
 | 
			
		||||
			'version' => isset($plugin_info['version']) ? $plugin_info['version'] : '',
 | 
			
		||||
			'author' => isset($plugin_info['author']) ? $plugin_info['author'] : '',
 | 
			
		||||
			'contact' => isset($plugin_info['contact']) ? $plugin_info['contact'] : '',
 | 
			
		||||
			'file' => $plugin,
 | 
			
		||||
			'name' => $plugin_info['name'] ?? '',
 | 
			
		||||
			'description' => $plugin_info['description'] ?? '',
 | 
			
		||||
			'version' => $plugin_info['version'] ?? '',
 | 
			
		||||
			'author' => $plugin_info['author'] ?? '',
 | 
			
		||||
			'contact' => $plugin_info['contact'] ?? '',
 | 
			
		||||
			'file' => $pluginOriginal,
 | 
			
		||||
			'enabled' => !$disabled,
 | 
			
		||||
			'uninstall' => isset($plugin_info['uninstall'])
 | 
			
		||||
		);
 | 
			
		||||
	}
 | 
			
		||||
 
 | 
			
		||||
@@ -4,35 +4,36 @@
 | 
			
		||||
 *
 | 
			
		||||
 * @package   MyAAC
 | 
			
		||||
 * @author    Lee
 | 
			
		||||
 * @copyright 2019 MyAAC
 | 
			
		||||
 * @copyright 2020 MyAAC
 | 
			
		||||
 * @link      https://my-aac.org
 | 
			
		||||
 */
 | 
			
		||||
defined('MYAAC') or die('Direct access not allowed!');
 | 
			
		||||
$title = 'Report Viewer';
 | 
			
		||||
$use_datatable = true;
 | 
			
		||||
 | 
			
		||||
$files = array();
 | 
			
		||||
$server_path_reports = $config['data_path'] . 'reports/';
 | 
			
		||||
 | 
			
		||||
if (file_exists($server_path_reports)) {
 | 
			
		||||
    foreach (scandir($server_path_reports, SCANDIR_SORT_ASCENDING) as $f) {
 | 
			
		||||
        if ($f[0] === '.') {
 | 
			
		||||
	        continue;
 | 
			
		||||
        }
 | 
			
		||||
	foreach (scandir($server_path_reports, SCANDIR_SORT_ASCENDING) as $f) {
 | 
			
		||||
		if ($f[0] === '.') {
 | 
			
		||||
			continue;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
        if (is_dir($server_path_reports . $f)) {
 | 
			
		||||
            foreach (scandir($server_path_reports . $f, SCANDIR_SORT_ASCENDING) as $f2) {
 | 
			
		||||
                if ($f2[0] === '.') {
 | 
			
		||||
	                continue;
 | 
			
		||||
                }
 | 
			
		||||
		if (is_dir($server_path_reports . $f)) {
 | 
			
		||||
			foreach (scandir($server_path_reports . $f, SCANDIR_SORT_ASCENDING) as $f2) {
 | 
			
		||||
				if ($f2[0] === '.') {
 | 
			
		||||
					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) {
 | 
			
		||||
@@ -42,16 +43,13 @@ foreach ($files as &$f) {
 | 
			
		||||
 | 
			
		||||
unset($f);
 | 
			
		||||
 | 
			
		||||
$twig->display('admin.reports.html.twig', array('files' => $files));
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
$file = isset($_GET['file']) ? $_GET['file'] : NULL;
 | 
			
		||||
if (!empty($file)) {
 | 
			
		||||
	if (!preg_match('/[^A-z0-9\' _\/\-\.]/', $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 {
 | 
			
		||||
			echo 'Specified file does not exist.';
 | 
			
		||||
		}
 | 
			
		||||
@@ -59,3 +57,5 @@ if (!empty($file)) {
 | 
			
		||||
		echo 'Invalid file name specified.';
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
$twig->display('admin.reports.html.twig', array('files' => $files));
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										56
									
								
								admin/pages/settings.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,56 @@
 | 
			
		||||
<?php
 | 
			
		||||
/**
 | 
			
		||||
 * Menus
 | 
			
		||||
 *
 | 
			
		||||
 * @package   MyAAC
 | 
			
		||||
 * @author    Slawkens <slawkens@gmail.com>
 | 
			
		||||
 * @copyright 2019 MyAAC
 | 
			
		||||
 * @link      https://my-aac.org
 | 
			
		||||
 */
 | 
			
		||||
defined('MYAAC') or die('Direct access not allowed!');
 | 
			
		||||
$title = 'Settings';
 | 
			
		||||
 | 
			
		||||
require_once SYSTEM . 'clients.conf.php';
 | 
			
		||||
if (empty($_GET['plugin'])) {
 | 
			
		||||
	error('Please select plugin from left Panel.');
 | 
			
		||||
	return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
$plugin = $_GET['plugin'];
 | 
			
		||||
 | 
			
		||||
if($plugin != 'core') {
 | 
			
		||||
	$pluginSettings = Plugins::getPluginSettings($plugin);
 | 
			
		||||
	if (!$pluginSettings) {
 | 
			
		||||
		error('This plugin does not exist or does not have settings defined.');
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	$settingsFilePath = BASE . $pluginSettings;
 | 
			
		||||
}
 | 
			
		||||
else {
 | 
			
		||||
	$settingsFilePath = SYSTEM . 'settings.php';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
if (!file_exists($settingsFilePath)) {
 | 
			
		||||
	error("Plugin $plugin does not exist or does not have settings defined.");
 | 
			
		||||
	return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
$settingsFile = require $settingsFilePath;
 | 
			
		||||
if (!is_array($settingsFile)) {
 | 
			
		||||
	error("Cannot load settings file for plugin $plugin");
 | 
			
		||||
	return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
$settingsKeyName = ($plugin == 'core' ? $plugin : $settingsFile['key']);
 | 
			
		||||
 | 
			
		||||
$title = ($plugin == 'core' ? 'Settings' : 'Plugin Settings - ' . $plugin);
 | 
			
		||||
 | 
			
		||||
$settingsParsed = Settings::display($settingsKeyName, $settingsFile['settings']);
 | 
			
		||||
 | 
			
		||||
$twig->display('admin.settings.html.twig', [
 | 
			
		||||
	'settingsParsed' => $settingsParsed['content'],
 | 
			
		||||
	'settings' => $settingsFile['settings'],
 | 
			
		||||
	'script' => $settingsParsed['script'],
 | 
			
		||||
	'settingsKeyName' => $settingsKeyName,
 | 
			
		||||
]);
 | 
			
		||||
@@ -7,26 +7,25 @@
 | 
			
		||||
 * @copyright 2019 MyAAC
 | 
			
		||||
 * @link      https://my-aac.org
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
use MyAAC\Models\Account;
 | 
			
		||||
use MyAAC\Models\Guild;
 | 
			
		||||
use MyAAC\Models\House;
 | 
			
		||||
use MyAAC\Models\Player;
 | 
			
		||||
 | 
			
		||||
defined('MYAAC') or die('Direct access not allowed!');
 | 
			
		||||
$title = 'Statistics';
 | 
			
		||||
 | 
			
		||||
$query = $db->query('SELECT count(*) as `how_much` FROM `accounts`;');
 | 
			
		||||
$query = $query->fetch();
 | 
			
		||||
$total_accounts = $query['how_much'];
 | 
			
		||||
$total_accounts = Account::count();
 | 
			
		||||
$total_players = Player::count();
 | 
			
		||||
$total_guilds = Guild::count();
 | 
			
		||||
$total_houses = House::count();
 | 
			
		||||
 | 
			
		||||
$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'];
 | 
			
		||||
 | 
			
		||||
$points = $db->query('SELECT `premium_points`, `' . (USE_ACCOUNT_NAME ? 'name' : 'id') . '` as `name` FROM `accounts` ORDER BY `premium_points` DESC LIMIT 10;');
 | 
			
		||||
$points = Account::select(['premium_points', (USE_ACCOUNT_NAME ? 'name' : 'id')])
 | 
			
		||||
	->orderByDesc('premium_points')
 | 
			
		||||
	->limit(10)
 | 
			
		||||
	->get()
 | 
			
		||||
	->toArray();
 | 
			
		||||
 | 
			
		||||
$twig->display('admin.statistics.html.twig', array(
 | 
			
		||||
	'total_accounts' => $total_accounts,
 | 
			
		||||
 
 | 
			
		||||
@@ -10,18 +10,24 @@
 | 
			
		||||
defined('MYAAC') or die('Direct access not allowed!');
 | 
			
		||||
$title = 'Tools';
 | 
			
		||||
 | 
			
		||||
$tool = $_GET['tool'];
 | 
			
		||||
if (!isset($tool)) {
 | 
			
		||||
if (!isset($_GET['tool'])) {
 | 
			
		||||
	echo 'Tool not set.';
 | 
			
		||||
	return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
$tool = $_GET['tool'];
 | 
			
		||||
if (preg_match("/[^A-z0-9_\-]/", $tool)) {
 | 
			
		||||
	echo 'Invalid tool.';
 | 
			
		||||
	return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
$file = BASE . 'admin/pages/tools/' . $tool . '.php';
 | 
			
		||||
if (!@file_exists($file))
 | 
			
		||||
$file = ADMIN . 'tools/' . $tool . '.php';
 | 
			
		||||
 | 
			
		||||
if (@file_exists($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);
 | 
			
		||||
if ($version_compare == 0) {
 | 
			
		||||
	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) {
 | 
			
		||||
	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 {
 | 
			
		||||
	warning('You\'re using outdated version.<br/>
 | 
			
		||||
		Your version: <b>' . MYAAC_VERSION . '</b><br/>
 | 
			
		||||
 
 | 
			
		||||
@@ -8,9 +8,15 @@
 | 
			
		||||
 * @link      https://my-aac.org
 | 
			
		||||
 */
 | 
			
		||||
defined('MYAAC') or die('Direct access not allowed!');
 | 
			
		||||
$title = 'Visitors';
 | 
			
		||||
 | 
			
		||||
if (!$config['visitors_counter']): ?>
 | 
			
		||||
use DeviceDetector\DeviceDetector;
 | 
			
		||||
use DeviceDetector\Parser\Client\Browser;
 | 
			
		||||
use DeviceDetector\Parser\OperatingSystem;
 | 
			
		||||
 | 
			
		||||
$title = 'Visitors';
 | 
			
		||||
$use_datatable = true;
 | 
			
		||||
 | 
			
		||||
if (!setting('core.visitors_counter')): ?>
 | 
			
		||||
	Visitors counter is disabled.<br/>
 | 
			
		||||
	You can enable it by editing this configurable in <b>config.local.php</b> file:<br/>
 | 
			
		||||
	<p style="margin-left: 3em;"><b>$config['visitors_counter'] = true;</b></p>
 | 
			
		||||
@@ -19,18 +25,42 @@ if (!$config['visitors_counter']): ?>
 | 
			
		||||
endif;
 | 
			
		||||
 | 
			
		||||
require SYSTEM . 'libs/visitors.php';
 | 
			
		||||
$visitors = new Visitors($config['visitors_counter_ttl']);
 | 
			
		||||
$visitors = new Visitors(setting('core.visitors_counter_ttl'));
 | 
			
		||||
 | 
			
		||||
function compare($a, $b)
 | 
			
		||||
{
 | 
			
		||||
function compare($a, $b): int {
 | 
			
		||||
	return $a['lastvisit'] > $b['lastvisit'] ? -1 : 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
$tmp = $visitors->getVisitors();
 | 
			
		||||
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(
 | 
			
		||||
	'config_visitors_counter_ttl' => $config['visitors_counter_ttl'],
 | 
			
		||||
	'config_visitors_counter_ttl' => setting('core.visitors_counter_ttl'),
 | 
			
		||||
	'visitors' => $tmp
 | 
			
		||||
));
 | 
			
		||||
?>
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										69
									
								
								admin/template/menus.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,69 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
return [
 | 
			
		||||
	['name' => 'Dashboard', 'icon' => 'tachometer-alt', 'order' => 10, 'link' => 'dashboard'],
 | 
			
		||||
	['name' => 'Settings', 'icon' => 'edit', 'order' => 19, 'link' =>
 | 
			
		||||
		require ADMIN . 'includes/settings_menus.php'
 | 
			
		||||
	],
 | 
			
		||||
	['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' => !setting('core.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 {
 | 
			
		||||
	width: 100%;
 | 
			
		||||
.menu-text-li {color: #4b646f; background: #1a2226;}
 | 
			
		||||
.menu-text {
 | 
			
		||||
	display: block;
 | 
			
		||||
	padding: .5rem 1rem;
 | 
			
		||||
	white-space: nowrap;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.slider {
 | 
			
		||||
	-webkit-appearance: 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;
 | 
			
		||||
.sidebar-mini.sidebar-collapse .menu-text {
 | 
			
		||||
	display: none;
 | 
			
		||||
}
 | 
			
		||||
@@ -1,229 +1,203 @@
 | 
			
		||||
<?php defined('MYAAC') or die('Direct access not allowed!'); ?>
 | 
			
		||||
<!DOCTYPE html>
 | 
			
		||||
<html>
 | 
			
		||||
<!doctype html>
 | 
			
		||||
<html lang="en">
 | 
			
		||||
<head>
 | 
			
		||||
	<?php echo template_header(true);
 | 
			
		||||
	$title_full =  (isset($title) ? $title . $config['title_separator'] : '') . $config['lua']['serverName'];
 | 
			
		||||
	?>
 | 
			
		||||
 | 
			
		||||
	<title><?php echo $title_full ?></title>
 | 
			
		||||
	<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">
 | 
			
		||||
	<?php $hooks->trigger(HOOK_ADMIN_HEAD_START); ?>
 | 
			
		||||
	<?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">
 | 
			
		||||
	<link rel="stylesheet" href="<?php echo BASE_URL; ?>tools/css/adminlte.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">
 | 
			
		||||
	<link rel="stylesheet" href="<?php echo BASE_URL; ?>tools/css/jquery.dataTables.min.css">
 | 
			
		||||
	<?php if (isset($use_datatable)) { ?>
 | 
			
		||||
	<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"/>
 | 
			
		||||
	<!--[if lt IE 9]>
 | 
			
		||||
	<script src="https://oss.maxcdn.com/html5shiv/3.7.3/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/html5shiv.min.js"></script>
 | 
			
		||||
	<script src="<?php echo BASE_URL; ?>tools/js/respond.min.js"></script>
 | 
			
		||||
	<![endif]-->
 | 
			
		||||
	<link rel="stylesheet"
 | 
			
		||||
		  href="https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,600,700,300italic,400italic,600italic">
 | 
			
		||||
	<link rel="stylesheet" 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>
 | 
			
		||||
<body class="hold-transition skin-blue sidebar-mini">
 | 
			
		||||
<div class="wrapper">
 | 
			
		||||
	<?php
 | 
			
		||||
	if ($logged && admin()) {
 | 
			
		||||
	?>
 | 
			
		||||
	<header class="main-header">
 | 
			
		||||
		<a href="." class="logo">
 | 
			
		||||
			<span class="logo-mini"><b>M</b>A</span>
 | 
			
		||||
			<span class="logo-lg"><b>My</b>AAC</span>
 | 
			
		||||
		</a>
 | 
			
		||||
 | 
			
		||||
		<nav class="navbar navbar-static-top" role="navigation">
 | 
			
		||||
			<a href="#" class="sidebar-toggle" data-toggle="push-menu" role="button">
 | 
			
		||||
				<span class="sr-only">Toggle navigation</span>
 | 
			
		||||
			</a>
 | 
			
		||||
			<div class="navbar-custom-menu">
 | 
			
		||||
				<ul class="nav navbar-nav">
 | 
			
		||||
					<li>
 | 
			
		||||
						<a href="#" data-toggle="control-sidebar"><i class="fa fa-gears"></i></a>
 | 
			
		||||
					</li>
 | 
			
		||||
				</ul>
 | 
			
		||||
			</div>
 | 
			
		||||
<body class="sidebar-mini ">
 | 
			
		||||
<?php $hooks->trigger(HOOK_ADMIN_BODY_START); ?>
 | 
			
		||||
<?php if ($logged && admin()) { ?>
 | 
			
		||||
	<div class="wrapper">
 | 
			
		||||
		<nav class="main-header navbar navbar-expand navbar-white navbar-light">
 | 
			
		||||
			<ul class="navbar-nav">
 | 
			
		||||
				<li class="nav-item">
 | 
			
		||||
					<a class="nav-link" data-widget="pushmenu" href="#"><i class="fas fa-bars"></i></a>
 | 
			
		||||
				</li>
 | 
			
		||||
				<li class="nav-item d-none d-sm-inline-block">
 | 
			
		||||
					<a href="<?php echo ADMIN_URL; ?>" class="nav-link">Home</a>
 | 
			
		||||
				</li>
 | 
			
		||||
			</ul>
 | 
			
		||||
			<ul class="navbar-nav ml-auto">
 | 
			
		||||
				<li class="nav-item">
 | 
			
		||||
					<a class="nav-link" data-widget="control-sidebar" data-slide="true" href="#"><i class="fas fa-th-large"></i></a>
 | 
			
		||||
				</li>
 | 
			
		||||
			</ul>
 | 
			
		||||
		</nav>
 | 
			
		||||
	</header>
 | 
			
		||||
	<aside class="main-sidebar">
 | 
			
		||||
		<section class="sidebar">
 | 
			
		||||
			<ul class="sidebar-menu" data-widget="tree">
 | 
			
		||||
				<li class="header">MyAAC</li>
 | 
			
		||||
		<aside class="main-sidebar sidebar-dark-info elevation-4">
 | 
			
		||||
			<a href="<?php echo ADMIN_URL; ?>" class="brand-link navbar-info">
 | 
			
		||||
				<img src="<?php echo ADMIN_URL; ?>images/logo.png" class="brand-image img-circle elevation-3" style="opacity: .8">
 | 
			
		||||
				<span class="brand-text"><b>My</b>AAC</span>
 | 
			
		||||
			</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
 | 
			
		||||
				$icons_a = array(
 | 
			
		||||
                    'dashboard','newspaper-o', 'envelope',
 | 
			
		||||
                    'book', 'list',
 | 
			
		||||
                    'plug', 'user',
 | 
			
		||||
                    'edit', 'gavel',
 | 
			
		||||
                    'wrench', 'edit', 'book', 'book',
 | 
			
		||||
                );
 | 
			
		||||
 | 
			
		||||
				$menus = array(
 | 
			
		||||
					'Dashboard' => 'dashboard',
 | 
			
		||||
					'News' => 'news',
 | 
			
		||||
					'Mailer' => 'mailer',
 | 
			
		||||
					'Pages' => 'pages',
 | 
			
		||||
					'Menus' => 'menus',
 | 
			
		||||
					'Plugins' => 'plugins',
 | 
			
		||||
					'Visitors' => 'visitors',
 | 
			
		||||
					'Editor' => array(
 | 
			
		||||
						'Accounts' => 'accounts',
 | 
			
		||||
						'Players' => 'players',
 | 
			
		||||
					),
 | 
			
		||||
					'Items' => 'items',
 | 
			
		||||
					'Tools' => array(
 | 
			
		||||
						'Notepad' => 'notepad',
 | 
			
		||||
						'phpinfo' => 'phpinfo',
 | 
			
		||||
					),
 | 
			
		||||
					'Logs' => array(
 | 
			
		||||
						'Logs' => 'logs',
 | 
			
		||||
						'Reports' => 'reports',
 | 
			
		||||
					),
 | 
			
		||||
				);
 | 
			
		||||
 | 
			
		||||
				$i = 0;
 | 
			
		||||
				foreach ($menus as $_name => $_page) {
 | 
			
		||||
					$has_child = is_array($_page);
 | 
			
		||||
					if (!$has_child) {
 | 
			
		||||
						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;
 | 
			
		||||
						foreach ($menus as $category => $menu) {
 | 
			
		||||
							if (isset($menu['disabled']) && $menu['disabled']) {
 | 
			
		||||
								continue;
 | 
			
		||||
							}
 | 
			
		||||
 | 
			
		||||
							$has_child = is_array($menu['link']);
 | 
			
		||||
							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'] ?>">
 | 
			
		||||
										<i class="nav-icon fas fa-<?php echo($menu['icon'] ?? 'link') ?>"></i>
 | 
			
		||||
										<p><?php echo $menu['name'] ?></p>
 | 
			
		||||
									</a>
 | 
			
		||||
								</li>
 | 
			
		||||
								<?php
 | 
			
		||||
							} else if ($has_child) {
 | 
			
		||||
								$used_menu = null;
 | 
			
		||||
								$nav_construct = '';
 | 
			
		||||
								foreach ($menu['link'] as $sub_category => $sub_menu) {
 | 
			
		||||
									$nav_construct .= '<li class="nav-item"><a href="?p=' . $sub_menu['link'] . '" class="nav-link';
 | 
			
		||||
									if ($_SERVER['QUERY_STRING'] == 'p=' . $sub_menu['link']) {
 | 
			
		||||
										$nav_construct .= ' active';
 | 
			
		||||
										$used_menu = true;
 | 
			
		||||
									}
 | 
			
		||||
									$nav_construct .= '"><i class="fas fa-' . ($sub_menu['icon'] ?? 'circle') . ' nav-icon"></i><p>' . $sub_menu['name'] . '</p></a></li>';
 | 
			
		||||
								}
 | 
			
		||||
								?>
 | 
			
		||||
								<li class="nav-item has-treeview<?php echo($used_menu ? ' menu-open' : '') ?>">
 | 
			
		||||
									<a href="#" class="nav-link<?php echo($used_menu ? ' active' : '') ?>">
 | 
			
		||||
										<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">
 | 
			
		||||
										<?php echo $nav_construct; ?>
 | 
			
		||||
									</ul>
 | 
			
		||||
								</li>
 | 
			
		||||
								<?php
 | 
			
		||||
							}
 | 
			
		||||
							$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' : '') . '">
 | 
			
		||||
                                      <a href="#"><i class="fa fa-' . (isset($icons_a[$i]) ? $icons_a[$i] : 'link') . '"></i> <span>' . $_name . '</span>
 | 
			
		||||
						              <span class="pull-right-container"><i class="fa fa-angle-left pull-right"></i></span></a>
 | 
			
		||||
						              <ul class="treeview-menu" style="' . (($used_menu) ? '  display: block' : ' display: none') . '">';
 | 
			
		||||
						echo $nav_construct;
 | 
			
		||||
						echo '</ul>
 | 
			
		||||
                                </li>';
 | 
			
		||||
					}
 | 
			
		||||
					$i++;
 | 
			
		||||
				}
 | 
			
		||||
						$query = $db->query('SELECT `name`, `page`, `flags` FROM `' . TABLE_PREFIX . 'admin_menu` ORDER BY `ordering`');
 | 
			
		||||
						$menu_db = $query->fetchAll();
 | 
			
		||||
						foreach ($menu_db as $item) {
 | 
			
		||||
							if ($item['flags'] == 0 || hasFlag($item['flags'])) { ?>
 | 
			
		||||
								<li class="nav-item">
 | 
			
		||||
									<a class="nav-link<?php echo($page == $item['page'] ? ' active' : '') ?>" href="?p=<?php echo $item['page'] ?>">
 | 
			
		||||
										<i class="nav-icon fas fa-link"></i>
 | 
			
		||||
										<p><?php echo $item['name'] ?></p>
 | 
			
		||||
									</a>
 | 
			
		||||
								</li>
 | 
			
		||||
								<?php
 | 
			
		||||
							}
 | 
			
		||||
						}
 | 
			
		||||
						?>
 | 
			
		||||
					</ul>
 | 
			
		||||
				</nav>
 | 
			
		||||
			</div>
 | 
			
		||||
		</aside>
 | 
			
		||||
 | 
			
		||||
				$query = $db->query('SELECT `name`, `page`, `flags` FROM `' . TABLE_PREFIX . 'admin_menu` ORDER BY `ordering`');
 | 
			
		||||
				$menu_db = $query->fetchAll();
 | 
			
		||||
				foreach ($menu_db as $item) {
 | 
			
		||||
					if ($item['flags'] == 0 || hasFlag($item['flags'])) {
 | 
			
		||||
						echo '<li ';
 | 
			
		||||
						if ($page == $item['page']) echo ' class="active"';
 | 
			
		||||
						echo ">";
 | 
			
		||||
						echo '<a href="?p=' . $item['page'] . '"><i class="fa fa-link"></i> <span>' . $item['name'] . '</span></a></li>';
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
				?>
 | 
			
		||||
			</ul>
 | 
			
		||||
		</section>
 | 
			
		||||
	</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 class="content-wrapper" style="min-height: 823px;">
 | 
			
		||||
			<div class="content-header">
 | 
			
		||||
				<div class="container-fluid">
 | 
			
		||||
					<div class="row mb-2">
 | 
			
		||||
						<div class="col-sm-6">
 | 
			
		||||
							<h3 class="m-0 text-dark"><?php echo(isset($title) ? $title : ''); ?><small> - Admin Panel</small></h3>
 | 
			
		||||
						</div>
 | 
			
		||||
						<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>
 | 
			
		||||
						</div>
 | 
			
		||||
					</div>
 | 
			
		||||
				</div>
 | 
			
		||||
			</h1>
 | 
			
		||||
		</section>
 | 
			
		||||
		<section class="content">
 | 
			
		||||
			<?php echo $content; ?>
 | 
			
		||||
		</section>
 | 
			
		||||
			</div>
 | 
			
		||||
			<div class="content">
 | 
			
		||||
				<div class="container-fluid">
 | 
			
		||||
					<?php echo $content; ?>
 | 
			
		||||
				</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>
 | 
			
		||||
 | 
			
		||||
	<footer class="main-footer">
 | 
			
		||||
 | 
			
		||||
		<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()) {
 | 
			
		||||
<?php } else if (!$logged && !admin()) {
 | 
			
		||||
	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/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>
 | 
			
		||||
<?php $hooks->trigger(HOOK_ADMIN_BODY_END); ?>
 | 
			
		||||
</body>
 | 
			
		||||
</html>
 | 
			
		||||
							
								
								
									
										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();
 | 
			
		||||
							
								
								
									
										43
									
								
								admin/tools/settings_save.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,43 @@
 | 
			
		||||
<?php
 | 
			
		||||
const MYAAC_ADMIN = true;
 | 
			
		||||
 | 
			
		||||
require '../../common.php';
 | 
			
		||||
require SYSTEM . 'functions.php';
 | 
			
		||||
require SYSTEM . 'init.php';
 | 
			
		||||
require SYSTEM . 'login.php';
 | 
			
		||||
 | 
			
		||||
// event system
 | 
			
		||||
require_once SYSTEM . 'hooks.php';
 | 
			
		||||
$hooks = new Hooks();
 | 
			
		||||
$hooks->load();
 | 
			
		||||
 | 
			
		||||
if(!admin()) {
 | 
			
		||||
	http_response_code(500);
 | 
			
		||||
	die('Access denied.');
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
csrfProtect();
 | 
			
		||||
 | 
			
		||||
if (!isset($_REQUEST['plugin'])) {
 | 
			
		||||
	http_response_code(500);
 | 
			
		||||
	die('Please enter plugin name.');
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
if (!isset($_POST['settings'])) {
 | 
			
		||||
	http_response_code(500);
 | 
			
		||||
	die('Please enter settings.');
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
$settings = Settings::getInstance();
 | 
			
		||||
 | 
			
		||||
$success = $settings->save($_REQUEST['plugin'], $_POST['settings']);
 | 
			
		||||
 | 
			
		||||
$errors = $settings->getErrors();
 | 
			
		||||
if (count($errors) > 0) {
 | 
			
		||||
	http_response_code(500);
 | 
			
		||||
	die(implode('<br/>', $errors));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
if ($success) {
 | 
			
		||||
	echo 'Saved at ' . date('H:i');
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										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');
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										164
									
								
								common.php
									
									
									
									
									
								
							
							
						
						@@ -23,70 +23,102 @@
 | 
			
		||||
 * @copyright 2019 MyAAC
 | 
			
		||||
 * @link      https://my-aac.org
 | 
			
		||||
 */
 | 
			
		||||
if (version_compare(phpversion(), '7.2.5', '<')) die('PHP version 7.2.5 or higher is required.');
 | 
			
		||||
if (version_compare(phpversion(), '8.0', '<')) die('PHP version 8.0 or higher is required.');
 | 
			
		||||
 | 
			
		||||
define('MYAAC', true);
 | 
			
		||||
define('MYAAC_VERSION', '0.8.21');
 | 
			
		||||
define('DATABASE_VERSION', 33);
 | 
			
		||||
define('TABLE_PREFIX', 'myaac_');
 | 
			
		||||
const MYAAC = true;
 | 
			
		||||
const MYAAC_VERSION = '1.0-dev';
 | 
			
		||||
const DATABASE_VERSION = 36;
 | 
			
		||||
const TABLE_PREFIX = 'myaac_';
 | 
			
		||||
define('START_TIME', microtime(true));
 | 
			
		||||
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']));
 | 
			
		||||
 | 
			
		||||
// account flags
 | 
			
		||||
define('FLAG_ADMIN', 1);
 | 
			
		||||
define('FLAG_SUPER_ADMIN', 2);
 | 
			
		||||
define('FLAG_CONTENT_PAGES', 4);
 | 
			
		||||
define('FLAG_CONTENT_MAILER', 8);
 | 
			
		||||
define('FLAG_CONTENT_NEWS', 16);
 | 
			
		||||
define('FLAG_CONTENT_FORUM', 32);
 | 
			
		||||
define('FLAG_CONTENT_COMMANDS', 64);
 | 
			
		||||
define('FLAG_CONTENT_SPELLS', 128);
 | 
			
		||||
define('FLAG_CONTENT_MONSTERS', 256);
 | 
			
		||||
define('FLAG_CONTENT_GALLERY', 512);
 | 
			
		||||
define('FLAG_CONTENT_VIDEOS', 1024);
 | 
			
		||||
define('FLAG_CONTENT_FAQ', 2048);
 | 
			
		||||
define('FLAG_CONTENT_MENUS', 4096);
 | 
			
		||||
define('FLAG_CONTENT_PLAYERS', 8192);
 | 
			
		||||
const FLAG_NONE = 0;
 | 
			
		||||
const FLAG_ADMIN = 1;
 | 
			
		||||
const FLAG_SUPER_ADMIN = 2;
 | 
			
		||||
const FLAG_SUPER_BOTH = 3;
 | 
			
		||||
const FLAG_CONTENT_PAGES = 4;
 | 
			
		||||
const FLAG_CONTENT_MAILER = 8;
 | 
			
		||||
const FLAG_CONTENT_NEWS = 16;
 | 
			
		||||
const FLAG_CONTENT_FORUM = 32;
 | 
			
		||||
const FLAG_CONTENT_COMMANDS = 64;
 | 
			
		||||
const FLAG_CONTENT_SPELLS = 128;
 | 
			
		||||
const FLAG_CONTENT_MONSTERS = 256;
 | 
			
		||||
const FLAG_CONTENT_GALLERY = 512;
 | 
			
		||||
const FLAG_CONTENT_VIDEOS = 1024;
 | 
			
		||||
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
 | 
			
		||||
define('NEWS', 1);
 | 
			
		||||
define('TICKER', 2);
 | 
			
		||||
define('ARTICLE', 3);
 | 
			
		||||
const NEWS = 1;
 | 
			
		||||
const TICKER = 2;
 | 
			
		||||
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
 | 
			
		||||
define('BASE', __DIR__ . '/');
 | 
			
		||||
define('ADMIN', BASE . 'admin/');
 | 
			
		||||
define('SYSTEM', BASE . 'system/');
 | 
			
		||||
define('CACHE', SYSTEM . 'cache/');
 | 
			
		||||
define('LOCALE', SYSTEM . 'locale/');
 | 
			
		||||
define('LIBS', SYSTEM . 'libs/');
 | 
			
		||||
define('LOGS', SYSTEM . 'logs/');
 | 
			
		||||
define('PAGES', SYSTEM . 'pages/');
 | 
			
		||||
define('PLUGINS', BASE . 'plugins/');
 | 
			
		||||
define('TEMPLATES', BASE . 'templates/');
 | 
			
		||||
define('TOOLS', BASE . 'tools/');
 | 
			
		||||
const BASE = __DIR__ . '/';
 | 
			
		||||
const ADMIN = BASE . ADMIN_PANEL_FOLDER . '/';
 | 
			
		||||
const SYSTEM = BASE . 'system/';
 | 
			
		||||
const CACHE = SYSTEM . 'cache/';
 | 
			
		||||
const LOCALE = SYSTEM . 'locale/';
 | 
			
		||||
const LIBS = SYSTEM . 'libs/';
 | 
			
		||||
const LOGS = SYSTEM . 'logs/';
 | 
			
		||||
const PAGES = SYSTEM . 'pages/';
 | 
			
		||||
const PLUGINS = BASE . 'plugins/';
 | 
			
		||||
const TEMPLATES = BASE . 'templates/';
 | 
			
		||||
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
 | 
			
		||||
define('MENU_CATEGORY_NEWS', 1);
 | 
			
		||||
define('MENU_CATEGORY_ACCOUNT', 2);
 | 
			
		||||
define('MENU_CATEGORY_COMMUNITY', 3);
 | 
			
		||||
define('MENU_CATEGORY_FORUM', 4);
 | 
			
		||||
define('MENU_CATEGORY_LIBRARY', 5);
 | 
			
		||||
define('MENU_CATEGORY_SHOP', 6);
 | 
			
		||||
const MENU_CATEGORY_NEWS = 1;
 | 
			
		||||
const MENU_CATEGORY_ACCOUNT = 2;
 | 
			
		||||
const MENU_CATEGORY_COMMUNITY = 3;
 | 
			
		||||
const MENU_CATEGORY_FORUM = 4;
 | 
			
		||||
const MENU_CATEGORY_LIBRARY = 5;
 | 
			
		||||
const MENU_CATEGORY_SHOP = 6;
 | 
			
		||||
 | 
			
		||||
// otserv versions
 | 
			
		||||
define('OTSERV', 1);
 | 
			
		||||
define('OTSERV_06', 2);
 | 
			
		||||
define('OTSERV_FIRST', OTSERV);
 | 
			
		||||
define('OTSERV_LAST', OTSERV_06);
 | 
			
		||||
define('TFS_02', 3);
 | 
			
		||||
define('TFS_03', 4);
 | 
			
		||||
define('TFS_FIRST', TFS_02);
 | 
			
		||||
define('TFS_LAST', TFS_03);
 | 
			
		||||
const OTSERV = 1;
 | 
			
		||||
const OTSERV_06 = 2;
 | 
			
		||||
const OTSERV_FIRST = OTSERV;
 | 
			
		||||
const OTSERV_LAST = OTSERV_06;
 | 
			
		||||
const TFS_02 = 3;
 | 
			
		||||
const TFS_03 = 4;
 | 
			
		||||
const TFS_FIRST = TFS_02;
 | 
			
		||||
const TFS_LAST = TFS_03;
 | 
			
		||||
 | 
			
		||||
// other definitions
 | 
			
		||||
const MAIL_MAIL = 0;
 | 
			
		||||
const MAIL_SMTP = 1;
 | 
			
		||||
 | 
			
		||||
const SMTP_SECURITY_NONE = 0;
 | 
			
		||||
const SMTP_SECURITY_SSL = 1;
 | 
			
		||||
const SMTP_SECURITY_TLS = 2;
 | 
			
		||||
 | 
			
		||||
const ACCOUNT_NUMBER_LENGTH = 8;
 | 
			
		||||
 | 
			
		||||
if (!IS_CLI) {
 | 
			
		||||
	session_save_path(SYSTEM . 'php_sessions');
 | 
			
		||||
	session_save_path(SESSIONS_DIR);
 | 
			
		||||
	session_start();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -97,13 +129,9 @@ $size = count($tmp) - 1;
 | 
			
		||||
for($i = 1; $i < $size; $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);
 | 
			
		||||
 | 
			
		||||
if (file_exists(BASE . 'config.local.php') && !defined('MYAAC_INSTALL')) {
 | 
			
		||||
	require BASE . 'config.local.php';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
if(!IS_CLI) {
 | 
			
		||||
	if (isset($_SERVER['HTTP_HOST'][0])) {
 | 
			
		||||
		$baseHost = $_SERVER['HTTP_HOST'];
 | 
			
		||||
@@ -117,14 +145,34 @@ if(!IS_CLI) {
 | 
			
		||||
 | 
			
		||||
	define('SERVER_URL', 'http' . (isHttps() ? 's' : '') . '://' . $baseHost);
 | 
			
		||||
	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']);
 | 
			
		||||
	if(@$config['env'] === 'dev') {
 | 
			
		||||
		require SYSTEM . 'exception.php';
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
require SYSTEM . 'autoload.php';
 | 
			
		||||
 | 
			
		||||
if (file_exists(BASE . 'config.local.php')) {
 | 
			
		||||
	require BASE . 'config.local.php';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/** @var array $config */
 | 
			
		||||
ini_set('log_errors', 1);
 | 
			
		||||
if(@$config['env'] === 'dev') {
 | 
			
		||||
	ini_set('display_errors', 1);
 | 
			
		||||
	ini_set('display_startup_errors', 1);
 | 
			
		||||
	error_reporting(E_ALL);
 | 
			
		||||
}
 | 
			
		||||
else {
 | 
			
		||||
	ini_set('display_errors', 0);
 | 
			
		||||
	ini_set('display_startup_errors', 0);
 | 
			
		||||
	error_reporting(E_ALL & ~E_DEPRECATED & ~E_STRICT);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
$autoloadFile = VENDOR . 'autoload.php';
 | 
			
		||||
if (!is_file($autoloadFile)) {
 | 
			
		||||
	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.');
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
require $autoloadFile;
 | 
			
		||||
 | 
			
		||||
function isHttps(): bool
 | 
			
		||||
{
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										27
									
								
								composer.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,27 @@
 | 
			
		||||
{
 | 
			
		||||
    "require": {
 | 
			
		||||
        "php": "^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",
 | 
			
		||||
        "illuminate/database": "^10.18",
 | 
			
		||||
        "peppeocchi/php-cron-scheduler": "4.*"
 | 
			
		||||
    },
 | 
			
		||||
    "require-dev": {
 | 
			
		||||
        "filp/whoops": "^2.15",
 | 
			
		||||
        "maximebf/debugbar": "dev-master"
 | 
			
		||||
    },
 | 
			
		||||
    "autoload": {
 | 
			
		||||
        "psr-4": {
 | 
			
		||||
            "MyAAC\\": "system/src"
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										302
									
								
								config.php
									
									
									
									
									
								
							
							
						
						@@ -1,302 +0,0 @@
 | 
			
		||||
<?php
 | 
			
		||||
/**
 | 
			
		||||
 * This is MyAAC's Main Configuration file
 | 
			
		||||
 *
 | 
			
		||||
 * All the default values are kept here, you should not modify it but use
 | 
			
		||||
 * a config.local.php file instead to override the settings from here.
 | 
			
		||||
 *
 | 
			
		||||
 * This is a piece of PHP code so PHP syntax applies!
 | 
			
		||||
 * For boolean values please use true/false.
 | 
			
		||||
 *
 | 
			
		||||
 * Minimally 'server_path' directive have to be filled, other options are optional.
 | 
			
		||||
 *
 | 
			
		||||
 * @package   MyAAC
 | 
			
		||||
 * @author    Slawkens <slawkens@gmail.com>
 | 
			
		||||
 * @copyright 2019 MyAAC
 | 
			
		||||
 * @link      https://my-aac.org
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
$config = array(
 | 
			
		||||
	// directories & files
 | 
			
		||||
	'server_path' => '', // path to the server directory (same directory where config file is located)
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Environment Setting
 | 
			
		||||
	 *
 | 
			
		||||
	 * if you use this script on your live server - set to 'prod' (production)
 | 
			
		||||
	 * if you want to test and debug the script locally, or develop plugins, set to 'dev' (development)
 | 
			
		||||
	 * WARNING: on 'dev' cache is disabled, so site will be significantly slower !!!
 | 
			
		||||
	 * WARNING2: on 'dev' all PHP errors/warnings are displayed
 | 
			
		||||
	 * Recommended: 'prod' cause of speed (page load time is better)
 | 
			
		||||
	 */
 | 
			
		||||
	'env' => 'prod', // 'prod' for production and 'dev' for development
 | 
			
		||||
 | 
			
		||||
	'template' => 'kathrine', // template used by website (kathrine, tibiacom)
 | 
			
		||||
	'template_allow_change' => true, // allow users to choose their own template while browsing website?
 | 
			
		||||
 | 
			
		||||
	'vocations_amount' => 4, // how much basic vocations your server got (without promotion)
 | 
			
		||||
 | 
			
		||||
	// what client version are you using on this OT?
 | 
			
		||||
	// used for the Downloads page and some templates aswell
 | 
			
		||||
	'client' => 1098, // 954 = client 9.54
 | 
			
		||||
 | 
			
		||||
	'session_prefix' => 'myaac_', // must be unique for every site on your server
 | 
			
		||||
	'friendly_urls' => false, // mod_rewrite is required for this, it makes links looks more elegant to eye, and also are SEO friendly (example: https://my-aac.org/guilds/Testing instead of https://my-aac.org/?subtopic=guilds&name=Testing). Remember to rename .htaccess.dist to .htaccess
 | 
			
		||||
	'gzip_output' => false, // gzip page content before sending it to the browser, uses less bandwidth but more cpu cycles
 | 
			
		||||
 | 
			
		||||
	// gesior backward support (templates & pages)
 | 
			
		||||
	// allows using gesior templates and pages with myaac
 | 
			
		||||
	// might bring some performance when disabled
 | 
			
		||||
	'backward_support' => true,
 | 
			
		||||
 | 
			
		||||
	// head options (html)
 | 
			
		||||
	'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
 | 
			
		||||
	'title_separator' => ' - ',
 | 
			
		||||
 | 
			
		||||
	// footer
 | 
			
		||||
	'footer' => ''/*'<br/>Your Server © 2016. All rights reserved.'*/,
 | 
			
		||||
 | 
			
		||||
	'language' => 'en', // default language (currently only 'en' available)
 | 
			
		||||
	'language_allow_change' => false,
 | 
			
		||||
 | 
			
		||||
	'visitors_counter' => true,
 | 
			
		||||
	'visitors_counter_ttl' => 10, // how long visitor will be marked as online (in minutes)
 | 
			
		||||
	'views_counter' => true,
 | 
			
		||||
 | 
			
		||||
	// cache system. by default file cache is used
 | 
			
		||||
	'cache_engine' => 'auto', // apc, apcu, eaccelerator, xcache, file, auto, or blank to disable.
 | 
			
		||||
	'cache_prefix' => 'myaac_', // have to be unique if running more MyAAC instances on the same server (except file system cache)
 | 
			
		||||
 | 
			
		||||
	// database details (leave blank for auto detect from config.lua)
 | 
			
		||||
	'database_host' => '',
 | 
			
		||||
	'database_port' => '', // leave blank to default 3306
 | 
			
		||||
	'database_user' => '',
 | 
			
		||||
	'database_password' => '',
 | 
			
		||||
	'database_name' => '',
 | 
			
		||||
	'database_log' => false, // should database queries be logged and 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_persistent' => false, // use database permanent connection (like server), may speed up your site
 | 
			
		||||
	'database_encryption' => 'sha1',
 | 
			
		||||
 | 
			
		||||
	// multiworld system (only TFS 0.3)
 | 
			
		||||
	'multiworld' => false, // use multiworld system?
 | 
			
		||||
	'worlds' => array( // list of worlds
 | 
			
		||||
		//'1' => 'Your World Name',
 | 
			
		||||
		//'2' => 'Your Second World Name'
 | 
			
		||||
	),
 | 
			
		||||
 | 
			
		||||
	// images
 | 
			
		||||
	'outfit_images_url' => 'https://outfit-images.ots.me/outfit.php', // set to animoutfit.php for animated outfit
 | 
			
		||||
	'item_images_url' => 'https://item-images.ots.me/1092/', // set to images/items if you host your own items in images folder
 | 
			
		||||
 | 
			
		||||
	// account
 | 
			
		||||
	'account_management' => true, // disable if you're using other method to manage users (fe. tfs account manager)
 | 
			
		||||
	'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_mail_verify' => false, // force users to confirm their email addresses when registering
 | 
			
		||||
	'account_mail_confirmed_reward' => [ // reward users for confirming their E-Mails
 | 
			
		||||
		// account_mail_verify needs to be enabled too
 | 
			
		||||
		'premium_days' => 0,
 | 
			
		||||
		'premium_points' => 0,
 | 
			
		||||
		'coins' => 0,
 | 
			
		||||
		'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_premium_days' => 0, // default premium days on new account
 | 
			
		||||
	'account_premium_points' => 0, // default premium points on new account
 | 
			
		||||
	'account_welcome_mail' => true, // send welcome email when user registers
 | 
			
		||||
	'account_mail_change' => 2, // how many days user need to change email to account - block hackers
 | 
			
		||||
	'account_country' => true, // user will be able to set country of origin when registering account, this information will be viewable in others places aswell
 | 
			
		||||
	'account_country_recognize' => true, // should country of user be automatically recognized by his IP? This makes an external API call to http://ipinfo.io
 | 
			
		||||
	'account_change_character_name' => false, // can user change their character name for premium points?
 | 
			
		||||
	'account_change_character_name_points' => 30, // cost of name change
 | 
			
		||||
	'account_change_character_sex' => false, // can user change their character sex for premium points?
 | 
			
		||||
	'account_change_character_sex_points' => 30, // cost of sex change
 | 
			
		||||
	'characters_per_account' => 10,	// max. number of characters per account
 | 
			
		||||
 | 
			
		||||
	// mail
 | 
			
		||||
	'mail_enabled' => false, // is aac maker configured to send e-mails?
 | 
			
		||||
	'mail_address' => 'no-reply@your-server.org', // server e-mail address (from:)
 | 
			
		||||
	'mail_admin' => 'your-address@your-server.org', // admin email address, where mails from contact form will be sent
 | 
			
		||||
	'mail_signature' => array( // signature that will be included at the end of every message sent using _mail function
 | 
			
		||||
		'plain' => ""/*"--\nMy Server,\nhttp://www.myserver.com"*/,
 | 
			
		||||
		'html' => ''/*'<br/>My Server,\n<a href="http://www.myserver.com">myserver.com</a>'*/
 | 
			
		||||
	),
 | 
			
		||||
	'smtp_enabled' => false, // send by smtp or mail function (set false if use mail function, set to true if you use GMail or Microsoft Outlook)
 | 
			
		||||
	'smtp_host' => '', // mail host. smtp.gmail.com for GMail / smtp-mail.outlook.com for Microsoft Outlook
 | 
			
		||||
	'smtp_port' => 25, // 25 (default) / 465 (ssl, GMail) / 587 (tls, Microsoft Outlook)
 | 
			
		||||
	'smtp_auth' => true, // need authorization?
 | 
			
		||||
	'smtp_user' => 'admin@example.org', // here your email username
 | 
			
		||||
	'smtp_pass' => '',
 | 
			
		||||
	'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)
 | 
			
		||||
 | 
			
		||||
	// 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_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_generate_reckey' => true,	// send e-mail with rec key (key is displayed on page anyway when generate)
 | 
			
		||||
 | 
			
		||||
	// genders (aka sex)
 | 
			
		||||
	'genders' => array(
 | 
			
		||||
		0 => 'Female',
 | 
			
		||||
		1 => 'Male'
 | 
			
		||||
	),
 | 
			
		||||
 | 
			
		||||
	// new character config
 | 
			
		||||
	'character_samples' => array( // vocations, format: ID_of_vocation => 'Name of Character to copy'
 | 
			
		||||
		//0 => 'Rook Sample',
 | 
			
		||||
		1 => 'Sorcerer Sample',
 | 
			
		||||
		2 => 'Druid Sample',
 | 
			
		||||
		3 => 'Paladin Sample',
 | 
			
		||||
		4 => 'Knight Sample'
 | 
			
		||||
	),
 | 
			
		||||
 | 
			
		||||
	'use_character_sample_skills' => false,
 | 
			
		||||
 | 
			
		||||
	// it must show limited number of players after using search in character page
 | 
			
		||||
	'characters_search_limit' => 15,
 | 
			
		||||
 | 
			
		||||
	// town list used when creating character
 | 
			
		||||
	// won't be displayed if there is only one item (rookgaard for example)
 | 
			
		||||
	'character_towns' => array(1),
 | 
			
		||||
 | 
			
		||||
	// characters length
 | 
			
		||||
	// 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_max_length' => 21,
 | 
			
		||||
 | 
			
		||||
	// 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)
 | 
			
		||||
	'towns' => array(
 | 
			
		||||
		0 => 'No town',
 | 
			
		||||
		1 => 'Sample town'
 | 
			
		||||
	),
 | 
			
		||||
 | 
			
		||||
	// guilds
 | 
			
		||||
	'guild_management' => true, // enable guild management system on the site?
 | 
			
		||||
	'guild_need_level' => 1, // min. level 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_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_motd_chars_limit' => 150, // limit of MOTD (message of the day) that is shown later in the game on the guild channel
 | 
			
		||||
 | 
			
		||||
	// online page
 | 
			
		||||
	'online_record' => true, // display players record?
 | 
			
		||||
	'online_vocations' => false, // display vocation statistics?
 | 
			
		||||
	'online_vocations_images' => false, // display vocation images?
 | 
			
		||||
	'online_skulls' => false, // display skull images
 | 
			
		||||
	'online_outfit' => true,
 | 
			
		||||
	'online_afk' => false,
 | 
			
		||||
 | 
			
		||||
	// support list page
 | 
			
		||||
	'team_style' => 2, // 1/2 (1 - normal table, 2 - in boxes, grouped by group id)
 | 
			
		||||
	'team_display_status' => true,
 | 
			
		||||
	'team_display_lastlogin' => true,
 | 
			
		||||
	'team_display_world' => false,
 | 
			
		||||
	'team_display_outfit' => true,
 | 
			
		||||
 | 
			
		||||
	// bans page
 | 
			
		||||
	'bans_limit' => 50,
 | 
			
		||||
	'bans_display_all' => true, // should all bans be displayed? (sorted page by page)
 | 
			
		||||
 | 
			
		||||
	// highscores page
 | 
			
		||||
	'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_frags' => false, // show 'Frags' tab (best fraggers on the server)? Only 0.3
 | 
			
		||||
	'highscores_balance' => false, // show 'Balance' tab (richest players on the server)
 | 
			
		||||
	'highscores_outfit' => true, // show player outfit?
 | 
			
		||||
	'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_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
 | 
			
		||||
 | 
			
		||||
	// characters page
 | 
			
		||||
	'characters' => array( // what things to display on character view page (true/false in each option)
 | 
			
		||||
		'level' => true,
 | 
			
		||||
		'experience' => false,
 | 
			
		||||
		'magic_level' => false,
 | 
			
		||||
		'balance' => false,
 | 
			
		||||
		'marriage_info' => true, // only 0.3
 | 
			
		||||
		'outfit' => true,
 | 
			
		||||
		'creation_date' => true,
 | 
			
		||||
		'quests' => true,
 | 
			
		||||
		'skills' => true,
 | 
			
		||||
		'equipment' => true,
 | 
			
		||||
		'frags' => false,
 | 
			
		||||
		'deleted' => false, // should deleted characters from same account be still listed on the list of characters? When enabled it will show that character is "[DELETED]"
 | 
			
		||||
	),
 | 
			
		||||
	'quests' => array(
 | 
			
		||||
		//'Some Quest' => 123,
 | 
			
		||||
		//'Some Quest Two' => 456,
 | 
			
		||||
	), // quests list (displayed in character view), name => storage
 | 
			
		||||
	'signature_enabled' => true,
 | 
			
		||||
	'signature_type' => 'tibian', // signature engine to use: tibian, mango, gesior
 | 
			
		||||
	'signature_cache_time' => 5, // how long to store cached file (in minutes), default 5 minutes
 | 
			
		||||
	'signature_browser_cache' => 60, // how long to cache by browser (in minutes), default 1 hour
 | 
			
		||||
 | 
			
		||||
	// news page
 | 
			
		||||
	'news_limit' => 5, // limit of news on the latest news page
 | 
			
		||||
	'news_ticker_limit' => 5, // limit of news in tickers (mini news) (0 to disable)
 | 
			
		||||
	'news_date_format' => 'j.n.Y', // check php manual date() function for more info about this
 | 
			
		||||
	'news_author' => true, // show author of the news
 | 
			
		||||
 | 
			
		||||
	// gifts/shop system
 | 
			
		||||
	'gifts_system' => false,
 | 
			
		||||
 | 
			
		||||
	// support/system
 | 
			
		||||
	'bug_report' => true, // this configurable has no effect, its always enabled
 | 
			
		||||
 | 
			
		||||
	// forum
 | 
			
		||||
	'forum' => 'site', // link to the server forum, set to "site" if you want to use build in forum system, otherwise leave empty if you aren't going to use any forum
 | 
			
		||||
	'forum_level_required' => 0, // level required to post, 0 to disable
 | 
			
		||||
	'forum_post_interval' => 30, // in seconds
 | 
			
		||||
	'forum_posts_per_page' => 20,
 | 
			
		||||
	'forum_threads_per_page' => 20,
 | 
			
		||||
	// uncomment to force use table for forum
 | 
			
		||||
	//'forum_table_prefix' => 'z_', // what forum mysql table to use, z_ (for gesior old forum) or myaac_ (for myaac)
 | 
			
		||||
 | 
			
		||||
	// last kills
 | 
			
		||||
	'last_kills_limit' => 50, // max. number of deaths shown on the last kills page
 | 
			
		||||
 | 
			
		||||
	// status, took automatically from config file if empty
 | 
			
		||||
	'status_enabled' => true, // you can disable status checking by settings this to "false"
 | 
			
		||||
	'status_ip' => '127.0.0.1',
 | 
			
		||||
	'status_port' => '',
 | 
			
		||||
	'status_timeout' => 1.0, // how long to wait for the initial response from the server (default: 1 second)
 | 
			
		||||
 | 
			
		||||
	// 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
 | 
			
		||||
	// when server is offline, it will be checked every time web refreshes, ignoring this variable
 | 
			
		||||
	'status_interval' => 60,
 | 
			
		||||
 | 
			
		||||
	// admin panel
 | 
			
		||||
	'admin_panel_modules' => 'lastlogin,points,coins',
 | 
			
		||||
 | 
			
		||||
	// other
 | 
			
		||||
	'anonymous_usage_statistics' => true,
 | 
			
		||||
	'email_lai_sec_interval' => 60, // time in seconds between e-mails to one account from lost account interface, block spam
 | 
			
		||||
	'google_analytics_id' => '', // e.g.: UA-XXXXXXX-X
 | 
			
		||||
	'experiencetable_columns' => 3, // how many columns to display in experience table page. * experiencetable_rows, 5 = 500 (will show up to 500 level)
 | 
			
		||||
	'experiencetable_rows' => 200, // till how many levels in one column
 | 
			
		||||
	'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
 | 
			
		||||
 | 
			
		||||
	'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('#password_confirm').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')
 | 
			
		||||
	})
 | 
			
		||||
})
 | 
			
		||||
							
								
								
									
										174
									
								
								cypress/e2e/3-check-public-pages.cy.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,174 @@
 | 
			
		||||
describe('Check Public Pages', () => {
 | 
			
		||||
 | 
			
		||||
	/// news
 | 
			
		||||
	it('Go to news page', () => {
 | 
			
		||||
		cy.visit({
 | 
			
		||||
			url: Cypress.env('URL') + '/news',
 | 
			
		||||
			method: 'GET',
 | 
			
		||||
		})
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	it('Go to news archive page', () => {
 | 
			
		||||
		cy.visit({
 | 
			
		||||
			url: Cypress.env('URL') + '/news/archive',
 | 
			
		||||
			method: 'GET',
 | 
			
		||||
		})
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	it('Go to changelog page', () => {
 | 
			
		||||
		cy.visit({
 | 
			
		||||
			url: Cypress.env('URL') + '/changelog',
 | 
			
		||||
			method: 'GET',
 | 
			
		||||
		})
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	/// account management
 | 
			
		||||
	it('Go to account manage page', () => {
 | 
			
		||||
		cy.visit({
 | 
			
		||||
			url: Cypress.env('URL') + '/account/manage',
 | 
			
		||||
			method: 'GET',
 | 
			
		||||
		})
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	it('Go to account create page', () => {
 | 
			
		||||
		cy.visit({
 | 
			
		||||
			url: Cypress.env('URL') + '/account/create',
 | 
			
		||||
			method: 'GET',
 | 
			
		||||
		})
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	it('Go to account lost page', () => {
 | 
			
		||||
		cy.visit({
 | 
			
		||||
			url: Cypress.env('URL') + '/account/lost',
 | 
			
		||||
			method: 'GET',
 | 
			
		||||
		})
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	it('Go to rules page', () => {
 | 
			
		||||
		cy.visit({
 | 
			
		||||
			url: Cypress.env('URL') + '/rules',
 | 
			
		||||
			method: 'GET',
 | 
			
		||||
		})
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	// community
 | 
			
		||||
	it('Go to online page', () => {
 | 
			
		||||
		cy.visit({
 | 
			
		||||
			url: Cypress.env('URL') + '/online',
 | 
			
		||||
			method: 'GET',
 | 
			
		||||
		})
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	it('Go to characters list page', () => {
 | 
			
		||||
		cy.visit({
 | 
			
		||||
			url: Cypress.env('URL') + '/characters',
 | 
			
		||||
			method: 'GET',
 | 
			
		||||
		})
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	it('Go to guilds page', () => {
 | 
			
		||||
		cy.visit({
 | 
			
		||||
			url: Cypress.env('URL') + '/guilds',
 | 
			
		||||
			method: 'GET',
 | 
			
		||||
		})
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	it('Go to highscores page', () => {
 | 
			
		||||
		cy.visit({
 | 
			
		||||
			url: Cypress.env('URL') + '/highscores',
 | 
			
		||||
			method: 'GET',
 | 
			
		||||
		})
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	it('Go to last kills page', () => {
 | 
			
		||||
		cy.visit({
 | 
			
		||||
			url: Cypress.env('URL') + '/lastkills',
 | 
			
		||||
			method: 'GET',
 | 
			
		||||
		})
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	it('Go to houses page', () => {
 | 
			
		||||
		cy.visit({
 | 
			
		||||
			url: Cypress.env('URL') + '/houses',
 | 
			
		||||
			method: 'GET',
 | 
			
		||||
		})
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	it('Go to bans page', () => {
 | 
			
		||||
		cy.visit({
 | 
			
		||||
			url: Cypress.env('URL') + '/bans',
 | 
			
		||||
			method: 'GET',
 | 
			
		||||
		})
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	it('Go to forum page', () => {
 | 
			
		||||
		cy.visit({
 | 
			
		||||
			url: Cypress.env('URL') + '/forum',
 | 
			
		||||
			method: 'GET',
 | 
			
		||||
		})
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	it('Go to team page', () => {
 | 
			
		||||
		cy.visit({
 | 
			
		||||
			url: Cypress.env('URL') + '/team',
 | 
			
		||||
			method: 'GET',
 | 
			
		||||
		})
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	// library
 | 
			
		||||
	it('Go to creatures page', () => {
 | 
			
		||||
		cy.visit({
 | 
			
		||||
			url: Cypress.env('URL') + '/creatures',
 | 
			
		||||
			method: 'GET',
 | 
			
		||||
		})
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	it('Go to spells page', () => {
 | 
			
		||||
		cy.visit({
 | 
			
		||||
			url: Cypress.env('URL') + '/spells',
 | 
			
		||||
			method: 'GET',
 | 
			
		||||
		})
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	it('Go to server info page', () => {
 | 
			
		||||
		cy.visit({
 | 
			
		||||
			url: Cypress.env('URL') + '/serverInfo',
 | 
			
		||||
			method: 'GET',
 | 
			
		||||
		})
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	it('Go to commands page', () => {
 | 
			
		||||
		cy.visit({
 | 
			
		||||
			url: Cypress.env('URL') + '/commands',
 | 
			
		||||
			method: 'GET',
 | 
			
		||||
		})
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	it('Go to downloads page', () => {
 | 
			
		||||
		cy.visit({
 | 
			
		||||
			url: Cypress.env('URL') + '/downloads',
 | 
			
		||||
			method: 'GET',
 | 
			
		||||
		})
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	it('Go to gallery page', () => {
 | 
			
		||||
		cy.visit({
 | 
			
		||||
			url: Cypress.env('URL') + '/gallery',
 | 
			
		||||
			method: 'GET',
 | 
			
		||||
		})
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	it('Go to experience table page', () => {
 | 
			
		||||
		cy.visit({
 | 
			
		||||
			url: Cypress.env('URL') + '/experienceTable',
 | 
			
		||||
			method: 'GET',
 | 
			
		||||
		})
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	it('Go to faq page', () => {
 | 
			
		||||
		cy.visit({
 | 
			
		||||
			url: Cypress.env('URL') + '/faq',
 | 
			
		||||
			method: 'GET',
 | 
			
		||||
		})
 | 
			
		||||
	})
 | 
			
		||||
})
 | 
			
		||||
							
								
								
									
										81
									
								
								cypress/e2e/4-check-protected-pages.cy.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,81 @@
 | 
			
		||||
const REQUIRED_LOGIN_MESSAGE = 'Please enter your account name and your password.';
 | 
			
		||||
const YOU_ARE_NOT_LOGGEDIN = 'You are not logged in.';
 | 
			
		||||
 | 
			
		||||
describe('Check Protected Pages', () => {
 | 
			
		||||
 | 
			
		||||
	// character actions
 | 
			
		||||
	it('Go to accouht character creation page', () => {
 | 
			
		||||
		cy.visit({
 | 
			
		||||
			url: Cypress.env('URL') + '/account/character/create',
 | 
			
		||||
			method: 'GET',
 | 
			
		||||
		})
 | 
			
		||||
		cy.contains(REQUIRED_LOGIN_MESSAGE)
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	it('Go to accouht character deletion page', () => {
 | 
			
		||||
		cy.visit({
 | 
			
		||||
			url: Cypress.env('URL') + '/account/character/delete',
 | 
			
		||||
			method: 'GET',
 | 
			
		||||
		})
 | 
			
		||||
		cy.contains(REQUIRED_LOGIN_MESSAGE)
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	// account actions
 | 
			
		||||
	it('Go to accouht email change page', () => {
 | 
			
		||||
		cy.visit({
 | 
			
		||||
			url: Cypress.env('URL') + '/account/email',
 | 
			
		||||
			method: 'GET',
 | 
			
		||||
		})
 | 
			
		||||
		cy.contains(REQUIRED_LOGIN_MESSAGE)
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	it('Go to accouht password change page', () => {
 | 
			
		||||
		cy.visit({
 | 
			
		||||
			url: Cypress.env('URL') + '/account/password',
 | 
			
		||||
			method: 'GET',
 | 
			
		||||
		})
 | 
			
		||||
		cy.contains(REQUIRED_LOGIN_MESSAGE)
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	it('Go to accouht info change page', () => {
 | 
			
		||||
		cy.visit({
 | 
			
		||||
			url: Cypress.env('URL') + '/account/info',
 | 
			
		||||
			method: 'GET',
 | 
			
		||||
		})
 | 
			
		||||
		cy.contains(REQUIRED_LOGIN_MESSAGE)
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	it('Go to accouht logout change page', () => {
 | 
			
		||||
		cy.visit({
 | 
			
		||||
			url: Cypress.env('URL') + '/account/logout',
 | 
			
		||||
			method: 'GET',
 | 
			
		||||
		})
 | 
			
		||||
		cy.contains(REQUIRED_LOGIN_MESSAGE)
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	// guild actions
 | 
			
		||||
	it('Go to guild creation page', () => {
 | 
			
		||||
		cy.visit({
 | 
			
		||||
			url: Cypress.env('URL') + '/?subtopic=guilds&action=create',
 | 
			
		||||
			method: 'GET',
 | 
			
		||||
		})
 | 
			
		||||
		cy.contains(YOU_ARE_NOT_LOGGEDIN)
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	it('Go to guilds cleanup players action page', () => {
 | 
			
		||||
		cy.visit({
 | 
			
		||||
			url: Cypress.env('URL') + '/?subtopic=guilds&action=cleanup_players',
 | 
			
		||||
			method: 'GET',
 | 
			
		||||
		})
 | 
			
		||||
		cy.contains(YOU_ARE_NOT_LOGGEDIN)
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	it('Go to guilds cleanup guilds action page', () => {
 | 
			
		||||
		cy.visit({
 | 
			
		||||
			url: Cypress.env('URL') + '/?subtopic=guilds&action=cleanup_guilds',
 | 
			
		||||
			method: 'GET',
 | 
			
		||||
		})
 | 
			
		||||
		cy.contains(YOU_ARE_NOT_LOGGEDIN)
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
})
 | 
			
		||||
							
								
								
									
										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  | 
							
								
								
									
										274
									
								
								index.php
									
									
									
									
									
								
							
							
						
						@@ -28,18 +28,22 @@ require_once 'common.php';
 | 
			
		||||
require_once SYSTEM . 'functions.php';
 | 
			
		||||
 | 
			
		||||
$uri = $_SERVER['REQUEST_URI'];
 | 
			
		||||
if(false !== strpos($uri, 'index.php')) {
 | 
			
		||||
	$uri = str_replace_first('/index.php', '', $uri);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
$tmp = BASE_DIR;
 | 
			
		||||
if(!empty($tmp))
 | 
			
		||||
	$uri = str_replace(BASE_DIR . '/', '', $uri);
 | 
			
		||||
else
 | 
			
		||||
if(0 === strpos($uri, '/')) {
 | 
			
		||||
	$uri = str_replace_first('/', '', $uri);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
$uri = str_replace(array('index.php/', '?'), '', $uri);
 | 
			
		||||
define('URI', $uri);
 | 
			
		||||
if(preg_match("/^[A-Za-z0-9-_%'+\/]+\.png$/i", $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]);
 | 
			
		||||
 | 
			
		||||
	chdir(TOOLS . 'signature');
 | 
			
		||||
@@ -47,168 +51,40 @@ if(preg_match("/^[A-Za-z0-9-_%'+]+\.png$/i", $uri)) {
 | 
			
		||||
	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);
 | 
			
		||||
	exit;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
if(file_exists(BASE . 'config.local.php')) {
 | 
			
		||||
	require_once BASE . 'config.local.php';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ini_set('log_errors', 1);
 | 
			
		||||
if(config('env') === 'dev') {
 | 
			
		||||
	ini_set('display_errors', 1);
 | 
			
		||||
	ini_set('display_startup_errors', 1);
 | 
			
		||||
	error_reporting(E_ALL);
 | 
			
		||||
}
 | 
			
		||||
else {
 | 
			
		||||
	ini_set('display_errors', 0);
 | 
			
		||||
	ini_set('display_startup_errors', 0);
 | 
			
		||||
	error_reporting(E_ALL & ~E_DEPRECATED & ~E_STRICT);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
if((!isset($config['installed']) || !$config['installed']) && file_exists(BASE . 'install'))
 | 
			
		||||
{
 | 
			
		||||
	header('Location: ' . BASE_URL . 'install/');
 | 
			
		||||
	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 . 'template.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.');
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
$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
 | 
			
		||||
require_once SYSTEM . 'hooks.php';
 | 
			
		||||
$hooks = new Hooks();
 | 
			
		||||
$hooks->load();
 | 
			
		||||
require_once SYSTEM . 'template.php';
 | 
			
		||||
require_once SYSTEM . 'login.php';
 | 
			
		||||
require_once SYSTEM . 'status.php';
 | 
			
		||||
 | 
			
		||||
$twig->addGlobal('config', $config);
 | 
			
		||||
$twig->addGlobal('status', $status);
 | 
			
		||||
 | 
			
		||||
require SYSTEM . 'migrate.php';
 | 
			
		||||
require_once SYSTEM . 'router.php';
 | 
			
		||||
 | 
			
		||||
$hooks->trigger(HOOK_STARTUP);
 | 
			
		||||
 | 
			
		||||
// anonymous usage statistics
 | 
			
		||||
// sent only when user agrees
 | 
			
		||||
if(isset($config['anonymous_usage_statistics']) && $config['anonymous_usage_statistics']) {
 | 
			
		||||
if(setting('core.anonymous_usage_statistics')) {
 | 
			
		||||
	$report_time = 30 * 24 * 60 * 60; // report one time per 30 days
 | 
			
		||||
	$should_report = true;
 | 
			
		||||
 | 
			
		||||
@@ -241,53 +117,22 @@ if(isset($config['anonymous_usage_statistics']) && $config['anonymous_usage_stat
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
if($config['views_counter'])
 | 
			
		||||
if(setting('core.views_counter'))
 | 
			
		||||
	require_once SYSTEM . 'counter.php';
 | 
			
		||||
 | 
			
		||||
if($config['visitors_counter'])
 | 
			
		||||
{
 | 
			
		||||
if(setting('core.visitors_counter')) {
 | 
			
		||||
	require_once SYSTEM . 'libs/visitors.php';
 | 
			
		||||
	$visitors = new Visitors($config['visitors_counter_ttl']);
 | 
			
		||||
	$visitors = new Visitors(setting('core.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
 | 
			
		||||
if($config['backward_support']) {
 | 
			
		||||
if(setting('core.backward_support')) {
 | 
			
		||||
	define('INITIALIZED', true);
 | 
			
		||||
	$SQL = $db;
 | 
			
		||||
	$layout_header = template_header();
 | 
			
		||||
	$layout_name = $template_path;
 | 
			
		||||
	$news_content = '';
 | 
			
		||||
	$tickers_content = '';
 | 
			
		||||
	$subtopic = PAGE;
 | 
			
		||||
	$main_content = '';
 | 
			
		||||
 | 
			
		||||
	$config['access_admin_panel'] = 2;
 | 
			
		||||
@@ -297,7 +142,7 @@ if($config['backward_support']) {
 | 
			
		||||
 | 
			
		||||
	$config['site'] = &$config;
 | 
			
		||||
	$config['server'] = &$config['lua'];
 | 
			
		||||
	$config['site']['shop_system'] = $config['gifts_system'];
 | 
			
		||||
	$config['site']['shop_system'] = setting('core.gifts_system');
 | 
			
		||||
	$config['site']['gallery_page'] = true;
 | 
			
		||||
 | 
			
		||||
	if(!isset($config['vdarkborder']))
 | 
			
		||||
@@ -311,74 +156,23 @@ if($config['backward_support']) {
 | 
			
		||||
	$config['site']['serverinfo_page'] = true;
 | 
			
		||||
	$config['site']['screenshot_page'] = true;
 | 
			
		||||
 | 
			
		||||
	if($config['forum'] != '')
 | 
			
		||||
		$config['forum_link'] = (strtolower($config['forum']) === 'site' ? getLink('forum') : $config['forum']);
 | 
			
		||||
	$forumSetting = setting('core.forum');
 | 
			
		||||
	if($forumSetting != '')
 | 
			
		||||
		$config['forum_link'] = (strtolower($forumSetting) === 'site' ? getLink('forum') : $forumSetting);
 | 
			
		||||
 | 
			
		||||
	foreach($status as $key => $value)
 | 
			
		||||
		$config['status']['serverStatus_' . $key] = $value;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
if($load_it)
 | 
			
		||||
{
 | 
			
		||||
	if(SITE_CLOSED && admin())
 | 
			
		||||
		$content .= '<p class="note">Site is under maintenance (closed mode). Only privileged users can see it.</p>';
 | 
			
		||||
 | 
			
		||||
	if($config['backward_support']) {
 | 
			
		||||
		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);
 | 
			
		||||
/**
 | 
			
		||||
 * @var OTS_Account $account_logged
 | 
			
		||||
 */
 | 
			
		||||
if ($logged && admin()) {
 | 
			
		||||
	$content .= $twig->render('admin-bar.html.twig', [
 | 
			
		||||
		'username' => USE_ACCOUNT_NAME ? $account_logged->getName() : $account_logged->getId()
 | 
			
		||||
	]);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
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'];
 | 
			
		||||
$title_full =  (isset($title) ? $title . ' - ' : '') . $config['lua']['serverName'];
 | 
			
		||||
require $template_path . '/' . $template_index;
 | 
			
		||||
 | 
			
		||||
echo base64_decode('PCEtLSBQb3dlcmVkIGJ5IE15QUFDIDo6IGh0dHBzOi8vd3d3Lm15LWFhYy5vcmcvIC0tPg==') . PHP_EOL;
 | 
			
		||||
 
 | 
			
		||||
@@ -6,12 +6,18 @@ $ots = POT::getInstance();
 | 
			
		||||
require SYSTEM . 'database.php';
 | 
			
		||||
 | 
			
		||||
if(!isset($db)) {
 | 
			
		||||
	$database_error = $locale['step_database_error_mysql_connect'] . '<br/>' .
 | 
			
		||||
			$locale['step_database_error_mysql_connect_2'] .
 | 
			
		||||
			'<ul>' .
 | 
			
		||||
				'<li>' . $locale['step_database_error_mysql_connect_3'] . '</li>' .
 | 
			
		||||
				'<li>' . $locale['step_database_error_mysql_connect_4'] . '</li>' .
 | 
			
		||||
			'</ul>' . '<br/>' . $error;
 | 
			
		||||
	$database_error = '<p class="lead">' . $locale['step_database_error_mysql_connect'] . '</p>';
 | 
			
		||||
	
 | 
			
		||||
	$database_error .= '<p>' . $locale['step_database_error_mysql_connect_2'] . '</p>';
 | 
			
		||||
 | 
			
		||||
	$database_error .= '<ul class="list-group">' .
 | 
			
		||||
							'<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 {
 | 
			
		||||
	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'] . '" />';
 | 
			
		||||
*/
 | 
			
		||||
	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)
 | 
			
		||||
		$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>';
 | 
			
		||||
	return $ret;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,4 @@
 | 
			
		||||
SET @myaac_database_version = 33;
 | 
			
		||||
SET @myaac_database_version = 36;
 | 
			
		||||
 | 
			
		||||
CREATE TABLE `myaac_account_actions`
 | 
			
		||||
(
 | 
			
		||||
@@ -127,75 +127,6 @@ CREATE TABLE `myaac_menu`
 | 
			
		||||
	PRIMARY KEY (`id`)
 | 
			
		||||
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8;
 | 
			
		||||
 | 
			
		||||
/* MENU_CATEGORY_NEWS kathrine */
 | 
			
		||||
INSERT INTO `myaac_menu` (`template`, `name`, `link`, `category`, `ordering`) VALUES ('kathrine', 'Latest News', 'news', 1, 0);
 | 
			
		||||
INSERT INTO `myaac_menu` (`template`, `name`, `link`, `category`, `ordering`) VALUES ('kathrine', 'News Archive', 'news/archive', 1, 1);
 | 
			
		||||
INSERT INTO `myaac_menu` (`template`, `name`, `link`, `category`, `ordering`) VALUES ('kathrine', 'Changelog', 'changelog', 1, 2);
 | 
			
		||||
/* MENU_CATEGORY_ACCOUNT kathrine */
 | 
			
		||||
INSERT INTO `myaac_menu` (`template`, `name`, `link`, `category`, `ordering`) VALUES ('kathrine', 'Account Management', 'account/manage', 2, 0);
 | 
			
		||||
INSERT INTO `myaac_menu` (`template`, `name`, `link`, `category`, `ordering`) VALUES ('kathrine', 'Create Account', 'account/create', 2, 1);
 | 
			
		||||
INSERT INTO `myaac_menu` (`template`, `name`, `link`, `category`, `ordering`) VALUES ('kathrine', 'Lost Account?', 'account/lost', 2, 2);
 | 
			
		||||
INSERT INTO `myaac_menu` (`template`, `name`, `link`, `category`, `ordering`) VALUES ('kathrine', 'Server Rules', 'rules', 2, 3);
 | 
			
		||||
INSERT INTO `myaac_menu` (`template`, `name`, `link`, `category`, `ordering`) VALUES ('kathrine', 'Downloads', 'downloads', 5, 4);
 | 
			
		||||
INSERT INTO `myaac_menu` (`template`, `name`, `link`, `category`, `ordering`) VALUES ('kathrine', 'Report Bug', 'bugtracker', 2, 5);
 | 
			
		||||
/* MENU_CATEGORY_COMMUNITY kathrine */
 | 
			
		||||
INSERT INTO `myaac_menu` (`template`, `name`, `link`, `category`, `ordering`) VALUES ('kathrine', 'Who is Online?', 'online', 3, 0);
 | 
			
		||||
INSERT INTO `myaac_menu` (`template`, `name`, `link`, `category`, `ordering`) VALUES ('kathrine', 'Characters', 'characters', 3, 1);
 | 
			
		||||
INSERT INTO `myaac_menu` (`template`, `name`, `link`, `category`, `ordering`) VALUES ('kathrine', 'Guilds', 'guilds', 3, 2);
 | 
			
		||||
INSERT INTO `myaac_menu` (`template`, `name`, `link`, `category`, `ordering`) VALUES ('kathrine', 'Highscores', 'highscores', 3, 3);
 | 
			
		||||
INSERT INTO `myaac_menu` (`template`, `name`, `link`, `category`, `ordering`) VALUES ('kathrine', 'Last Deaths', 'lastkills', 3, 4);
 | 
			
		||||
INSERT INTO `myaac_menu` (`template`, `name`, `link`, `category`, `ordering`) VALUES ('kathrine', 'Houses', 'houses', 3, 5);
 | 
			
		||||
INSERT INTO `myaac_menu` (`template`, `name`, `link`, `category`, `ordering`) VALUES ('kathrine', 'Bans', 'bans', 3, 6);
 | 
			
		||||
INSERT INTO `myaac_menu` (`template`, `name`, `link`, `category`, `ordering`) VALUES ('kathrine', 'Forum', 'forum', 3, 7);
 | 
			
		||||
INSERT INTO `myaac_menu` (`template`, `name`, `link`, `category`, `ordering`) VALUES ('kathrine', 'Team', 'team', 3, 8);
 | 
			
		||||
/* MENU_CATEGORY_LIBRARY kathrine */
 | 
			
		||||
INSERT INTO `myaac_menu` (`template`, `name`, `link`, `category`, `ordering`) VALUES ('kathrine', 'Monsters', 'creatures', 5, 0);
 | 
			
		||||
INSERT INTO `myaac_menu` (`template`, `name`, `link`, `category`, `ordering`) VALUES ('kathrine', 'Spells', 'spells', 5, 1);
 | 
			
		||||
INSERT INTO `myaac_menu` (`template`, `name`, `link`, `category`, `ordering`) VALUES ('kathrine', 'Server Info', 'serverInfo', 5, 2);
 | 
			
		||||
INSERT INTO `myaac_menu` (`template`, `name`, `link`, `category`, `ordering`) VALUES ('kathrine', 'Commands', 'commands', 5, 3);
 | 
			
		||||
INSERT INTO `myaac_menu` (`template`, `name`, `link`, `category`, `ordering`) VALUES ('kathrine', 'Gallery', 'gallery', 5, 4);
 | 
			
		||||
INSERT INTO `myaac_menu` (`template`, `name`, `link`, `category`, `ordering`) VALUES ('kathrine', 'Experience Table', 'experienceTable', 5, 5);
 | 
			
		||||
INSERT INTO `myaac_menu` (`template`, `name`, `link`, `category`, `ordering`) VALUES ('kathrine', 'FAQ', 'faq', 5, 6);
 | 
			
		||||
/* MENU_CATEGORY_SHOP kathrine */
 | 
			
		||||
INSERT INTO `myaac_menu` (`template`, `name`, `link`, `category`, `ordering`) VALUES ('kathrine', 'Buy Points', 'points', 6, 0);
 | 
			
		||||
INSERT INTO `myaac_menu` (`template`, `name`, `link`, `category`, `ordering`) VALUES ('kathrine', 'Shop Offer', 'gifts', 6, 1);
 | 
			
		||||
INSERT INTO `myaac_menu` (`template`, `name`, `link`, `category`, `ordering`) VALUES ('kathrine', 'Shop History', 'gifts/history', 6, 2);
 | 
			
		||||
/* MENU_CATEGORY_NEWS tibiacom */
 | 
			
		||||
INSERT INTO `myaac_menu` (`template`, `name`, `link`, `category`, `ordering`) VALUES ('tibiacom', 'Latest News', 'news', 1, 0);
 | 
			
		||||
INSERT INTO `myaac_menu` (`template`, `name`, `link`, `category`, `ordering`) VALUES ('tibiacom', 'News Archive', 'news/archive', 1, 1);
 | 
			
		||||
INSERT INTO `myaac_menu` (`template`, `name`, `link`, `category`, `ordering`) VALUES ('tibiacom', 'Changelog', 'changelog', 1, 2);
 | 
			
		||||
/* MENU_CATEGORY_ACCOUNT tibiacom */
 | 
			
		||||
INSERT INTO `myaac_menu` (`template`, `name`, `link`, `category`, `ordering`) VALUES ('tibiacom', 'Account Management', 'account/manage', 2, 0);
 | 
			
		||||
INSERT INTO `myaac_menu` (`template`, `name`, `link`, `category`, `ordering`) VALUES ('tibiacom', 'Create Account', 'account/create', 2, 1);
 | 
			
		||||
INSERT INTO `myaac_menu` (`template`, `name`, `link`, `category`, `ordering`) VALUES ('tibiacom', 'Lost Account?', 'account/lost', 2, 2);
 | 
			
		||||
INSERT INTO `myaac_menu` (`template`, `name`, `link`, `category`, `ordering`) VALUES ('tibiacom', 'Server Rules', 'rules', 2, 3);
 | 
			
		||||
INSERT INTO `myaac_menu` (`template`, `name`, `link`, `category`, `ordering`) VALUES ('tibiacom', 'Downloads', 'downloads', 2, 4);
 | 
			
		||||
INSERT INTO `myaac_menu` (`template`, `name`, `link`, `category`, `ordering`) VALUES ('tibiacom', 'Report Bug', 'bugtracker', 2, 5);
 | 
			
		||||
/* MENU_CATEGORY_COMMUNITY tibiacom */
 | 
			
		||||
INSERT INTO `myaac_menu` (`template`, `name`, `link`, `category`, `ordering`) VALUES ('tibiacom', 'Characters', 'characters', 3, 0);
 | 
			
		||||
INSERT INTO `myaac_menu` (`template`, `name`, `link`, `category`, `ordering`) VALUES ('tibiacom', 'Who Is Online?', 'online', 3, 1);
 | 
			
		||||
INSERT INTO `myaac_menu` (`template`, `name`, `link`, `category`, `ordering`) VALUES ('tibiacom', 'Highscores', 'highscores', 3, 2);
 | 
			
		||||
INSERT INTO `myaac_menu` (`template`, `name`, `link`, `category`, `ordering`) VALUES ('tibiacom', 'Last Kills', 'lastkills', 3, 3);
 | 
			
		||||
INSERT INTO `myaac_menu` (`template`, `name`, `link`, `category`, `ordering`) VALUES ('tibiacom', 'Houses', 'houses', 3, 4);
 | 
			
		||||
INSERT INTO `myaac_menu` (`template`, `name`, `link`, `category`, `ordering`) VALUES ('tibiacom', 'Guilds', 'guilds', 3, 5);
 | 
			
		||||
INSERT INTO `myaac_menu` (`template`, `name`, `link`, `category`, `ordering`) VALUES ('tibiacom', 'Polls', 'polls', 3, 6);
 | 
			
		||||
INSERT INTO `myaac_menu` (`template`, `name`, `link`, `category`, `ordering`) VALUES ('tibiacom', 'Bans', 'bans', 3, 7);
 | 
			
		||||
INSERT INTO `myaac_menu` (`template`, `name`, `link`, `category`, `ordering`) VALUES ('tibiacom', 'Support List', 'team', 3, 8);
 | 
			
		||||
/* MENU_CATEGORY_FORUM tibiacom */
 | 
			
		||||
INSERT INTO `myaac_menu` (`template`, `name`, `link`, `category`, `ordering`) VALUES ('tibiacom', 'Forum', 'forum', 4, 0);
 | 
			
		||||
/* MENU_CATEGORY_LIBRARY tibiacom */
 | 
			
		||||
INSERT INTO `myaac_menu` (`template`, `name`, `link`, `category`, `ordering`) VALUES ('tibiacom', 'Creatures', 'creatures', 5, 0);
 | 
			
		||||
INSERT INTO `myaac_menu` (`template`, `name`, `link`, `category`, `ordering`) VALUES ('tibiacom', 'Spells', 'spells', 5, 1);
 | 
			
		||||
INSERT INTO `myaac_menu` (`template`, `name`, `link`, `category`, `ordering`) VALUES ('tibiacom', 'Commands', 'commands', 5, 2);
 | 
			
		||||
INSERT INTO `myaac_menu` (`template`, `name`, `link`, `category`, `ordering`) VALUES ('tibiacom', 'Exp Stages', 'experienceStages', 5, 3);
 | 
			
		||||
INSERT INTO `myaac_menu` (`template`, `name`, `link`, `category`, `ordering`) VALUES ('tibiacom', 'Gallery', 'gallery', 5, 4);
 | 
			
		||||
INSERT INTO `myaac_menu` (`template`, `name`, `link`, `category`, `ordering`) VALUES ('tibiacom', 'Server Info', 'serverInfo', 5, 5);
 | 
			
		||||
INSERT INTO `myaac_menu` (`template`, `name`, `link`, `category`, `ordering`) VALUES ('tibiacom', 'Experience Table', 'experienceTable', 5, 6);
 | 
			
		||||
/* MENU_CATEGORY_SHOP tibiacom */
 | 
			
		||||
INSERT INTO `myaac_menu` (`template`, `name`, `link`, `category`, `ordering`) VALUES ('tibiacom', 'Buy Points', 'points', 6, 0);
 | 
			
		||||
INSERT INTO `myaac_menu` (`template`, `name`, `link`, `category`, `ordering`) VALUES ('tibiacom', 'Shop Offer', 'gifts', 6, 1);
 | 
			
		||||
INSERT INTO `myaac_menu` (`template`, `name`, `link`, `category`, `ordering`) VALUES ('tibiacom', 'Shop History', 'gifts/history', 6, 2);
 | 
			
		||||
 | 
			
		||||
CREATE TABLE `myaac_monsters` (
 | 
			
		||||
	`id` int(11) NOT NULL AUTO_INCREMENT,
 | 
			
		||||
	`hidden` tinyint(1) NOT NULL default 0,
 | 
			
		||||
@@ -203,25 +134,29 @@ CREATE TABLE `myaac_monsters` (
 | 
			
		||||
	`mana` int(11) NOT NULL DEFAULT 0,
 | 
			
		||||
	`exp` int(11) NOT NULL,
 | 
			
		||||
	`health` int(11) NOT NULL,
 | 
			
		||||
	`look` VARCHAR(255) NOT NULL DEFAULT '',
 | 
			
		||||
	`speed_lvl` int(11) NOT NULL default 1,
 | 
			
		||||
	`use_haste` tinyint(1) NOT NULL,
 | 
			
		||||
	`voices` text NOT NULL,
 | 
			
		||||
	`immunities` varchar(255) NOT NULL,
 | 
			
		||||
	`elements` TEXT NOT NULL,
 | 
			
		||||
	`summonable` tinyint(1) NOT NULL,
 | 
			
		||||
	`convinceable` tinyint(1) NOT NULL,
 | 
			
		||||
	`pushable` TINYINT(1) NOT NULL DEFAULT '0',
 | 
			
		||||
	`canpushitems` TINYINT(1) NOT NULL DEFAULT '0',
 | 
			
		||||
	`canwalkonenergy` TINYINT(1) NOT NULL DEFAULT '0',
 | 
			
		||||
	`canwalkonpoison` TINYINT(1) NOT NULL DEFAULT '0',
 | 
			
		||||
	`canwalkonfire` TINYINT(1) NOT NULL DEFAULT '0',
 | 
			
		||||
	`runonhealth` TINYINT(1) NOT NULL DEFAULT '0',
 | 
			
		||||
	`hostile` TINYINT(1) NOT NULL DEFAULT '0',
 | 
			
		||||
	`attackable` TINYINT(1) NOT NULL DEFAULT '0',
 | 
			
		||||
	`rewardboss` TINYINT(1) NOT NULL DEFAULT '0',
 | 
			
		||||
	`defense` INT(11) NOT NULL DEFAULT '0',
 | 
			
		||||
	`armor` INT(11) NOT NULL DEFAULT '0',
 | 
			
		||||
	`canpushcreatures` TINYINT(1) NOT NULL DEFAULT '0',
 | 
			
		||||
	`race` varchar(255) NOT NULL,
 | 
			
		||||
	`loot` text NOT NULL,
 | 
			
		||||
	PRIMARY KEY (`id`)
 | 
			
		||||
) 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,
 | 
			
		||||
	`summons` TEXT NOT NULL,
 | 
			
		||||
	PRIMARY KEY (`id`)
 | 
			
		||||
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8;
 | 
			
		||||
 | 
			
		||||
@@ -299,6 +234,16 @@ CREATE TABLE `myaac_gallery`
 | 
			
		||||
 | 
			
		||||
INSERT INTO `myaac_gallery` (`id`, `ordering`, `comment`, `image`, `thumb`, `author`) VALUES (NULL, 1, 'Demon', 'images/gallery/demon.jpg', 'images/gallery/demon_thumb.gif', 'MyAAC');
 | 
			
		||||
 | 
			
		||||
CREATE TABLE `myaac_settings`
 | 
			
		||||
(
 | 
			
		||||
	`id` int(11) NOT NULL AUTO_INCREMENT,
 | 
			
		||||
	`name` VARCHAR(255) NOT NULL DEFAULT '',
 | 
			
		||||
	`key` VARCHAR(255) NOT NULL DEFAULT '',
 | 
			
		||||
	`value` TEXT NOT NULL,
 | 
			
		||||
	PRIMARY KEY (`id`),
 | 
			
		||||
	KEY `key` (`key`)
 | 
			
		||||
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8;
 | 
			
		||||
 | 
			
		||||
CREATE TABLE `myaac_spells`
 | 
			
		||||
(
 | 
			
		||||
	`id` INT(11) NOT NULL AUTO_INCREMENT,
 | 
			
		||||
@@ -327,6 +272,7 @@ CREATE TABLE `myaac_visitors`
 | 
			
		||||
	`ip` VARCHAR(45) NOT NULL,
 | 
			
		||||
	`lastvisit` INT(11) NOT NULL DEFAULT 0,
 | 
			
		||||
	`page` VARCHAR(2048) NOT NULL,
 | 
			
		||||
	`user_agent` VARCHAR(255) NOT NULL DEFAULT '',
 | 
			
		||||
	UNIQUE (`ip`)
 | 
			
		||||
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -12,9 +12,7 @@ require SYSTEM . 'functions.php';
 | 
			
		||||
require BASE . 'install/includes/functions.php';
 | 
			
		||||
require BASE . 'install/includes/locale.php';
 | 
			
		||||
require SYSTEM . 'clients.conf.php';
 | 
			
		||||
 | 
			
		||||
if(file_exists(BASE . 'config.local.php'))
 | 
			
		||||
	require BASE . 'config.local.php';
 | 
			
		||||
require LIBS . 'Settings.php';
 | 
			
		||||
 | 
			
		||||
// ignore undefined index from Twig autoloader
 | 
			
		||||
$config['env'] = 'prod';
 | 
			
		||||
@@ -26,13 +24,13 @@ $twig = new Twig_Environment($twig_loader, array(
 | 
			
		||||
));
 | 
			
		||||
 | 
			
		||||
// load installation status
 | 
			
		||||
$step = isset($_POST['step']) ? $_POST['step'] : 'welcome';
 | 
			
		||||
$step = $_REQUEST['step'] ?? 'welcome';
 | 
			
		||||
 | 
			
		||||
$install_status = array();
 | 
			
		||||
if(file_exists(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'] : '';
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
@@ -70,7 +68,7 @@ if($step == 'database') {
 | 
			
		||||
 | 
			
		||||
		$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;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
@@ -91,14 +89,6 @@ if($step == 'database') {
 | 
			
		||||
				break;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		else if($key == 'mail_admin' && !Validator::email($value)) {
 | 
			
		||||
			$errors[] = $locale['step_config_mail_admin_error'];
 | 
			
		||||
			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())) {
 | 
			
		||||
			$errors[] = $locale['step_config_timezone_error'];
 | 
			
		||||
			break;
 | 
			
		||||
@@ -124,6 +114,7 @@ else if($step == 'admin') {
 | 
			
		||||
else if($step == 'finish') {
 | 
			
		||||
	$email = $_SESSION['var_email'];
 | 
			
		||||
	$password = $_SESSION['var_password'];
 | 
			
		||||
	$password_confirm = $_SESSION['var_password_confirm'];
 | 
			
		||||
	$player_name = $_SESSION['var_player_name'];
 | 
			
		||||
 | 
			
		||||
	// email check
 | 
			
		||||
@@ -165,6 +156,9 @@ else if($step == 'finish') {
 | 
			
		||||
	else if(!Validator::password($password)) {
 | 
			
		||||
		$errors[] = $locale['step_admin_password_error_format'];
 | 
			
		||||
	}
 | 
			
		||||
	else if($password != $password_confirm) {
 | 
			
		||||
		$errors[] = $locale['step_admin_password_confirm_error_not_same'];
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// player name check
 | 
			
		||||
	if(empty($player_name)) {
 | 
			
		||||
@@ -189,14 +183,14 @@ clearstatcache();
 | 
			
		||||
if(is_writable(CACHE) && (MYAAC_OS != 'WINDOWS' || win_is_writable(CACHE))) {
 | 
			
		||||
	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/>
 | 
			
		||||
		Your IP is:<br /><b>' . get_browser_real_ip() . '</b>', true);
 | 
			
		||||
		Your IP is:<br /><b>' . $_SERVER['REMOTE_ADDR'] . '</b>', true);
 | 
			
		||||
	}
 | 
			
		||||
	else {
 | 
			
		||||
		$file_content = trim(file_get_contents(BASE . 'install/ip.txt'));
 | 
			
		||||
		$allow = false;
 | 
			
		||||
		$listIP = preg_split('/\s+/', $file_content);
 | 
			
		||||
		foreach($listIP as $ip) {
 | 
			
		||||
			if(get_browser_real_ip() == $ip) {
 | 
			
		||||
			if($_SERVER['REMOTE_ADDR'] == $ip) {
 | 
			
		||||
				$allow = true;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,7 @@
 | 
			
		||||
<?php
 | 
			
		||||
defined('MYAAC') or die('Direct access not allowed!');
 | 
			
		||||
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 {
 | 
			
		||||
	unset($_SESSION['saved']);
 | 
			
		||||
 
 | 
			
		||||
@@ -2,8 +2,21 @@
 | 
			
		||||
defined('MYAAC') or die('Direct access not allowed!');
 | 
			
		||||
 | 
			
		||||
// 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 = [
 | 
			
		||||
	'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)
 | 
			
		||||
{
 | 
			
		||||
	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))
 | 
			
		||||
		echo ': <b>' . $info . '</b>';
 | 
			
		||||
 | 
			
		||||
	echo '</p>';
 | 
			
		||||
	echo '</div>';
 | 
			
		||||
	if(!$ok && !$warning)
 | 
			
		||||
		$failed = true;
 | 
			
		||||
}
 | 
			
		||||
@@ -27,12 +40,18 @@ $failed = false;
 | 
			
		||||
 | 
			
		||||
// start validating
 | 
			
		||||
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);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
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');
 | 
			
		||||
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']);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
if($failed)
 | 
			
		||||
{
 | 
			
		||||
	echo '<br/><b>' . $locale['step_requirements_failed'];
 | 
			
		||||
	echo next_form(true, false);
 | 
			
		||||
foreach ($extensions_optional as $ext => $errorMsg) {
 | 
			
		||||
	$loaded = extension_loaded($ext);
 | 
			
		||||
	version_check(str_replace('$EXTENSION$', strtoupper($ext), $locale['step_requirements_extension']) , $loaded, $loaded ? $locale['loaded'] : $locale['not_loaded'] . '. ' . $errorMsg, true);
 | 
			
		||||
}
 | 
			
		||||
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 '</div>';
 | 
			
		||||
?>
 | 
			
		||||
@@ -11,18 +11,12 @@ if(!isset($_SESSION['var_server_path'])) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
if(!$error) {
 | 
			
		||||
	$content = "<?php";
 | 
			
		||||
	$content .= PHP_EOL;
 | 
			
		||||
	$content .= '// place for your configuration directives, so you can later easily update myaac';
 | 
			
		||||
	$content .= PHP_EOL;
 | 
			
		||||
	$content .= '$config[\'installed\'] = true;';
 | 
			
		||||
	$content .= PHP_EOL;
 | 
			
		||||
	// by default, set env to prod
 | 
			
		||||
	// user can disable when he wants
 | 
			
		||||
	$content .= '$config[\'env\'] = \'prod\'; // dev or prod';
 | 
			
		||||
	$content .= PHP_EOL;
 | 
			
		||||
	$content .= '$config[\'mail_enabled\'] = true;';
 | 
			
		||||
	$content .= PHP_EOL;
 | 
			
		||||
	$configToSave = [
 | 
			
		||||
		// by default, set env to prod
 | 
			
		||||
		// user can disable when he wants
 | 
			
		||||
		'env' => 'prod',
 | 
			
		||||
	];
 | 
			
		||||
 | 
			
		||||
	foreach($_SESSION as $key => $value)
 | 
			
		||||
	{
 | 
			
		||||
		if(strpos($key, 'var_') !== false)
 | 
			
		||||
@@ -34,17 +28,16 @@ if(!$error) {
 | 
			
		||||
					$value .= '/';
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			if($key === 'var_usage') {
 | 
			
		||||
				$content .= '$config[\'anonymous_usage_statistics\'] = ' . ((int)$value == 1 ? 'true' : 'false') . ';';
 | 
			
		||||
				$content .= PHP_EOL;
 | 
			
		||||
			}
 | 
			
		||||
			else if(!in_array($key, array('var_account', 'var_account_id', 'var_password', 'var_step', 'var_email', 'var_player_name'), true)) {
 | 
			
		||||
				$content .= '$config[\'' . str_replace('var_', '', $key) . '\'] = \'' . $value . '\';';
 | 
			
		||||
				$content .= PHP_EOL;
 | 
			
		||||
			if(!in_array($key, ['var_usage', 'var_date_timezone', 'var_client', 'var_account', 'var_account_id', 'var_password', 'var_password_confirm', 'var_step', 'var_email', 'var_player_name'], true)) {
 | 
			
		||||
				$configToSave[str_replace('var_', '', $key)] = $value;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	$configToSave['gzip_output'] = false;
 | 
			
		||||
	$configToSave['cache_engine'] = 'auto';
 | 
			
		||||
	$configToSave['cache_prefix'] = 'myaac_' . generateRandomString(8, true, false, true);
 | 
			
		||||
 | 
			
		||||
	require BASE . 'install/includes/config.php';
 | 
			
		||||
 | 
			
		||||
	if(!$error) {
 | 
			
		||||
@@ -81,36 +74,17 @@ if(!$error) {
 | 
			
		||||
					'message' => $locale['loading_spinner']
 | 
			
		||||
				));
 | 
			
		||||
 | 
			
		||||
				if(!Validator::email($_SESSION['var_mail_admin'])) {
 | 
			
		||||
					error($locale['step_config_mail_admin_error']);
 | 
			
		||||
					$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 .= PHP_EOL;
 | 
			
		||||
				$content .= '$config[\'cache_prefix\'] = \'myaac_' . generateRandomString(8, true, false, true, false) . '_\';';
 | 
			
		||||
 | 
			
		||||
				$saved = true;
 | 
			
		||||
				if(!$error) {
 | 
			
		||||
					$saved = file_put_contents(BASE . 'config.local.php', $content);
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				$content = '';
 | 
			
		||||
				$saved = Settings::saveConfig($configToSave, BASE . 'config.local.php', $content);
 | 
			
		||||
				if($saved) {
 | 
			
		||||
					success($locale['step_database_config_saved']);
 | 
			
		||||
					if(!$error) {
 | 
			
		||||
						$_SESSION['saved'] = true;
 | 
			
		||||
					}
 | 
			
		||||
					$_SESSION['saved'] = true;
 | 
			
		||||
				}
 | 
			
		||||
				else {
 | 
			
		||||
					$_SESSION['config_content'] = $content;
 | 
			
		||||
					unset($_SESSION['saved']);
 | 
			
		||||
 | 
			
		||||
					$locale['step_database_error_file'] = str_replace('$FILE$', '<b>' . BASE . 'config.local.php</b>', $locale['step_database_error_file']);
 | 
			
		||||
					$locale['step_database_error_file'] = str_replace('$FILE$', '<b>' . BASE . 'config.php</b>', $locale['step_database_error_file']);
 | 
			
		||||
					error($locale['step_database_error_file'] . '<br/>
 | 
			
		||||
						<textarea cols="70" rows="10">' . $content . '</textarea>');
 | 
			
		||||
				}
 | 
			
		||||
@@ -120,8 +94,10 @@ if(!$error) {
 | 
			
		||||
}
 | 
			
		||||
?>
 | 
			
		||||
 | 
			
		||||
<form action="<?php echo BASE_URL; ?>install/" method="post">
 | 
			
		||||
	<input type="hidden" name="step" id="step" value="admin" />
 | 
			
		||||
	<?php echo next_buttons(true, !$error);
 | 
			
		||||
	?>
 | 
			
		||||
</form>
 | 
			
		||||
<div class="text-center m-3">
 | 
			
		||||
	<form action="<?php echo BASE_URL; ?>install/" method="post">
 | 
			
		||||
		<input type="hidden" name="step" id="step" value="admin" />
 | 
			
		||||
		<?php echo next_buttons(true, !$error);
 | 
			
		||||
		?>
 | 
			
		||||
	</form>
 | 
			
		||||
</div>
 | 
			
		||||
 
 | 
			
		||||
@@ -8,15 +8,14 @@ if(isset($config['installed']) && $config['installed'] && !isset($_SESSION['save
 | 
			
		||||
else {
 | 
			
		||||
	require SYSTEM . 'init.php';
 | 
			
		||||
	if(!$error) {
 | 
			
		||||
		if(USE_ACCOUNT_NAME)
 | 
			
		||||
		if(USE_ACCOUNT_NAME || USE_ACCOUNT_NUMBER)
 | 
			
		||||
			$account = isset($_SESSION['var_account']) ? $_SESSION['var_account'] : null;
 | 
			
		||||
		else
 | 
			
		||||
			$account_id = isset($_SESSION['var_account_id']) ? $_SESSION['var_account_id'] : null;
 | 
			
		||||
 | 
			
		||||
		$password = $_SESSION['var_password'];
 | 
			
		||||
 | 
			
		||||
		$config_salt_enabled = $db->hasColumn('accounts', 'salt');
 | 
			
		||||
		if($config_salt_enabled)
 | 
			
		||||
		if(USE_ACCOUNT_SALT)
 | 
			
		||||
		{
 | 
			
		||||
			$salt = generateRandomString(10, false, true, true);
 | 
			
		||||
			$password = $salt . $password;
 | 
			
		||||
@@ -74,13 +73,11 @@ else {
 | 
			
		||||
			$account_used = &$new_account;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if($config_salt_enabled)
 | 
			
		||||
		if(USE_ACCOUNT_SALT)
 | 
			
		||||
			$account_used->setCustomField('salt', $salt);
 | 
			
		||||
 | 
			
		||||
		$account_used->setCustomField('web_flags', FLAG_ADMIN + FLAG_SUPER_ADMIN);
 | 
			
		||||
		$account_used->setCustomField('country', 'us');
 | 
			
		||||
		$account_used->setCustomField('email_verified', 1);
 | 
			
		||||
 | 
			
		||||
		if($db->hasColumn('accounts', 'group_id'))
 | 
			
		||||
			$account_used->setCustomField('group_id', $groups->getHighestId());
 | 
			
		||||
		if($db->hasColumn('accounts', 'type'))
 | 
			
		||||
@@ -119,24 +116,44 @@ else {
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		$settings = Settings::getInstance();
 | 
			
		||||
		foreach($_SESSION as $key => $value) {
 | 
			
		||||
			if (in_array($key, ['var_usage', 'var_date_timezone', 'var_client'])) {
 | 
			
		||||
				if ($key == 'var_usage') {
 | 
			
		||||
					$key = 'anonymous_usage_statistics';
 | 
			
		||||
					$value = ((int)$value == 1 ? 'true' : 'false');
 | 
			
		||||
				} elseif ($key == 'var_date_timezone') {
 | 
			
		||||
					$key = 'date_timezone';
 | 
			
		||||
				} elseif ($key == 'var_client') {
 | 
			
		||||
					$key = 'client';
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				$settings->updateInDatabase('core', $key, $value);
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		success('Settings saved.');
 | 
			
		||||
 | 
			
		||||
		$twig->display('install.installer.html.twig', array(
 | 
			
		||||
			'url' => 'tools/7-finish.php',
 | 
			
		||||
			'message' => $locale['importing_spinner']
 | 
			
		||||
		));
 | 
			
		||||
 | 
			
		||||
		if(!isset($_SESSION['installed'])) {
 | 
			
		||||
			$report_url = 'https://my-aac.org/report_install.php?v=' . MYAAC_VERSION . '&b=' . urlencode(BASE_URL);
 | 
			
		||||
			if (function_exists('curl_version'))
 | 
			
		||||
			{
 | 
			
		||||
				$curl = curl_init();
 | 
			
		||||
				curl_setopt($curl, CURLOPT_URL, $report_url);
 | 
			
		||||
				curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
 | 
			
		||||
				curl_exec($curl);
 | 
			
		||||
				curl_close($curl);
 | 
			
		||||
			}
 | 
			
		||||
			else if (ini_get('allow_url_fopen') ) {
 | 
			
		||||
				file_get_contents($report_url);
 | 
			
		||||
			if (!array_key_exists('CI', getenv())) {
 | 
			
		||||
				$report_url = 'https://my-aac.org/report_install.php?v=' . MYAAC_VERSION . '&b=' . urlencode(BASE_URL);
 | 
			
		||||
				if (function_exists('curl_version'))
 | 
			
		||||
				{
 | 
			
		||||
					$curl = curl_init();
 | 
			
		||||
					curl_setopt($curl, CURLOPT_URL, $report_url);
 | 
			
		||||
					curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
 | 
			
		||||
					curl_exec($curl);
 | 
			
		||||
					curl_close($curl);
 | 
			
		||||
				}
 | 
			
		||||
				else if (ini_get('allow_url_fopen') ) {
 | 
			
		||||
					file_get_contents($report_url);
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			$_SESSION['installed'] = true;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,299 +1,13 @@
 | 
			
		||||
* {
 | 
			
		||||
	margin: 0; padding: 0;
 | 
			
		||||
}
 | 
			
		||||
@import url('https://fonts.googleapis.com/css2?family=Roboto:wght@100;300;400&display=swap');
 | 
			
		||||
 | 
			
		||||
body {
 | 
			
		||||
	text-align: center;
 | 
			
		||||
	font: 12px Verdana;
 | 
			
		||||
	color: #000000;
 | 
			
		||||
	background-color: #000000;
 | 
			
		||||
}
 | 
			
		||||
img {
 | 
			
		||||
	border: 0;
 | 
			
		||||
    font-family: 'Roboto', sans-serif;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.break {
 | 
			
		||||
	font-size: 0;
 | 
			
		||||
	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;
 | 
			
		||||
h1{
 | 
			
		||||
    font-weight: 100 !important;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/** BEGIN wrapper **/
 | 
			
		||||
#wrapper {
 | 
			
		||||
	background: #ffffff url(images/background.jpg) repeat-x 0 0;
 | 
			
		||||
	width: 980px;
 | 
			
		||||
h3 {
 | 
			
		||||
    font-weight: 300 !important;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#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,48 +1,74 @@
 | 
			
		||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 | 
			
		||||
<html xmlns="http://www.w3.org/1999/xhtml" dir="<?php echo $locale['direction']; ?>" lang="<?php echo $locale['lang']; ?>" xml:lang="<?php echo $locale['lang']; ?>">
 | 
			
		||||
<!DOCTYPE html>
 | 
			
		||||
<html dir="<?php echo $locale['direction']; ?>" lang="<?php echo $locale['lang']; ?>" xml:lang="<?php echo $locale['lang']; ?>">
 | 
			
		||||
<head>
 | 
			
		||||
	<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>
 | 
			
		||||
	<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" />
 | 
			
		||||
	<script type="text/javascript" src="<?php echo BASE_URL; ?>tools/js/jquery.min.js"></script>
 | 
			
		||||
</head>
 | 
			
		||||
<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">
 | 
			
		||||
					<h2><?php echo $locale['steps']; ?></h2>
 | 
			
		||||
					<ul>
 | 
			
		||||
						<?php
 | 
			
		||||
							$i = 0;
 | 
			
		||||
							foreach($steps as $key => $value)
 | 
			
		||||
								echo '<li' . ($step == $value ? ' class="current"' : '') . '>' . ++$i . '. ' . $locale['step_' . $value] . '</li>';
 | 
			
		||||
						?>
 | 
			
		||||
					</ul>
 | 
			
		||||
				</div>
 | 
			
		||||
		<header id="header" class="pt-5 pb-4 pb-sm-5">
 | 
			
		||||
			<h1>MyAAC <?php echo $locale['installation']; ?></h1>
 | 
			
		||||
		</header>
 | 
			
		||||
 | 
			
		||||
				<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
 | 
			
		||||
						if(isset($locale['step_' . $step . '_title']))
 | 
			
		||||
							echo '<h1>' . $locale['step_' . $step . '_title'] . '</h1>';
 | 
			
		||||
						else
 | 
			
		||||
							echo '<h1>' . $locale['step_' . $step] . '</h1>';
 | 
			
		||||
						echo $content;
 | 
			
		||||
						$i = 0;
 | 
			
		||||
						foreach($steps as $key => $value){
 | 
			
		||||
 | 
			
		||||
							if ($step == $value) {
 | 
			
		||||
								$progress = ($i == 6) ? 100 : $i * 16;
 | 
			
		||||
							}
 | 
			
		||||
 | 
			
		||||
							echo '<li class="list-group-item' . ($step == $value ? ' active' : '') . '">' . ++$i . '. ' . $locale['step_' . $value] . '</li>';
 | 
			
		||||
						}
 | 
			
		||||
 | 
			
		||||
					?>
 | 
			
		||||
				</div>
 | 
			
		||||
 | 
			
		||||
				<div class="break"></div>
 | 
			
		||||
				</ul>
 | 
			
		||||
			</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 id="footer">
 | 
			
		||||
	<footer id="footer" class="p-4">
 | 
			
		||||
		<p style="text-align: center;"><?php echo base64_decode('UG93ZXJlZCBieSA8YSBocmVmPSJodHRwOi8vbXktYWFjLm9yZyIgdGFyZ2V0PSJfYmxhbmsiPk15QUFDLjwvYT4='); ?></p>
 | 
			
		||||
	</div>
 | 
			
		||||
	</footer>
 | 
			
		||||
</body>
 | 
			
		||||
</html>
 | 
			
		||||
@@ -11,10 +11,8 @@ $error = false;
 | 
			
		||||
require BASE . 'install/includes/config.php';
 | 
			
		||||
 | 
			
		||||
ini_set('max_execution_time', 300);
 | 
			
		||||
 | 
			
		||||
@ob_end_flush();
 | 
			
		||||
ob_implicit_flush();
 | 
			
		||||
 | 
			
		||||
ob_end_flush();
 | 
			
		||||
header('X-Accel-Buffering: no');
 | 
			
		||||
 | 
			
		||||
if(!$error) {
 | 
			
		||||
@@ -58,7 +56,7 @@ else {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
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...');
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||