6
6
using libsignalservice . crypto ;
7
7
using libsignalservice . messages ;
8
8
using libsignalservice . messages . multidevice ;
9
+ using libsignalservice . messages . shared ;
9
10
using libsignalservice . push ;
10
11
using libsignalservice . push . exceptions ;
11
12
using libsignalservice . push . http ;
19
20
using System . Threading ;
20
21
using System . Threading . Tasks ;
21
22
using static libsignalservice . messages . SignalServiceDataMessage ;
23
+ using static libsignalservice . push . DataMessage . Types ;
22
24
using static libsignalservice . push . DataMessage . Types . Quote . Types ;
23
25
using static libsignalservice . push . SyncMessage . Types ;
24
26
@@ -305,7 +307,7 @@ private async Task<byte[]> CreateMessageContent(CancellationToken token, SignalS
305
307
{
306
308
var quote = new DataMessage . Types . Quote ( )
307
309
{
308
- Id = ( ulong ) message . Quote . Id ,
310
+ Id = ( ulong ) message . Quote . Id ,
309
311
Author = message . Quote . Author . E164number ,
310
312
Text = message . Quote . Text
311
313
} ;
@@ -329,7 +331,10 @@ private async Task<byte[]> CreateMessageContent(CancellationToken token, SignalS
329
331
dataMessage . Quote = quote ;
330
332
}
331
333
332
- dataMessage . Timestamp = ( ulong ) message . Timestamp ;
334
+ if ( message . SharedContacts != null )
335
+ dataMessage . Contact . AddRange ( CreateSharedContactContent ( message . SharedContacts ) ) ;
336
+
337
+ dataMessage . Timestamp = ( ulong ) message . Timestamp ;
333
338
334
339
content . DataMessage = dataMessage ;
335
340
return content . ToByteArray ( ) ;
@@ -550,7 +555,7 @@ private async Task<GroupContext> CreateGroupContent(CancellationToken token, Sig
550
555
else throw new Exception ( "Unknown type: " + group . Type ) ;
551
556
552
557
if ( group . Name != null ) groupContext . Name = group . Name ;
553
- if ( group . Members != null ) groupContext . Members . AddRange ( group . Members ) ;
558
+ if ( group . Members != null ) groupContext . Members . AddRange ( group . Members ) ;
554
559
555
560
if ( group . Avatar != null && group . Avatar . IsStream ( ) )
556
561
{
@@ -595,6 +600,115 @@ private async Task<SendMessageResponseList> SendMessage(CancellationToken token,
595
600
return responseList ;
596
601
}
597
602
603
+ private List < Contact > CreateSharedContactContent ( List < SharedContact > contacts )
604
+ {
605
+ List < Contact > results = new List < Contact > ( ) ;
606
+
607
+ foreach ( var contact in contacts )
608
+ {
609
+ //TODO
610
+ /*
611
+ DataMessage.Contact.Name.Builder nameBuilder = DataMessage.Contact.Name.newBuilder();
612
+
613
+ if (contact.getName().getFamily().isPresent()) nameBuilder.setFamilyName(contact.getName().getFamily().get());
614
+ if (contact.getName().getGiven().isPresent()) nameBuilder.setGivenName(contact.getName().getGiven().get());
615
+ if (contact.getName().getMiddle().isPresent()) nameBuilder.setMiddleName(contact.getName().getMiddle().get());
616
+ if (contact.getName().getPrefix().isPresent()) nameBuilder.setPrefix(contact.getName().getPrefix().get());
617
+ if (contact.getName().getSuffix().isPresent()) nameBuilder.setSuffix(contact.getName().getSuffix().get());
618
+ if (contact.getName().getDisplay().isPresent()) nameBuilder.setDisplayName(contact.getName().getDisplay().get());
619
+
620
+ DataMessage.Contact.Builder contactBuilder = DataMessage.Contact.newBuilder()
621
+ .setName(nameBuilder);
622
+
623
+ if (contact.getAddress().isPresent())
624
+ {
625
+ for (SharedContact.PostalAddress address : contact.getAddress().get())
626
+ {
627
+ DataMessage.Contact.PostalAddress.Builder addressBuilder = DataMessage.Contact.PostalAddress.newBuilder();
628
+
629
+ switch (address.getType())
630
+ {
631
+ case HOME: addressBuilder.setType(DataMessage.Contact.PostalAddress.Type.HOME); break;
632
+ case WORK: addressBuilder.setType(DataMessage.Contact.PostalAddress.Type.WORK); break;
633
+ case CUSTOM: addressBuilder.setType(DataMessage.Contact.PostalAddress.Type.CUSTOM); break;
634
+ default: throw new AssertionError("Unknown type: " + address.getType());
635
+ }
636
+
637
+ if (address.getCity().isPresent()) addressBuilder.setCity(address.getCity().get());
638
+ if (address.getCountry().isPresent()) addressBuilder.setCountry(address.getCountry().get());
639
+ if (address.getLabel().isPresent()) addressBuilder.setLabel(address.getLabel().get());
640
+ if (address.getNeighborhood().isPresent()) addressBuilder.setNeighborhood(address.getNeighborhood().get());
641
+ if (address.getPobox().isPresent()) addressBuilder.setPobox(address.getPobox().get());
642
+ if (address.getPostcode().isPresent()) addressBuilder.setPostcode(address.getPostcode().get());
643
+ if (address.getRegion().isPresent()) addressBuilder.setRegion(address.getRegion().get());
644
+ if (address.getStreet().isPresent()) addressBuilder.setStreet(address.getStreet().get());
645
+
646
+ contactBuilder.addAddress(addressBuilder);
647
+ }
648
+ }
649
+
650
+ if (contact.getEmail().isPresent())
651
+ {
652
+ for (SharedContact.Email email : contact.getEmail().get())
653
+ {
654
+ DataMessage.Contact.Email.Builder emailBuilder = DataMessage.Contact.Email.newBuilder()
655
+ .setValue(email.getValue());
656
+
657
+ switch (email.getType())
658
+ {
659
+ case HOME: emailBuilder.setType(DataMessage.Contact.Email.Type.HOME); break;
660
+ case WORK: emailBuilder.setType(DataMessage.Contact.Email.Type.WORK); break;
661
+ case MOBILE: emailBuilder.setType(DataMessage.Contact.Email.Type.MOBILE); break;
662
+ case CUSTOM: emailBuilder.setType(DataMessage.Contact.Email.Type.CUSTOM); break;
663
+ default: throw new AssertionError("Unknown type: " + email.getType());
664
+ }
665
+
666
+ if (email.getLabel().isPresent()) emailBuilder.setLabel(email.getLabel().get());
667
+
668
+ contactBuilder.addEmail(emailBuilder);
669
+ }
670
+ }
671
+
672
+ if (contact.getPhone().isPresent())
673
+ {
674
+ for (SharedContact.Phone phone : contact.getPhone().get())
675
+ {
676
+ DataMessage.Contact.Phone.Builder phoneBuilder = DataMessage.Contact.Phone.newBuilder()
677
+ .setValue(phone.getValue());
678
+
679
+ switch (phone.getType())
680
+ {
681
+ case HOME: phoneBuilder.setType(DataMessage.Contact.Phone.Type.HOME); break;
682
+ case WORK: phoneBuilder.setType(DataMessage.Contact.Phone.Type.WORK); break;
683
+ case MOBILE: phoneBuilder.setType(DataMessage.Contact.Phone.Type.MOBILE); break;
684
+ case CUSTOM: phoneBuilder.setType(DataMessage.Contact.Phone.Type.CUSTOM); break;
685
+ default: throw new AssertionError("Unknown type: " + phone.getType());
686
+ }
687
+
688
+ if (phone.getLabel().isPresent()) phoneBuilder.setLabel(phone.getLabel().get());
689
+
690
+ contactBuilder.addNumber(phoneBuilder);
691
+ }
692
+ }
693
+
694
+ if (contact.getAvatar().isPresent())
695
+ {
696
+ contactBuilder.setAvatar(DataMessage.Contact.Avatar.newBuilder()
697
+ .setAvatar(createAttachmentPointer(contact.getAvatar().get().getAttachment().asStream()))
698
+ .setIsProfile(contact.getAvatar().get().isProfile()));
699
+ }
700
+
701
+ if (contact.getOrganization().isPresent())
702
+ {
703
+ contactBuilder.setOrganization(contact.getOrganization().get());
704
+ }
705
+
706
+ results.add(contactBuilder.build());
707
+ */
708
+ }
709
+ return results ;
710
+ }
711
+
598
712
private async Task < SendMessageResponse > SendMessage ( CancellationToken token , SignalServiceAddress recipient , long timestamp , byte [ ] content , bool silent )
599
713
{
600
714
for ( int i = 0 ; i < 3 ; i ++ )
@@ -631,7 +745,7 @@ private async Task<SendMessageResponse> SendMessage(CancellationToken token, Sig
631
745
throw new Exception ( "Failed to resolve conflicts after 3 attempts!" ) ;
632
746
}
633
747
634
- private async Task < IList < AttachmentPointer > > CreateAttachmentPointers ( CancellationToken token , List < SignalServiceAttachment > attachments )
748
+ private async Task < IList < AttachmentPointer > > CreateAttachmentPointers ( CancellationToken token , List < SignalServiceAttachment > ? attachments )
635
749
{
636
750
IList < AttachmentPointer > pointers = new List < AttachmentPointer > ( ) ;
637
751
@@ -691,7 +805,7 @@ private async Task<AttachmentPointer> CreateAttachmentPointer(CancellationToken
691
805
692
806
if ( attachment . Width > 0 )
693
807
{
694
- attachmentPointer . Width = ( uint ) attachment . Width ;
808
+ attachmentPointer . Width = ( uint ) attachment . Width ;
695
809
}
696
810
697
811
if ( attachment . Height > 0 )
@@ -701,7 +815,7 @@ private async Task<AttachmentPointer> CreateAttachmentPointer(CancellationToken
701
815
702
816
if ( attachment . VoiceNote )
703
817
{
704
- attachmentPointer . Flags = ( uint ) AttachmentPointer . Types . Flags . VoiceMessage ;
818
+ attachmentPointer . Flags = ( uint ) AttachmentPointer . Types . Flags . VoiceMessage ;
705
819
}
706
820
707
821
return attachmentPointer ;
@@ -824,7 +938,7 @@ private async Task<OutgoingPushMessage> GetEncryptedMessage(CancellationToken to
824
938
{
825
939
return cipher . Encrypt ( signalProtocolAddress , plaintext , silent ) ;
826
940
}
827
- catch ( libsignal . exceptions . UntrustedIdentityException e )
941
+ catch ( libsignal . exceptions . UntrustedIdentityException e )
828
942
{
829
943
throw new UntrustedIdentityException ( "Untrusted on send" , e . getName ( ) , e . getUntrustedIdentity ( ) ) ;
830
944
}
0 commit comments