(function () { "use strict"; var input_div; var clients_list = {}; var clients_list_ul; function Client(client_id) { var id_str = client_id.toString() this.id = client_id; this.name = "client-" + id_str; this.li = document.createElement("li"); this.checkbox = document.createElement("input"); this.checkbox.setAttribute("type", "checkbox"); this.checkbox.setAttribute("checked", ""); this.li.append(this.checkbox); this.li.append(document.createTextNode(this.name)); this.set_name = function (new_name) { this.name = new_name; if (this.checkbox.nextSibling !== null) { this.checkbox.nextSibling.remove(); } this.li.append(document.createTextNode(new_name)); }; clients_list[id_str] = this; clients_list_ul.append(this.li); } function all_client_ids() { var key; var result = []; for (key in clients_list) { result.push(clients_list[key].id); } return result; } function selected_client_ids() { var key; var client; var result = []; for (key in clients_list) { client = clients_list[key]; if (client.checkbox.checked) { result.push(client.id); } } return result; } function setup_chat(ws) { var inp = input_div.getElementsByTagName("input")[0]; inp.disabled = false; inp.addEventListener( "keydown", common.on_return( function (event, target) { ws.send( JSON.stringify( { "client_ids": selected_client_ids(), "name": "MASTER", "data": target.value, } ) ); common.write("MASTER: " + target.value); target.value = ""; } ) ); } function open(ws) { input_div = document.getElementById("input"); clients_list_ul = document.getElementById("clients_list"); setup_chat(ws); common.write("connected to ws_master"); } function close() { input_div.getElementsByTagName("input")[0].disabled = true; common.write("connection lost"); } function join(ws, client_id) { var client = new Client(client_id); ws.send( JSON.stringify( { "client_ids": all_client_ids(), "client_id": client_id, "action": "join", "name": client.name, } ) ); common.write("[action]: " + client.name + " joins"); } function leave(ws, client_id) { var id_str = client_id.toString(); var client = clients_list[id_str]; client.li.remove(); delete clients_list[id_str]; ws.send( JSON.stringify( { "client_ids": all_client_ids(), "client_id": client_id, "action": "leave", "name": client.name, } ) ); common.write("[action]: " + client.name + " leaves"); } function set_name(ws, client_id, name) { var client = clients_list[client_id.toString()]; var old_name = client.name; client.set_name(name); ws.send( JSON.stringify( { "client_ids": all_client_ids(), "client_id": client_id, "action": "set_name", "name": name, "old_name": old_name, } ) ); common.write("[action]: " + old_name + " changes name to " + name); } function send_data(ws, client_id, data) { var client = clients_list[client_id.toString()]; ws.send( JSON.stringify( { "client_ids": all_client_ids(), "client_id": client.id, "name": client.name, "data": data, } ) ); common.write(client.name + " [" + client.id + "]: " + data); } function message(ws, msg) { var obj = JSON.parse(msg.data); if (obj.action === "join") { join(ws, obj.client_id); } else if (obj.action === "leave") { leave(ws, obj.client_id); } else if (obj.action === "set_name") { set_name(ws, obj.client_id, obj.name); } else if (obj.hasOwnProperty("data")) { send_data(ws, obj.client_id, obj.data); } } common.setup(function () { common.open_websocket(ws_uri, open, close, message); }); })();