mirror of
https://gitlab.com/mangadex-pub/mangadex_at_home.git
synced 2024-01-19 02:48:37 +00:00
Commit the roughest POC of an UI ever
This commit is contained in:
parent
9fe15a8afa
commit
1818175d4a
|
@ -1,8 +1,12 @@
|
||||||
{
|
{
|
||||||
"client_secret": "7rc7p00md0n0xsvqnv4rv17fthvjjrzpdghak1yq45833zvdvnb0",
|
"client_secret": "s76t1dazfctvtgq9dyvgw9herxc4gcz39q0q0y3taxpkgg0ahq8g",
|
||||||
"max_cache_size_mib": 2048,
|
"max_cache_size_mib": 2048,
|
||||||
"client_port": 8080,
|
"client_port": 443,
|
||||||
"max_burst_rate_kib_per_second": 100,
|
"max_burst_rate_kib_per_second": 0,
|
||||||
"max_bandwidth_mib_per_hour": 1,
|
"max_bandwidth_mib_per_hour": 0,
|
||||||
"threads_per_cpu": 32
|
"threads_per_cpu": 32,
|
||||||
|
"web_settings":
|
||||||
|
{
|
||||||
|
"ui_port": 8080
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -64,8 +64,7 @@ public class MangaDexClient {
|
||||||
if (snapshot != null) {
|
if (snapshot != null) {
|
||||||
String json = snapshot.getString(0);
|
String json = snapshot.getString(0);
|
||||||
snapshot.close();
|
snapshot.close();
|
||||||
statistics.set(GSON.fromJson(json, new TypeToken<ArrayList<Statistics>>() {
|
statistics.set(GSON.fromJson(json, Statistics.class));
|
||||||
}.getType()));
|
|
||||||
} else {
|
} else {
|
||||||
statistics.set(new Statistics());
|
statistics.set(new Statistics());
|
||||||
}
|
}
|
||||||
|
@ -85,6 +84,16 @@ public class MangaDexClient {
|
||||||
}
|
}
|
||||||
|
|
||||||
statsMap.put(Instant.now(), statistics.get());
|
statsMap.put(Instant.now(), statistics.get());
|
||||||
|
try {
|
||||||
|
DiskLruCache.Editor editor = cache.edit("statistics");
|
||||||
|
if (editor != null) {
|
||||||
|
String json = GSON.toJson(statistics.get(), Statistics.class);
|
||||||
|
editor.setString(0, json);
|
||||||
|
editor.setString(1, "");
|
||||||
|
editor.setString(2, "");
|
||||||
|
editor.commit();
|
||||||
|
}
|
||||||
|
} catch (IOException ignored) {}
|
||||||
|
|
||||||
if (clientSettings.getWebSettings() != null) {
|
if (clientSettings.getWebSettings() != null) {
|
||||||
webUi = WebUiKt.getUiServer(clientSettings.getWebSettings(), statistics, statsMap);
|
webUi = WebUiKt.getUiServer(clientSettings.getWebSettings(), statistics, statsMap);
|
||||||
|
|
|
@ -7,5 +7,6 @@ data class Statistics(
|
||||||
@field:SerializedName("cache_hits") val cacheHits: Int = 0,
|
@field:SerializedName("cache_hits") val cacheHits: Int = 0,
|
||||||
@field:SerializedName("cache_misses") val cacheMisses: Int = 0,
|
@field:SerializedName("cache_misses") val cacheMisses: Int = 0,
|
||||||
@field:SerializedName("browser_cached") val browserCached: Int = 0,
|
@field:SerializedName("browser_cached") val browserCached: Int = 0,
|
||||||
@field:SerializedName("bytes_sent") val bytesSent: Long = 0
|
@field:SerializedName("bytes_sent") val bytesSent: Long = 0,
|
||||||
|
@field:SerializedName("bytes_on_disk") val bytesOnDisk: Long = 0
|
||||||
)
|
)
|
||||||
|
|
|
@ -25,7 +25,6 @@ fun getUiServer(
|
||||||
statistics: AtomicReference<Statistics>,
|
statistics: AtomicReference<Statistics>,
|
||||||
statsMap: Map<Instant, Statistics>
|
statsMap: Map<Instant, Statistics>
|
||||||
): Http4kServer {
|
): Http4kServer {
|
||||||
val statisticsLens = Body.auto<Statistics>().toLens()
|
|
||||||
val statsMapLens = Body.auto<Map<Instant, Statistics>>().toLens()
|
val statsMapLens = Body.auto<Map<Instant, Statistics>>().toLens()
|
||||||
|
|
||||||
return catchAllHideDetails()
|
return catchAllHideDetails()
|
||||||
|
@ -34,7 +33,7 @@ fun getUiServer(
|
||||||
.then(
|
.then(
|
||||||
routes(
|
routes(
|
||||||
"/api/stats" bind Method.GET to {
|
"/api/stats" bind Method.GET to {
|
||||||
statisticsLens(statistics.get(), Response(Status.OK))
|
statsMapLens(mapOf(Instant.now() to statistics.get()), Response(Status.OK))
|
||||||
},
|
},
|
||||||
"/api/pastStats" bind Method.GET to {
|
"/api/pastStats" bind Method.GET to {
|
||||||
synchronized(statsMap) {
|
synchronized(statsMap) {
|
||||||
|
|
|
@ -200,11 +200,12 @@ function loadStuff() {
|
||||||
type: 'doughnut',
|
type: 'doughnut',
|
||||||
data: {
|
data: {
|
||||||
datasets: [{
|
datasets: [{
|
||||||
data: [0, 0]
|
data: [0, 0, 0]
|
||||||
}],
|
}],
|
||||||
labels: [
|
labels: [
|
||||||
'Hits',
|
'Hits',
|
||||||
'Misses'
|
'Misses',
|
||||||
|
'Browser Cached'
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
options: {}
|
options: {}
|
||||||
|
@ -235,12 +236,12 @@ function loadStuff() {
|
||||||
byte = new Chart(document.getElementById('bytessent').getContext('2d'), {
|
byte = new Chart(document.getElementById('bytessent').getContext('2d'), {
|
||||||
type: 'line',
|
type: 'line',
|
||||||
data: {
|
data: {
|
||||||
labels: [1, 2, 3, 4],
|
labels: [],
|
||||||
datasets: [{
|
datasets: [{
|
||||||
label: 'Bytes Sent',
|
label: 'Bytes Sent',
|
||||||
backgroundColor: "#f00",
|
backgroundColor: "#f00",
|
||||||
borderColor: "#f00",
|
borderColor: "#f00",
|
||||||
data: [36, 98, 45, 67],
|
data: [],
|
||||||
fill: false
|
fill: false
|
||||||
}]
|
}]
|
||||||
},
|
},
|
||||||
|
@ -258,12 +259,12 @@ function loadStuff() {
|
||||||
cached = new Chart(document.getElementById('browsercached').getContext('2d'), {
|
cached = new Chart(document.getElementById('browsercached').getContext('2d'), {
|
||||||
type: 'line',
|
type: 'line',
|
||||||
data: {
|
data: {
|
||||||
labels: [1, 2, 3, 4],
|
labels: [],
|
||||||
datasets: [{
|
datasets: [{
|
||||||
label: 'Cached',
|
label: 'Bytes On Disk',
|
||||||
backgroundColor: "#f00",
|
backgroundColor: "#f00",
|
||||||
borderColor: "#f00",
|
borderColor: "#f00",
|
||||||
data: [36, 98, 45, 67],
|
data: [],
|
||||||
fill: false
|
fill: false
|
||||||
}]
|
}]
|
||||||
},
|
},
|
||||||
|
@ -585,49 +586,38 @@ function updateWithMessage(m) {
|
||||||
|
|
||||||
function getStats() {
|
function getStats() {
|
||||||
fetch("/api/stats")
|
fetch("/api/stats")
|
||||||
.then(response => async function () {
|
.then(response => response.json())
|
||||||
let respj = JSON.parse(await response.text());
|
.then(response => {
|
||||||
parseResponse(respj);
|
updateValues(response);
|
||||||
console.log(respj);
|
console.log(response);
|
||||||
});
|
});
|
||||||
//TODO: use values and update web info
|
//TODO: use values and update web info
|
||||||
}
|
}
|
||||||
|
|
||||||
function parseResponse(x) {
|
|
||||||
hitmiss.data.datasets[0].data[0] = (x.cache_hits);
|
|
||||||
hitmiss.data.datasets[0].data[1] = (x.misses);
|
|
||||||
req.data.labels.push(x.snap_time);
|
|
||||||
req.data.datasets.forEach((dataset) => {
|
|
||||||
dataset.data.push(x.requests_served);
|
|
||||||
});
|
|
||||||
byte.data.labels.push(x.snap_time);
|
|
||||||
byte.data.datasets.forEach((dataset) => {
|
|
||||||
dataset.data.push(x.bytes_sent);
|
|
||||||
});
|
|
||||||
cached.data.labels.push(x.snap_time);
|
|
||||||
cached.data.datasets.forEach((dataset) => {
|
|
||||||
dataset.data.push(x.browser_cached);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function updateValues(data) {
|
function updateValues(data) {
|
||||||
for (let key in data) {
|
for (let key in data) {
|
||||||
if (data.hasOwnProperty(key)) {
|
if (data.hasOwnProperty(key)) {
|
||||||
let x = data[key];
|
let x = data[key];
|
||||||
hitmiss.data.datasets[0].data[0] = (x.cache_hits);
|
hitmiss.data.datasets[0].data[0] = x.cache_hits;
|
||||||
hitmiss.data.datasets[0].data[1] = (x.misses);
|
hitmiss.data.datasets[0].data[1] = x.cache_misses;
|
||||||
|
hitmiss.data.datasets[0].data[2] = x.browser_cached;
|
||||||
|
|
||||||
|
hitmiss.update()
|
||||||
req.data.labels.push(key);
|
req.data.labels.push(key);
|
||||||
req.data.datasets.forEach((dataset) => {
|
req.data.datasets.forEach((dataset) => {
|
||||||
dataset.data.push(x.requests_served);
|
dataset.data.push(x.requests_served);
|
||||||
});
|
});
|
||||||
|
req.update()
|
||||||
byte.data.labels.push(key);
|
byte.data.labels.push(key);
|
||||||
byte.data.datasets.forEach((dataset) => {
|
byte.data.datasets.forEach((dataset) => {
|
||||||
dataset.data.push(x.bytes_sent);
|
dataset.data.push(x.bytes_sent);
|
||||||
});
|
});
|
||||||
|
byte.update()
|
||||||
cached.data.labels.push(key);
|
cached.data.labels.push(key);
|
||||||
cached.data.datasets.forEach((dataset) => {
|
cached.data.datasets.forEach((dataset) => {
|
||||||
dataset.data.push(x.browser_cached);
|
dataset.data.push(x.bytes_on_disk);
|
||||||
});
|
});
|
||||||
|
cached.update()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,17 +30,9 @@
|
||||||
<img src="icons/dashboard.png" alt="dash" width="30px" height="30px" style="padding: 10px" class="img">
|
<img src="icons/dashboard.png" alt="dash" width="30px" height="30px" style="padding: 10px" class="img">
|
||||||
<h2 style="position: absolute; left: 50px; top: 50px; margin: calc((50px - 29px)/2)">Dashboard</h2>
|
<h2 style="position: absolute; left: 50px; top: 50px; margin: calc((50px - 29px)/2)">Dashboard</h2>
|
||||||
</div>
|
</div>
|
||||||
<div id="cons" class="sideOption" onclick="selectTab('cons','console')">
|
|
||||||
<img src="icons/console.png" alt="dash" width="30px" height="30px" style="padding: 10px" class="img">
|
|
||||||
<h2 style="position: absolute; left: 50px; top: 100px; margin: calc((50px - 29px)/2)">Console</h2>
|
|
||||||
</div>
|
|
||||||
<div id="opt" class="sideOption" onclick="selectTab('opt','dashOptions')">
|
<div id="opt" class="sideOption" onclick="selectTab('opt','dashOptions')">
|
||||||
<img src="icons/options.png" alt="dash" width="30px" height="30px" style="padding: 10px" class="img">
|
<img src="icons/options.png" alt="dash" width="30px" height="30px" style="padding: 10px" class="img">
|
||||||
<h2 style="position: absolute; left: 50px; top: 150px; margin: calc((50px - 29px)/2)">Options</h2>
|
<h2 style="position: absolute; left: 50px; top: 100px; margin: calc((50px - 29px)/2)">Options</h2>
|
||||||
</div>
|
|
||||||
<div id="inf" class="sideOption" onclick="selectTab('inf','info')">
|
|
||||||
<img src="icons/info.png" alt="dash" width="30px" height="30px" style="padding: 10px" class="img">
|
|
||||||
<h2 style="position: absolute; left: 50px; top: 200px; margin: calc((50px - 29px)/2)">Info</h2>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div id="content">
|
<div id="content">
|
||||||
|
@ -93,23 +85,6 @@
|
||||||
<h4>Data Refresh Rate</h4>
|
<h4>Data Refresh Rate</h4>
|
||||||
<label><input id="dataRefreshRate" type="number" class="optionInput input" placeholder="5000" min="500"></label>
|
<label><input id="dataRefreshRate" type="number" class="optionInput input" placeholder="5000" min="500"></label>
|
||||||
</div>
|
</div>
|
||||||
<div class="option">
|
|
||||||
<h4>Websocket Port</h4>
|
|
||||||
<label><input id="port" type="number" class="optionInput input" placeholder="33333"></label>
|
|
||||||
</div>
|
|
||||||
<div class="option">
|
|
||||||
<h4>Client IP</h4>
|
|
||||||
<label><input id="ip" type="text" class="optionInput input" placeholder="localhost"></label>
|
|
||||||
</div>
|
|
||||||
<div class="option">
|
|
||||||
<h4>Max Console Lines</h4>
|
|
||||||
<label><input id="maxConsoleLines" type="number" class="optionInput input" placeholder="1000" min="100"></label>
|
|
||||||
</div>
|
|
||||||
<div class="option">
|
|
||||||
<h4>Graph Time Frame</h4>
|
|
||||||
<label><input id="graphTimeFrame" type="number" class="optionInput input" placeholder="30000"
|
|
||||||
min="5000"></label>
|
|
||||||
</div>
|
|
||||||
<h3>Display</h3>
|
<h3>Display</h3>
|
||||||
<div class="option">
|
<div class="option">
|
||||||
<h4>Theme</h4>
|
<h4>Theme</h4>
|
||||||
|
@ -127,13 +102,6 @@
|
||||||
<option value="softStyle">Soft</option>
|
<option value="softStyle">Soft</option>
|
||||||
</select></label>
|
</select></label>
|
||||||
</div>
|
</div>
|
||||||
<div class="option">
|
|
||||||
<h4>Show Console Latest</h4>
|
|
||||||
<label class="switch switchInput">
|
|
||||||
<input id="newestconsole" type="checkbox">
|
|
||||||
<span id="newestconsolecb" class="slider"></span>
|
|
||||||
</label>
|
|
||||||
</div>
|
|
||||||
<div class="option">
|
<div class="option">
|
||||||
<h4>Animations</h4>
|
<h4>Animations</h4>
|
||||||
<label class="switch switchInput">
|
<label class="switch switchInput">
|
||||||
|
@ -141,13 +109,6 @@
|
||||||
<span id="doAnimationscb" class="slider"></span>
|
<span id="doAnimationscb" class="slider"></span>
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="option">
|
|
||||||
<h4>Lock Dashboard <br>(does not work)</h4>
|
|
||||||
<label class="switch switchInput">
|
|
||||||
<input id="lockDash" type="checkbox">
|
|
||||||
<span id="lockDashcb" class="slider"></span>
|
|
||||||
</label>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
<button id="apply" class="button" onclick="applyOptions()">Apply</button>
|
<button id="apply" class="button" onclick="applyOptions()">Apply</button>
|
||||||
<button id="reset" class="button" onclick="resetOptions()">Reset</button>
|
<button id="reset" class="button" onclick="resetOptions()">Reset</button>
|
||||||
|
|
Loading…
Reference in a new issue