This commit is contained in:
Izalia Mae 2022-04-23 16:27:48 -04:00
parent 828dc59387
commit d4944946b8
5 changed files with 122 additions and 63 deletions

View file

@ -1,75 +1,69 @@
function fetch_saves() {
async function fetch_saves() {
const saves = document.getElementById('saves');
let resp = await fetch('/api/list');
fetch('/api/list').then((resp) => {
if (!resp.ok) {
return Promise.reject(resp);
if (!resp.ok) {
return;
}
let data = await resp.json();
data.sort();
for (let id of data) {
let resp = await fetch(`/api/save/${id}/html`);
if (resp.ok) {
let data = await resp.text();
var div = document.createElement('div');
div.innerHTML = data;
saves.appendChild(div.firstChild);
}
return resp.json();
}).then((data) => {
data.sort();
data.map((id) => {
fetch(`/api/save/${id}/html`).then((resp) => {
if (!resp.ok) {
return Promise.reject(resp);
}
return resp.text();
}).then((data) => {
const div = document.createElement('div');
div.innerHTML = data;
saves.appendChild(div.firstChild);
});
});
});
}
}
function update_save(id) {
fetch(`/api/save/${id}`).then((resp) => {
if (!resp.ok) {
return Promise.reject(resp);
}
async function update_save(id) {
const save = document.getElementById(id);
const resp = await fetch(`/api/save/${id}/reload`);
return resp.json();
}).then((data) => {
const save = document.getElementById(id);
if (!resp.ok){
return;
}
save.getElementsByClassName('name')[0].innerHTML = data.name;
const data = await resp.json();
save.getElementsByClassName('level')[0]
save.getElementsByClassName('name')[0].innerHTML = data.name;
save.getElementsByClassName('level')[0]
.getElementsByClassName('value')[0].innerHTML = data.level;
save.getElementsByClassName('xp')[0]
save.getElementsByClassName('xp')[0]
.getElementsByClassName('value')[0].innerHTML = data.xp;
save.getElementsByClassName('money')[0]
save.getElementsByClassName('money')[0]
.getElementsByClassName('value')[0].innerHTML = data.money;
save.getElementsByClassName('eridium')[0]
save.getElementsByClassName('eridium')[0]
.getElementsByClassName('value')[0].innerHTML = data.eridium;
save.getElementsByClassName('readonly')[0]
save.getElementsByClassName('readonly')[0]
.getElementsByClassName('value')[0].innerHTML = data.readonly ? 'Yes' : 'No';
});
save.getElementsByClassName('filename')[0]
.getElementsByClassName('value')[0].innerHTML = data.filename;
}
function toggle_readonly(id) {
fetch(`/api/save/${id}/toggle`).then((resp) => {
if (!resp.ok) {
return Promise.reject(resp);
}
async function toggle_readonly(id) {
const resp = await fetch(`/api/save/${id}/toggle`);
return resp.json();
}).then((data) => {
const save = document.getElementById(id)
if (!resp.ok) {
return;
}
const data = await resp.json();
document.getElementById(id)
.getElementsByClassName('readonly')[0]
.getElementsByClassName('value')[0].innerHTML = data.readonly ? 'Yes' : 'No';
});
}

View file

@ -7,6 +7,10 @@
%col style='width: auto;'
%tbody
%tr.class
%td.key << Class
%td.value -> =save.character_class
%tr.level
%td.key << Level
%td.value -> =save.level

View file

@ -41,6 +41,7 @@ class Server(Application):
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()

View file

@ -1,4 +1,5 @@
from izzylib import DotDict
from izzylib_http_async.server.error import NotFound
from izzylib_http_async.server.view import View
from . import tpl_path
@ -7,16 +8,19 @@ from . import tpl_path
class BaseView(View):
def get_save(self, saveid):
try:
save = self.app.get_save_by_id(saveid)
return self.app.get_save_by_id(saveid)
except KeyError as e:
return response.set_json({'error': e}, status=404)
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['readonly'] = save.path.permissions()['user'] == 4
return data
@ -65,7 +69,9 @@ class ApiSave(BaseView):
__path__ = ['/api/save/{saveid:int}']
async def get(self, request, response, saveid):
return response.set_json(self.get_save(saveid))
save = self.get_save(saveid)
data = self.get_data(save)
return response.set_json(data)
class ApiSaveToggle(BaseView):
@ -73,18 +79,31 @@ class ApiSaveToggle(BaseView):
async def get(self, request, response, saveid):
save = self.get_save(saveid)
readonly = save.path.permissions()['user'] == 4
if save.readonly:
if readonly:
save.path.chmod(644)
else:
save.path.chmod(444)
return response.set_json({'readonly': not save.readonly})
return response.set_json({'readonly': not readonly})
class ApiSaveHtml(BaseView):
__path__ = ['/api/save/{saveid:int}/html']
async def get(self, request, response, saveid):
return response.set_template('save.haml', {'save': self.get_save(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))

View file

@ -3,6 +3,7 @@ import shlex
import subprocess
import time
from bl2_save_edit import Bl2Save
from datetime import datetime
from izzylib import Path, logging
from watchdog.events import FileSystemEventHandler
@ -59,23 +60,42 @@ class SaveHandler(FileSystemEventHandler):
self.server = server
self.modified_times = dict()
for save in self.server.saves:
self.modified_times[save.path.name] = save.last_save
def on_any_event(self, event):
if event.event_type not in ['modified', 'created', 'deleted']:
if event.event_type not in ['modified', 'created', 'deleted', 'moved']:
logging.debug(f'Ignored event: {event.event_type}')
return
path = Path(event.src_path)
save = self.server.get_save_by_filename(name)
src = Path(event.src_path)
if not path.suffix == 'sav':
try:
dest = Path(event.dest_path) if event.dest_path else None
except:
dest = None
if not src.suffix == 'sav' or (dest and not dest.suffix == 'sav'):
return
self.handle_save_change(save, event.event_type)
try:
save = self.server.get_save_by_filename(src.name)
if dest:
save.path = dest
except KeyError:
save = None
self.handle_save_change(save, src, dest, event.event_type)
def handle_save_change(self, save, event):
def handle_save_change(self, save, src, dest, event):
if event == 'modified':
if not save:
return
try:
if self.modified_times[save.path.name] == save.last_save:
return
@ -83,4 +103,25 @@ class SaveHandler(FileSystemEventHandler):
except KeyError:
self.modified_times[save.path.name] = save.last_save
print(name, event)
return
elif event == 'created':
save = Bl2Save(src)
self.server.saves.append(save)
self.modified_times[save.path.name] = save.last_save
return
elif event == 'deleted':
if not save:
return
try:
del self.modified_times[save.path.name]
except KeyError:
pass
self.server.saves.remove(save)
return
print(event, save)