Skip to content

Commit

Permalink
base on the python version (#104)
Browse files Browse the repository at this point in the history
Co-authored-by: Tulir Asokan <[email protected]>
  • Loading branch information
rnons and tulir authored Dec 6, 2024
1 parent 74a4761 commit 3473f5a
Show file tree
Hide file tree
Showing 39 changed files with 26,889 additions and 114,405 deletions.
7 changes: 3 additions & 4 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,7 @@ go 1.23.0
toolchain go1.23.3

require (
github.com/google/go-querystring v1.1.0
github.com/mattn/go-colorable v0.1.13
github.com/rs/zerolog v1.33.0
go.mau.fi/util v0.8.2
golang.org/x/net v0.31.0
google.golang.org/protobuf v1.35.2
maunium.net/go/mautrix v0.22.1-0.20241126202918-4b970e0ea7e6
)
Expand All @@ -20,10 +16,12 @@ require (
github.com/gorilla/mux v1.8.0 // indirect
github.com/gorilla/websocket v1.5.0 // indirect
github.com/lib/pq v1.10.9 // indirect
github.com/mattn/go-colorable v0.1.13 // indirect
github.com/mattn/go-isatty v0.0.19 // indirect
github.com/mattn/go-sqlite3 v1.14.24 // indirect
github.com/petermattis/goid v0.0.0-20241025130422-66cb2e6d7274 // indirect
github.com/rs/xid v1.6.0 // indirect
github.com/rs/zerolog v1.33.0 // indirect
github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e // indirect
github.com/tidwall/gjson v1.18.0 // indirect
github.com/tidwall/match v1.1.1 // indirect
Expand All @@ -33,6 +31,7 @@ require (
go.mau.fi/zeroconfig v0.1.3 // indirect
golang.org/x/crypto v0.29.0 // indirect
golang.org/x/exp v0.0.0-20241108190413-2d47ceb2692f // indirect
golang.org/x/net v0.31.0 // indirect
golang.org/x/sync v0.9.0 // indirect
golang.org/x/sys v0.27.0 // indirect
golang.org/x/text v0.20.0 // indirect
Expand Down
4 changes: 0 additions & 4 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,8 @@ github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSV
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8=
github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU=
github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI=
github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So=
github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc=
Expand Down Expand Up @@ -69,7 +66,6 @@ golang.org/x/sys v0.27.0 h1:wBqf8DvsY9Y/2P8gAfPDEYNuS30J4lPHJxXSb/nJZ+s=
golang.org/x/sys v0.27.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/text v0.20.0 h1:gK/Kv2otX8gz+wn7Rmb3vT96ZwuoxnQlY+HlJVj7Qug=
golang.org/x/text v0.20.0/go.mod h1:D4IsuqiFMhST5bX19pQ9ikHC2GsaKyk/oF+pn3ducp4=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io=
google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
Expand Down
94 changes: 77 additions & 17 deletions pkg/connector/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,17 @@ package connector

import (
"context"
"fmt"
"time"

"go.mau.fi/mautrix-googlechat/pkg/gchatmeow"

"go.mau.fi/util/ptr"
"maunium.net/go/mautrix/bridgev2"
"maunium.net/go/mautrix/bridgev2/networkid"
"maunium.net/go/mautrix/bridgev2/simplevent"
bridgeEvt "maunium.net/go/mautrix/event"

"go.mau.fi/mautrix-googlechat/pkg/gchatmeow"
"go.mau.fi/mautrix-googlechat/pkg/gchatmeow/proto"
)

type GChatClient struct {
Expand All @@ -20,15 +25,9 @@ var (
)

func (c *GChatClient) Connect(ctx context.Context) error {
_, err := c.Client.LoadMessagesPage()
if err != nil {
return err
}
err = c.Client.Connect()
if err != nil {
return err
}
return c.onConnect(ctx)
c.Client.OnConnect.AddObserver(func(interface{}) { c.onConnect(ctx) })
c.Client.OnStreamEvent.AddObserver(func(evt interface{}) { c.onStreamEvent(ctx, evt) })
return c.Client.Connect(ctx, time.Duration(90)*time.Minute)
}

func (c *GChatClient) Disconnect() {
Expand Down Expand Up @@ -57,14 +56,18 @@ func (c *GChatClient) IsThisUser(ctx context.Context, userID networkid.UserID) b
func (c *GChatClient) LogoutRemote(ctx context.Context) {
}

func (c *GChatClient) onConnect(ctx context.Context) error {
res, err := c.Client.GetPaginatedWorlds(nil)
func (c *GChatClient) onConnect(ctx context.Context) {
res, err := c.Client.Sync(ctx)
if err != nil {
return err
fmt.Println((err))
return
}
for _, item := range res.WorldItems {
// TODO room name for DM, and full members list
name := item.GetRoomName()
name := item.RoomName
if name == nil {
name = ptr.Ptr("dm")
}
memberMap := map[networkid.UserID]bridgev2.ChatMember{}
memberMap[networkid.UserID(c.UserLogin.ID)] = bridgev2.ChatMember{
EventSender: bridgev2.EventSender{
Expand All @@ -82,12 +85,69 @@ func (c *GChatClient) onConnect(ctx context.Context) error {
CreatePortal: true,
},
ChatInfo: &bridgev2.ChatInfo{
Name: &name,
Name: name,
Members: &bridgev2.ChatMemberList{
MemberMap: memberMap,
},
},
})

}
return nil
}

func (c *GChatClient) onStreamEvent(ctx context.Context, raw any) {
evt, ok := raw.(*proto.Event)
if !ok {
fmt.Println("Invalid event", raw)
return
}
switch *evt.Type {
case proto.Event_MESSAGE_POSTED:
msg := evt.Body.GetMessagePosted().Message
senderId := *msg.Creator.UserId.Id
c.UserLogin.Bridge.QueueRemoteEvent(c.UserLogin, &simplevent.Message[*proto.Message]{
EventMeta: simplevent.EventMeta{
Type: bridgev2.RemoteEventMessage,
PortalKey: networkid.PortalKey{
ID: networkid.PortalID(evt.GroupId.String()),
Receiver: c.UserLogin.ID,
},
// CreatePortal: true,
Sender: bridgev2.EventSender{
// IsFromMe: isFromMe,
SenderLogin: networkid.UserLoginID(senderId),
Sender: networkid.UserID(senderId),
},
// Timestamp: evtData.CreatedAt,
},
ID: networkid.MessageID(*msg.LocalId),
Data: msg,
ConvertMessageFunc: func(ctx context.Context, portal *bridgev2.Portal, intent bridgev2.MatrixAPI, data *proto.Message) (*bridgev2.ConvertedMessage, error) {
return c.convertToMatrix(ctx, portal, intent, data), nil
},
})
}
}

func (c *GChatClient) convertToMatrix(ctx context.Context, portal *bridgev2.Portal, intent bridgev2.MatrixAPI, msg *proto.Message) *bridgev2.ConvertedMessage {
parts := make([]*bridgev2.ConvertedMessagePart, 0)

textPart := &bridgev2.ConvertedMessagePart{
ID: "",
Type: bridgeEvt.EventMessage,
Content: &bridgeEvt.MessageEventContent{
MsgType: bridgeEvt.MsgText,
Body: *msg.TextBody,
},
}

if len(textPart.Content.Body) > 0 {
parts = append(parts, textPart)
}

cm := &bridgev2.ConvertedMessage{
Parts: parts,
}

return cm
}
40 changes: 18 additions & 22 deletions pkg/connector/login.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,13 @@ import (
"context"
"fmt"

"go.mau.fi/mautrix-googlechat/pkg/gchatmeow"
"go.mau.fi/mautrix-googlechat/pkg/gchatmeow/cookies"
"go.mau.fi/mautrix-googlechat/pkg/gchatmeow/debug"

"maunium.net/go/mautrix/bridge/status"
"maunium.net/go/mautrix/bridgev2"
"maunium.net/go/mautrix/bridgev2/database"
"maunium.net/go/mautrix/bridgev2/networkid"
"maunium.net/go/mautrix/id"

"go.mau.fi/mautrix-googlechat/pkg/gchatmeow"
)

const (
Expand All @@ -35,10 +33,9 @@ func (gc *GChatConnector) GetLoginFlows() []bridgev2.LoginFlow {
func (gc *GChatConnector) LoadUserLogin(ctx context.Context, login *bridgev2.UserLogin) error {
loginMetadata := login.Metadata.(*UserLoginMetadata)
var client *gchatmeow.Client
clientOptions := gchatmeow.ClientOpts{
Cookies: cookies.NewCookiesFromString(loginMetadata.Cookies),
if loginMetadata.Cookies != nil {
client = gchatmeow.NewClient(loginMetadata.Cookies, "", 0, 0)
}
client = gchatmeow.NewClient(&clientOptions, debug.NewLogger())
c := &GChatClient{
UserLogin: login,
Client: client,
Expand All @@ -52,7 +49,7 @@ type GChatCookieLogin struct {
}

type UserLoginMetadata struct {
Cookies string
Cookies *gchatmeow.Cookies
}

var _ bridgev2.LoginProcessCookies = (*GChatCookieLogin)(nil)
Expand All @@ -72,32 +69,31 @@ func (gl *GChatCookieLogin) Start(ctx context.Context) (*bridgev2.LoginStep, err
func (gl *GChatCookieLogin) Cancel() {}

func (gl *GChatCookieLogin) SubmitCookies(ctx context.Context, strCookies map[string]string) (*bridgev2.LoginStep, error) {
cookies := &cookies.Cookies{}
cookies := &gchatmeow.Cookies{}
cookies.UpdateValues(strCookies)

clientOptions := gchatmeow.ClientOpts{
Cookies: cookies,
client := gchatmeow.NewClient(cookies, "", 0, 0)
err := client.RefreshTokens(ctx)
if err != nil {
return nil, err
}
client := gchatmeow.NewClient(&clientOptions, debug.NewLogger())

initialData, err := client.LoadMessagesPage()
user, err := client.GetSelf(ctx)
if err != nil {
return nil, err
}

user := initialData.CurrentUser.Data

userId := user.Id.Id
userId := user.UserId.Id
ul, err := gl.User.NewLogin(ctx, &database.UserLogin{
ID: networkid.UserLoginID(userId),
RemoteName: user.Fullname,
ID: networkid.UserLoginID(*userId),
RemoteName: user.GetName(),
RemoteProfile: status.RemoteProfile{
Name: user.Fullname,
Email: user.Email,
Name: user.GetName(),
Email: *user.Email,
Avatar: id.ContentURIString(user.GetAvatarUrl()),
},
Metadata: &UserLoginMetadata{
Cookies: cookies.String(),
Cookies: cookies,
},
}, nil)

Expand All @@ -113,7 +109,7 @@ func (gl *GChatCookieLogin) SubmitCookies(ctx context.Context, strCookies map[st
return &bridgev2.LoginStep{
Type: bridgev2.LoginStepTypeComplete,
StepID: LoginStepIDComplete,
Instructions: fmt.Sprintf("Logged in as %s (%s)", user.Fullname, userId),
Instructions: fmt.Sprintf("Logged in as %s (%d)", user.GetName(), userId),
CompleteParams: &bridgev2.LoginCompleteParams{
UserLoginID: ul.ID,
UserLogin: ul,
Expand Down
9 changes: 0 additions & 9 deletions pkg/gchatmeow/TODOS.md

This file was deleted.

Loading

0 comments on commit 3473f5a

Please sign in to comment.