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:
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
}