class Tavern { // Callback definitions! onlogin = (_loggedIn) => { }; onmessage = (_message) => { }; onspawntoken = (_spawnToken) => { }; onmovetoken = (_moveToken) => { }; onshowscene = (_scene) => { }; onscenelist = (_sceneList) => { }; onconnectedplayers = (_playersList) => { }; constructor() { this.socket = new WebSocket('ws:/' + window.location.host + '/ws'); this.socket.onopen = () => this.connected = true; this.socket.onclose = () => { this.connected = false; this.loggedIn = false; this.call(this.onclose); }; this.msgs = []; this.connected = false; this.loggedIn = false; this.admin = false; this.socket.onmessage = (m) => { m = JSON.parse(m.data); console.log(m); if (m.login) { this.socket.loggedIn = m.login.success; this.admin = m.login.admin; this.call(this.onlogin, this.socket.loggedIn); } if (m.message) { this.add_msg_to_history(m.message); this.call(this.onmessage, m.message); } if (m.get_chat_history) { m.get_chat_history.forEach(msg => { this.add_msg_to_history(msg); this.call(this.onmessage, msg); }); } if (m.spawn_token) { this.call(this.onspawntoken, m.spawn_token); } if (m.move_token) { this.call(this.onmovetoken, m.move_token); } if (m.show_scene) { this.call(this.onshowscene, m.show_scene); } if (m.scene_list) { this.call(this.onscenelist, m.scene_list); } if (m.connected_players) { this.call(this.onconnectedplayers, m.connected_players); } } } call(f, ...args) { if (typeof (f) == "function") { f(...args); } } add_msg_to_history = (m) => { let id = m.id - 1; if (id >= 0) { if (id < this.msgs.length) { if (this.msgs[id].id == id + 1) { this.msgs[id] = m; } else { for (let i = 0; i < this.msgs.length; i += 1) { if (this.msgs[i].id > id) { this.msgs.splice(i, 0, m); break; } } } } else { this.msgs.push(m) } } } login = (username, password) => { if (!this.connected || this.loggedIn) { return false; } this.socket.send(JSON.stringify({ login: { username, password } })); } simple_msg = (msg, token) => { if (!this.connected || this.loggedIn) { return false; } this.socket.send(JSON.stringify({ message: { text: msg, character: token ?? "" } })); } edit_msg = (new_text, id) => { if (id <= this.msgs.length && id > 0) { let msg = this.msgs[id - 1]; msg.text = new_text; this.socket.send(JSON.stringify({ message: msg })); } } get_chat_history = (from, amount) => { if (!this.connected || this.loggedIn) { return false; } this.socket.send(JSON.stringify({ get_chat_history: { from: from, amount: amount } })) } get_tokens = (mapId) => { if (!this.connected || this.loggedIn) { return false; } this.socket.send(JSON.stringify({ get_tokens: { scene: mapId } })); } move_token = (id, x, y) => { if (!this.connected || this.loggedIn) { return false; } this.socket.send(JSON.stringify({ move_token: { token_id: id, x: x, y: y } })); } action_result = (name, source, targets, results) => { if (!this.connected || this.loggedIn) { return false; } this.socket.send(JSON.stringify({ action_result: { name: name, source: source ?? '', targets: targets ?? [], results: results } })); } get_scene = (id) => { if (!this.connected || this.loggedIn) { return; } this.socket.send(JSON.stringify({ get_scene: { scene: id } })) } spawn_token = (scene, character, x, y, img_path, visible_to_players) => { if (!this.connected || this.loggedIn) { return; } this.socket.send(JSON.stringify({ spawn_token: { map_id: scene, character: character, x: x, y: y, img_path: img_path, visible_to_players: visible_to_players } })); } create_scene = (title) => { if (!this.connected || this.loggedIn) { return; } this.socket.send(JSON.stringify({ create_scene: { title: title } })); } delete_scene = (scene) => { if (!this.connected || this.loggedIn) { return; } this.socket.send(JSON.stringify({ delete_scene: { scene: scene } })); } shutdown = () => { if (!this.connected || this.loggedIn || !this.admin) { return; } this.socket.send(JSON.stringify('shutdown')); } save = () => { if (!this.connected || this.loggedIn || !this.admin) { return; } this.socket.send(JSON.stringify('save')); } kick = (id) => { if (!this.connected || this.loggedIn || !this.admin) { return; } this.socket.send(JSON.stringify({ kick: id })); } show_scene = (id) => { if (!this.connected || this.loggedIn || !this.admin) { return; } this.socket.send(JSON.stringify({ show_scene: { scene: id } })); } set_scene_visible = (id, visible) => { if (!this.connected || this.loggedIn || !this.admin) { return; } this.socket.send(JSON.stringify({ set_scene_visible: { scene: id, visible: visible } })); } } const tavern = new Tavern();