- 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 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();
+ if (times.length % 2) {
+ message.Time = times[(times.length-1)/2];
+ } else {
+ var middle = times.length/2;
+ var difference = times[middle].getTime() - times[middle-1].getTime();
+ message.Time = new Date(times[middle-1].getTime() + difference/2);
+ }
+
+ // This may have broken history's in-sorted-order invariant
+ var hi = history.indexOf(message);
+ if ((history[hi-1] && history[hi-1].Time > message.Time) ||
+ (history[hi+1] && history[hi+1].Time < message.Time)) {
+ history.splice(hi,1);
+ rcaddmessagetohistory(message);
+ }
+
+ // Update the UI
+ var spans = message.UI.getElementsByTagName("span");
+ for (var i in spans) {
+ if (spans[i].getAttribute && spans[i].getAttribute("class") == "timestamp") {
+ spans[i].firstChild.data = rcformattime(message.Time);
+ }
+ }
+ }
+
+ 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) {
+ seen[seen_key].ServerTimes[server] = m.Time;
+ rcupdatemessagetime(seen[seen_key]);
+ } else {
+ m.ServerTimes = {};
+ m.ServerTimes[server] = m.Time;
+ seen[seen_key] = m;
+ rcaddmessagetohistory(m);
+ for (var i in servers) {
+ rcchangeserverstatus(servers[i], "sad");
+ }