]> git.scottworley.com Git - reliable-chat/commitdiff
Merge skitch's changes.
authorScott Worley <sworley@chkno.net>
Fri, 3 Aug 2012 01:38:31 +0000 (18:38 -0700)
committerScott Worley <sworley@chkno.net>
Fri, 3 Aug 2012 01:38:31 +0000 (18:38 -0700)
Conflicts:
webclient/rc.html

1  2 
webclient/rc.html

diff --combined webclient/rc.html
index 8aeae37ce3d43d4de54b0cfcb65bca39488afc50,9460159064b4e56ed21c131b2b2e5b42a2d33316..b3109a92ee387b858891d72a9f2fdf10f0641d0b
@@@ -5,21 -5,64 +5,65 @@@
  <head>
   <title>Reliable Chat</title>
    <style type="text/css"><!--/*--><![CDATA[/*><!--*/
-       html, body, #outer-table, #history { width: 99.9%; height: 100%; margin: 0; padding: 0 }
-       #status { background-color: #eef }
+       html, body {
+               width: 99.9%;
+               height: 100%;
+               margin: 0;
+               padding: 0;
+               background-color: #293134;
+               color: silver;
+               font-family: monospace;
+       }
+       #container {
+               height: 100%;
+       }
+       #status {
+               width: 100%;
+               text-align: right;
+               background-color: #293134;
+               padding: 5px 5px 5px 0px;
+       }
+       #client {
+               width: 98.5%;
+               padding: 0px 0px 0px 5px;
+               height: 50px;
+               position: fixed;
+               bottom: 0;
+       }
+       #input {
+               width: 100%;
+               background-color: #293134;
+       }
        #say { width: 100% }
-       #history { vertical-align: bottom }
+       #history {
+               padding: 0px 5px 55px 5px;
+               vertical-align: bottom
+       }
        img { width: 1px; height: 1px; }
        iframe { display: none }
