From 781ada64ca24be87691bd1473ae04a1d585d1aae Mon Sep 17 00:00:00 2001 From: lilia Date: Fri, 19 Feb 2016 16:28:08 -0800 Subject: [PATCH] Add libtextsecure support for syncing read messages Plumbing for sending and receiving a new sync protobuf for marking messages read on/from my other devices. // FREEBIE --- js/background.js | 7 +++++ js/libtextsecure.js | 37 +++++++++++++++++++++++++- libtextsecure/message_receiver.js | 18 ++++++++++++- libtextsecure/sendmessage.js | 19 +++++++++++++ protos/IncomingPushMessageSignal.proto | 5 ++++ 5 files changed, 84 insertions(+), 2 deletions(-) diff --git a/js/background.js b/js/background.js index 44225cef67..b0e8dffb1d 100644 --- a/js/background.js +++ b/js/background.js @@ -103,6 +103,7 @@ messageReceiver.addEventListener('contact', onContactReceived); messageReceiver.addEventListener('group', onGroupReceived); messageReceiver.addEventListener('sent', onSentMessage); + messageReceiver.addEventListener('read', onReadReceipt); messageReceiver.addEventListener('error', onError); window.textsecure.messaging = new textsecure.MessageSender(SERVER_URL, USERNAME, PASSWORD, ATTACHMENT_SERVER_URL); @@ -228,6 +229,12 @@ throw e; } + function onReadReceipt(ev) { + var timestamp = ev.timestamp.toNumber(); + var sender = ev.sender; + console.log('read receipt ', sender, timestamp); + } + // lazy hack window.receipts = new Backbone.Collection(); diff --git a/js/libtextsecure.js b/js/libtextsecure.js index 85c98434d3..dbed6013c4 100644 --- a/js/libtextsecure.js +++ b/js/libtextsecure.js @@ -37034,7 +37034,11 @@ MessageReceiver.prototype.extend({ } if (syncMessage.sent) { var sentMessage = syncMessage.sent; - console.log('sent message to', sentMessage.destination, sentMessage.timestamp.toNumber(), 'from', envelope.source + '.' + envelope.sourceDevice); + console.log('sent message to', + sentMessage.destination, + sentMessage.timestamp.toNumber(), + 'from', envelope.source + '.' + envelope.sourceDevice + ); return this.handleSentMessage( sentMessage.destination, sentMessage.timestamp, @@ -37046,10 +37050,22 @@ MessageReceiver.prototype.extend({ this.handleGroups(syncMessage.groups); } else if (syncMessage.request) { console.log('Got SyncMessage Request'); + } else if (syncMessage.read) { + console.log('read messages', + 'from', envelope.source + '.' + envelope.sourceDevice); + this.handleRead(syncMessage.read); } else { throw new Error('Got empty SyncMessage'); } }, + handleRead: function(read) { + for (var i = 0; i < read.length; ++i) { + var ev = new Event('read'); + ev.timestamp = read[i].timestamp; + ev.sender = read[i].sender; + this.dispatchEvent(ev); + } + }, handleContacts: function(contacts) { console.log('contact sync'); var eventTarget = this; @@ -37623,6 +37639,24 @@ MessageSender.prototype = { return this.sendIndividualProto(myNumber, contentMessage, Date.now()); } }, + sendReadReceipts: function(receipts) { + var myNumber = textsecure.storage.user.getNumber(); + var myDevice = textsecure.storage.user.getDeviceId(); + if (myDevice != 1) { + var syncMessage = new textsecure.protobuf.SyncMessage(); + syncMessage.read = []; + for (var i = 0; i < receipts.length; ++i) { + var read = new textsecure.protobuf.SyncMessage.Read(); + read.timestamp = receipts[i].timestamp; + read.sender = receipts[i].sender; + syncMessage.read.push(read); + } + var contentMessage = new textsecure.protobuf.Content(); + contentMessage.syncMessage = syncMessage; + + return this.sendIndividualProto(myNumber, contentMessage, Date.now()); + } + }, sendGroupProto: function(numbers, proto, timestamp) { timestamp = timestamp || Date.now(); @@ -37824,6 +37858,7 @@ textsecure.MessageSender = function(url, username, password, attachment_server_u this.setGroupAvatar = sender.setGroupAvatar .bind(sender); this.leaveGroup = sender.leaveGroup .bind(sender); this.sendSyncMessage = sender.sendSyncMessage .bind(sender); + this.sendReadReceipts = sender.sendReadReceipts .bind(sender); }; textsecure.MessageSender.prototype = { diff --git a/libtextsecure/message_receiver.js b/libtextsecure/message_receiver.js index dd8c8a7a9a..ac5283f66b 100644 --- a/libtextsecure/message_receiver.js +++ b/libtextsecure/message_receiver.js @@ -198,7 +198,11 @@ MessageReceiver.prototype.extend({ } if (syncMessage.sent) { var sentMessage = syncMessage.sent; - console.log('sent message to', sentMessage.destination, sentMessage.timestamp.toNumber(), 'from', envelope.source + '.' + envelope.sourceDevice); + console.log('sent message to', + sentMessage.destination, + sentMessage.timestamp.toNumber(), + 'from', envelope.source + '.' + envelope.sourceDevice + ); return this.handleSentMessage( sentMessage.destination, sentMessage.timestamp, @@ -210,10 +214,22 @@ MessageReceiver.prototype.extend({ this.handleGroups(syncMessage.groups); } else if (syncMessage.request) { console.log('Got SyncMessage Request'); + } else if (syncMessage.read) { + console.log('read messages', + 'from', envelope.source + '.' + envelope.sourceDevice); + this.handleRead(syncMessage.read); } else { throw new Error('Got empty SyncMessage'); } }, + handleRead: function(read) { + for (var i = 0; i < read.length; ++i) { + var ev = new Event('read'); + ev.timestamp = read[i].timestamp; + ev.sender = read[i].sender; + this.dispatchEvent(ev); + } + }, handleContacts: function(contacts) { console.log('contact sync'); var eventTarget = this; diff --git a/libtextsecure/sendmessage.js b/libtextsecure/sendmessage.js index 1b30c09697..7db35edb2b 100644 --- a/libtextsecure/sendmessage.js +++ b/libtextsecure/sendmessage.js @@ -182,6 +182,24 @@ MessageSender.prototype = { return this.sendIndividualProto(myNumber, contentMessage, Date.now()); } }, + sendReadReceipts: function(receipts) { + var myNumber = textsecure.storage.user.getNumber(); + var myDevice = textsecure.storage.user.getDeviceId(); + if (myDevice != 1) { + var syncMessage = new textsecure.protobuf.SyncMessage(); + syncMessage.read = []; + for (var i = 0; i < receipts.length; ++i) { + var read = new textsecure.protobuf.SyncMessage.Read(); + read.timestamp = receipts[i].timestamp; + read.sender = receipts[i].sender; + syncMessage.read.push(read); + } + var contentMessage = new textsecure.protobuf.Content(); + contentMessage.syncMessage = syncMessage; + + return this.sendIndividualProto(myNumber, contentMessage, Date.now()); + } + }, sendGroupProto: function(numbers, proto, timestamp) { timestamp = timestamp || Date.now(); @@ -383,6 +401,7 @@ textsecure.MessageSender = function(url, username, password, attachment_server_u this.setGroupAvatar = sender.setGroupAvatar .bind(sender); this.leaveGroup = sender.leaveGroup .bind(sender); this.sendSyncMessage = sender.sendSyncMessage .bind(sender); + this.sendReadReceipts = sender.sendReadReceipts .bind(sender); }; textsecure.MessageSender.prototype = { diff --git a/protos/IncomingPushMessageSignal.proto b/protos/IncomingPushMessageSignal.proto index 0c1df06f44..d21b760cf1 100644 --- a/protos/IncomingPushMessageSignal.proto +++ b/protos/IncomingPushMessageSignal.proto @@ -60,11 +60,16 @@ message SyncMessage { } optional Type type = 1; } + message Read { + optional string sender = 1; + optional uint64 timestamp = 2; + } optional Sent sent = 1; optional Contacts contacts = 2; optional Groups groups = 3; optional Request request = 4; + repeated Read read = 5; } message AttachmentPointer {