99 lines
2.3 KiB
Python
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
|