@@ -7,12 +7,26 @@ import (
77
88 "github.com/rs/zerolog"
99 "maunium.net/go/mautrix/bridgev2"
10+ "maunium.net/go/mautrix/bridgev2/database"
1011 "maunium.net/go/mautrix/bridgev2/networkid"
1112 "maunium.net/go/mautrix/bridgev2/simplevent"
1213
1314 "go.mau.fi/mautrix-googlechat/pkg/gchatmeow/proto"
1415)
1516
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+
1630func (c * GChatClient ) onStreamEvent (ctx context.Context , raw any ) {
1731 evt , ok := raw .(* proto.Event )
1832 if ! ok {
@@ -23,26 +37,22 @@ func (c *GChatClient) onStreamEvent(ctx context.Context, raw any) {
2337 switch evt .Type {
2438 case proto .Event_MESSAGE_POSTED :
2539 msg := evt .Body .GetMessagePosted ().Message
26- senderId := msg .Creator .UserId .Id
2740 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 ),
4242 ID : networkid .MessageID (msg .Id .MessageId ),
4343 Data : msg ,
4444 ConvertMessageFunc : c .msgConv .ToMatrix ,
4545 })
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+ })
4656 }
4757
4858 c .setPortalRevision (ctx , evt )
@@ -66,25 +76,32 @@ func (c *GChatClient) handleReaction(ctx context.Context, evt *proto.Event) {
6676
6777 sender := reaction .UserId .GetId ()
6878 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+ }
6987 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 ,
8689 EmojiID : networkid .EmojiID (reaction .Emoji .GetUnicode ()),
8790 Emoji : reaction .Emoji .GetUnicode (),
8891 TargetMessage : networkid .MessageID (messageId ),
8992 })
9093}
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