]> git.mar77i.info Git - hublib/blobdiff - hubapps/first/master.js
functioning basic chat app
[hublib] / hubapps / first / master.js
index e33e9fecf19a0923feb3d253141c50a74edf3d62..d6074e8588d6e0ca6b55b1bfcf6785eca08814af 100644 (file)
@@ -1,15 +1,86 @@
-"use strict";
-
 (function () {
-    document.addEventListener("readystatechange", function (event) {
-        if (!event) {
-            event = window.event;
-        }
-        if (event.target.readyState !== "complete") {
-            return;
+    "use strict";
+    var input_div = null;
+    var clients_list = null;
+
+    function write(msg) {
+        common.write(input_div.previousSibling, msg);
+    }
+    function master_send(hub, client_ids, client_id, obj) {
+        obj.client_ids = client_ids;
+        obj.client_id = client_id;
+        hub.send(JSON.stringify(obj));
+    }
+
+    function setup_chat(hub) {
+        clients_list = new common.ClientsList();
+        input_div = document.createElement("div");
+        input_div.append(document.createTextNode("MASTER "));
+        input_div.append(common.get_input(function () {
+            var input = input_div.getElementsByTagName("input")[0];
+            master_send(hub, clients_list.selected(), null, {
+                "name": "MASTER",
+                "data": input.value,
+            });
+            write("MASTER [null]: " + input.value);
+            input.value = "";
+        }));
+
+        document.body.append(document.createElement("div")); // output
+        document.body.append(input_div);
+    }
+
+    function open() {
+        setup_chat(this);
+        write("connected to " + ws_uri);
+    }
+
+    function close() {
+        write("connection lost");
+    }
+
+    function join_leave_broadcast(hub, client_id, client_name, action) {
+        write("[action]: " + client_name + " " + obj.action + "s");
+        master_send(hub, clients_list.all(), obj.client_id, {
+            "action": obj.action,
+            "name": client_name,
+        });
+    }
+
+    function message(msg) {
+        var obj = JSON.parse(msg.data);
+        var client_name;
+        if (obj.action === "join") {
+            clients_list.append(obj.client_id);
+            join_leave_broadcast(
+                this, obj.client_id, clients_list.get_name(obj.client_id), obj.action
+            );
+        } else if (obj.action === "leave") {
+            client_name = clients_list.get_name(obj.client_id);
+            clients_list.remove(obj.client_id);
+            join_leave_broadcast(this, obj.client_id, client_name, obj.action);
+        } else if (obj.action == "set_name") {
+            client_name = clients_list.set_name(obj.client_id, obj.name);
+            write(
+                "[action]: " +
+                client_name +
+                " changes name to " +
+                obj.name
+            );
+            master_send(this, clients_list.all(), obj.client_id, {
+                "action": "set_name",
+                "old_name": client_name,
+                "name": obj.name,
+            });
+        } else if (obj.hasOwnProperty("data")) {
+            client_name = clients_list.get_name(obj.client_id);
+            write(client_name + " [" + obj.client_id + "]: " + obj.data);
+            master_send(this, clients_list.all(), obj.client_id, {
+                "name": client_name,
+                "data": obj.data,
+            });
         }
-        document.body.append(document.createTextNode("(this is master.js) "));
-        // hide real url
-        history.pushState({}, "", new URL(window.location.origin + "/"));
-    });
+    }
+
+    common.setup(function () {new common.HubClient(ws_uri, open, close, message)});
 })();