bl2tools/bl2tools/server.py
2022-04-23 16:27:48 -04:00

99 lines
2.3 KiB
Python

import sys
from bl2_save_edit import Bl2Save
from izzylib import Path, Url, logging
from izzylib_http_async.server.application import Application
from izzylib_http_async.server.error import Forbidden
from . import views, tpl_path
from .functions import get_save_path
class Server(Application):
def __init__(self, listen='0.0.0.0', port=8080, save_path=None, access_log=False):
options = dict(
appname = 'bl2tools',
name = 'BL2 Tools',
title = 'BL2 Tools',
version = '0.1.0',
git_repo = 'https://git.barkshark.xyz/izaliamae/bl2tools',
listen = listen,
port = port,
access_log = access_log,
tpl_search = [tpl_path]
)
if hasattr(sys, 'frozen'):
options['frontend_path'] = Path(sys._MEIPASS).join('izzylib_frontend')
Application.__init__(self, **options)
self.saves = []
self.save_path = save_path or get_save_path()
## Frontend paths
self.add_view(views.Home)
self.add_view(views.Style)
self.add_view(views.Javascript)
## Api paths
self.add_view(views.ApiList)
self.add_view(views.ApiSave)
self.add_view(views.ApiSaveToggle)
self.add_view(views.ApiSaveHtml)
self.add_view(views.ApiSaveReload)
self.add_middleware(check_address_type)
self.read_saves()
def get_save(self, key, value):
for save in self.saves:
if save[key] == value:
return save
raise KeyError(f'Cannot find save: {key} = {value}')
def get_save_by_id(self, saveid):
return self.get_save('id', saveid)
def get_save_by_filename(self, filename):
for save in self.saves:
if save.path.name == filename:
return save
raise KeyError(f'Cannot find save with filename: {filename}')
def read_saves(self):
for path in self.save_path.listdir(False):
if not path.endswith('sav'):
continue
save = Bl2Save(path)
try:
save_id = int(save.path.stem[4:], 16)
if save_id != save.id:
logging.warning('Save ID does not match savefile:', repr(save))
save.id = save_id
except ValueError:
pass
if int(save.path.permissions()) not in [644, 444]:
save.path.chmod(644)
self.saves.append(save)
async def check_address_type(request):
if not any([request.remote.private, request.remote.loopback]):
raise Forbidden('Only private access allowed')
if request.path.startswith('/api') or request.path.endswith(('js', 'css')):
request.log = False