bl2tools/bl2tools/views.py

111 lines
2.5 KiB
Python

from izzylib import DotDict
from izzylib_http_async.server.error import NotFound
from izzylib_http_async.server.view import View
from . import tpl_path
class BaseView(View):
def get_save(self, saveid):
try:
return self.app.get_save_by_id(saveid)
except KeyError as e:
raise NotFound(e)
def get_data(self, save):
data = DotDict(save.props.to_dict())
data['xp'] = f'{data.xp:,d}'
data['money'] = f'${data.money:,d}'
data['path'] = save.path
data['filename'] = save.path.name
data['character_class'] = save.character_class.name
data['eridium'] = save.eridium
data['readonly'] = save.path.permissions()['user'] == 4
return data
class Home(BaseView):
__path__ = ['/']
async def get(self, request, response):
response.set_template('home.haml')
class Style(BaseView):
__path__ = ['/style.css']
async def get(self, request, response):
response.set_template('style.css', content_type='text/css')
class Javascript(BaseView):
__path__ = ['/functions.js']
jspath = tpl_path.join('functions.js')
jsfile = None
last_mod = 0
async def get(self, request, response):
if not self.jsfile or self.last_mod < self.jspath.mtime:
self.last_mod = self.jspath.mtime
with self.jspath.open('r') as fd:
self.jsfile = fd.read()
response.body = self.jsfile
response.content_type = 'application/javascript'
class ApiList(BaseView):
__path__ = ['/api/list']
async def get(self, request, response):
save_list = {save.id for save in self.app.saves}
response.set_json(list(save_list))
class ApiSave(BaseView):
__path__ = ['/api/save/{saveid:int}']
async def get(self, request, response, saveid):
save = self.get_save(saveid)
data = self.get_data(save)
return response.set_json(data)
class ApiSaveToggle(BaseView):
__path__ = ['/api/save/{saveid:int}/toggle']
async def get(self, request, response, saveid):
save = self.get_save(saveid)
readonly = save.path.permissions()['user'] == 4
if readonly:
save.path.chmod(644)
else:
save.path.chmod(444)
return response.set_json({'readonly': not readonly})
class ApiSaveHtml(BaseView):
__path__ = ['/api/save/{saveid:int}/html']
async def get(self, request, response, saveid):
save = self.get_save(saveid)
data = self.get_data(save)
return response.set_template('save.haml', {'save': data})
class ApiSaveReload(BaseView):
__path__ = ['/api/save/{saveid:int}/reload']
async def get(self, request, response, saveid):
save = self.get_save(saveid)
save.reload()
return response.set_json(self.get_data(save))