Skip to content

Commit 5dcccb8

Browse files
committed
Honor received leave group messages
1 parent 7814d2e commit 5dcccb8

File tree

3 files changed

+140
-62
lines changed

3 files changed

+140
-62
lines changed

Signal-Windows.Lib/IncomingMessages.cs

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,14 @@ private void HandleMessage(SignalServiceEnvelope envelope)
113113
{
114114
HandleGroupUpdateMessage(envelope, content, message, false, timestamp);
115115
}
116+
else if (message.Group.Type == SignalServiceGroup.GroupType.QUIT)
117+
{
118+
HandleGroupLeaveMessage(envelope, content, message, false, timestamp);
119+
}
120+
else if (message.Group.Type == SignalServiceGroup.GroupType.REQUEST_INFO)
121+
{
122+
Logger.LogWarning("Received REQUEST_INFO request");
123+
}
116124
}
117125
else if (message.ExpirationUpdate)
118126
{
@@ -140,6 +148,14 @@ private void HandleMessage(SignalServiceEnvelope envelope)
140148
{
141149
HandleGroupUpdateMessage(envelope, content, dataMessage, true, timestamp);
142150
}
151+
else if (dataMessage.Group.Type == SignalServiceGroup.GroupType.QUIT)
152+
{
153+
HandleGroupLeaveMessage(envelope, content, dataMessage, true, timestamp);
154+
}
155+
else if (dataMessage.Group.Type == SignalServiceGroup.GroupType.REQUEST_INFO)
156+
{
157+
Logger.LogWarning("Received synced REQUEST_INFO request");
158+
}
143159
}
144160
else if (dataMessage.ExpirationUpdate)
145161
{
@@ -285,6 +301,43 @@ private void HandleSessionResetMessage(SignalServiceEnvelope envelope, SignalSer
285301
SignalLibHandle.Instance.SaveAndDispatchSignalMessage(sm, conversation);
286302
}
287303

304+
private void HandleGroupLeaveMessage(SignalServiceEnvelope envelope, SignalServiceContent content, SignalServiceDataMessage dataMessage, bool isSync, long timestamp)
305+
{
306+
SignalServiceGroup sentGroup = dataMessage.Group;
307+
if (sentGroup != null)
308+
{
309+
string groupid = Base64.encodeBytes(sentGroup.GroupId);
310+
SignalGroup group = SignalDBContext.GetOrCreateGroupLocked(groupid, 0);
311+
if (isSync)
312+
{
313+
//TODO
314+
}
315+
else
316+
{
317+
SignalContact author = SignalDBContext.GetOrCreateContactLocked(envelope.getSource(), 0);
318+
SignalMessage sm = new SignalMessage()
319+
{
320+
Direction = SignalMessageDirection.Incoming,
321+
Type = SignalMessageType.GroupLeave,
322+
Status = SignalMessageStatus.Received,
323+
Author = author,
324+
Content = new SignalMessageContent() { Content = $"{author.ThreadDisplayName} has left the group." },
325+
ThreadId = groupid,
326+
DeviceId = (uint)envelope.getSourceDevice(),
327+
Receipts = 0,
328+
ComposedTimestamp = envelope.getTimestamp(),
329+
ReceivedTimestamp = timestamp,
330+
};
331+
SignalConversation updatedConversation = SignalDBContext.RemoveMemberFromGroup(groupid, author, sm);
332+
SignalLibHandle.Instance.DispatchAddOrUpdateConversation(updatedConversation, sm);
333+
}
334+
}
335+
else
336+
{
337+
Logger.LogError("HandleGroupLeaveMessage() received group update without group info");
338+
}
339+
}
340+
288341
private void HandleGroupUpdateMessage(SignalServiceEnvelope envelope, SignalServiceContent content, SignalServiceDataMessage dataMessage, bool isSync, long timestamp)
289342
{
290343
if (dataMessage.Group != null) //TODO check signal droid: group messages have different types!

Signal-Windows.Lib/Models/SignalMessage.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,8 @@ public enum SignalMessageType
3030
GroupUpdate = 1,
3131
SessionReset = 2,
3232
ExpireUpdate = 3,
33-
IdentityKeyChange = 4
33+
IdentityKeyChange = 4,
34+
GroupLeave = 5
3435
}
3536

3637
public enum SignalMessageDirection

Signal-Windows.Lib/Storage/DB.cs

Lines changed: 85 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -746,70 +746,77 @@ public static void SaveMessageLocked(SignalMessage message)
746746
{
747747
using (var ctx = new SignalDBContext())
748748
{
749-
long timestamp;
750-
if (message.Direction == SignalMessageDirection.Synced)
751-
{
752-
var receipts = ctx.EarlyReceipts
753-
.Where(er => er.Timestamp == message.ComposedTimestamp)
754-
.ToList();
749+
SaveMessage(ctx, message);
750+
}
751+
}
752+
}
755753

756-
message.Receipts = (uint)receipts.Count;
757-
ctx.EarlyReceipts.RemoveRange(receipts);
758-
if (message.Receipts > 0)
759-
{
760-
message.Status = SignalMessageStatus.Received;
761-
}
762-
}
763-
if (message.Author != null)
764-
{
765-
timestamp = message.ReceivedTimestamp;
766-
message.Author = ctx.Contacts.Where(a => a.Id == message.Author.Id).Single();
767-
}
768-
else
769-
{
770-
timestamp = message.ComposedTimestamp;
771-
}
772-
if (!message.ThreadId.EndsWith("="))
773-
{
774-
var contact = ctx.Contacts
775-
.Where(c => c.ThreadId == message.ThreadId)
776-
.Single();
777-
contact.LastActiveTimestamp = timestamp;
778-
contact.LastMessage = message;
779-
contact.MessagesCount += 1;
780-
if (message.Author == null)
781-
{
782-
contact.UnreadCount = 0;
783-
contact.LastSeenMessageIndex = contact.MessagesCount;
784-
}
785-
else
786-
{
787-
contact.UnreadCount += 1;
788-
}
789-
}
790-
else
791-
{
792-
var group = ctx.Groups
793-
.Where(c => c.ThreadId == message.ThreadId)
794-
.Single();
795-
message.ExpiresAt = group.ExpiresInSeconds;
796-
group.LastActiveTimestamp = timestamp;
797-
group.LastMessage = message;
798-
group.MessagesCount += 1;
799-
if (message.Author == null)
800-
{
801-
group.UnreadCount = 0;
802-
group.LastSeenMessageIndex = group.MessagesCount;
803-
}
804-
else
805-
{
806-
group.UnreadCount += 1;
807-
}
808-
}
809-
ctx.Messages.Add(message);
810-
ctx.SaveChanges();
754+
private static SignalConversation SaveMessage(SignalDBContext ctx, SignalMessage message)
755+
{
756+
SignalConversation conversation;
757+
long timestamp;
758+
if (message.Direction == SignalMessageDirection.Synced)
759+
{
760+
var receipts = ctx.EarlyReceipts
761+
.Where(er => er.Timestamp == message.ComposedTimestamp)
762+
.ToList();
763+
764+
message.Receipts = (uint)receipts.Count;
765+
ctx.EarlyReceipts.RemoveRange(receipts);
766+
if (message.Receipts > 0)
767+
{
768+
message.Status = SignalMessageStatus.Received;
769+
}
770+
}
771+
if (message.Author != null)
772+
{
773+
timestamp = message.ReceivedTimestamp;
774+
message.Author = ctx.Contacts.Where(a => a.Id == message.Author.Id).Single();
775+
}
776+
else
777+
{
778+
timestamp = message.ComposedTimestamp;
779+
}
780+
if (!message.ThreadId.EndsWith("="))
781+
{
782+
conversation = ctx.Contacts
783+
.Where(c => c.ThreadId == message.ThreadId)
784+
.Single();
785+
conversation.LastActiveTimestamp = timestamp;
786+
conversation.LastMessage = message;
787+
conversation.MessagesCount += 1;
788+
if (message.Author == null)
789+
{
790+
conversation.UnreadCount = 0;
791+
conversation.LastSeenMessageIndex = conversation.MessagesCount;
792+
}
793+
else
794+
{
795+
conversation.UnreadCount += 1;
811796
}
812797
}
798+
else
799+
{
800+
conversation = ctx.Groups
801+
.Where(c => c.ThreadId == message.ThreadId)
802+
.Single();
803+
message.ExpiresAt = conversation.ExpiresInSeconds;
804+
conversation.LastActiveTimestamp = timestamp;
805+
conversation.LastMessage = message;
806+
conversation.MessagesCount += 1;
807+
if (message.Author == null)
808+
{
809+
conversation.UnreadCount = 0;
810+
conversation.LastSeenMessageIndex = conversation.MessagesCount;
811+
}
812+
else
813+
{
814+
conversation.UnreadCount += 1;
815+
}
816+
}
817+
ctx.Messages.Add(message);
818+
ctx.SaveChanges();
819+
return conversation;
813820
}
814821

815822
public static List<SignalMessageContainer> GetMessagesLocked(SignalConversation thread, int startIndex, int count)
@@ -1083,6 +1090,23 @@ internal static SignalConversation UpdateMessageRead(long index, SignalConversat
10831090

10841091
#region Groups
10851092

1093+
public static SignalConversation RemoveMemberFromGroup(string groupId, SignalContact member, SignalMessage quitMessage)
1094+
{
1095+
lock (DBLock)
1096+
{
1097+
using (var ctx = new SignalDBContext())
1098+
{
1099+
var dbgroup = ctx.Groups
1100+
.Where(g => g.ThreadId == groupId)
1101+
.Include(g => g.GroupMemberships)
1102+
.ThenInclude(gm => gm.Contact)
1103+
.Single();
1104+
dbgroup.GroupMemberships.RemoveAll(gm => gm.Contact.Id == member.Id);
1105+
return SaveMessage(ctx, quitMessage);
1106+
}
1107+
}
1108+
}
1109+
10861110
public static SignalGroup GetOrCreateGroupLocked(string groupId, long timestamp, bool notify = true)
10871111
{
10881112
SignalGroup dbgroup;

0 commit comments

Comments
 (0)