@@ -10,6 +10,7 @@ import (
10
10
"maunium.net/go/mautrix/bridgev2/database"
11
11
"maunium.net/go/mautrix/bridgev2/networkid"
12
12
"maunium.net/go/mautrix/bridgev2/simplevent"
13
+ "maunium.net/go/mautrix/event"
13
14
14
15
"go.mau.fi/mautrix-googlechat/pkg/gchatmeow/proto"
15
16
)
@@ -37,12 +38,14 @@ func (c *GChatClient) onStreamEvent(ctx context.Context, raw any) {
37
38
switch evt .Type {
38
39
case proto .Event_MESSAGE_POSTED :
39
40
msg := evt .Body .GetMessagePosted ().Message
40
- c .userLogin .Bridge .QueueRemoteEvent (c .userLogin , & simplevent.Message [* proto.Message ]{
41
- EventMeta : c .makeEventMeta (evt , bridgev2 .RemoteEventMessage , msg .Creator .UserId .Id , msg .CreateTime ),
42
- ID : networkid .MessageID (msg .Id .MessageId ),
43
- Data : msg ,
44
- ConvertMessageFunc : c .msgConv .ToMatrix ,
45
- })
41
+ if msg .MessageType != proto .Message_SYSTEM_MESSAGE {
42
+ c .userLogin .Bridge .QueueRemoteEvent (c .userLogin , & simplevent.Message [* proto.Message ]{
43
+ EventMeta : c .makeEventMeta (evt , bridgev2 .RemoteEventMessage , msg .Creator .UserId .Id , msg .CreateTime ),
44
+ ID : networkid .MessageID (msg .Id .MessageId ),
45
+ Data : msg ,
46
+ ConvertMessageFunc : c .msgConv .ToMatrix ,
47
+ })
48
+ }
46
49
case proto .Event_MESSAGE_UPDATED :
47
50
msg := evt .Body .GetMessagePosted ().Message
48
51
eventMeta := c .makeEventMeta (evt , bridgev2 .RemoteEventEdit , msg .Creator .UserId .Id , msg .LastEditTime )
@@ -71,9 +74,12 @@ func (c *GChatClient) onStreamEvent(ctx context.Context, raw any) {
71
74
c .userLogin .Bridge .QueueRemoteEvent (c .userLogin , & simplevent.Receipt {
72
75
EventMeta : c .makeEventMeta (evt , bridgev2 .RemoteEventReadReceipt , receipt .User .UserId .Id , receipt .ReadTimeMicros ),
73
76
ReadUpTo : time .UnixMicro (receipt .ReadTimeMicros ),
74
- },
75
- )
77
+ })
76
78
}
79
+ case proto .Event_GROUP_UPDATED :
80
+ c .handleGroupUpdated (ctx , evt )
81
+ case proto .Event_MEMBERSHIP_CHANGED :
82
+ c .handleMembershipChanged (ctx , evt )
77
83
}
78
84
79
85
c .setPortalRevision (ctx , evt )
@@ -113,6 +119,50 @@ func (c *GChatClient) handleReaction(ctx context.Context, evt *proto.Event) {
113
119
})
114
120
}
115
121
122
+ func (c * GChatClient ) handleGroupUpdated (ctx context.Context , evt * proto.Event ) {
123
+ new := evt .Body .GetGroupUpdated ().New
124
+ if new == nil || (new .Name == "" && new .AvatarUrl == "" ) {
125
+ return
126
+ }
127
+ c .userLogin .Bridge .QueueRemoteEvent (c .userLogin , & simplevent.ChatInfoChange {
128
+ EventMeta : c .makeEventMeta (evt , bridgev2 .RemoteEventChatInfoChange , "" , evt .GetGroupRevision ().Timestamp ),
129
+ ChatInfoChange : & bridgev2.ChatInfoChange {
130
+ ChatInfo : & bridgev2.ChatInfo {
131
+ Name : & new .Name ,
132
+ Avatar : c .makeAvatar (new .AvatarUrl ),
133
+ },
134
+ },
135
+ })
136
+ }
137
+
138
+ func (c * GChatClient ) handleMembershipChanged (ctx context.Context , evt * proto.Event ) {
139
+ userId := evt .Body .GetMembershipChanged ().NewMembership .Id .MemberId .GetUserId ().Id
140
+ member := bridgev2.ChatMember {
141
+ EventSender : bridgev2.EventSender {
142
+ IsFromMe : userId == string (c .userLogin .ID ),
143
+ Sender : networkid .UserID (userId ),
144
+ },
145
+ }
146
+ switch evt .Body .GetMembershipChanged ().NewMembership .MembershipState {
147
+ case proto .MembershipState_MEMBER_JOINED :
148
+ member .Membership = event .MembershipJoin
149
+ case proto .MembershipState_MEMBER_NOT_A_MEMBER :
150
+ member .Membership = event .MembershipLeave
151
+ case proto .MembershipState_MEMBER_INVITED :
152
+ member .Membership = event .MembershipInvite
153
+ }
154
+ memberMap := map [networkid.UserID ]bridgev2.ChatMember {}
155
+ memberMap [networkid .UserID (userId )] = member
156
+ c .userLogin .Bridge .QueueRemoteEvent (c .userLogin , & simplevent.ChatInfoChange {
157
+ EventMeta : c .makeEventMeta (evt , bridgev2 .RemoteEventChatInfoChange , "" , evt .GetGroupRevision ().Timestamp ),
158
+ ChatInfoChange : & bridgev2.ChatInfoChange {
159
+ MemberChanges : & bridgev2.ChatMemberList {
160
+ MemberMap : memberMap ,
161
+ },
162
+ },
163
+ })
164
+ }
165
+
116
166
func (c * GChatClient ) ConvertEdit (ctx context.Context , portal * bridgev2.Portal , intent bridgev2.MatrixAPI , existing []* database.Message , msg * proto.Message ) (* bridgev2.ConvertedEdit , error ) {
117
167
cm , err := c .msgConv .ToMatrix (ctx , portal , intent , msg )
118
168
if err != nil {
0 commit comments