morpheus

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

commit 2644519ecf46e4001f2486581a874c4a9efaef18
parent a4b0e0b16a0ff9d26d23f1408552e698827c2b8f
Author: MTRNord <mtrnord1@gmail.com>
Date:   Sat, 14 Oct 2017 23:50:24 +0200

Fix #21

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

Diffstat:
Melements/messageList.go | 8++++++--
Melements/moc_cgo_windows_windows_amd64.go | 1+
Melements/roomlist.go | 1-
Mmain.go | 43++++++++++++++++++++++++++++---------------
Mmatrix/db.go | 83++++++++++++++++++++++++++++++++++++++++++++++++++++++++-----------------------
Mmatrix/login.go | 96++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-------------
Mmatrix/user.go | 87+++++++++++++++++++++++++++++++++++++++++++++++++++++---------------------------
Muis.go | 138++++++++++++++++++++++++++++++++++++++++++++++---------------------------------
Mutil/logger.go | 14++++++++++----
9 files changed, 324 insertions(+), 147 deletions(-)

diff --git a/elements/messageList.go b/elements/messageList.go @@ -41,8 +41,12 @@ func NewMessageList(scrollArea *widgets.QScrollArea, messageView *widgets.QWidge } // NewMessage adds a new message object to the view -func (messageViewLayout *QVBoxLayoutWithTriggerSlot) NewMessage(body string, cli *gomatrix.Client, sender string, scrollArea *widgets.QScrollArea) { - avatar := matrix.GetUserAvatar(cli, sender) +func (messageViewLayout *QVBoxLayoutWithTriggerSlot) NewMessage(body string, cli *gomatrix.Client, sender string, scrollArea *widgets.QScrollArea) (err error) { + avatar, AvatarErr := matrix.GetUserAvatar(cli, sender) + if err != nil { + err = AvatarErr + return + } var widget = widgets.NewQWidget(nil, 0) diff --git a/elements/moc_cgo_windows_windows_amd64.go b/elements/moc_cgo_windows_windows_amd64.go @@ -8,3 +8,4 @@ package elements #cgo LDFLAGS: -lglu32 -lopengl32 -lgdi32 -luser32 -lmingw32 -LC:/msys64/mingw64/lib -lqtmain -lshell32 -lQt5Widgets -lQt5Gui -lQt5Core #cgo LDFLAGS: -Wl,--allow-multiple-definition */ +import "C" diff --git a/elements/roomlist.go b/elements/roomlist.go @@ -29,5 +29,4 @@ func NewRoom(name string, roomListViewLayout *widgets.QGridLayout) { roomLayout.AddWidget(room, 0, core.Qt__AlignTop) roomListViewLayout.AddWidget(room, 0, 0, core.Qt__AlignTop) - return } diff --git a/main.go b/main.go @@ -11,22 +11,27 @@ import ( "github.com/therecipe/qt/gui" "github.com/therecipe/qt/widgets" "github.com/tidwall/buntdb" - _ "image/png" "sync" ) var window *widgets.QMainWindow var localLog *log.Logger -var db *buntdb.DB func main() { var file *os.File + var err error + localLog = util.Logger() - localLog, file = util.StartFileLog(localLog) + localLog, file, err = util.StartFileLog(localLog) + if err != nil { + localLog.Fatalln(err) + } defer file.Close() - db = matrix.OpenDB() - defer db.Close() + db, DBOpenErr := matrix.OpenDB() + if DBOpenErr != nil { + localLog.Fatalln(DBOpenErr) + } localLog.Println("Starting Morpheus") @@ -55,7 +60,7 @@ func main() { var userID string // Get cache - db.View(func(tx *buntdb.Tx) error { + DBErr := db.View(func(tx *buntdb.Tx) error { accessTokenErr := tx.AscendKeys("user:accessToken", func(key, value string) bool { accessToken = value @@ -77,12 +82,12 @@ func main() { userID = value return true }) - if userIDErr != nil { - return userIDErr - } - - return nil + return userIDErr }) + if DBErr != nil { + localLog.Fatalln(DBErr) + } + db.Close() if accessToken != "" && homeserverURL != "" && userID != "" { var wg sync.WaitGroup @@ -90,7 +95,7 @@ func main() { results := make(chan *gomatrix.Client) wg.Add(1) - go DoLogin("", "", homeserverURL, userID, accessToken, localLog, results, &wg) + go matrix.DoLogin("", "", homeserverURL, userID, accessToken, localLog, results, &wg) go func() { wg.Wait() // wait for each execTask to return @@ -100,13 +105,21 @@ func main() { //Show MainUI for result := range results { //TODO Don't switch screen on wrong login data. - mainUI := NewMainUI(windowWidth, windowHeight, result, window) + mainUI, mainUIErr := NewMainUI(windowWidth, windowHeight, result, window) + if mainUIErr != nil { + localLog.Fatalln(mainUIErr) + return + } mainUI.Resize2(windowWidth, windowHeight) window.SetCentralWidget(mainUI) } } else { //Show loginUI - loginUI := NewLoginUI(windowWidth, windowHeight, window) + loginUI, loginUIErr := NewLoginUI(windowWidth, windowHeight, window) + if loginUIErr != nil { + localLog.Fatalln(loginUIErr) + return + } loginUI.Resize2(windowWidth, windowHeight) window.SetCentralWidget(loginUI) } @@ -115,6 +128,6 @@ func main() { window.Show() //enter the main event loop - widgets.QApplication_Exec() + _ = widgets.QApplication_Exec() localLog.Println("Stopping Morpheus") } diff --git a/matrix/db.go b/matrix/db.go @@ -1,7 +1,6 @@ package matrix import ( - "log" "os" "path/filepath" @@ -13,63 +12,99 @@ import ( var db *buntdb.DB // OpenDB opens or generates the Database file for settings and Cache -func OpenDB() (expDB *buntdb.DB) { +func OpenDB() (db *buntdb.DB, err error) { // Open the data.db file. It will be created if it doesn't exist. configDirs := configdir.New("Nordgedanken", "Morpheus") - if _, err := os.Stat(filepath.ToSlash(configDirs.QueryFolders(configdir.Global)[0].Path) + "/data/"); os.IsNotExist(err) { - os.MkdirAll(filepath.ToSlash(configDirs.QueryFolders(configdir.Global)[0].Path)+"/data/", 0666) + if _, StatErr := os.Stat(filepath.ToSlash(configDirs.QueryFolders(configdir.Global)[0].Path) + "/data/"); os.IsNotExist(StatErr) { + MkdirErr := os.MkdirAll(filepath.ToSlash(configDirs.QueryFolders(configdir.Global)[0].Path)+"/data/", 0666) + if MkdirErr != nil { + err = MkdirErr + return + } } - expDB, err := buntdb.Open(filepath.ToSlash(configDirs.QueryFolders(configdir.Global)[0].Path) + "/data/data.db") - if err != nil { - log.Fatal(err) + expDB, DBErr := buntdb.Open(filepath.ToSlash(configDirs.QueryFolders(configdir.Global)[0].Path) + "/data/data.db") + if DBErr != nil { + err = DBErr + return } - db = expDB + db = expDB return } // InitData inits basic Data like getting aliases of joinedRooms -func InitData(cli *gomatrix.Client, db *buntdb.DB) { +func InitData(cli *gomatrix.Client) (err error) { + db, DBOpenErr := OpenDB() + if DBOpenErr != nil { + localLog.Fatalln(DBOpenErr) + } + defer db.Close() + roomsURL := cli.BuildURL("joined_rooms") var rooms JoinedRooms - _, err := cli.MakeRequest("GET", roomsURL, nil, &rooms) - if err != nil { - localLog.Println(err) + _, ReqErr := cli.MakeRequest("GET", roomsURL, nil, &rooms) + if ReqErr != nil { + err = ReqErr + return } for _, room := range rooms.JoinedRooms { var roomAliases RoomAliases - if err := cli.StateEvent(room, "m.room.aliases", "", &roomAliases); err != nil { - localLog.Println(err) + if StateEventErr := cli.StateEvent(room, "m.room.aliases", "", &roomAliases); StateEventErr != nil { + localLog.Println(StateEventErr) + // Not returning as a Error NotFound is allowed } for index, alias := range roomAliases.Content.Aliases { // Update cache DBerr := db.Update(func(tx *buntdb.Tx) error { localLog.Println(room) - tx.Set("room:"+room+":aliases:"+string(index), alias, nil) - return nil + _, _, DBSetErr := tx.Set("room:"+room+":aliases:"+string(index), alias, nil) + return DBSetErr }) if DBerr != nil { - localLog.Fatalln(DBerr) + err = DBerr + return } } } + return } // CacheMessageEvents writes message infos into the cache into the defined room -func CacheMessageEvents(id, sender, roomID, message string, timestamp int64, db *buntdb.DB) { +func CacheMessageEvents(id, sender, roomID, message string, timestamp int64) (err error) { + db, DBOpenErr := OpenDB() + if DBOpenErr != nil { + localLog.Fatalln(DBOpenErr) + } + defer db.Close() + // Update cache DBerr := db.Update(func(tx *buntdb.Tx) error { localLog.Println(roomID) - tx.Set("room:"+roomID+":messages:"+id+":id", id, nil) - tx.Set("room:"+roomID+":messages:"+id+":sender", sender, nil) - tx.Set("room:"+roomID+":messages:"+id+":message", message, nil) - tx.Set("room:"+roomID+":messages:"+id+":timestamp", string(timestamp), nil) - return nil + _, _, DBSetIDErr := tx.Set("room:"+roomID+":messages:"+id+":id", id, nil) + if DBSetIDErr != nil { + return DBSetIDErr + } + + _, _, DBSetSenderErr := tx.Set("room:"+roomID+":messages:"+id+":sender", sender, nil) + if DBSetSenderErr != nil { + return DBSetSenderErr + } + + _, _, DBSetMessageErr := tx.Set("room:"+roomID+":messages:"+id+":message", message, nil) + if DBSetMessageErr != nil { + return DBSetMessageErr + } + + _, _, DBSeTimestampErr := tx.Set("room:"+roomID+":messages:"+id+":timestamp", string(timestamp), nil) + return DBSeTimestampErr + }) if DBerr != nil { - localLog.Fatalln(DBerr) + err = DBerr + return } + return } diff --git a/matrix/login.go b/matrix/login.go @@ -5,24 +5,44 @@ import ( "github.com/matrix-org/gomatrix" "github.com/tidwall/buntdb" + "log" + "sync" ) //GetClient returns a Client func GetClient(homeserverURL, userID, accessToken string) (client *gomatrix.Client, err error) { - client, err = gomatrix.NewClient(homeserverURL, userID, accessToken) - if err != nil { - client = nil + db, DBOpenErr := OpenDB() + if DBOpenErr != nil { + localLog.Fatalln(DBOpenErr) + } + defer db.Close() + + client, ClientErr := gomatrix.NewClient(homeserverURL, userID, accessToken) + if ClientErr != nil { + err = ClientErr return } - err = db.Update(func(tx *buntdb.Tx) error { - tx.Set("user:accessToken", client.AccessToken, nil) - tx.Set("user:homeserverURL", client.HomeserverURL.String(), nil) - tx.Set("user:userID", client.UserID, nil) - return nil + if db == nil { + localLog.Println("FUCK") + } + + DBErr := db.Update(func(tx *buntdb.Tx) error { + _, _, DBSetAccessTokenErr := tx.Set("user:accessToken", client.AccessToken, nil) + if DBSetAccessTokenErr != nil { + return DBSetAccessTokenErr + } + + _, _, DBSetHomeserverURLErr := tx.Set("user:homeserverURL", client.HomeserverURL.String(), nil) + if DBSetHomeserverURLErr != nil { + return DBSetHomeserverURLErr + } + + _, _, DBSetUserIDErr := tx.Set("user:userID", client.UserID, nil) + return DBSetUserIDErr }) - if err != nil { - client = nil + if DBErr != nil { + err = DBErr return } @@ -54,16 +74,62 @@ func LoginUser(username, password string) (*gomatrix.Client, error) { if err != nil { return nil, err } + + db, DBOpenErr := OpenDB() + if DBOpenErr != nil { + localLog.Fatalln(DBOpenErr) + } + defer db.Close() cli.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) - tx.Set("user:homeserverURL", resp.HomeServer, nil) - tx.Set("user:userID", resp.UserID, nil) - return nil + _, _, DBSetAccessTokenErr := tx.Set("user:accessToken", resp.AccessToken, nil) + if DBSetAccessTokenErr != nil { + return DBSetAccessTokenErr + } + + _, _, DBSetDeviceIDErr := tx.Set("user:deviceID", resp.DeviceID, nil) + if DBSetDeviceIDErr != nil { + return DBSetDeviceIDErr + } + + _, _, DBSetHomeserverURLErr := tx.Set("user:homeserverURL", resp.HomeServer, nil) + if DBSetHomeserverURLErr != nil { + return DBSetHomeserverURLErr + } + + _, _, DBSetUserIDErr := tx.Set("user:userID", resp.UserID, nil) + return DBSetUserIDErr }) if DBerr != nil { return nil, DBerr } return cli, nil } + +// DoLogin generates the needed Client +func DoLogin(username, password, homeserverURL, userID, accessToken string, localLog *log.Logger, results chan<- *gomatrix.Client, wg *sync.WaitGroup) { + defer wg.Done() + var cli *gomatrix.Client + if accessToken != "" && homeserverURL != "" && userID != "" { + var cliErr error + if strings.HasPrefix(homeserverURL, "https://") { + cli, cliErr = GetClient(homeserverURL, userID, accessToken) + } else if strings.HasPrefix(homeserverURL, "http://") { + cli, cliErr = GetClient(homeserverURL, userID, accessToken) + } else { + cli, cliErr = GetClient("https://"+homeserverURL, userID, accessToken) + } + if cliErr != nil { + localLog.Println(cliErr) + } + cli.SetCredentials(userID, accessToken) + } else { + var err error + cli, err = LoginUser(username, password) + if err != nil { + localLog.Println(err) + } + } + + results <- cli +} diff --git a/matrix/user.go b/matrix/user.go @@ -6,7 +6,6 @@ import ( "strings" "bytes" - "fmt" "github.com/Nordgedanken/Morpheus/util" "github.com/matrix-org/gomatrix" "github.com/therecipe/qt/gui" @@ -24,8 +23,13 @@ var localLog *log.Logger func init() { var file *os.File + var err error + localLog = util.Logger() - localLog, file = util.StartFileLog(localLog) + localLog, file, err = util.StartFileLog(localLog) + if err != nil { + localLog.Fatalln(err) + } defer file.Close() } @@ -50,7 +54,7 @@ func (c *circle) At(x, y int) color.Color { return color.Alpha{0} } -func generateGenericImages(displayname string) string { +func generateGenericImages(displayname string) (imgData string, err error) { // Create an 100 x 100 image img := image.NewRGBA(image.Rect(0, 0, 100, 100)) @@ -58,33 +62,46 @@ func generateGenericImages(displayname string) string { img.Set(50, 50, color.RGBA{uint8(rand.Intn(200)), uint8(rand.Intn(255)), uint8(rand.Intn(255)), 255}) buf := new(bytes.Buffer) - png.Encode(buf, img) - return string(buf.Bytes()) + EncodeErr := png.Encode(buf, img) + if EncodeErr != nil { + err = EncodeErr + return + } + imgData = buf.String() + return } // GetOwnUserAvatar returns a *gui.QPixmap of an UserAvatar -func GetOwnUserAvatar(cli *gomatrix.Client) *gui.QPixmap { - return GetUserAvatar(cli, cli.UserID) +func GetOwnUserAvatar(cli *gomatrix.Client) (avatar *gui.QPixmap, err error) { + avatar, err = GetUserAvatar(cli, cli.UserID) + return } // GetUserAvatar returns a *gui.QPixmap of an UserAvatar -func GetUserAvatar(cli *gomatrix.Client, mxid string) *gui.QPixmap { +func GetUserAvatar(cli *gomatrix.Client, mxid string) (avatarResp *gui.QPixmap, err error) { + db, DBOpenErr := OpenDB() + if DBOpenErr != nil { + localLog.Fatalln(DBOpenErr) + } + defer db.Close() + // Init local vars var avatarData string var IMGdata string // Get cache - db.View(func(tx *buntdb.Tx) error { + DBErr := db.View(func(tx *buntdb.Tx) error { QueryErr := tx.AscendKeys("user:"+mxid+":avatarData100x100", func(key, value string) bool { avatarData = value return true }) - if QueryErr != nil { - return QueryErr - } - return nil + return QueryErr }) + if DBErr != nil { + err = DBErr + return + } //If cache is empty do a ServerQuery if avatarData == "" { @@ -94,7 +111,11 @@ func GetUserAvatar(cli *gomatrix.Client, mxid string) *gui.QPixmap { AvatarURL string `json:"avatar_url"` }{} - cli.MakeRequest("GET", urlPath, nil, &s) + _, ReqErr := cli.MakeRequest("GET", urlPath, nil, &s) + if ReqErr != nil { + err = ReqErr + return + } avatarURL := s.AvatarURL // If avatarURL is not empty (aka. has a avatar set) download it at the size of 100x100. Else make the data string empty @@ -104,34 +125,41 @@ func GetUserAvatar(cli *gomatrix.Client, mxid string) *gui.QPixmap { urlPath := hsURL + "/_matrix/media/r0/thumbnail/" + avatarURLSplits[0] + "/" + avatarURLSplits[1] + "?width=100&height=100" - data, err := cli.MakeRequest("GET", urlPath, nil, nil) - if err != nil { - localLog.Println(err) + data, ReqErr := cli.MakeRequest("GET", urlPath, nil, nil) + if ReqErr != nil { + err = ReqErr + return } IMGdata = string(data[:]) } else { //TODO Generate default image (Step: AfterUI) DisplayNameResp, _ := cli.GetOwnDisplayName() DisplayName := DisplayNameResp.DisplayName - IMGdata = generateGenericImages(DisplayName) + var GenerateImgErr error + IMGdata, GenerateImgErr = generateGenericImages(DisplayName) + if GenerateImgErr != nil { + err = GenerateImgErr + return + } } // Update cache DBerr := db.Update(func(tx *buntdb.Tx) error { - tx.Set("user:"+mxid+":avatarData100x100", IMGdata, nil) - return nil + _, _, DBSetErr := tx.Set("user:"+mxid+":avatarData100x100", IMGdata, nil) + return DBSetErr }) if DBerr != nil { - localLog.Fatalln("DB ERROR: ", DBerr) + err = DBErr + return } } else { IMGdata = avatarData } r := bytes.NewReader([]byte(IMGdata)) - srcIMG, _, err := image.Decode(r) - if err != nil { - localLog.Println("Decoder error: ", err) + srcIMG, _, DecodeErr := image.Decode(r) + if DecodeErr != nil { + err = DecodeErr } // Convert avatarimage to QPixmap for usage in QT @@ -141,12 +169,13 @@ func GetUserAvatar(cli *gomatrix.Client, mxid string) *gui.QPixmap { draw.DrawMask(canvas, canvas.Bounds(), srcIMG, image.ZP, &circle{image.Point{cx, cy}, 110}, image.ZP, draw.Over) avatar := gui.NewQPixmap() buf := new(bytes.Buffer) - Converr := png.Encode(buf, canvas) - if Converr != nil { - localLog.Println("Converting error: ", Converr) + ConvErr := png.Encode(buf, canvas) + if ConvErr != nil { + err = ConvErr } - str := fmt.Sprintf("%s", buf) + str := buf.String() avatar.LoadFromData(str, uint(len(str)), "", 0) - return avatar + avatarResp = avatar + return } diff --git a/uis.go b/uis.go @@ -11,7 +11,6 @@ import ( "github.com/therecipe/qt/widgets" "github.com/tidwall/buntdb" "log" - "strings" "sync" "time" ) @@ -19,36 +18,8 @@ import ( var username string var password string -// DoLogin generates the needed Client -func DoLogin(username, password, homeserverURL, userID, accessToken string, localLog *log.Logger, results chan<- *gomatrix.Client, wg *sync.WaitGroup) { - defer wg.Done() - var cli *gomatrix.Client - if accessToken != "" && homeserverURL != "" && userID != "" { - var cliErr error - if strings.HasPrefix(homeserverURL, "https://") { - cli, cliErr = matrix.GetClient(homeserverURL, userID, accessToken) - } else if strings.HasPrefix(homeserverURL, "http://") { - cli, cliErr = matrix.GetClient(homeserverURL, userID, accessToken) - } else { - cli, cliErr = matrix.GetClient("https://"+homeserverURL, userID, accessToken) - } - if cliErr != nil { - localLog.Println(cliErr) - } - cli.SetCredentials(userID, accessToken) - } else { - var err error - cli, err = matrix.LoginUser(username, password) - if err != nil { - localLog.Println(err) - } - } - - results <- cli -} - //NewLoginUI initializes the login Screen -func NewLoginUI(windowWidth, windowHeight int, window *widgets.QMainWindow) *widgets.QWidget { +func NewLoginUI(windowWidth, windowHeight int, window *widgets.QMainWindow) (respWidget *widgets.QWidget, err error) { widget := widgets.NewQWidget(nil, 0) widget.SetObjectName("LoginWrapper") widget.SetStyleSheet("QWidget#LoginWrapper { border: 0px; };") @@ -112,7 +83,7 @@ func NewLoginUI(windowWidth, windowHeight int, window *widgets.QMainWindow) *wid password = value }) - loginButton.ConnectClicked(func(checked bool) { + loginButton.ConnectClicked(func(_ bool) { //TODO register enter and show loader or so var wg sync.WaitGroup @@ -122,7 +93,7 @@ func NewLoginUI(windowWidth, windowHeight int, window *widgets.QMainWindow) *wid results := make(chan *gomatrix.Client) wg.Add(1) - go DoLogin(username, password, "", "", "", localLog, results, &wg) + go matrix.DoLogin(username, password, "", "", "", localLog, results, &wg) go func() { wg.Wait() // wait for each execTask to return @@ -132,8 +103,13 @@ func NewLoginUI(windowWidth, windowHeight int, window *widgets.QMainWindow) *wid //Show MainUI for result := range results { //TODO Don't switch screen on wrong login data. - mainUI := NewMainUI(windowWidth, windowHeight, result, window) + mainUI, mainUIErr := NewMainUI(windowWidth, windowHeight, result, window) + if mainUIErr != nil { + err = mainUIErr + return + } window.SetCentralWidget(mainUI) + window.Resize(widget.Size()) } } else { localLog.Println("Username and/or password is empty. Do Nothing.") @@ -142,12 +118,13 @@ func NewLoginUI(windowWidth, windowHeight int, window *widgets.QMainWindow) *wid widget.SetWindowTitle("Morpheus - Login") - return widget + respWidget = widget + return } //NewMainUI initializes the login Screen //func NewMainUI(windowWidth, windowHeight int, cli *gomatrix.Client) *widgets.QWidget { -func NewMainUI(windowWidth, windowHeight int, cli *gomatrix.Client, window *widgets.QMainWindow) *widgets.QWidget { +func NewMainUI(windowWidth, windowHeight int, cli *gomatrix.Client, window *widgets.QMainWindow) (respWidget *widgets.QWidget, err error) { var widget = widgets.NewQWidget(nil, 0) var loader = uitools.NewQUiLoader(nil) @@ -157,7 +134,11 @@ func NewMainUI(windowWidth, windowHeight int, cli *gomatrix.Client, window *widg var mainWidget = loader.Load(file, widget) file.Close() - matrix.InitData(cli, db) + InitDataErr := matrix.InitData(cli) + if InitDataErr != nil { + err = InitDataErr + return + } messageScrollArea := widgets.NewQScrollAreaFromPointer(widget.FindChild("messageScroll", core.Qt__FindChildrenRecursively).Pointer()) messagesScrollAreaContent := widgets.NewQWidgetFromPointer(widget.FindChild("messagesScrollAreaContent", core.Qt__FindChildrenRecursively).Pointer()) @@ -186,11 +167,16 @@ func NewMainUI(windowWidth, windowHeight int, cli *gomatrix.Client, window *widg //Set Avatar avatarLogo := widgets.NewQLabelFromPointer(widget.FindChild("UserAvatar", core.Qt__FindChildrenRecursively).Pointer()) - avatarLogo.SetPixmap(matrix.GetOwnUserAvatar(cli)) + avatar, AvatarErr := matrix.GetOwnUserAvatar(cli) + if AvatarErr != nil { + err = AvatarErr + return + } + avatarLogo.SetPixmap(avatar) //Handle LogoutButton logoutButton := widgets.NewQPushButtonFromPointer(widget.FindChild("LogoutButton", core.Qt__FindChildrenRecursively).Pointer()) - logoutButton.ConnectClicked(func(checked bool) { + logoutButton.ConnectClicked(func(_ bool) { //TODO register enter and show loader or so localLog.Println("Starting Logout Sequenze in background") var wg sync.WaitGroup @@ -199,17 +185,31 @@ func NewMainUI(windowWidth, windowHeight int, cli *gomatrix.Client, window *widg wg.Add(1) go func(cli *gomatrix.Client, localLog *log.Logger, results chan<- bool) { defer wg.Done() - _, err := cli.Logout() - if err != nil { - localLog.Println(err) + _, LogoutErr := cli.Logout() + if LogoutErr != nil { + localLog.Println(LogoutErr) results <- false - } else { - cli.ClearCredentials() - //Flush complete DB - db.View(func(tx *buntdb.Tx) error { - QueryErr := tx.DeleteAll() + } + cli.ClearCredentials() + + db, DBOpenErr := matrix.OpenDB() + if DBOpenErr != nil { + localLog.Fatalln(DBOpenErr) + } + defer db.Close() + + //Flush complete DB + DBErr := db.Update(func(tx *buntdb.Tx) error { + QueryErr := tx.DeleteAll() + if QueryErr != nil { return QueryErr - }) + } + return nil + }) + if DBErr != nil { + localLog.Panicln(DBErr) + results <- false + } else { results <- true } }(cli, localLog, results) @@ -222,7 +222,15 @@ func NewMainUI(windowWidth, windowHeight int, cli *gomatrix.Client, window *widg //Show LoginUI for result := range results { if result { - loginUI := NewLoginUI(windowWidth, windowHeight, window) + window.DisconnectKeyPressEvent() + window.DisconnectResizeEvent() + widget.DisconnectResizeEvent() + messageScrollArea.DisconnectResizeEvent() + + loginUI, loginUIErr := NewLoginUI(windowWidth, windowHeight, window) + if loginUIErr != nil { + localLog.Panicln(loginUIErr) + } window.SetCentralWidget(loginUI) } } @@ -238,7 +246,11 @@ func NewMainUI(windowWidth, windowHeight int, cli *gomatrix.Client, window *widg messageListLayout := elements.NewMessageList(messageScrollArea, messagesScrollAreaContent) messageListLayout.ConnectTriggerMessage(func(messageBody, sender string) { - messageListLayout.NewMessage(messageBody, cli, sender, messageScrollArea) + NewMessageErr := messageListLayout.NewMessage(messageBody, cli, sender, messageScrollArea) + if NewMessageErr != nil { + err = NewMessageErr + return + } }) messageScrollArea.SetWidgetResizable(true) messageScrollArea.SetHorizontalScrollBarPolicy(core.Qt__ScrollBarAlwaysOff) @@ -250,20 +262,23 @@ func NewMainUI(windowWidth, windowHeight int, cli *gomatrix.Client, window *widg sender := ev.Sender id := ev.ID timestamp := ev.Timestamp - matrix.CacheMessageEvents(id, sender, room, msg, timestamp, db) + CacheErr := matrix.CacheMessageEvents(id, sender, room, msg, timestamp) + if CacheErr != nil { + err = CacheErr + return + } messageListLayout.TriggerMessage(msg, sender) }) // Start Non-blocking sync - localLog.Println("Syncing now") go func() { + localLog.Println("Start sync") for { - localLog.Println("sync") + if e := cli.Sync(); e != nil { localLog.Println("Fatal Sync() error") - time.Sleep(10 * time.Second) + time.Sleep(5 * time.Second) } - localLog.Println("sync done") time.Sleep(10 * time.Second) } }() @@ -274,9 +289,17 @@ func NewMainUI(windowWidth, windowHeight int, cli *gomatrix.Client, window *widg if int(ev.Key()) == int(core.Qt__Key_Enter) || int(ev.Key()) == int(core.Qt__Key_Return) { mardownMessage := commonmark.Md2Html(message, 0) if mardownMessage == message { - cli.SendText("!zTIXGmDjyRcAqbrWab:matrix.ffslfl.net", message) + _, SendErr := cli.SendText("!zTIXGmDjyRcAqbrWab:matrix.ffslfl.net", message) + if SendErr != nil { + err = SendErr + return + } } else { - cli.SendMessageEvent("!zTIXGmDjyRcAqbrWab:matrix.ffslfl.net", "m.room.message", matrix.HTMLMessage{"m.text", message, mardownMessage, "org.matrix.custom.html"}) + _, SendErr := cli.SendMessageEvent("!zTIXGmDjyRcAqbrWab:matrix.ffslfl.net", "m.room.message", matrix.HTMLMessage{"m.text", message, mardownMessage, "org.matrix.custom.html"}) + if SendErr != nil { + err = SendErr + return + } } messageInput.Clear() } else { @@ -287,5 +310,6 @@ func NewMainUI(windowWidth, windowHeight int, cli *gomatrix.Client, window *widg message = value }) - return widget + respWidget = widget + return } diff --git a/util/logger.go b/util/logger.go @@ -23,10 +23,14 @@ func Logger() *log.Logger { } //StartFileLog initialises the logging function -func StartFileLog(localLog *log.Logger) (*log.Logger, *os.File) { +func StartFileLog(localLog *log.Logger) (logger *log.Logger, logFile *os.File, err error) { configDirs := configdir.New("Nordgedanken", "Morpheus") - if _, err := os.Stat(filepath.ToSlash(configDirs.QueryFolders(configdir.Global)[0].Path) + "/log/"); os.IsNotExist(err) { - os.MkdirAll(filepath.ToSlash(configDirs.QueryFolders(configdir.Global)[0].Path)+"/log/", 0666) + if _, StatErr := os.Stat(filepath.ToSlash(configDirs.QueryFolders(configdir.Global)[0].Path) + "/log/"); os.IsNotExist(StatErr) { + MkdirErr := os.MkdirAll(filepath.ToSlash(configDirs.QueryFolders(configdir.Global)[0].Path)+"/log/", 0666) + if MkdirErr != nil { + err = MkdirErr + return + } } f, err := os.OpenFile(filepath.ToSlash(configDirs.QueryFolders(configdir.Global)[0].Path)+"/log/Morpheus.log", os.O_CREATE|os.O_APPEND|os.O_RDWR, 0666) if err != nil { @@ -37,5 +41,7 @@ func StartFileLog(localLog *log.Logger) (*log.Logger, *os.File) { localLog.SetOutput(mw) localLog.SetPrefix(time.Now().Format("2006-01-02 15:04:05") + " - ") - return localLog, f + logger = localLog + logFile = f + return }