Skip to content

Commit 84129f4

Browse files
committed
render mention
1 parent 5616408 commit 84129f4

File tree

5 files changed

+55
-11
lines changed

5 files changed

+55
-11
lines changed

pkg/connector/client.go

+7-1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
"time"
88

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

@@ -125,8 +126,12 @@ func (c *GChatClient) onConnect(ctx context.Context) {
125126
for _, item := range res.WorldItems {
126127
name := item.RoomName
127128
var gcMembers []*proto.UserId
129+
roomType := database.RoomTypeGroupDM
130+
isDm := false
128131
if item.DmMembers != nil {
132+
roomType = database.RoomTypeDM
129133
gcMembers = item.DmMembers.Members
134+
isDm = true
130135
for _, member := range item.DmMembers.Members {
131136
if member.Id != string(c.userLogin.ID) {
132137
name = c.users[member.Id].Name
@@ -162,7 +167,8 @@ func (c *GChatClient) onConnect(ctx context.Context) {
162167
},
163168
ChatInfo: &bridgev2.ChatInfo{
164169
Name: &name,
165-
Members: c.gcMembersToMatrix(gcMembers),
170+
Members: c.gcMembersToMatrix(isDm, gcMembers),
171+
Type: &roomType,
166172
},
167173
})
168174

pkg/connector/login.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ func (gl *GChatCookieLogin) SubmitCookies(ctx context.Context, strCookies map[st
105105
return &bridgev2.LoginStep{
106106
Type: bridgev2.LoginStepTypeComplete,
107107
StepID: LoginStepIDComplete,
108-
Instructions: fmt.Sprintf("Logged in as %s (%d)", user.GetName(), userId),
108+
Instructions: fmt.Sprintf("Logged in as %s (%s)", user.GetName(), userId),
109109
CompleteParams: &bridgev2.LoginCompleteParams{
110110
UserLoginID: ul.ID,
111111
UserLogin: ul,

pkg/connector/mapping.go

+8-2
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,15 @@ import (
77
"go.mau.fi/mautrix-googlechat/pkg/gchatmeow/proto"
88
)
99

10-
func (c *GChatClient) gcMembersToMatrix(gcMembers []*proto.UserId) *bridgev2.ChatMemberList {
10+
func (c *GChatClient) gcMembersToMatrix(isDm bool, gcMembers []*proto.UserId) *bridgev2.ChatMemberList {
11+
var otherUserId string
1112
memberMap := map[networkid.UserID]bridgev2.ChatMember{}
1213
for _, gcMember := range gcMembers {
1314
userId := networkid.UserID(gcMember.Id)
15+
if isDm && gcMember.Id != string(c.userLogin.ID) {
16+
otherUserId = gcMember.Id
17+
18+
}
1419
memberMap[userId] = bridgev2.ChatMember{
1520
EventSender: bridgev2.EventSender{
1621
IsFromMe: gcMember.Id == string(c.userLogin.ID),
@@ -20,6 +25,7 @@ func (c *GChatClient) gcMembersToMatrix(gcMembers []*proto.UserId) *bridgev2.Cha
2025
}
2126

2227
return &bridgev2.ChatMemberList{
23-
MemberMap: memberMap,
28+
MemberMap: memberMap,
29+
OtherUserID: networkid.UserID(otherUserId),
2430
}
2531
}

pkg/msgconv/gchatfmt/convert.go

+33
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99

1010
pb "google.golang.org/protobuf/proto"
1111
"maunium.net/go/mautrix/bridgev2"
12+
"maunium.net/go/mautrix/bridgev2/networkid"
1213
"maunium.net/go/mautrix/event"
1314

1415
"go.mau.fi/mautrix-googlechat/pkg/gchatmeow"
@@ -180,6 +181,38 @@ func annotationsToMatrix(
180181
default:
181182
skipEntity = true
182183
}
184+
} else if annotation.GetUrlMetadata() != nil {
185+
fmt.Fprintf(&bodyHtml, "<a href='%s'>%s</a>", annotation.GetUrlMetadata().Url.Url, entityText)
186+
} else if annotation.GetUserMentionMetadata() != nil {
187+
if annotation.GetUserMentionMetadata().Type == proto.UserMentionMetadata_MENTION_ALL {
188+
bodyHtml.WriteString("@room")
189+
} else {
190+
gcid := annotation.GetUserMentionMetadata().Id.Id
191+
dmPortals, err := portal.Bridge.GetDMPortalsWith(ctx, networkid.UserID(gcid))
192+
if err != nil {
193+
return "", err
194+
}
195+
196+
if len(dmPortals) != 0 {
197+
fmt.Fprintf(&bodyHtml,
198+
`<a href="%s">%s</a>`,
199+
dmPortals[0].MXID.URI().MatrixToURL(),
200+
dmPortals[0].Name,
201+
)
202+
} else {
203+
userLogin := portal.Bridge.GetCachedUserLoginByID(networkid.UserLoginID(gcid))
204+
if userLogin != nil {
205+
fmt.Fprintf(&bodyHtml,
206+
`<a href="%s">%s</a>`,
207+
userLogin.UserMXID.URI().MatrixToURL(),
208+
entityText,
209+
)
210+
211+
} else {
212+
bodyHtml.WriteString(entityText)
213+
}
214+
}
215+
}
183216
} else {
184217
skipEntity = true
185218
}

pkg/msgconv/gchatfmt/convert_test.go

+6-7
Original file line numberDiff line numberDiff line change
@@ -5,21 +5,20 @@ import (
55
"testing"
66

77
"github.com/stretchr/testify/assert"
8-
"go.mau.fi/util/ptr"
98

109
"go.mau.fi/mautrix-googlechat/pkg/gchatmeow/proto"
1110
"go.mau.fi/mautrix-googlechat/pkg/msgconv/gchatfmt"
1211
)
1312

1413
func makeAnnotation(start, length int32, format proto.FormatMetadata_FormatType) *proto.Annotation {
1514
return &proto.Annotation{
16-
Type: proto.AnnotationType_FORMAT_DATA.Enum(),
17-
StartIndex: ptr.Ptr(start),
18-
Length: ptr.Ptr(length),
19-
ChipRenderType: ptr.Ptr(proto.Annotation_DO_NOT_RENDER),
15+
Type: proto.AnnotationType_FORMAT_DATA,
16+
StartIndex: start,
17+
Length: length,
18+
ChipRenderType: proto.Annotation_DO_NOT_RENDER,
2019
Metadata: &proto.Annotation_FormatMetadata{
2120
FormatMetadata: &proto.FormatMetadata{
22-
FormatType: format.Enum(),
21+
FormatType: format,
2322
},
2423
},
2524
}
@@ -66,7 +65,7 @@ func TestParse(t *testing.T) {
6665
for _, test := range tests {
6766
t.Run(test.name, func(t *testing.T) {
6867
msg := &proto.Message{
69-
TextBody: ptr.Ptr(test.ins),
68+
TextBody: test.ins,
7069
Annotations: test.ine,
7170
}
7271
parsed := gchatfmt.Parse(context.TODO(), nil, msg)

0 commit comments

Comments
 (0)