some more scrolling tweaks
[mudsync.git] / data / web-static / js / mudsync.js
1 /*
2 ;;; Mudsync --- Live hackable MUD
3 ;;; Copyright © 2017 Christopher Allan Webber <cwebber@dustycloud.org>
4 ;;;
5 ;;; This file is part of Mudsync.
6 ;;;
7 ;;; Mudsync is free software; you can redistribute it and/or modify it
8 ;;; under the terms of the GNU General Public License as published by
9 ;;; the Free Software Foundation; either version 3 of the License, or
10 ;;; (at your option) any later version.
11 ;;;
12 ;;; Mudsync is distributed in the hope that it will be useful, but
13 ;;; WITHOUT ANY WARRANTY; without even the implied warranty of
14 ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15 ;;; General Public License for more details.
16 ;;;
17 ;;; You should have received a copy of the GNU General Public License
18 ;;; along with Mudsync.  If not, see <http://www.gnu.org/licenses/>.
19 */
20
21 function scrollDown() {
22     var stream_metabox = document.getElementById("stream-metabox");
23     stream_metabox.scrollTop = stream_metabox.scrollHeight;
24 }
25
26 function withMaybeScroll(thunk) {
27     var stream_metabox = document.getElementById("stream-metabox");
28     var should_scroll = false;
29     // if within a reasonable threshold, we scroll
30     if((stream_metabox.scrollHeight - stream_metabox.offsetHeight)
31        - stream_metabox.scrollTop <= 50) {
32         should_scroll = true;
33     }
34     thunk();
35     if (should_scroll) {
36         stream_metabox.scrollTop = stream_metabox.scrollHeight;
37     }
38 }
39
40
41 function displayMessage(data, self_sent) {
42     var new_entry = document.createElement("div");
43     withMaybeScroll(
44         function () {
45             if (self_sent) {
46                 new_entry.setAttribute("class", "stream-entry self-sent");
47                 document.getElementById("main-input").value = "";
48             } else {
49                 new_entry.setAttribute("class", "stream-entry");
50             }
51             new_entry.innerHTML = data;
52             document.getElementById("stream").appendChild(new_entry);
53         });
54 }
55
56 function installWebsocket() {
57     // TODO: Don't hardcode the websocket path; pull it from the DOM
58     var address = "ws://".concat(window.location.hostname, ":", window.location.port);
59     var ws = new WebSocket(address);
60     ws.onmessage = function(evt) {
61         displayMessage(evt.data, false);
62     };
63     ws.onopen = function() {
64         console.log("connected");
65     };
66     ws.onclose = function () {
67         console.log("closed websocket");
68     };
69     installUIHooks(ws);
70 }
71
72 function installUIHooks(ws) {
73     var input = document.getElementById("main-input");
74     input.onkeypress = function(e) {
75         if (!e) e = window.event;
76         var keyCode = e.keyCode || e.which;
77         if (keyCode == '13') {
78             var input_val = input.value;
79             withMaybeScroll(
80                 function () {
81                     displayMessage("> ".concat(input_val), true);
82                 });
83             sendMessageToServer(ws, input_val);
84         }
85     }
86 }
87
88 function sendMessageToServer(ws, data) {
89     ws.send(data);
90 }
91
92 window.onload = function () {
93     installWebsocket();
94     window.onresize = scrollDown;
95 }