desktop support
This commit is contained in:
		@@ -1,10 +1,24 @@
 | 
			
		||||
import logging
 | 
			
		||||
import os
 | 
			
		||||
import pathlib
 | 
			
		||||
import sys
 | 
			
		||||
 | 
			
		||||
import flask
 | 
			
		||||
import redis
 | 
			
		||||
 | 
			
		||||
app = flask.Flask("seagull-game", root_path="/app")
 | 
			
		||||
log = logging.getLogger()
 | 
			
		||||
pipe_stderr = logging.StreamHandler(sys.stderr)
 | 
			
		||||
pipe_stderr.setLevel(logging.DEBUG)
 | 
			
		||||
log.addHandler(pipe_stderr)
 | 
			
		||||
 | 
			
		||||
if getattr(sys, "frozen", False):
 | 
			
		||||
    path_appdir = pathlib.Path(sys._MEIPASS)
 | 
			
		||||
else:
 | 
			
		||||
    path_appdir = pathlib.Path.cwd()
 | 
			
		||||
log.critical(path_appdir)
 | 
			
		||||
 | 
			
		||||
desktop_mode = False
 | 
			
		||||
 | 
			
		||||
app = flask.Flask("seagull-game", root_path=path_appdir)
 | 
			
		||||
orig_url_for = app.url_for
 | 
			
		||||
 | 
			
		||||
#REDIS_HOST="stub-implementation.example.net"
 | 
			
		||||
@@ -16,9 +30,8 @@ orig_url_for = app.url_for
 | 
			
		||||
def url_for_override(endpoint, *posargs, _anchor=None, _method=None, _scheme=None, _external=None, self=app, **values):
 | 
			
		||||
    if endpoint == "static":
 | 
			
		||||
        # bandaid for #1
 | 
			
		||||
        if not os.path.exists("/app/static/" + values["filename"]):
 | 
			
		||||
            sys.stderr.write("WARN:: requested {0} from local file, but it doesn't exist in this container. Redirecting to CDN...\n".format(values["filename"]))
 | 
			
		||||
            sys.stderr.flush()
 | 
			
		||||
        if not os.path.exists(path_appdir / "static" / values["filename"]):
 | 
			
		||||
            log.warning("requested {0} from local file, but it doesn't exist in this container. Redirecting to CDN...\n".format(values["filename"]))
 | 
			
		||||
            return "https://cdn.otl-hga.net/seagull/" + values["filename"]
 | 
			
		||||
    
 | 
			
		||||
    return orig_url_for(endpoint, *posargs, _anchor=_anchor, _method=_method, _scheme=_scheme, _external=_external, **values)
 | 
			
		||||
@@ -51,5 +64,5 @@ def render_base_context():
 | 
			
		||||
    base_context_live = True
 | 
			
		||||
 | 
			
		||||
@app.route("/core/ping")
 | 
			
		||||
def aws_healthcheck_ping():
 | 
			
		||||
def healthcheck_ping():
 | 
			
		||||
    return flask.Response("OK", content_type="text/plain")
 | 
			
		||||
							
								
								
									
										32
									
								
								app/pylocal/desktop.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								app/pylocal/desktop.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,32 @@
 | 
			
		||||
import pathlib
 | 
			
		||||
 | 
			
		||||
from . import core
 | 
			
		||||
 | 
			
		||||
path_storagedir = pathlib.Path()
 | 
			
		||||
 | 
			
		||||
class JS_API:
 | 
			
		||||
    debug_mode = False
 | 
			
		||||
 | 
			
		||||
    def load_data(self, key):
 | 
			
		||||
        if not (path_storagedir / key).exists():
 | 
			
		||||
            return None
 | 
			
		||||
 | 
			
		||||
        with open(path_storagedir / key) as fd_datafile:
 | 
			
		||||
            try:
 | 
			
		||||
                return fd_datafile.read()
 | 
			
		||||
            except Exception as exc:
 | 
			
		||||
                core.log.error(f"problem loading {key} (from {path_storagedir}): {exc}")
 | 
			
		||||
                return None
 | 
			
		||||
    
 | 
			
		||||
    def save_data(self, key, data):
 | 
			
		||||
        with open(path_storagedir / key, "w") as fd_datafile:
 | 
			
		||||
            try:
 | 
			
		||||
                fd_datafile.write(data)
 | 
			
		||||
            except Exception as exc:
 | 
			
		||||
                core.log.error(f"problem saving {key} (to {path_storagedir}): {exc}")
 | 
			
		||||
 | 
			
		||||
    def delete_data(self, key):
 | 
			
		||||
        if (path_storagedir / key).exists():
 | 
			
		||||
            (path_storagedir / key).unlink()
 | 
			
		||||
 | 
			
		||||
api = JS_API()
 | 
			
		||||
							
								
								
									
										7
									
								
								app/pylocal/dev.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								app/pylocal/dev.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,7 @@
 | 
			
		||||
import flask
 | 
			
		||||
 | 
			
		||||
from . import core
 | 
			
		||||
 | 
			
		||||
@core.app.route("/dev/get-toolbox")
 | 
			
		||||
def dev_toolbox():
 | 
			
		||||
    return flask.render_template("dev_toolbox.j2", ipaddr=flask.request.remote_addr, desktop=core.desktop_mode)
 | 
			
		||||
@@ -7,7 +7,11 @@ import flask
 | 
			
		||||
from . import core
 | 
			
		||||
 | 
			
		||||
def generate_flavor_text():
 | 
			
		||||
    proc_rant = subprocess.run(["rant", "/app/rant/flavor.rant"], capture_output=True)
 | 
			
		||||
    if core.desktop_mode:
 | 
			
		||||
        rant_path = core.path_appdir / "opt/rant/bin/rant"
 | 
			
		||||
    else:
 | 
			
		||||
        rant_path = "rant" # rely on OS PATH
 | 
			
		||||
    proc_rant = subprocess.run([rant_path, (core.path_appdir / "rant/flavor.rant").as_posix()], capture_output=True)
 | 
			
		||||
    return proc_rant.stdout.decode()
 | 
			
		||||
 | 
			
		||||
class TickEvent(object):
 | 
			
		||||
@@ -36,11 +40,13 @@ def tick():
 | 
			
		||||
    result["event_type"] = random.choices(ticktypes, weights=tickweights)[0]
 | 
			
		||||
 | 
			
		||||
    match result["event_type"]:
 | 
			
		||||
        case 0:
 | 
			
		||||
            pass
 | 
			
		||||
        case 1: # FLAVOR
 | 
			
		||||
            result["log"] = generate_flavor_text()
 | 
			
		||||
        case 10: # ENCHUMAN
 | 
			
		||||
            result["items"] = [] # TODO: implement items
 | 
			
		||||
            result["items"] = {} # TODO: implement items
 | 
			
		||||
        case _:
 | 
			
		||||
            print("undefined tick: {0}".format(result["event_type"]))
 | 
			
		||||
            core.log.warning("undefined tick: {0}".format(result["event_type"]))
 | 
			
		||||
 | 
			
		||||
    return flask.Response(json.dumps(result), status=200, content_type="application/json")
 | 
			
		||||
		Reference in New Issue
	
	Block a user