-       #status span { margin-right: 2em }
-       #status span.sad { background-color: #fee }
-       #status span.happy { background-color: #efe }
+       #status span { margin-right: 10px; }
+       #status span.sad {
+               background-color: #f00;
+               color: #fff;
+               border: 1px solid black;
+               border-radius: 5px;
+               padding-left: 5px;
+               padding-right: 5px;
+       }
+       #status span.happy {
+               background-color: #0f0;
+               color: #000;
+               border: 1px solid black;
+               border-radius: 5px;
+               padding-left: 5px;
+               padding-right: 5px;
+       }
    /*]]>*/--></style>
    <script type="text/javascript"><!--//--><![CDATA[//><!--
        var servers = ['chkno.net', 'rc2.chkno.net', 'echto.net', 'the-wes.com', 'vibrantlogic.com'];
  
        var session = Math.random();
 +      var since = {};
        var seen = {};
  
        function rcnick() {
                return id.replace(/@/g, "@@") + "_@_" + text.replace(/@/g, "@@");
        }
  
 -      function receiveMessage(server, time, id, text) {
 -              var seen_key = make_seen_key(id, text);
 -              if (!(seen_key in seen)) {
 -                      seen[seen_key] = true;
 -                      rcaddmessagetohistory(text);
 -                      for (var i in servers) {
 -                              rcchangeserverstatus(servers[i], "sad");
 +      function rcreceivemessages(server, messages) {
 +              for (var i in messages) {
 +                      var seen_key = make_seen_key(messages[i]['ID'], messages[i]['Text']);
 +                      if (!(seen_key in seen)) {
 +                              seen[seen_key] = true;
 +                              rcaddmessagetohistory(messages[i]['Text']);
 +                              for (var i in servers) {
 +                                      rcchangeserverstatus(servers[i], "sad");
 +                              }
                        }
 +                      rcchangeserverstatus(server, "happy");
                }
 -              rcchangeserverstatus(server, "happy");
        }
  
 -      function receiveMessageEvent(event)  
 -      {  
 -              for (var i in servers) {
 -                      if (event.origin === rcserverbase(servers[i])) {
 -                              messages = JSON.parse(event.data);
 -                              for (var j in messages) {
 -                                      if ('Time' in messages[j] &&
 -                                          'ID'   in messages[j] &&
 -                                          'Text' in messages[j]) {
 -                                              receiveMessage(servers[i], messages[j]['Time'], messages[j]['ID'], messages[j]['Text']);
 +      function rcfetch(server) {
 +              var delay = 10000;  // TODO: Exponential backoff
 +              var xhr = new XMLHttpRequest();
 +              xhr.onreadystatechange = function() {
 +                      if (this.readyState == this.DONE) {
 +                              if (this.status == 200) {
 +                                      var rtxt = this.responseText;
 +                                      if (rtxt != null) {
 +                                              var messages = JSON.parse(rtxt);
 +                                              if (messages != null) {
 +                                                      rcreceivemessages(server, messages);
 +                                                      window.parent.postMessage(rtxt, "*");
 +                                                      delay = 40;
 +                                                      if (messages.length >= 1 && "Time" in messages[messages.length-1]) {
 +                                                              since[server] = messages[messages.length-1]["Time"];
 +                                                      }
 +                                              }
                                        }
                                }
 +                              window.setTimeout(rcfetch, delay, server);
                        }
                }
 +              var uri = rcserverbase(server) + "/fetch";
 +              if (server in since) {
 +                      uri += '?since="' + since[server] + '"';
 +              }
 +              xhr.open("GET", uri);
 +              xhr.send();
        }
  
        function rcconnect() {
 -              window.addEventListener("message", receiveMessageEvent, false);  
                for (var i in servers) {
 -                      // Create a hidden iframe for same-origin workaround
 -                      var iframe = document.createElement("iframe");
 -                      iframe.setAttribute("src", rcserverbase(servers[i]) + "/frame");
 -                      document.body.insertBefore(iframe, document.body.firstChild);
 +                      rcfetch(servers[i]);
                        // Status bar entry
                        var status_indicator = document.createElement("span");
                        status_indicator.appendChild(document.createTextNode(servers[i]));
                                message = "<" + rcnick() + "> " + input;
                        }
  
+                       // /me support
+                       var message;
+                       var re = /^\/me (.*)/;
+                       var match = re.exec(input);
+                       var inputme = input.substring(4);
+                       if (match) {
+                               message = "* " + rcnick() + "  " + inputme;
+                       } else {
+                               message = "<" + rcnick() + "> " + input;
+                       }
 +                      // Say the message
 +                      var d = rcaddmessagetohistory(message);
 +                      rcsend(d, message);
 +
                        // Remind people to set their nick
                        if (rcnick() == 'anonymous') {
                                rcaddmessagetohistory("-!- Set your nick with /nick");
                        }
 -
 -                      // Say the message
 -                      var d = rcaddmessagetohistory(message);
 -                      rcsend(d, message);
                }
        }
    //--><!]]></script>
  </head>
  
  <body onload="rcconnect()">
-       <table id="outer-table">
-               <tr><td id="history"></td></tr>
-               <tr><td id="status">&nbsp;</td></tr>
-               <tr><td><form name="input" onsubmit="return false" autocomplete="off">
-                       <input id="say" onkeydown="return rckeydown(event)" autocomplete="off"></input>
-                       </form></td></tr>
-       </table>
+       <div id="container">
+               <div id="history"></div>
+               <div id="client">
+                       <div id="input">
+                               <form name="input" onsubmit="return false" autocomplete="off">
+                                       <input id="say" onkeydown="return rckeydown(event)" autocomplete="off" autofocus="autofocus"></input>
+                               </form></div>
+                       <div id="status">&nbsp;</div>
+               </div>
+       </div>
  </body>
  </html>