X-Git-Url: http://git.scottworley.com/reliable-chat/blobdiff_plain/869430fa1ce8451a742702fa0b5d344d247513b6..40380bd38b8334e7e936502bbb4057ef5318d708:/webclient/rc.html?ds=sidebyside diff --git a/webclient/rc.html b/webclient/rc.html index bb99825..988f1fb 100644 --- a/webclient/rc.html +++ b/webclient/rc.html @@ -82,6 +82,12 @@ var session = Math.random(); // For outgoing message IDs var since = {}; // server -> time: For fetch?since= var seen = {}; // seen_key -> message + // Messages have these fields: + // Time: The timestamp. Median of ServerTimes + // ID: Some unique string for deduping + // Text: The text of the message + // ServerTimes: server -> timestamp + // UI: The DOM node for this message in the UI function rcnick() { var nick = localStorage.getItem("nick"); @@ -139,12 +145,32 @@ return id.replace(/@/g, "@@") + "_@_" + text.replace(/@/g, "@@"); } + function rcupdatemessagetime(message) { + // Set message.Time to be the median of message.ServerTimes + var times = []; + for (var i in message.ServerTimes) { + times.push(message.ServerTimes[i]); + } + times.sort(); + var middle = times.length/2; + if (times.length % 2) { + message.Time = times[middle]; + } else { + var difference = times[middle].getTime() - times[middle-1].getTime(); + message.Time = new Date(times[middle-1].getTime() + difference/2); + } + } + function rcreceivemessages(server, messages) { for (var i in messages) { var m = messages[i]; m.Time = new Date(m.Time); var seen_key = make_seen_key(m.ID, m.Text); - if (!(seen_key in seen)) { + if (seen_key in seen) { + seen[seen_key].ServerTimes[server] = m.Time; + rcupdatemessagetime(seen[seen_key]); + } else { + m.ServerTimes = {server: m.Time}; seen[seen_key] = m; rcaddmessagetohistory(m); for (var i in servers) {