Skip to content

Commit 7725ad9

Browse files
committed
use dm correspondent name as room name
1 parent 5d8881f commit 7725ad9

File tree

5 files changed

+80
-32
lines changed

5 files changed

+80
-32
lines changed

pkg/connector/client.go

Lines changed: 64 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import (
55
"fmt"
66
"time"
77

8-
"go.mau.fi/util/ptr"
98
"maunium.net/go/mautrix/bridgev2"
109
"maunium.net/go/mautrix/bridgev2/networkid"
1110
"maunium.net/go/mautrix/bridgev2/simplevent"
@@ -16,18 +15,27 @@ import (
1615
)
1716

1817
type GChatClient struct {
19-
UserLogin *bridgev2.UserLogin
20-
Client *gchatmeow.Client
18+
userLogin *bridgev2.UserLogin
19+
client *gchatmeow.Client
20+
users map[string]*proto.User
2121
}
2222

2323
var (
2424
_ bridgev2.NetworkAPI = (*GChatClient)(nil)
2525
)
2626

27+
func NewClient(userLogin *bridgev2.UserLogin, client *gchatmeow.Client) *GChatClient {
28+
return &GChatClient{
29+
userLogin: userLogin,
30+
client: client,
31+
users: make(map[string]*proto.User),
32+
}
33+
}
34+
2735
func (c *GChatClient) Connect(ctx context.Context) error {
28-
c.Client.OnConnect.AddObserver(func(interface{}) { c.onConnect(ctx) })
29-
c.Client.OnStreamEvent.AddObserver(func(evt interface{}) { c.onStreamEvent(ctx, evt) })
30-
return c.Client.Connect(ctx, time.Duration(90)*time.Minute)
36+
c.client.OnConnect.AddObserver(func(interface{}) { c.onConnect(ctx) })
37+
c.client.OnStreamEvent.AddObserver(func(evt interface{}) { c.onStreamEvent(ctx, evt) })
38+
return c.client.Connect(ctx, time.Duration(90)*time.Minute)
3139
}
3240

3341
func (c *GChatClient) Disconnect() {
@@ -50,37 +58,76 @@ func (c *GChatClient) IsLoggedIn() bool {
5058
}
5159

5260
func (c *GChatClient) IsThisUser(ctx context.Context, userID networkid.UserID) bool {
53-
return networkid.UserID(c.UserLogin.ID) == userID
61+
return networkid.UserID(c.userLogin.ID) == userID
5462
}
5563

5664
func (c *GChatClient) LogoutRemote(ctx context.Context) {
5765
}
5866

67+
func (c *GChatClient) getUsers(ctx context.Context, userIds []*string) error {
68+
res, err := c.client.GetMembers(ctx, userIds)
69+
if err != nil {
70+
return err
71+
}
72+
for _, member := range res.Members {
73+
user := member.GetUser()
74+
c.users[*user.UserId.Id] = user
75+
}
76+
return nil
77+
}
78+
5979
func (c *GChatClient) onConnect(ctx context.Context) {
60-
res, err := c.Client.Sync(ctx)
80+
res, err := c.client.Sync(ctx)
81+
if err != nil {
82+
fmt.Println(err)
83+
return
84+
}
85+
userIdMap := make(map[*string]struct{})
86+
for _, item := range res.WorldItems {
87+
if item.DmMembers != nil {
88+
for _, member := range item.DmMembers.Members {
89+
userIdMap[member.Id] = struct{}{}
90+
}
91+
}
92+
}
93+
userIds := make([]*string, len(userIdMap))
94+
i := 0
95+
for userId := range userIdMap {
96+
userIds[i] = userId
97+
i++
98+
}
99+
100+
err = c.getUsers(ctx, userIds)
61101
if err != nil {
62-
fmt.Println((err))
102+
fmt.Println(err)
63103
return
64104
}
105+
65106
for _, item := range res.WorldItems {
66107
// TODO room name for DM, and full members list
67108
name := item.RoomName
68-
if name == nil {
69-
name = ptr.Ptr("dm")
109+
if name == nil && item.DmMembers != nil {
110+
for _, member := range item.DmMembers.Members {
111+
if *member.Id != string(c.userLogin.ID) {
112+
name = c.users[*member.Id].Name
113+
break
114+
}
115+
}
116+
70117
}
71118
memberMap := map[networkid.UserID]bridgev2.ChatMember{}
72-
memberMap[networkid.UserID(c.UserLogin.ID)] = bridgev2.ChatMember{
119+
memberMap[networkid.UserID(c.userLogin.ID)] = bridgev2.ChatMember{
73120
EventSender: bridgev2.EventSender{
74121
IsFromMe: true,
75-
Sender: networkid.UserID(c.UserLogin.ID),
122+
Sender: networkid.UserID(c.userLogin.ID),
76123
},
77124
}
78-
c.UserLogin.Bridge.QueueRemoteEvent(c.UserLogin, &simplevent.ChatResync{
125+
c.userLogin.Bridge.QueueRemoteEvent(c.userLogin, &simplevent.ChatResync{
79126
EventMeta: simplevent.EventMeta{
80127
Type: bridgev2.RemoteEventChatResync,
81128
PortalKey: networkid.PortalKey{
82129
ID: networkid.PortalID(item.GroupId.String()),
83-
Receiver: c.UserLogin.ID,
130+
Receiver: c.userLogin.ID,
84131
},
85132
CreatePortal: true,
86133
},
@@ -105,12 +152,12 @@ func (c *GChatClient) onStreamEvent(ctx context.Context, raw any) {
105152
case proto.Event_MESSAGE_POSTED:
106153
msg := evt.Body.GetMessagePosted().Message
107154
senderId := *msg.Creator.UserId.Id
108-
c.UserLogin.Bridge.QueueRemoteEvent(c.UserLogin, &simplevent.Message[*proto.Message]{
155+
c.userLogin.Bridge.QueueRemoteEvent(c.userLogin, &simplevent.Message[*proto.Message]{
109156
EventMeta: simplevent.EventMeta{
110157
Type: bridgev2.RemoteEventMessage,
111158
PortalKey: networkid.PortalKey{
112159
ID: networkid.PortalID(evt.GroupId.String()),
113-
Receiver: c.UserLogin.ID,
160+
Receiver: c.userLogin.ID,
114161
},
115162
// CreatePortal: true,
116163
Sender: bridgev2.EventSender{

pkg/connector/handlematrix.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ func (c *GChatClient) HandleMatrixMessage(ctx context.Context, msg *bridgev2.Mat
2727
return nil, err
2828
}
2929

30-
res, err := c.Client.CreateTopic(ctx, &proto.CreateTopicRequest{
30+
res, err := c.client.CreateTopic(ctx, &proto.CreateTopicRequest{
3131
GroupId: groupId,
3232
TextBody: &msg.Content.Body,
3333
})

pkg/connector/login.go

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -36,11 +36,7 @@ func (gc *GChatConnector) LoadUserLogin(ctx context.Context, login *bridgev2.Use
3636
if loginMetadata.Cookies != nil {
3737
client = gchatmeow.NewClient(loginMetadata.Cookies, "", 0, 0)
3838
}
39-
c := &GChatClient{
40-
UserLogin: login,
41-
Client: client,
42-
}
43-
login.Client = c
39+
login.Client = NewClient(login, client)
4440
return nil
4541
}
4642

@@ -103,8 +99,8 @@ func (gl *GChatCookieLogin) SubmitCookies(ctx context.Context, strCookies map[st
10399

104100
ul.Client.Connect(ctx)
105101
c := ul.Client.(*GChatClient)
106-
c.UserLogin = ul
107-
c.Client = client
102+
c.userLogin = ul
103+
c.client = client
108104

109105
return &bridgev2.LoginStep{
110106
Type: bridgev2.LoginStepTypeComplete,

pkg/gchatmeow/api.go

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -100,14 +100,19 @@ func (c *Client) getSelfUserStatus(ctx context.Context) (*proto.GetSelfUserStatu
100100
return response, err
101101
}
102102

103-
func (c *Client) getMembers(ctx context.Context, gcid *string) (*proto.GetMembersResponse, error) {
103+
func (c *Client) GetMembers(ctx context.Context, ids []*string) (*proto.GetMembersResponse, error) {
104+
memberIds := make([]*proto.MemberId, len(ids))
105+
for i, id := range ids {
106+
memberIds[i] = &proto.MemberId{
107+
Id: &proto.MemberId_UserId{
108+
UserId: &proto.UserId{Id: id},
109+
},
110+
}
111+
}
112+
104113
request := &proto.GetMembersRequest{
105114
RequestHeader: c.gcRequestHeader,
106-
MemberIds: []*proto.MemberId{
107-
&proto.MemberId{Id: &proto.MemberId_UserId{
108-
UserId: &proto.UserId{Id: gcid},
109-
}},
110-
},
115+
MemberIds: memberIds,
111116
}
112117
response := &proto.GetMembersResponse{}
113118
err := c.gcRequest(ctx, "get_members", request, response)

pkg/gchatmeow/client.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -242,7 +242,7 @@ func (c *Client) GetSelf(ctx context.Context) (*proto.User, error) {
242242
return nil, err
243243
}
244244
gcid := status.UserStatus.UserId.Id
245-
members, err := c.getMembers(ctx, gcid)
245+
members, err := c.GetMembers(ctx, []*string{gcid})
246246
if err != nil {
247247
return nil, err
248248
}

0 commit comments

Comments
 (0)