1
1
package connector
2
2
3
3
import (
4
+ "context"
5
+ "io"
6
+ "mime"
7
+ "net/url"
8
+ "strings"
9
+
4
10
"maunium.net/go/mautrix/bridgev2"
5
11
"maunium.net/go/mautrix/bridgev2/networkid"
12
+ bridgeEvt "maunium.net/go/mautrix/event"
6
13
7
14
"go.mau.fi/mautrix-googlechat/pkg/gchatmeow/proto"
8
15
)
9
16
10
- func (c * GChatClient ) gcMembersToMxMembers (gcMembers []* proto.UserId ) * bridgev2.ChatMemberList {
17
+ func (c * GChatClient ) gcMembersToMatrix (gcMembers []* proto.UserId ) * bridgev2.ChatMemberList {
11
18
memberMap := map [networkid.UserID ]bridgev2.ChatMember {}
12
19
for _ , gcMember := range gcMembers {
13
20
userId := networkid .UserID (* gcMember .Id )
@@ -23,3 +30,83 @@ func (c *GChatClient) gcMembersToMxMembers(gcMembers []*proto.UserId) *bridgev2.
23
30
MemberMap : memberMap ,
24
31
}
25
32
}
33
+
34
+ func (c * GChatClient ) gcAnnotationToMatrix (ctx context.Context , portal * bridgev2.Portal , intent bridgev2.MatrixAPI , annotation * proto.Annotation ) (* bridgev2.ConvertedMessagePart , error ) {
35
+ var attUrl * url.URL
36
+ var mimeType string
37
+ var fileName string
38
+ uploadMeta := annotation .GetUploadMetadata ()
39
+ urlMeta := annotation .GetUrlMetadata ()
40
+ if uploadMeta != nil {
41
+ mimeType = * uploadMeta .ContentType
42
+ fileName = * uploadMeta .ContentName
43
+ params := url.Values {
44
+ "url_type" : []string {"DOWNLOAD_URL" },
45
+ "attachment_token" : []string {uploadMeta .GetAttachmentToken ()},
46
+ }
47
+ if strings .HasPrefix (* uploadMeta .ContentType , "image/" ) {
48
+ params .Set ("url_type" , "FIFE_URL" )
49
+ params .Set ("sz" , "w10000-h10000" )
50
+ params .Set ("content_type" , * uploadMeta .ContentType )
51
+ }
52
+ parsedUrl , err := url .Parse ("https://chat.google.com/api/get_attachment_url" )
53
+ if err != nil {
54
+ return nil , err
55
+ }
56
+ attUrl = parsedUrl
57
+ attUrl .RawQuery = params .Encode ()
58
+
59
+ } else if urlMeta != nil {
60
+ if urlMeta .MimeType != nil {
61
+ mimeType = * urlMeta .MimeType
62
+ }
63
+ parsedUrl , err := url .Parse (* urlMeta .Url .Url )
64
+ if err != nil {
65
+ return nil , err
66
+ }
67
+ attUrl = parsedUrl
68
+ } else {
69
+ return nil , nil
70
+ }
71
+ resp , err := c .client .DownloadAttachment (ctx , attUrl )
72
+ if err != nil {
73
+ return nil , err
74
+ }
75
+
76
+ if fileName == "" {
77
+ _ , params , _ := mime .ParseMediaType (resp .Header .Get ("Content-Disposition" ))
78
+ fileName = params ["filename" ]
79
+ }
80
+ if mimeType == "" {
81
+ mimeType = resp .Header .Get ("Content-Type" )
82
+ }
83
+ if fileName == "" && mimeType != "" {
84
+ fileName = strings .Replace (mimeType , "/" , "." , 1 )
85
+ }
86
+
87
+ content := bridgeEvt.MessageEventContent {
88
+ Body : fileName ,
89
+ Info : & bridgeEvt.FileInfo {
90
+ MimeType : mimeType ,
91
+ },
92
+ MsgType : bridgeEvt .MsgImage ,
93
+ }
94
+ content .URL , content .File , err = intent .UploadMediaStream (ctx , portal .MXID , resp .ContentLength , true , func (file io.Writer ) (* bridgev2.FileStreamResult , error ) {
95
+ _ , err := io .Copy (file , resp .Body )
96
+ if err != nil {
97
+ return nil , err
98
+ }
99
+ return & bridgev2.FileStreamResult {
100
+ MimeType : content .Info .MimeType ,
101
+ FileName : fileName ,
102
+ }, nil
103
+ })
104
+ if err != nil {
105
+ return nil , err
106
+ }
107
+ return & bridgev2.ConvertedMessagePart {
108
+ ID : "" ,
109
+ Type : bridgeEvt .EventMessage ,
110
+ Content : & content ,
111
+ }, nil
112
+ }
0 commit comments