Skip to content

Commit c3dc926

Browse files
committed
handle gchat space name/member changes
1 parent 1557079 commit c3dc926

File tree

2 files changed

+65
-10
lines changed

2 files changed

+65
-10
lines changed

pkg/connector/handlegchat.go

+58-8
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010
"maunium.net/go/mautrix/bridgev2/database"
1111
"maunium.net/go/mautrix/bridgev2/networkid"
1212
"maunium.net/go/mautrix/bridgev2/simplevent"
13+
"maunium.net/go/mautrix/event"
1314

1415
"go.mau.fi/mautrix-googlechat/pkg/gchatmeow/proto"
1516
)
@@ -37,12 +38,14 @@ func (c *GChatClient) onStreamEvent(ctx context.Context, raw any) {
3738
switch evt.Type {
3839
case proto.Event_MESSAGE_POSTED:
3940
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+
}
4649
case proto.Event_MESSAGE_UPDATED:
4750
msg := evt.Body.GetMessagePosted().Message
4851
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) {
7174
c.userLogin.Bridge.QueueRemoteEvent(c.userLogin, &simplevent.Receipt{
7275
EventMeta: c.makeEventMeta(evt, bridgev2.RemoteEventReadReceipt, receipt.User.UserId.Id, receipt.ReadTimeMicros),
7376
ReadUpTo: time.UnixMicro(receipt.ReadTimeMicros),
74-
},
75-
)
77+
})
7678
}
79+
case proto.Event_GROUP_UPDATED:
80+
c.handleGroupUpdated(ctx, evt)
81+
case proto.Event_MEMBERSHIP_CHANGED:
82+
c.handleMembershipChanged(ctx, evt)
7783
}
7884

7985
c.setPortalRevision(ctx, evt)
@@ -113,6 +119,50 @@ func (c *GChatClient) handleReaction(ctx context.Context, evt *proto.Event) {
113119
})
114120
}
115121

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+
116166
func (c *GChatClient) ConvertEdit(ctx context.Context, portal *bridgev2.Portal, intent bridgev2.MatrixAPI, existing []*database.Message, msg *proto.Message) (*bridgev2.ConvertedEdit, error) {
117167
cm, err := c.msgConv.ToMatrix(ctx, portal, intent, msg)
118168
if err != nil {

pkg/connector/mapping.go

+7-2
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99
"maunium.net/go/mautrix/bridgev2/networkid"
1010

1111
"go.mau.fi/mautrix-googlechat/pkg/gchatmeow/proto"
12+
"go.mau.fi/util/ptr"
1213
)
1314

1415
func (c *GChatClient) makeAvatar(avatarURL string) *bridgev2.Avatar {
@@ -34,14 +35,17 @@ func (c *GChatClient) gcMembersToMatrix(isDm bool, gcMembers []*proto.UserId) *b
3435
userId := networkid.UserID(gcMember.Id)
3536
if isDm && gcMember.Id != string(c.userLogin.ID) {
3637
otherUserId = gcMember.Id
37-
3838
}
39+
isMe := gcMember.Id == string(c.userLogin.ID)
3940
member := bridgev2.ChatMember{
4041
EventSender: bridgev2.EventSender{
41-
IsFromMe: gcMember.Id == string(c.userLogin.ID),
42+
IsFromMe: isMe,
4243
Sender: userId,
4344
},
4445
}
46+
if isMe {
47+
member.PowerLevel = ptr.Ptr(50)
48+
}
4549
user := c.users[gcMember.Id]
4650
if user != nil {
4751
member.UserInfo = &bridgev2.UserInfo{
@@ -53,6 +57,7 @@ func (c *GChatClient) gcMembersToMatrix(isDm bool, gcMembers []*proto.UserId) *b
5357
}
5458

5559
return &bridgev2.ChatMemberList{
60+
IsFull: true,
5661
MemberMap: memberMap,
5762
OtherUserID: networkid.UserID(otherUserId),
5863
}

0 commit comments

Comments
 (0)