5
5
"fmt"
6
6
"time"
7
7
8
- "go.mau.fi/util/ptr"
9
8
"maunium.net/go/mautrix/bridgev2"
10
9
"maunium.net/go/mautrix/bridgev2/networkid"
11
10
"maunium.net/go/mautrix/bridgev2/simplevent"
@@ -16,18 +15,27 @@ import (
16
15
)
17
16
18
17
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
21
21
}
22
22
23
23
var (
24
24
_ bridgev2.NetworkAPI = (* GChatClient )(nil )
25
25
)
26
26
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
+
27
35
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 )
31
39
}
32
40
33
41
func (c * GChatClient ) Disconnect () {
@@ -50,37 +58,76 @@ func (c *GChatClient) IsLoggedIn() bool {
50
58
}
51
59
52
60
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
54
62
}
55
63
56
64
func (c * GChatClient ) LogoutRemote (ctx context.Context ) {
57
65
}
58
66
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
+
59
79
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 )
61
101
if err != nil {
62
- fmt .Println (( err ) )
102
+ fmt .Println (err )
63
103
return
64
104
}
105
+
65
106
for _ , item := range res .WorldItems {
66
107
// TODO room name for DM, and full members list
67
108
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
+
70
117
}
71
118
memberMap := map [networkid.UserID ]bridgev2.ChatMember {}
72
- memberMap [networkid .UserID (c .UserLogin .ID )] = bridgev2.ChatMember {
119
+ memberMap [networkid .UserID (c .userLogin .ID )] = bridgev2.ChatMember {
73
120
EventSender : bridgev2.EventSender {
74
121
IsFromMe : true ,
75
- Sender : networkid .UserID (c .UserLogin .ID ),
122
+ Sender : networkid .UserID (c .userLogin .ID ),
76
123
},
77
124
}
78
- c .UserLogin .Bridge .QueueRemoteEvent (c .UserLogin , & simplevent.ChatResync {
125
+ c .userLogin .Bridge .QueueRemoteEvent (c .userLogin , & simplevent.ChatResync {
79
126
EventMeta : simplevent.EventMeta {
80
127
Type : bridgev2 .RemoteEventChatResync ,
81
128
PortalKey : networkid.PortalKey {
82
129
ID : networkid .PortalID (item .GroupId .String ()),
83
- Receiver : c .UserLogin .ID ,
130
+ Receiver : c .userLogin .ID ,
84
131
},
85
132
CreatePortal : true ,
86
133
},
@@ -105,12 +152,12 @@ func (c *GChatClient) onStreamEvent(ctx context.Context, raw any) {
105
152
case proto .Event_MESSAGE_POSTED :
106
153
msg := evt .Body .GetMessagePosted ().Message
107
154
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 ]{
109
156
EventMeta : simplevent.EventMeta {
110
157
Type : bridgev2 .RemoteEventMessage ,
111
158
PortalKey : networkid.PortalKey {
112
159
ID : networkid .PortalID (evt .GroupId .String ()),
113
- Receiver : c .UserLogin .ID ,
160
+ Receiver : c .userLogin .ID ,
114
161
},
115
162
// CreatePortal: true,
116
163
Sender : bridgev2.EventSender {
0 commit comments