@@ -7,12 +7,26 @@ import (
7
7
8
8
"github.com/rs/zerolog"
9
9
"maunium.net/go/mautrix/bridgev2"
10
+ "maunium.net/go/mautrix/bridgev2/database"
10
11
"maunium.net/go/mautrix/bridgev2/networkid"
11
12
"maunium.net/go/mautrix/bridgev2/simplevent"
12
13
13
14
"go.mau.fi/mautrix-googlechat/pkg/gchatmeow/proto"
14
15
)
15
16
17
+ func (c * GChatClient ) makeEventMeta (evt * proto.Event , typ bridgev2.RemoteEventType , senderId string , ts int64 ) simplevent.EventMeta {
18
+ return simplevent.EventMeta {
19
+ Type : typ ,
20
+ PortalKey : c .makePortalKey (evt ),
21
+ Sender : bridgev2.EventSender {
22
+ IsFromMe : senderId == string (c .userLogin .ID ),
23
+ SenderLogin : networkid .UserLoginID (senderId ),
24
+ Sender : networkid .UserID (senderId ),
25
+ },
26
+ Timestamp : time .UnixMicro (ts ),
27
+ }
28
+ }
29
+
16
30
func (c * GChatClient ) onStreamEvent (ctx context.Context , raw any ) {
17
31
evt , ok := raw .(* proto.Event )
18
32
if ! ok {
@@ -23,26 +37,22 @@ func (c *GChatClient) onStreamEvent(ctx context.Context, raw any) {
23
37
switch evt .Type {
24
38
case proto .Event_MESSAGE_POSTED :
25
39
msg := evt .Body .GetMessagePosted ().Message
26
- senderId := msg .Creator .UserId .Id
27
40
c .userLogin .Bridge .QueueRemoteEvent (c .userLogin , & simplevent.Message [* proto.Message ]{
28
- EventMeta : simplevent.EventMeta {
29
- Type : bridgev2 .RemoteEventMessage ,
30
- PortalKey : networkid.PortalKey {
31
- ID : networkid .PortalID (evt .GroupId .String ()),
32
- Receiver : c .userLogin .ID ,
33
- },
34
- // CreatePortal: true,
35
- Sender : bridgev2.EventSender {
36
- // IsFromMe: isFromMe,
37
- SenderLogin : networkid .UserLoginID (senderId ),
38
- Sender : networkid .UserID (senderId ),
39
- },
40
- Timestamp : time .UnixMicro (msg .CreateTime ),
41
- },
41
+ EventMeta : c .makeEventMeta (evt , bridgev2 .RemoteEventMessage , msg .Creator .UserId .Id , msg .CreateTime ),
42
42
ID : networkid .MessageID (msg .Id .MessageId ),
43
43
Data : msg ,
44
44
ConvertMessageFunc : c .msgConv .ToMatrix ,
45
45
})
46
+ case proto .Event_MESSAGE_UPDATED :
47
+ msg := evt .Body .GetMessagePosted ().Message
48
+ eventMeta := c .makeEventMeta (evt , bridgev2 .RemoteEventEdit , msg .Creator .UserId .Id , msg .LastEditTime )
49
+ c .userLogin .Bridge .QueueRemoteEvent (c .userLogin , & simplevent.Message [* proto.Message ]{
50
+ EventMeta : eventMeta ,
51
+ ID : networkid .MessageID (msg .Id .MessageId ),
52
+ TargetMessage : networkid .MessageID (msg .Id .MessageId ),
53
+ Data : msg ,
54
+ ConvertEditFunc : c .ConvertEdit ,
55
+ })
46
56
}
47
57
48
58
c .setPortalRevision (ctx , evt )
@@ -66,25 +76,32 @@ func (c *GChatClient) handleReaction(ctx context.Context, evt *proto.Event) {
66
76
67
77
sender := reaction .UserId .GetId ()
68
78
messageId := reaction .MessageId .GetMessageId ()
79
+ eventMeta := c .makeEventMeta (evt , eventType , sender , reaction .Timestamp )
80
+ eventMeta .LogContext = func (c zerolog.Context ) zerolog.Context {
81
+ return c .
82
+ Str ("message_id" , messageId ).
83
+ Str ("sender" , sender ).
84
+ Str ("emoji" , reaction .Emoji .GetUnicode ()).
85
+ Str ("type" , reaction .GetType ().String ())
86
+ }
69
87
c .userLogin .Bridge .QueueRemoteEvent (c .userLogin , & simplevent.Reaction {
70
- EventMeta : simplevent.EventMeta {
71
- Type : eventType ,
72
- LogContext : func (c zerolog.Context ) zerolog.Context {
73
- return c .
74
- Str ("message_id" , messageId ).
75
- Str ("sender" , sender ).
76
- Str ("emoji" , reaction .Emoji .GetUnicode ()).
77
- Str ("type" , reaction .GetType ().String ())
78
- },
79
- PortalKey : c .makePortalKey (evt ),
80
- Timestamp : time .UnixMicro (reaction .Timestamp ),
81
- Sender : bridgev2.EventSender {
82
- IsFromMe : sender == string (c .userLogin .ID ),
83
- Sender : networkid .UserID (sender ),
84
- },
85
- },
88
+ EventMeta : eventMeta ,
86
89
EmojiID : networkid .EmojiID (reaction .Emoji .GetUnicode ()),
87
90
Emoji : reaction .Emoji .GetUnicode (),
88
91
TargetMessage : networkid .MessageID (messageId ),
89
92
})
90
93
}
94
+
95
+ func (c * GChatClient ) ConvertEdit (ctx context.Context , portal * bridgev2.Portal , intent bridgev2.MatrixAPI , existing []* database.Message , msg * proto.Message ) (* bridgev2.ConvertedEdit , error ) {
96
+ cm , err := c .msgConv .ToMatrix (ctx , portal , intent , msg )
97
+ if err != nil {
98
+ return nil , err
99
+ }
100
+
101
+ editPart := cm .Parts [len (cm .Parts )- 1 ].ToEditPart (existing [len (existing )- 1 ])
102
+ editPart .Part .EditCount ++
103
+
104
+ return & bridgev2.ConvertedEdit {
105
+ ModifiedParts : []* bridgev2.ConvertedEditPart {editPart },
106
+ }, nil
107
+ }
0 commit comments