summary refs log tree commit diff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/htmlbuilder.js46
-rw-r--r--lib/key.js16
-rw-r--r--lib/sd.js61
-rw-r--r--lib/stores.js12
4 files changed, 135 insertions, 0 deletions
diff --git a/lib/htmlbuilder.js b/lib/htmlbuilder.js
new file mode 100644
index 0000000..7343116
--- /dev/null
+++ b/lib/htmlbuilder.js
@@ -0,0 +1,46 @@
+function makeSigmaHtmlPlusElement(elem) {
+    elem.child = function (type) {
+        let childElem = makeSigmaHtmlPlusElement(document.createElement(type));
+        elem.appendChild(childElem)
+        return childElem;
+    }
+    elem.html = function (html) {
+        elem.innerHTML = html;
+        return elem;
+    }
+    elem.text = function (text) {
+        elem.innerText = text;
+        return elem;
+    }
+    elem.attr = function (attribute, value) {
+        elem.setAttribute(attribute, value);
+        return elem;
+    }
+    elem.class = function (className) {
+        elem.classList.add(className)
+        return elem;
+    }
+    elem.do = function (a, params) {
+        elem.a(...params)
+        return elem;
+    }
+    elem.ev = function (event, listener) {
+        elem.addEventListener(event, listener)
+        return elem;
+    }
+    elem.up = function () {
+        return elem.parentElement
+    }
+    elem.for = function (array, func) {
+        array.forEach(element => elem.appendChild(func(element)));
+        return elem
+    }
+    return elem;
+}
+
+/**
+ * @param {String} type HTML element type
+ */
+export default function make(type) {
+    return makeSigmaHtmlPlusElement(document.createElement(type));
+}
\ No newline at end of file
diff --git a/lib/key.js b/lib/key.js
new file mode 100644
index 0000000..7f7971a
--- /dev/null
+++ b/lib/key.js
@@ -0,0 +1,16 @@
+window.onkeydown = function (e) {
+	if (!e) e = window.event;
+	shiftHeld = e.shiftKey;
+};
+
+window.onkeyup = function (e) {
+	if (!e) e = window.event;
+	shiftHeld = e.shiftKey;
+};
+
+window.onmousemove = function (e) {
+	if (!e) e = window.event;
+	shiftHeld = e.shiftKey;
+};
+
+export let shiftHeld;
\ No newline at end of file
diff --git a/lib/sd.js b/lib/sd.js
new file mode 100644
index 0000000..69bd067
--- /dev/null
+++ b/lib/sd.js
@@ -0,0 +1,61 @@
+import "https://unpkg.com/eventemitter3@latest/dist/eventemitter3.umd.min.js"
+
+export default class SoktDeer {
+    /** @type {string} */
+    token = '';
+    /** @type {boolean} */
+    loggedIn = false;
+    /** @type {WebSocket} */
+    ws;
+    /** @type {import("node:events").EventEmitter} */
+    wsEvents = new EventEmitter3();
+
+    /** @type {any[]} */
+    messages = [];
+    constructor (wsUri="wss://sokt.meltland.dev") {
+        this.ws = new WebSocket(wsUri);
+        this.ws.onmessage = (rdata) => {
+            const data = JSON.parse(rdata.data.toString());
+            console.info("SD", "INCOMING", data)
+            if ('token' in data) return this.wsEvents.emit('token', data.token);
+            if ('command' in data) return this.wsEvents.emit(data.command, data);
+            if ('error' in data) return this.wsEvents.emit('error', data);
+        }
+        this.wsEvents.on('greet', greetp => {
+            this.messages = greetp.messages
+        })
+        this.wsEvents.on('new_post', ({data: post}) => {
+            this.messages.push(post)
+        })
+    }
+    login(username, password) {
+        return new Promise((resolve, reject) => {
+            this.ws.send(JSON.stringify({
+                command: "login_pswd",
+                username,
+                password
+            }))
+            this.wsEvents.once('token', token => {
+                this.token = token;
+                resolve(token)
+            })
+            this.wsEvents.once('error', error => {
+                if(error.error) {
+                    reject(error.code)
+                }
+            })
+        })
+    }
+    loginToken(token) {
+        return new Promise((resolve, reject) => {
+            this.ws.send(JSON.stringify({
+                command: "login_token",
+                token
+            }))
+            this.wsEvents.once('error', error => {
+                if(error.error) reject(error.code)
+                else resolve()
+            })
+        })
+    }
+}
\ No newline at end of file
diff --git a/lib/stores.js b/lib/stores.js
new file mode 100644
index 0000000..eacb5e2
--- /dev/null
+++ b/lib/stores.js
@@ -0,0 +1,12 @@
+export function set(store, value) {
+    window.stores[store] = value
+    Object.values(window.storesEvents).forEach(ev => {if(ev.store == store) cb()})
+}
+export function update(store) {
+    Object.values(window.storesEvents).forEach(ev => {if(ev.store == store) cb()})
+}
+export function onChange(store, cb) {
+    let id = nextStoresEventID++;
+    storesEvents[id] = {store, cb};
+    return id;
+}
\ No newline at end of file