morpheus

A Matrix client written in Go-QT
git clone git://archive.git.mtrnord.blog/Nordgedanken/morpheus.git
Log | Files | Refs | README | LICENSE

commit 3d075168e8b4d38ba812c39a79cb75ee55671bb6
parent 108435c89fbcecca336325a9b82835ad45606270
Author: MTRNord <mtrnord1@gmail.com>
Date:   Fri, 25 Aug 2017 01:23:20 +0200

Fix sync (only works with changes from https://github.com/matrix-org/gomatrix/pull/39 )

Signed-off-by: MTRNord <mtrnord1@gmail.com>

Diffstat:
Mmain.go | 4+++-
Mmatrix/login.go | 10+++++-----
Mmatrix/ownUser.go | 14+++++++-------
Mmatrix/types.go | 2+-
Muis.go | 37+++++++++++++++++++++----------------
5 files changed, 37 insertions(+), 30 deletions(-)

diff --git a/main.go b/main.go @@ -8,6 +8,7 @@ import ( "github.com/Nordgedanken/Neo/util" "github.com/therecipe/qt/widgets" "github.com/tidwall/buntdb" + "sync" ) var window *widgets.QMainWindow @@ -65,11 +66,12 @@ func main() { }) if accessToken != "" && homeserverURL != "" && userID != "" { + var wg sync.WaitGroup localLog.Println("Starting Auto Login Sequenze in background") results := make(chan *matrix.Client) wg.Add(1) - go DoLogin("", "", homeserverURL, userID, accessToken, localLog, results) + go DoLogin("", "", homeserverURL, userID, accessToken, localLog, results, &wg) go func() { wg.Wait() // wait for each execTask to return diff --git a/matrix/login.go b/matrix/login.go @@ -18,9 +18,9 @@ func GetClient(homeserverURL, userID, accessToken string) (clientInstance *Clien clientInstance = &Client{client} err = db.Update(func(tx *buntdb.Tx) error { - tx.Set("user:accessToken", clientInstance.AccessToken, nil) - tx.Set("user:homeserverURL", clientInstance.HomeserverURL.String(), nil) - tx.Set("user:userID", clientInstance.UserID, nil) + tx.Set("user:accessToken", clientInstance.Client.AccessToken, nil) + tx.Set("user:homeserverURL", clientInstance.Client.HomeserverURL.String(), nil) + tx.Set("user:userID", clientInstance.Client.UserID, nil) return nil }) if err != nil { @@ -48,7 +48,7 @@ func LoginUser(username, password string) (*Client, error) { return nil, cliErr } - resp, err := cli.Login(&gomatrix.ReqLogin{ + resp, err := cli.Client.Login(&gomatrix.ReqLogin{ Type: "m.login.password", User: username, Password: password, @@ -56,7 +56,7 @@ func LoginUser(username, password string) (*Client, error) { if err != nil { return nil, err } - cli.SetCredentials(resp.UserID, resp.AccessToken) + cli.Client.SetCredentials(resp.UserID, resp.AccessToken) DBerr := db.Update(func(tx *buntdb.Tx) error { tx.Set("user:accessToken", resp.AccessToken, nil) tx.Set("user:deviceID", resp.DeviceID, nil) diff --git a/matrix/ownUser.go b/matrix/ownUser.go @@ -36,9 +36,9 @@ func getUserDisplayName(mxid string, cli *Client) (displayName string, err error // If cache is empty query the api if displayName == "" { - urlPath := cli.BuildURL("profile", mxid, "displayname") + urlPath := cli.Client.BuildURL("profile", mxid, "displayname") var resp *RespUserDisplayName - _, err = cli.MakeRequest("GET", urlPath, nil, &resp) + _, err = cli.Client.MakeRequest("GET", urlPath, nil, &resp) // Update cache err = db.Update(func(tx *buntdb.Tx) error { @@ -59,7 +59,7 @@ func getOwnUserAvatar(cli *Client) *gui.QPixmap { // Get cache db.View(func(tx *buntdb.Tx) error { - QueryErr := tx.AscendKeys("user:"+cli.UserID+":avatarData100x100", + QueryErr := tx.AscendKeys("user:"+cli.Client.UserID+":avatarData100x100", func(key, value string) bool { avatarData = value return true @@ -73,19 +73,19 @@ func getOwnUserAvatar(cli *Client) *gui.QPixmap { //If cache is empty do a ServerQuery if avatarData == "" { // Get avatarURL - avatarURL, avatarErr := cli.GetAvatarURL() + avatarURL, avatarErr := cli.Client.GetAvatarURL() if avatarErr != nil { localLog.Println(avatarErr) } // If avatarURL is not empty (aka. has a avatar set) download it at the size of 100x100. Else make the data string empty if avatarURL != "" { - hsURL := cli.HomeserverURL.String() + hsURL := cli.Client.HomeserverURL.String() avatarURL_splits := strings.Split(strings.Replace(avatarURL, "mxc://", "", -1), "/") urlPath := hsURL + "/_matrix/media/r0/thumbnail/" + avatarURL_splits[0] + "/" + avatarURL_splits[1] + "?width=100&height=100" - data, err := cli.MakeRequest("GET", urlPath, nil, nil) + data, err := cli.Client.MakeRequest("GET", urlPath, nil, nil) if err != nil { localLog.Println(err) } @@ -97,7 +97,7 @@ func getOwnUserAvatar(cli *Client) *gui.QPixmap { // Update cache DBerr := db.Update(func(tx *buntdb.Tx) error { - tx.Set("user:"+cli.UserID+":avatarData100x100", IMGdata, nil) + tx.Set("user:"+cli.Client.UserID+":avatarData100x100", IMGdata, nil) return nil }) if DBerr != nil { diff --git a/matrix/types.go b/matrix/types.go @@ -7,7 +7,7 @@ import ( // Client is the Client type extender toadd new methods to it which gomatrix lacks currently type Client struct { - *gomatrix.Client + Client *gomatrix.Client } // RespUserDisplayName is the Response type of getUserDisplayName() diff --git a/uis.go b/uis.go @@ -1,6 +1,7 @@ package main import ( + "fmt" "log" "strings" "sync" @@ -15,9 +16,8 @@ import ( var username string var password string -var wg sync.WaitGroup -func DoLogin(username, password, homeserverURL, userID, accessToken string, localLog *log.Logger, results chan<- *matrix.Client) { +func DoLogin(username, password, homeserverURL, userID, accessToken string, localLog *log.Logger, results chan<- *matrix.Client, wg *sync.WaitGroup) { defer wg.Done() var cli *matrix.Client if accessToken != "" && homeserverURL != "" && userID != "" { @@ -32,7 +32,7 @@ func DoLogin(username, password, homeserverURL, userID, accessToken string, loca if cliErr != nil { localLog.Println(cliErr) } - cli.SetCredentials(userID, accessToken) + cli.Client.SetCredentials(userID, accessToken) } else { var err error cli, err = matrix.LoginUser(username, password) @@ -111,12 +111,14 @@ func NewLoginUI(windowWidth, windowHeight int) *widgets.QWidget { loginButton.ConnectClicked(func(checked bool) { //TODO register enter and show loader or so + var wg sync.WaitGroup + if username != "" && password != "" { localLog.Println("Starting Login Sequenze in background") results := make(chan *matrix.Client) wg.Add(1) - go DoLogin(username, password, "", "", "", localLog, results) + go DoLogin(username, password, "", "", "", localLog, results, &wg) go func() { wg.Wait() // wait for each execTask to return @@ -194,11 +196,11 @@ func NewMainUI(windowWidth, windowHeight int, cli *matrix.Client) *widgets.QWidg messageScroll.SetWidgetResizable(true) // Messages - syncer := cli.Syncer.(*gomatrix.DefaultSyncer) - cli.Store = gomatrix.NewInMemoryStore() - syncer.Store = gomatrix.NewInMemoryStore() + syncer := cli.Client.Syncer.(*gomatrix.DefaultSyncer) + customStore := gomatrix.NewInMemoryStore() + cli.Client.Store = customStore + syncer.Store = customStore syncer.OnEventType("m.room.message", func(ev *gomatrix.Event) { - localLog.Println(ev) // TODO Later needs to match current Room if ev.RoomID == "!zTIXGmDjyRcAqbrWab:matrix.ffslfl.net" { messageBody, messageOk := ev.Body() @@ -216,14 +218,17 @@ func NewMainUI(windowWidth, windowHeight int, cli *matrix.Client) *widgets.QWidg // Start Non-blocking sync localLog.Println("Syncing now") - go func(localLog *log.Logger, cli *matrix.Client) { - if err := cli.Sync(); err != nil { - localLog.Println("Sync() returned ", err) + go func() { + for { + fmt.Println("sync") + if e := cli.Client.Sync(); e != nil { + fmt.Println("Fatal Sync() error") + time.Sleep(10 * time.Second) + } time.Sleep(10 * time.Second) - } else { - localLog.Println("Stopping Sync()") } - }(localLog, cli) + }() + localLog.Println("Started Syncing") wrapperLayout.AddWidget(messageScroll, 0, 1, 0) @@ -251,12 +256,12 @@ func NewMainUI(windowWidth, windowHeight int, cli *matrix.Client) *widgets.QWidg wg.Add(1) go func(cli *matrix.Client, localLog *log.Logger, results chan<- bool) { defer wg.Done() - _, err := cli.Logout() + _, err := cli.Client.Logout() if err != nil { localLog.Println(err) results <- false } else { - cli.ClearCredentials() + cli.Client.ClearCredentials() //Flush complete DB db.View(func(tx *buntdb.Tx) error { var QueryErr error