| 
									
										
										
										
											2020-07-27 05:04:49 +02:00
										 |  |  | import base64 | 
					
						
							| 
									
										
										
										
											2022-10-17 01:08:31 +02:00
										 |  |  | import os | 
					
						
							| 
									
										
										
										
											2020-12-05 00:43:18 +01:00
										 |  |  | import socket | 
					
						
							| 
									
										
										
										
											2022-10-17 01:08:31 +02:00
										 |  |  | import uuid | 
					
						
							| 
									
										
										
										
											2020-06-13 08:37:05 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-07 18:28:50 +02:00
										 |  |  | from flask import Flask | 
					
						
							| 
									
										
										
										
											2020-06-21 15:32:31 +02:00
										 |  |  | from flask_caching import Cache | 
					
						
							| 
									
										
										
										
											2020-06-30 07:32:05 +02:00
										 |  |  | from flask_compress import Compress | 
					
						
							| 
									
										
										
										
											2022-10-17 01:08:31 +02:00
										 |  |  | from pony.flask import Pony | 
					
						
							| 
									
										
										
										
											2022-08-07 18:28:50 +02:00
										 |  |  | from werkzeug.routing import BaseConverter | 
					
						
							| 
									
										
										
										
											2020-06-16 11:26:54 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-09 22:21:45 +02:00
										 |  |  | from Utils import title_sorted | 
					
						
							| 
									
										
										
										
											2020-06-16 11:26:54 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-06-14 09:45:23 +02:00
										 |  |  | UPLOAD_FOLDER = os.path.relpath('uploads') | 
					
						
							|  |  |  | LOGS_FOLDER = os.path.relpath('logs') | 
					
						
							| 
									
										
										
										
											2020-06-13 10:16:29 +02:00
										 |  |  | os.makedirs(LOGS_FOLDER, exist_ok=True) | 
					
						
							| 
									
										
										
										
											2020-06-13 08:37:05 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | app = Flask(__name__) | 
					
						
							| 
									
										
										
										
											2020-06-20 20:03:06 +02:00
										 |  |  | Pony(app) | 
					
						
							| 
									
										
										
										
											2020-06-21 15:32:31 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-25 22:40:24 +02:00
										 |  |  | app.jinja_env.filters['any'] = any | 
					
						
							|  |  |  | app.jinja_env.filters['all'] = all | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-12-13 05:48:33 +01:00
										 |  |  | app.config["SELFHOST"] = True  # application process is in charge of running the websites | 
					
						
							| 
									
										
										
										
											2020-08-18 01:18:37 +02:00
										 |  |  | app.config["GENERATORS"] = 8  # maximum concurrent world gens | 
					
						
							| 
									
										
										
										
											2021-12-13 05:48:33 +01:00
										 |  |  | app.config["SELFLAUNCH"] = True  # application process is in charge of launching Rooms. | 
					
						
							| 
									
										
										
										
											2023-01-21 17:29:27 +01:00
										 |  |  | app.config["SELFLAUNCHCERT"] = None  # can point to a SSL Certificate to encrypt Room websocket connections | 
					
						
							|  |  |  | app.config["SELFLAUNCHKEY"] = None  # can point to a SSL Certificate Key to encrypt Room websocket connections | 
					
						
							| 
									
										
										
										
											2021-12-13 05:48:33 +01:00
										 |  |  | app.config["SELFGEN"] = True  # application process is in charge of scheduling Generations. | 
					
						
							| 
									
										
										
										
											2020-07-10 15:32:58 +02:00
										 |  |  | app.config["DEBUG"] = False | 
					
						
							|  |  |  | app.config["PORT"] = 80 | 
					
						
							| 
									
										
										
										
											2020-06-13 08:37:05 +02:00
										 |  |  | app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER | 
					
						
							| 
									
										
										
										
											2021-10-16 20:11:26 +02:00
										 |  |  | app.config['MAX_CONTENT_LENGTH'] = 64 * 1024 * 1024  # 64 megabyte limit | 
					
						
							| 
									
										
										
										
											2020-12-05 00:43:18 +01:00
										 |  |  | # if you want to deploy, make sure you have a non-guessable secret key | 
					
						
							|  |  |  | app.config["SECRET_KEY"] = bytes(socket.gethostname(), encoding="utf-8") | 
					
						
							| 
									
										
										
										
											2022-11-06 21:37:11 +01:00
										 |  |  | # at what amount of worlds should scheduling be used, instead of rolling in the web-thread | 
					
						
							| 
									
										
										
										
											2023-04-30 07:13:24 +02:00
										 |  |  | app.config["JOB_THRESHOLD"] = 1 | 
					
						
							| 
									
										
										
										
											2022-11-06 21:37:11 +01:00
										 |  |  | # after what time in seconds should generation be aborted, freeing the queue slot. Can be set to None to disable. | 
					
						
							|  |  |  | app.config["JOB_TIME"] = 600 | 
					
						
							| 
									
										
										
										
											2020-06-20 20:03:06 +02:00
										 |  |  | app.config['SESSION_PERMANENT'] = True | 
					
						
							| 
									
										
										
										
											2020-07-27 04:05:42 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | # waitress uses one thread for I/O, these are for processing of views that then get sent | 
					
						
							| 
									
										
										
										
											2021-01-03 14:32:32 +01:00
										 |  |  | # archipelago.gg uses gunicorn + nginx; ignoring this option | 
					
						
							| 
									
										
										
										
											2020-07-27 04:05:42 +02:00
										 |  |  | app.config["WAITRESS_THREADS"] = 10 | 
					
						
							| 
									
										
										
										
											2021-01-03 14:32:32 +01:00
										 |  |  | # a default that just works. archipelago.gg runs on mariadb | 
					
						
							| 
									
										
										
										
											2020-06-14 07:44:59 +02:00
										 |  |  | app.config["PONY"] = { | 
					
						
							|  |  |  |     'provider': 'sqlite', | 
					
						
							| 
									
										
										
										
											2021-03-13 23:36:57 +01:00
										 |  |  |     'filename': os.path.abspath('ap.db3'), | 
					
						
							| 
									
										
										
										
											2020-06-14 07:44:59 +02:00
										 |  |  |     'create_db': True | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2020-08-02 22:11:52 +02:00
										 |  |  | app.config["MAX_ROLL"] = 20 | 
					
						
							| 
									
										
										
										
											2023-09-09 05:02:05 +02:00
										 |  |  | app.config["CACHE_TYPE"] = "SimpleCache" | 
					
						
							| 
									
										
										
										
											2023-03-09 21:31:00 +01:00
										 |  |  | app.config["HOST_ADDRESS"] = "" | 
					
						
							| 
									
										
										
										
											2024-04-20 20:58:56 -04:00
										 |  |  | app.config["ASSET_RIGHTS"] = False | 
					
						
							| 
									
										
										
										
											2020-11-03 05:26:10 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-09-09 05:02:05 +02:00
										 |  |  | cache = Cache() | 
					
						
							| 
									
										
										
										
											2020-06-30 07:32:05 +02:00
										 |  |  | Compress(app) | 
					
						
							| 
									
										
										
										
											2020-06-13 08:37:05 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-27 05:04:49 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | class B64UUIDConverter(BaseConverter): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def to_python(self, value): | 
					
						
							|  |  |  |         return uuid.UUID(bytes=base64.urlsafe_b64decode(value + '==')) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def to_url(self, value): | 
					
						
							|  |  |  |         return base64.urlsafe_b64encode(value.bytes).rstrip(b'=').decode('ascii') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # short UUID | 
					
						
							|  |  |  | app.url_map.converters["suuid"] = B64UUIDConverter | 
					
						
							|  |  |  | app.jinja_env.filters['suuid'] = lambda value: base64.urlsafe_b64encode(value.bytes).rstrip(b'=').decode('ascii') | 
					
						
							| 
									
										
										
										
											2022-08-09 22:21:45 +02:00
										 |  |  | app.jinja_env.filters["title_sorted"] = title_sorted | 
					
						
							| 
									
										
										
										
											2020-06-13 08:37:05 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-04-05 01:14:30 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-07 18:28:50 +02:00
										 |  |  | def register(): | 
					
						
							|  |  |  |     """Import submodules, triggering their registering on flask routing.
 | 
					
						
							|  |  |  |     Note: initializes worlds subsystem."""
 | 
					
						
							|  |  |  |     # has automatic patch integration | 
					
						
							| 
									
										
										
										
											2022-09-30 00:36:30 +02:00
										 |  |  |     import worlds.AutoWorld | 
					
						
							|  |  |  |     import worlds.Files | 
					
						
							|  |  |  |     app.jinja_env.filters['supports_apdeltapatch'] = lambda game_name: \ | 
					
						
							|  |  |  |         game_name in worlds.Files.AutoPatchRegister.patch_types | 
					
						
							| 
									
										
										
										
											2022-04-05 01:14:30 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-07 18:28:50 +02:00
										 |  |  |     from WebHostLib.customserver import run_server_process | 
					
						
							|  |  |  |     # to trigger app routing picking up on it | 
					
						
							| 
									
										
										
										
											2024-04-20 20:58:56 -04:00
										 |  |  |     from . import tracker, upload, landing, check, generate, downloads, api, stats, misc, robots | 
					
						
							| 
									
										
										
										
											2021-07-24 23:09:34 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-07 18:28:50 +02:00
										 |  |  |     app.register_blueprint(api.api_endpoints) |