|
|
|
@ -145,24 +145,32 @@ class CwtchNotifier {
|
|
|
|
|
break;
|
|
|
|
|
case "NewMessageFromGroup":
|
|
|
|
|
if (data["ProfileOnion"] != data["RemotePeer"]) {
|
|
|
|
|
//if not currently open
|
|
|
|
|
if (appState.selectedProfile != data["ProfileOnion"] || appState.selectedConversation != data["GroupID"]) {
|
|
|
|
|
profileCN.getProfile(data["ProfileOnion"])?.contactList.getContact(data["GroupID"])!.unreadMessages++;
|
|
|
|
|
var idx = int.parse(data["Index"]);
|
|
|
|
|
var currentTotal = profileCN.getProfile(data["ProfileOnion"])?.contactList.getContact(data["GroupID"])!.totalMessages;
|
|
|
|
|
|
|
|
|
|
// Only bother to do anything if we know about the group and the provided index is greater than our current total...
|
|
|
|
|
if (currentTotal != null && idx >= currentTotal) {
|
|
|
|
|
profileCN.getProfile(data["ProfileOnion"])?.contactList.getContact(data["GroupID"])!.totalMessages = idx + 1;
|
|
|
|
|
|
|
|
|
|
//if not currently open
|
|
|
|
|
if (appState.selectedProfile != data["ProfileOnion"] || appState.selectedConversation != data["GroupID"]) {
|
|
|
|
|
profileCN.getProfile(data["ProfileOnion"])?.contactList.getContact(data["GroupID"])!.unreadMessages++;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var timestampSent = DateTime.tryParse(data['TimestampSent'])!;
|
|
|
|
|
// TODO: There are 2 timestamps associated with a new group message - time sent and time received.
|
|
|
|
|
// Sent refers to the time a profile alleges they sent a message
|
|
|
|
|
// Received refers to the time we actually saw the message from the server
|
|
|
|
|
// These can obviously be very different for legitimate reasons.
|
|
|
|
|
// We also maintain a relative hash-link through PreviousMessageSignature which is the ground truth for
|
|
|
|
|
// order.
|
|
|
|
|
// In the future we will want to combine these 3 ordering mechanisms into a cohesive view of the timeline
|
|
|
|
|
// For now we perform some minimal checks on the sent timestamp to use to provide a useful ordering for honest contacts
|
|
|
|
|
// and ensure that malicious contacts in groups can only set this timestamp to a value within the range of `last seen message time`
|
|
|
|
|
// and `local now`.
|
|
|
|
|
profileCN.getProfile(data["ProfileOnion"])?.contactList.updateLastMessageTime(data["GroupID"], timestampSent.toLocal());
|
|
|
|
|
notificationManager.notify("New Message From Group!");
|
|
|
|
|
}
|
|
|
|
|
profileCN.getProfile(data["ProfileOnion"])?.contactList.getContact(data["GroupID"])!.totalMessages++;
|
|
|
|
|
var timestampSent = DateTime.tryParse(data['TimestampSent'])!;
|
|
|
|
|
// TODO: There are 2 timestamps associated with a new group message - time sent and time received.
|
|
|
|
|
// Sent refers to the time a profile alleges they sent a message
|
|
|
|
|
// Received refers to the time we actually saw the message from the server
|
|
|
|
|
// These can obviously be very different for legitimate reasons.
|
|
|
|
|
// We also maintain a relative hash-link through PreviousMessageSignature which is the ground truth for
|
|
|
|
|
// order.
|
|
|
|
|
// In the future we will want to combine these 3 ordering mechanisms into a cohesive view of the timeline
|
|
|
|
|
// For now we perform some minimal checks on the sent timestamp to use to provide a useful ordering for honest contacts
|
|
|
|
|
// and ensure that malicious contacts in groups can only set this timestamp to a value within the range of `last seen message time`
|
|
|
|
|
// and `local now`.
|
|
|
|
|
profileCN.getProfile(data["ProfileOnion"])?.contactList.updateLastMessageTime(data["GroupID"], timestampSent.toLocal());
|
|
|
|
|
notificationManager.notify("New Message From Group!");
|
|
|
|
|
} else {
|
|
|
|
|
// from me (already displayed - do not update counter)
|
|
|
|
|
var idx = data["Signature"];
|
|
|
|
@ -180,7 +188,10 @@ class CwtchNotifier {
|
|
|
|
|
case "MessageCounterResync":
|
|
|
|
|
var contactHandle = data["RemotePeer"];
|
|
|
|
|
if (contactHandle == null || contactHandle == "") contactHandle = data["GroupID"];
|
|
|
|
|
profileCN.getProfile(data["Identity"])?.contactList.getContact(contactHandle)!.totalMessages = int.parse(data["Data"]);
|
|
|
|
|
var total = int.parse(data["Data"]);
|
|
|
|
|
if (total != profileCN.getProfile(data["Identity"])?.contactList.getContact(contactHandle)!.totalMessages) {
|
|
|
|
|
profileCN.getProfile(data["Identity"])?.contactList.getContact(contactHandle)!.totalMessages = total;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case "SendMessageToPeerError":
|
|
|
|
|
// Ignore
|
|
|
|
@ -316,7 +327,7 @@ class CwtchNotifier {
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case "NewRetValMessageFromPeer":
|
|
|
|
|
if (data["Path"] == "name") {
|
|
|
|
|
if (data["Path"] == "name" && data["Data"].toString().trim().length > 0) {
|
|
|
|
|
// Update locally on the UI...
|
|
|
|
|
if (profileCN.getProfile(data["ProfileOnion"])?.contactList.getContact(data["RemotePeer"]) != null) {
|
|
|
|
|
profileCN.getProfile(data["ProfileOnion"])?.contactList.getContact(data["RemotePeer"])!.nickname = data["Data"];
|
|
|
|
|
if (a && b)