morpheus

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

commit 528f91784d10cd7116db9199ebb68d679d6ec938
parent 89ccc954f2974b76db9e90b05765ff5bcaccf005
Author: MTRNord <mtrnord1@gmail.com>
Date:   Fri, 24 Nov 2017 07:04:48 +0100

Hopefully fix images from cache sometimes break

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

Diffstat:
Mmatrix/rooms.go | 21++++++++++-----------
Mmatrix/user.go | 44+++++++++++++++++++++++++++-----------------
Mui/MainUI.go | 8++++----
3 files changed, 41 insertions(+), 32 deletions(-)

diff --git a/matrix/rooms.go b/matrix/rooms.go @@ -2,7 +2,6 @@ package matrix import ( "bytes" - "fmt" "image" "image/draw" "image/png" @@ -62,24 +61,24 @@ func (r *Room) GetRoomAvatar() (avatarResp *gui.QPixmap, err error) { } // Get the image Data - db, DBOpenErr := db.OpenCacheDB() + cacheDB, DBOpenErr := db.OpenCacheDB() if DBOpenErr != nil { localLog.Fatalln(DBOpenErr) } // Init local vars - var roomAvatarData string - var IMGdata string + var roomAvatarData []byte + var IMGdata []byte // Get cache - DBErr := db.View(func(txn *badger.Txn) error { + DBErr := cacheDB.View(func(txn *badger.Txn) error { roomAvatarDataItem, QueryErr := txn.Get([]byte("room|" + r.RoomID + "|84x84")) if QueryErr != nil && QueryErr != badger.ErrKeyNotFound { return QueryErr } if QueryErr != badger.ErrKeyNotFound { roomAvatarDataBytes, roomAvatarDataErr := roomAvatarDataItem.Value() - roomAvatarData = fmt.Sprintf("%s", roomAvatarDataBytes) + roomAvatarData = roomAvatarDataBytes return roomAvatarDataErr } return nil @@ -90,7 +89,7 @@ func (r *Room) GetRoomAvatar() (avatarResp *gui.QPixmap, err error) { } //If cache is empty do a ServerQuery - if roomAvatarData == "" { + if len(roomAvatarData) <= 0 { // If avatarURL is not empty (aka. has a avatar set) download it at the size of 100x100. Else make the data string empty if r.RoomAvatarURL != "" { hsURL := r.cli.HomeserverURL.String() @@ -103,7 +102,7 @@ func (r *Room) GetRoomAvatar() (avatarResp *gui.QPixmap, err error) { err = ReqErr return } - IMGdata = string(data[:]) + IMGdata = data } else { localLog.Println("Generating Room Avatar") var GenerateImgErr error @@ -124,8 +123,8 @@ func (r *Room) GetRoomAvatar() (avatarResp *gui.QPixmap, err error) { } // Update cache - DBSetErr := db.Update(func(txn *badger.Txn) error { - DBSetErr := txn.Set([]byte("room|"+r.RoomID+"|84x84"), []byte(IMGdata)) + DBSetErr := cacheDB.Update(func(txn *badger.Txn) error { + DBSetErr := txn.Set([]byte("room|"+r.RoomID+"|84x84"), IMGdata) return DBSetErr }) if DBSetErr != nil { @@ -137,7 +136,7 @@ func (r *Room) GetRoomAvatar() (avatarResp *gui.QPixmap, err error) { IMGdata = roomAvatarData } - reader := bytes.NewReader([]byte(IMGdata)) + reader := bytes.NewReader(IMGdata) srcIMG, _, DecodeErr := image.Decode(reader) if DecodeErr != nil { err = DecodeErr diff --git a/matrix/user.go b/matrix/user.go @@ -2,13 +2,16 @@ package matrix import ( "bytes" - "fmt" "image" "image/color" "image/draw" + // image/gif needed to load gif images + _ "image/gif" // image/jpeg needed to load jpeg images _ "image/jpeg" "image/png" + // image/png needed to load png images + _ "image/png" "log" "os" "strconv" @@ -28,6 +31,12 @@ import ( // golang.org/x/image/bmp needed to load bmp images _ "golang.org/x/image/bmp" + + // golang.org/x/image/riff needed to load riff images + _ "golang.org/x/image/riff" + + // golang.org/x/image/tiff needed to load tiff images + _ "golang.org/x/image/tiff" ) var localLog *log.Logger @@ -60,12 +69,12 @@ func (c *circle) Bounds() image.Rectangle { func (c *circle) At(x, y int) color.Color { xx, yy, rr := float64(x-c.p.X)+0.5, float64(y-c.p.Y)+0.5, float64(c.r) if xx*xx+yy*yy < rr*rr { - return color.Alpha{255} + return color.Alpha{A: 255} } - return color.Alpha{0} + return color.Alpha{A: 0} } -func generateGenericImages(displayname string, size int) (imgData string, err error) { +func generateGenericImages(displayname string, size int) (imgData []byte, err error) { identifier := displayname if (identifier[0] == '#' || identifier[0] == '!' || identifier[0] == '@') && len(identifier) > 1 { identifier = identifier[1:] @@ -85,7 +94,7 @@ func generateGenericImages(displayname string, size int) (imgData string, err er err = EncodeErr return } - imgData = buf.String() + imgData = buf.Bytes() return } @@ -97,17 +106,17 @@ func GetOwnUserAvatar(cli *gomatrix.Client) (avatar *gui.QPixmap, err error) { // GetUserAvatar returns a *gui.QPixmap of an UserAvatar func GetUserAvatar(cli *gomatrix.Client, mxid string, size int) (avatarResp *gui.QPixmap, err error) { - db, DBOpenErr := db.OpenCacheDB() + cacheDB, DBOpenErr := db.OpenCacheDB() if DBOpenErr != nil { localLog.Fatalln(DBOpenErr) } // Init local vars - var avatarData string - var IMGdata string + var avatarData []byte + var IMGdata []byte // Get cache - txn := db.NewTransaction(false) + txn := cacheDB.NewTransaction(false) avatarDataItem, QueryErr := txn.Get([]byte("user|" + mxid + "|avatarData" + strconv.Itoa(size) + "x" + strconv.Itoa(size))) if QueryErr != nil && QueryErr != badger.ErrKeyNotFound { err = QueryErr @@ -115,7 +124,7 @@ func GetUserAvatar(cli *gomatrix.Client, mxid string, size int) (avatarResp *gui } if QueryErr != badger.ErrKeyNotFound { avatarDataByte, avatarDataErr := avatarDataItem.Value() - avatarData = fmt.Sprintf("%s", avatarDataByte) + avatarData = avatarDataByte if avatarDataErr != nil { err = avatarDataErr } @@ -123,7 +132,7 @@ func GetUserAvatar(cli *gomatrix.Client, mxid string, size int) (avatarResp *gui } //If cache is empty do a ServerQuery - if avatarData == "" { + if len(avatarData) <= 0 { // Get avatarURL urlPath := cli.BuildURL("profile", mxid, "avatar_url") s := struct { @@ -149,7 +158,7 @@ func GetUserAvatar(cli *gomatrix.Client, mxid string, size int) (avatarResp *gui err = ReqErr return } - IMGdata = string(data[:]) + IMGdata = data } else { DisplayNameResp, _ := cli.GetDisplayName(mxid) DisplayName := DisplayNameResp.DisplayName @@ -162,8 +171,8 @@ func GetUserAvatar(cli *gomatrix.Client, mxid string, size int) (avatarResp *gui } // Update cache - txn := db.NewTransaction(true) - DBSetErr := txn.Set([]byte("user|"+mxid+"|avatarData"+strconv.Itoa(size)+"x"+strconv.Itoa(size)), []byte(IMGdata)) + txn := cacheDB.NewTransaction(true) + DBSetErr := txn.Set([]byte("user|"+mxid+"|avatarData"+strconv.Itoa(size)+"x"+strconv.Itoa(size)), IMGdata) if DBSetErr != nil { err = DBSetErr return @@ -172,7 +181,7 @@ func GetUserAvatar(cli *gomatrix.Client, mxid string, size int) (avatarResp *gui IMGdata = avatarData } - r := bytes.NewReader([]byte(IMGdata)) + r := bytes.NewReader(IMGdata) srcIMG, _, DecodeErr := image.Decode(r) if DecodeErr != nil { err = DecodeErr @@ -191,8 +200,9 @@ func GetUserAvatar(cli *gomatrix.Client, mxid string, size int) (avatarResp *gui err = ConvErr } - str := buf.String() - avatar.LoadFromData(str, uint(len(str)), "", 0) + str := buf.Bytes() + + avatar.LoadFromData(string(str[:]), uint(len(str)), "PNG", 0) avatarResp = avatar return } diff --git a/ui/MainUI.go b/ui/MainUI.go @@ -362,11 +362,11 @@ func contains(slice []string, item string) bool { } func (m *MainUI) loadCache() (err error) { - /*barAtBottom := false + barAtBottom := false bar := m.messageScrollArea.VerticalScrollBar() if bar.Value() == bar.Maximum() { barAtBottom = true - }*/ + } db, DBOpenErr := db.OpenCacheDB() if DBOpenErr != nil { @@ -595,9 +595,9 @@ func (m *MainUI) loadCache() (err error) { return } - /*if barAtBottom { + if !barAtBottom { bar.SetValue(bar.Maximum()) - }*/ + } return }