a
This commit is contained in:
parent
828dc59387
commit
d4944946b8
|
@ -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';
|
||||
|
||||
});
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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))
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in a new issue