Separate messages from different days.
This commit is contained in:
parent
7ae4bed223
commit
f1bfc51152
@ -145,7 +145,7 @@ input.new-chatroom-name {
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.chat-event {
|
||||
.chat-event, .chat-date {
|
||||
color: #808080;
|
||||
}
|
||||
|
||||
|
118
converse.js
118
converse.js
@ -79,22 +79,39 @@
|
||||
}(this, function ($, store, _, console) {
|
||||
|
||||
var xmppchat = {};
|
||||
xmppchat.msg_counter = 0;
|
||||
|
||||
// IE <= 8 Doesn't have toISOStringMethod
|
||||
if (!Date.toISOString) {
|
||||
Date.prototype.toISOString = function () {
|
||||
var d = new Date();
|
||||
xmppchat.toISOString = function (date) {
|
||||
if (typeof date.toISOString !== 'undefined') {
|
||||
return date.toISOString();
|
||||
} else {
|
||||
// IE <= 8 Doesn't have toISOStringMethod
|
||||
pad = function (num) {
|
||||
return (num < 10) ? '0' + num : '' + num;
|
||||
};
|
||||
return d.getUTCFullYear() + '-' +
|
||||
pad(d.getUTCMonth() + 1) + '-' +
|
||||
pad(d.getUTCDate()) + 'T' +
|
||||
pad(d.getUTCHours()) + ':' +
|
||||
pad(d.getUTCMinutes()) + ':' +
|
||||
pad(d.getUTCSeconds()) + '.000Z';
|
||||
};
|
||||
}
|
||||
return date.getUTCFullYear() + '-' +
|
||||
pad(date.getUTCMonth() + 1) + '-' +
|
||||
pad(date.getUTCDate()) + 'T' +
|
||||
pad(date.getUTCHours()) + ':' +
|
||||
pad(date.getUTCMinutes()) + ':' +
|
||||
pad(date.getUTCSeconds()) + '.000Z';
|
||||
}
|
||||
};
|
||||
|
||||
xmppchat.updateMsgCounter = function () {
|
||||
this.msg_counter += 1;
|
||||
if (this.msg_counter > 0) {
|
||||
if (document.title.search(/^Messages \(\d\) /) === -1) {
|
||||
document.title = "Messages (" + this.msg_counter + ") " + document.title;
|
||||
} else {
|
||||
document.title = document.title.replace(/^Messages \(\d\) /, "Messages (" + this.msg_counter + ") ");
|
||||
}
|
||||
window.blur();
|
||||
window.focus();
|
||||
} else if (document.title.search(/^\(\d\) /) !== -1) {
|
||||
document.title = document.title.replace(/^Messages \(\d\) /, "");
|
||||
}
|
||||
};
|
||||
|
||||
xmppchat.collections = {
|
||||
/* FIXME: XEP-0136 specifies 'urn:xmpp:archive' but the mod_archive_odbc
|
||||
@ -149,7 +166,7 @@
|
||||
|
||||
addMessage: function (jid, msg, direction) {
|
||||
var bare_jid = Strophe.getBareJidFromJid(jid),
|
||||
now = (new Date()).toISOString(),
|
||||
now = xmppchat.toISOString(new Date()),
|
||||
msgs = store.get(hex_sha1(this.get('own_jid')+bare_jid)) || [];
|
||||
if (msgs.length >= 30) {
|
||||
msgs.shift();
|
||||
@ -168,6 +185,14 @@
|
||||
return decrypted_msgs;
|
||||
},
|
||||
|
||||
getLastMessage: function (jid) {
|
||||
var bare_jid = Strophe.getBareJidFromJid(jid);
|
||||
var msgs = store.get(hex_sha1(this.get('own_jid')+bare_jid)) || [];
|
||||
if (msgs.length) {
|
||||
return sjcl.decrypt(hex_sha1(this.get('own_jid')), msgs[msgs.length-1]);
|
||||
}
|
||||
},
|
||||
|
||||
getOpenChats: function () {
|
||||
var key = hex_sha1(this.get('own_jid')+'-open-chats'),
|
||||
chats = store.get(key) || [],
|
||||
@ -248,6 +273,14 @@
|
||||
minutes = now.getMinutes().toString(),
|
||||
$chat_content = $(this.el).find('.chat-content');
|
||||
|
||||
var msg = xmppchat.storage.getLastMessage(this.model.get('jid'));
|
||||
if (typeof msg !== 'undefined') {
|
||||
var prev_date = new Date(Date.parse(msg.split(' ', 2)[0]));
|
||||
if (this.isDifferentDay(prev_date, now)) {
|
||||
$chat_content.append($('<div class="chat-date"> </div>'));
|
||||
$chat_content.append($('<div class="chat-date"></div>').text(now.toString().substring(0,15)));
|
||||
}
|
||||
}
|
||||
message = this.autoLink(message);
|
||||
if (minutes.length==1) {minutes = '0'+minutes;}
|
||||
$chat_content.find('div.chat-event').remove();
|
||||
@ -261,10 +294,10 @@
|
||||
$chat_content.scrollTop($chat_content[0].scrollHeight);
|
||||
},
|
||||
|
||||
insertStatusNotification: function (user_id, message) {
|
||||
insertStatusNotification: function (message, replace) {
|
||||
var $chat_content = this.$el.find('.chat-content');
|
||||
$chat_content.find('div.chat-event').remove().end()
|
||||
.append($('<div class="chat-event"></div>').text(user_id+' '+message));
|
||||
.append($('<div class="chat-event"></div>').text(message));
|
||||
$chat_content.scrollTop($chat_content[0].scrollHeight);
|
||||
},
|
||||
|
||||
@ -287,7 +320,7 @@
|
||||
}
|
||||
if (!body) {
|
||||
if (composing.length > 0) {
|
||||
this.insertStatusNotification(fullname, 'is typing');
|
||||
this.insertStatusNotification(fullname+' '+'is typing');
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
@ -320,21 +353,44 @@
|
||||
}));
|
||||
$chat_content.scrollTop($chat_content[0].scrollHeight);
|
||||
}
|
||||
xmppchat.updateMsgCounter();
|
||||
},
|
||||
|
||||
isDifferentDay: function (prev_date, next_date) {
|
||||
return ((next_date.getDate() != prev_date.getDate()) || (next_date.getFullYear() != prev_date.getFullYear()) || (next_date.getMonth() != prev_date.getMonth()));
|
||||
},
|
||||
|
||||
insertClientStoredMessages: function () {
|
||||
var msgs = xmppchat.storage.getMessages(this.model.get('jid')),
|
||||
$content = this.$el.find('.chat-content'), i;
|
||||
$content = this.$el.find('.chat-content'),
|
||||
prev_date, this_date, now, separator, i;
|
||||
|
||||
|
||||
|
||||
for (i=0; i<_.size(msgs); i++) {
|
||||
var msg = msgs[i],
|
||||
msg_array = msg.split(' ', 2),
|
||||
date = msg_array[0];
|
||||
|
||||
if (i === 0) {
|
||||
this_date = new Date(Date.parse(date));
|
||||
if (this.isDifferentDay(this_date, new Date())) {
|
||||
$content.append($('<div class="chat-date"></div>').text(this_date.toString().substring(0,15)));
|
||||
}
|
||||
} else {
|
||||
prev_date = this_date;
|
||||
this_date = new Date(Date.parse(date));
|
||||
if (this.isDifferentDay(prev_date, this_date)) {
|
||||
$content.append($('<div class="chat-date"> </div>'));
|
||||
$content.append($('<div class="chat-date"></div>').text(this_date.toString().substring(0,15)));
|
||||
}
|
||||
}
|
||||
msg = this.autoLink(String(msg).replace(/(.*?\s.*?\s)/, ''));
|
||||
if (msg_array[1] == 'to') {
|
||||
$content.append(
|
||||
this.message_template({
|
||||
'sender': 'me',
|
||||
'time': new Date(Date.parse(date)).toLocaleTimeString().substring(0,5),
|
||||
'time': this_date.toLocaleTimeString().substring(0,5),
|
||||
'message': msg,
|
||||
'username': 'me',
|
||||
'extra_classes': 'delayed'
|
||||
@ -343,7 +399,7 @@
|
||||
$content.append(
|
||||
this.message_template({
|
||||
'sender': 'them',
|
||||
'time': new Date(Date.parse(date)).toLocaleTimeString().substring(0,5),
|
||||
'time': this_date.toLocaleTimeString().substring(0,5),
|
||||
'message': msg,
|
||||
'username': this.model.get('fullname').split(' ')[0],
|
||||
'extra_classes': 'delayed'
|
||||
@ -356,7 +412,7 @@
|
||||
// TODO: Look in ChatPartners to see what resources we have for the recipient.
|
||||
// if we have one resource, we sent to only that resources, if we have multiple
|
||||
// we send to the bare jid.
|
||||
var timestamp = new Date().getTime();
|
||||
var timestamp = (new Date()).getTime();
|
||||
var bare_jid = this.model.get('jid');
|
||||
var message = $msg({from: xmppchat.connection.bare_jid, to: bare_jid, type: 'chat', id: timestamp})
|
||||
.c('body').t(text).up()
|
||||
@ -371,8 +427,8 @@
|
||||
|
||||
xmppchat.connection.send(message);
|
||||
xmppchat.connection.send(forwarded);
|
||||
xmppchat.storage.addMessage(bare_jid, text, 'to');
|
||||
this.appendMessage(text);
|
||||
xmppchat.storage.addMessage(bare_jid, text, 'to');
|
||||
},
|
||||
|
||||
keyPressed: function (ev) {
|
||||
@ -423,11 +479,11 @@
|
||||
if (_.has(changed.changes, 'presence_type')) {
|
||||
if (this.$el.is(':visible')) {
|
||||
if (item.get('presence_type') === 'offline') {
|
||||
this.insertStatusNotification(this.model.get('fullname'), 'has gone offline');
|
||||
this.insertStatusNotification(this.model.get('fullname')+' '+'has gone offline');
|
||||
} else if (item.get('presence_type') === 'away') {
|
||||
this.insertStatusNotification(this.model.get('fullname'), 'has gone away');
|
||||
this.insertStatusNotification(this.model.get('fullname')+' '+'has gone away');
|
||||
} else if ((item.get('presence_type') === 'busy') || (item.get('presence_type') === 'dnd')) {
|
||||
this.insertStatusNotification(this.model.get('fullname'), 'is busy');
|
||||
this.insertStatusNotification(this.model.get('fullname')+' '+'is busy');
|
||||
} else if (item.get('presence_type') === 'online') {
|
||||
this.$el.find('div.chat-event').remove();
|
||||
}
|
||||
@ -842,7 +898,7 @@
|
||||
}
|
||||
if (!body) {
|
||||
if (composing.length > 0) {
|
||||
this.insertStatusNotification(sender, 'is typing');
|
||||
this.insertStatusNotification(sender+' '+'is typing');
|
||||
return true;
|
||||
}
|
||||
} else {
|
||||
@ -1425,7 +1481,7 @@
|
||||
}
|
||||
}
|
||||
return true;
|
||||
},
|
||||
}
|
||||
});
|
||||
|
||||
xmppchat.RosterView= (function (roster, _, $, console) {
|
||||
@ -1466,7 +1522,8 @@
|
||||
children = $(this.el).children(),
|
||||
my_contacts = this.$el.find('#xmpp-contacts').hide(),
|
||||
contact_requests = this.$el.find('#xmpp-contact-requests').hide(),
|
||||
pending_contacts = this.$el.find('#pending-xmpp-contacts').hide();
|
||||
pending_contacts = this.$el.find('#pending-xmpp-contacts').hide(),
|
||||
$count, num;
|
||||
|
||||
for (var i=0; i<models.length; i++) {
|
||||
var model = models[i],
|
||||
@ -1489,7 +1546,8 @@
|
||||
h.show();
|
||||
}
|
||||
});
|
||||
$('#online-count').text(this.model.getNumOnlineContacts());
|
||||
$count = $('#online-count');
|
||||
$count.text(this.model.getNumOnlineContacts());
|
||||
}
|
||||
});
|
||||
var view = new View();
|
||||
@ -1675,8 +1733,8 @@
|
||||
$(document).unbind('jarnxmpp.connected');
|
||||
$(document).bind('jarnxmpp.connected', $.proxy(function (ev, connection) {
|
||||
this.connection = connection
|
||||
this.connection.xmlInput = function (body) { console.log(body); };
|
||||
this.connection.xmlOutput = function (body) { console.log(body); };
|
||||
// this.connection.xmlInput = function (body) { console.log(body); };
|
||||
// this.connection.xmlOutput = function (body) { console.log(body); };
|
||||
this.connection.bare_jid = Strophe.getBareJidFromJid(this.connection.jid);
|
||||
this.connection.domain = Strophe.getDomainFromJid(this.connection.jid);
|
||||
this.connection.muc_domain = 'conference.' + this.connection.domain;
|
||||
|
Loading…
Reference in New Issue
Block a user