From ddc7be079433b27ee22439445ea27cac474de5e5 Mon Sep 17 00:00:00 2001 From: Fabian Dill Date: Sat, 13 Jun 2020 22:49:57 +0200 Subject: [PATCH] update webhost --- MultiServer.py | 17 +++++++++++++---- WebHost/__init__.py | 16 ++++------------ WebHost/templates/host_multidata.html | 6 +----- WebHost/templates/upload_multidata.html | 7 +++++++ host.yaml | 2 ++ 5 files changed, 27 insertions(+), 21 deletions(-) create mode 100644 WebHost/templates/upload_multidata.html diff --git a/MultiServer.py b/MultiServer.py index e66d09b0..99082025 100644 --- a/MultiServer.py +++ b/MultiServer.py @@ -57,7 +57,7 @@ class Client(Endpoint): class Context(Node): def __init__(self, host: str, port: int, password: str, location_check_points: int, hint_cost: int, - item_cheat: bool, forfeit_mode: str = "disabled", remaining_mode: str = "disabled"): + item_cheat: bool, forfeit_mode: str = "disabled", remaining_mode: str = "disabled", auto_shutdown=0): super(Context, self).__init__() self.data_filename = None self.save_filename = None @@ -88,7 +88,9 @@ class Context(Node): typing.Tuple[int, int], datetime.datetime] = {} # datetime of last connection self.client_game_state: typing.Dict[typing.Tuple[int, int], int] = collections.defaultdict(int) self.er_hint_data: typing.Dict[int, typing.Dict[int, str]] = {} + self.auto_shutdown = 0 self.commandprocessor = ServerCommandProcessor(self) + self.embedded_blacklist = {"host", "port"} def load(self, multidatapath: str, use_embedded_server_options: bool = False): with open(multidatapath, 'rb') as f: @@ -111,10 +113,10 @@ class Context(Node): self._set_options(server_options) def _set_options(self, server_options: dict): - blacklist = {"host", "port"} + sentinel = object() for key, value in server_options.items(): - if key not in blacklist: + if key not in self.blacklist: current = getattr(self, key, sentinel) if current is not sentinel: logging.debug(f"Setting server option {key} to {value} from supplied multidata") @@ -1061,6 +1063,9 @@ def parse_args() -> argparse.Namespace: disabled: !remaining is never available goal: !remaining can be used after goal completion ''') + parser.add_argument('--auto_shutdown', default=defaults["auto_shutdown"], type=int, + help="automatically shut down the server after this many minutes without new location checks. " + "0 to keep running. Not yet implemented.") parser.add_argument('--use_embedded_options', action="store_true", help='retrieve forfeit, remaining and hint options from the multidata file,' ' instead of host.yaml') @@ -1068,11 +1073,15 @@ def parse_args() -> argparse.Namespace: return args +async def auto_shutdown(ctx): + # to be implemented soon + pass + async def main(args: argparse.Namespace): logging.basicConfig(format='[%(asctime)s] %(message)s', level=getattr(logging, args.loglevel.upper(), logging.INFO)) ctx = Context(args.host, args.port, args.password, args.location_check_points, args.hint_cost, - not args.disable_item_cheat, args.forfeit_mode, args.remaining_mode) + not args.disable_item_cheat, args.forfeit_mode, args.remaining_mode, args.auto_shutdown) data_filename = args.multidata diff --git a/WebHost/__init__.py b/WebHost/__init__.py index ced69721..23b64c75 100644 --- a/WebHost/__init__.py +++ b/WebHost/__init__.py @@ -49,7 +49,7 @@ class Multiworld(): def start(self): if self.process and self.process.is_alive(): - return + return False logging.info(f"Spinning up {self.multidata}") self.process = multiprocessing.Process(group=None, target=run_server_process, args=(self.port, self.multidata), @@ -82,15 +82,7 @@ def upload_multidata(): file.save(os.path.join(multidata_folder, filename)) return redirect(url_for('host_multidata', filename=filename)) - return ''' - - Upload Multidata -

Upload Multidata

-
- - -
- ''' + return render_template("upload_multidata.html") portlock = threading.Lock() @@ -147,13 +139,13 @@ def run_server_process(port: int, multidata: str): ctx = Context("", port, "", 1, 1000, True, "enabled", "goal") ctx.load(multidata, True) + ctx.auto_shutdown = 24 * 60 * 60 # 24 hours ctx.init_save() ctx.server = websockets.serve(functools.partial(server, ctx=ctx), ctx.host, ctx.port, ping_timeout=None, ping_interval=None) - logging.info('Hosting game at %s:%d (%s)' % (name, ctx.port, - 'No password' if not ctx.password else 'Password: %s' % ctx.password)) + logging.info(f'Hosting game at {name}:{ctx.port} (Password: {bool(ctx.password)})') await ctx.server while ctx.running: await asyncio.sleep(1) diff --git a/WebHost/templates/host_multidata.html b/WebHost/templates/host_multidata.html index 30c75925..43213471 100644 --- a/WebHost/templates/host_multidata.html +++ b/WebHost/templates/host_multidata.html @@ -13,7 +13,7 @@ Hosting {{ filename }} at {{ name }}:{{ port }} xmlhttp.onreadystatechange = function () { if (this.readyState == 4 && this.status == 200) { - myFunction(this.responseText); + document.getElementById("logger").innerText = this.responseText; } }; @@ -23,10 +23,6 @@ Hosting {{ filename }} at {{ name }}:{{ port }} } - function myFunction(text) { - document.getElementById("logger").innerText = text; - } - request_new(); window.setInterval(request_new, 3000); diff --git a/WebHost/templates/upload_multidata.html b/WebHost/templates/upload_multidata.html new file mode 100644 index 00000000..95ceed6a --- /dev/null +++ b/WebHost/templates/upload_multidata.html @@ -0,0 +1,7 @@ + +Upload Multidata +

Upload Multidata

+
+ + +
\ No newline at end of file diff --git a/host.yaml b/host.yaml index bb54f3ef..fc599569 100644 --- a/host.yaml +++ b/host.yaml @@ -34,6 +34,8 @@ server_options: # "goal" -> client can ask for remaining items after goal completion # warning: only Berserker's Multiworld clients of version 2.1+ send game beaten information remaining_mode: "goal" + # automatically shut down the server after this many minutes without new location checks, 0 to keep running + auto_shutdown: 0 #options for MultiMystery.py multi_mystery_options: #teams, however, note that there is currently no way to supply names for teams 2+ through MultiMystery