summaryrefslogtreecommitdiff
path: root/src/server
diff options
context:
space:
mode:
authorsyuilo <Syuilotan@yahoo.co.jp>2021-03-03 01:03:29 +0900
committerGitHub <noreply@github.com>2021-03-03 01:03:29 +0900
commit5e9cc09fcb6cb88cc4d2c3040bf085e9e278d22e (patch)
tree246d32546b846566e3dcbd324cd4054cd9a733b9 /src/server
parentwip: better error handling (diff)
downloadsharkey-5e9cc09fcb6cb88cc4d2c3040bf085e9e278d22e.tar.gz
sharkey-5e9cc09fcb6cb88cc4d2c3040bf085e9e278d22e.tar.bz2
sharkey-5e9cc09fcb6cb88cc4d2c3040bf085e9e278d22e.zip
Bios (#7286)
* wip * wip * wip
Diffstat (limited to 'src/server')
-rw-r--r--src/server/web/bios.css40
-rw-r--r--src/server/web/bios.js87
-rw-r--r--src/server/web/cli.css19
-rw-r--r--src/server/web/cli.js55
-rw-r--r--src/server/web/index.ts12
-rw-r--r--src/server/web/views/bios.pug20
-rw-r--r--src/server/web/views/cli.pug21
7 files changed, 254 insertions, 0 deletions
diff --git a/src/server/web/bios.css b/src/server/web/bios.css
new file mode 100644
index 0000000000..b0da3ee39b
--- /dev/null
+++ b/src/server/web/bios.css
@@ -0,0 +1,40 @@
+* {
+ font-family: Fira code, Fira Mono, Consolas, Menlo, Courier, monospace;
+}
+
+html {
+ background: #ffb4e1;
+}
+
+main {
+ background: #dedede;
+}
+main > .tabs {
+ padding: 16px;
+ border-bottom: solid 4px #c3c3c3;
+}
+
+#lsEditor > .adder {
+ margin: 16px;
+ padding: 16px;
+ border: solid 2px #c3c3c3;
+}
+#lsEditor > .adder > textarea {
+ display: block;
+ width: 100%;
+ min-height: 5em;
+ box-sizing: border-box;
+}
+#lsEditor > .record {
+ padding: 16px;
+ border-bottom: solid 1px #c3c3c3;
+}
+#lsEditor > .record > header {
+ font-weight: bold;
+}
+#lsEditor > .record > textarea {
+ display: block;
+ width: 100%;
+ min-height: 5em;
+ box-sizing: border-box;
+}
diff --git a/src/server/web/bios.js b/src/server/web/bios.js
new file mode 100644
index 0000000000..d06dee801a
--- /dev/null
+++ b/src/server/web/bios.js
@@ -0,0 +1,87 @@
+'use strict';
+
+window.onload = async () => {
+ const account = JSON.parse(localStorage.getItem('account'));
+ const i = account.token;
+
+ const api = (endpoint, data = {}) => {
+ const promise = new Promise((resolve, reject) => {
+ // Append a credential
+ if (i) data.i = i;
+
+ // Send request
+ fetch(endpoint.indexOf('://') > -1 ? endpoint : `/api/${endpoint}`, {
+ method: 'POST',
+ body: JSON.stringify(data),
+ credentials: 'omit',
+ cache: 'no-cache'
+ }).then(async (res) => {
+ const body = res.status === 204 ? null : await res.json();
+
+ if (res.status === 200) {
+ resolve(body);
+ } else if (res.status === 204) {
+ resolve();
+ } else {
+ reject(body.error);
+ }
+ }).catch(reject);
+ });
+
+ return promise;
+ };
+
+ const content = document.getElementById('content');
+
+ document.getElementById('ls').addEventListener('click', () => {
+ content.innerHTML = '';
+
+ const lsEditor = document.createElement('div');
+ lsEditor.id = 'lsEditor';
+
+ const adder = document.createElement('div');
+ adder.classList.add('adder');
+ const addKeyInput = document.createElement('input');
+ const addValueTextarea = document.createElement('textarea');
+ const addButton = document.createElement('button');
+ addButton.textContent = 'add';
+ addButton.addEventListener('click', () => {
+ localStorage.setItem(addKeyInput.value, addValueTextarea.value);
+ location.reload();
+ });
+
+ adder.appendChild(addKeyInput);
+ adder.appendChild(addValueTextarea);
+ adder.appendChild(addButton);
+ lsEditor.appendChild(adder);
+
+ for (let i = 0; i < localStorage.length; i++) {
+ const k = localStorage.key(i);
+ const record = document.createElement('div');
+ record.classList.add('record');
+ const header = document.createElement('header');
+ header.textContent = k;
+ const textarea = document.createElement('textarea');
+ textarea.textContent = localStorage.getItem(k);
+ const saveButton = document.createElement('button');
+ saveButton.textContent = 'save';
+ saveButton.addEventListener('click', () => {
+ localStorage.setItem(k, textarea.value);
+ location.reload();
+ });
+ const removeButton = document.createElement('button');
+ removeButton.textContent = 'remove';
+ removeButton.addEventListener('click', () => {
+ localStorage.removeItem(k);
+ location.reload();
+ });
+ record.appendChild(header);
+ record.appendChild(textarea);
+ record.appendChild(saveButton);
+ record.appendChild(removeButton);
+ lsEditor.appendChild(record);
+ }
+
+ content.appendChild(lsEditor);
+ });
+};
diff --git a/src/server/web/cli.css b/src/server/web/cli.css
new file mode 100644
index 0000000000..07cd27830b
--- /dev/null
+++ b/src/server/web/cli.css
@@ -0,0 +1,19 @@
+* {
+ font-family: Fira code, Fira Mono, Consolas, Menlo, Courier, monospace;
+}
+
+html {
+ background: #ffb4e1;
+}
+
+main {
+ background: #dedede;
+}
+
+#tl > div {
+ padding: 16px;
+ border-bottom: solid 1px #c3c3c3;
+}
+#tl > div > header {
+ font-weight: bold;
+}
diff --git a/src/server/web/cli.js b/src/server/web/cli.js
new file mode 100644
index 0000000000..3dff1d4860
--- /dev/null
+++ b/src/server/web/cli.js
@@ -0,0 +1,55 @@
+'use strict';
+
+window.onload = async () => {
+ const account = JSON.parse(localStorage.getItem('account'));
+ const i = account.token;
+
+ const api = (endpoint, data = {}) => {
+ const promise = new Promise((resolve, reject) => {
+ // Append a credential
+ if (i) data.i = i;
+
+ // Send request
+ fetch(endpoint.indexOf('://') > -1 ? endpoint : `/api/${endpoint}`, {
+ method: 'POST',
+ body: JSON.stringify(data),
+ credentials: 'omit',
+ cache: 'no-cache'
+ }).then(async (res) => {
+ const body = res.status === 204 ? null : await res.json();
+
+ if (res.status === 200) {
+ resolve(body);
+ } else if (res.status === 204) {
+ resolve();
+ } else {
+ reject(body.error);
+ }
+ }).catch(reject);
+ });
+
+ return promise;
+ };
+
+ document.getElementById('submit').addEventListener('click', () => {
+ api('notes/create', {
+ text: document.getElementById('text').value
+ }).then(() => {
+ location.reload();
+ });
+ });
+
+ api('notes/timeline').then(notes => {
+ const tl = document.getElementById('tl');
+ for (const note of notes) {
+ const el = document.createElement('div');
+ const name = document.createElement('header');
+ name.textContent = `${note.user.name} @${note.user.username}`;
+ const text = document.createElement('div');
+ text.textContent = `${note.text}`;
+ el.appendChild(name);
+ el.appendChild(text);
+ tl.appendChild(el);
+ }
+ });
+};
diff --git a/src/server/web/index.ts b/src/server/web/index.ts
index 8ea7e15751..a1d79100a6 100644
--- a/src/server/web/index.ts
+++ b/src/server/web/index.ts
@@ -376,6 +376,18 @@ router.get('/info', async ctx => {
});
});
+router.get('/bios', async ctx => {
+ await ctx.render('bios', {
+ version: config.version,
+ });
+});
+
+router.get('/cli', async ctx => {
+ await ctx.render('cli', {
+ version: config.version,
+ });
+});
+
const override = (source: string, target: string, depth: number = 0) =>
[, ...target.split('/').filter(x => x), ...source.split('/').filter(x => x).splice(depth)].join('/');
diff --git a/src/server/web/views/bios.pug b/src/server/web/views/bios.pug
new file mode 100644
index 0000000000..d81a3ee67f
--- /dev/null
+++ b/src/server/web/views/bios.pug
@@ -0,0 +1,20 @@
+doctype html
+
+html
+
+ head
+ meta(charset='utf-8')
+ meta(name='application-name' content='Misskey')
+ title Misskey BIOS
+ style
+ include ../bios.css
+ script
+ include ../bios.js
+
+ body
+ header
+ h1 Misskey BIOS #{version}
+ main
+ div.tabs
+ button#ls edit local storage
+ div#content
diff --git a/src/server/web/views/cli.pug b/src/server/web/views/cli.pug
new file mode 100644
index 0000000000..d2cf7c4335
--- /dev/null
+++ b/src/server/web/views/cli.pug
@@ -0,0 +1,21 @@
+doctype html
+
+html
+
+ head
+ meta(charset='utf-8')
+ meta(name='application-name' content='Misskey')
+ title Misskey Cli
+ style
+ include ../cli.css
+ script
+ include ../cli.js
+
+ body
+ header
+ h1 Misskey Cli #{version}
+ main
+ div#form
+ textarea#text
+ button#submit submit
+ div#tl