add throughput, format code, and begin to add MUC preview window

This commit is contained in:
2026-04-18 10:29:07 +01:00
parent 7416aa37e0
commit 843687ff2b
20 changed files with 165 additions and 94 deletions
+12
View File
@@ -115,6 +115,10 @@ var commentB64 string = base64.StdEncoding.EncodeToString(commentBytes)
var informationBytes []byte var informationBytes []byte
var informationB64 string = base64.StdEncoding.EncodeToString(informationBytes) var informationB64 string = base64.StdEncoding.EncodeToString(informationBytes)
//go:embed assets/car.png
var carBytes []byte
var carB64 string = base64.StdEncoding.EncodeToString(carBytes)
func init() { func init() {
loader := gdkpixbuf.NewPixbufLoader() loader := gdkpixbuf.NewPixbufLoader()
@@ -331,4 +335,12 @@ func init() {
loader.Close() loader.Close()
clientAssets["status_"] = gdk.NewTextureForPixbuf(loader.Pixbuf()) clientAssets["status_"] = gdk.NewTextureForPixbuf(loader.Pixbuf())
loader = gdkpixbuf.NewPixbufLoader()
carData, _ := base64.StdEncoding.DecodeString(carB64)
loader.Write(carData)
loader.Close()
clientAssets["car"] = gdk.NewTextureForPixbuf(loader.Pixbuf())
} }
BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 671 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 593 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 935 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 970 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 508 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 612 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 806 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 622 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 924 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 882 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 903 B

+2 -2
View File
@@ -55,8 +55,8 @@ func switchToTab(jid string, w *gtk.Window) {
} }
typed_tab := tab.(*chatTab) typed_tab := tab.(*chatTab)
scroller.SetChild(typed_tab.msgs) scroller.SetChild(typed_tab.msgs)
typingStatus.SetText("")
if typed_tab.isMuc { if typed_tab.isMuc {
m, ok := mucmembers.Load(jid) m, ok := mucmembers.Load(jid)
@@ -490,7 +490,7 @@ func showErrorDialog(err error) {
func createIdenticon(word string) *gtk.Image { // This function generates an identicon func createIdenticon(word string) *gtk.Image { // This function generates an identicon
if !loadedConfig.Identicons { if !loadedConfig.Identicons {
i := gtk.NewImageFromPaintable(clientAssets["DefaultAvatar"]) i := gtk.NewImageFromPaintable(clientAssets["DefaultAvatar"])
i.AddCSSClass(loadedConfig.CVD.String()+"_CVD") i.AddCSSClass(loadedConfig.CVD.String() + "_CVD")
return i return i
} }
+3 -3
View File
@@ -120,7 +120,7 @@ func generateMessageWidget(p stanza.Packet) gtk.Widgetter {
quote.ConnectClicked(func() { quote.ConnectClicked(func() {
lines := strings.Split(m.Body, "\n") lines := strings.Split(m.Body, "\n")
for i, line := range lines { for i, line := range lines {
quoteline:= "> " + line quoteline := "> " + line
lines[i] = quoteline lines[i] = quoteline
} }
@@ -279,7 +279,7 @@ func getAvatar(j, hash string) *gtk.Image { // TODO: This function probably shou
_, err = os.ReadFile(hash) _, err = os.ReadFile(hash)
if err == nil { if err == nil {
i := newImageFromPath(hash) i := newImageFromPath(hash)
i.AddCSSClass(loadedConfig.CVD.String()+"_CVD") i.AddCSSClass(loadedConfig.CVD.String() + "_CVD")
return i return i
} }
@@ -326,6 +326,6 @@ func getAvatar(j, hash string) *gtk.Image { // TODO: This function probably shou
} }
i := newImageFromPath(hash) i := newImageFromPath(hash)
i.AddCSSClass(loadedConfig.CVD.String()+"_CVD") i.AddCSSClass(loadedConfig.CVD.String() + "_CVD")
return i return i
} }
+1 -2
View File
@@ -2,8 +2,8 @@
package main package main
import ( import (
"sync"
"sort" "sort"
"sync"
) )
func rangeOrdered(m *sync.Map, fn func(k, v any) bool) { func rangeOrdered(m *sync.Map, fn func(k, v any) bool) {
@@ -23,4 +23,3 @@ func rangeOrdered(m *sync.Map, fn func(k, v any) bool) {
} }
} }
} }
+77 -17
View File
@@ -40,6 +40,9 @@ var connectionIcon *gtk.Image
var mStatus *gtk.Label var mStatus *gtk.Label
var mIcon *gtk.Image var mIcon *gtk.Image
var sStatus *gtk.Label
var sIcon *gtk.Image
var typingStatus *gtk.Label var typingStatus *gtk.Label
var pingStatus *gtk.Label var pingStatus *gtk.Label
@@ -91,6 +94,14 @@ func init() {
} }
func main() { func main() {
// Setup log
xmlLog, err := os.CreateTemp("", "xmpp-log")
if err != nil {
panic(err)
}
defer os.Remove(xmlLog.Name())
pingTimes = append(pingTimes, []float64{}) pingTimes = append(pingTimes, []float64{})
p, err := ensureConfig() p, err := ensureConfig()
if err != nil { if err != nil {
@@ -120,12 +131,14 @@ func main() {
CharsetReader: func(c string, input io.Reader) (io.Reader, error) { CharsetReader: func(c string, input io.Reader) (io.Reader, error) {
return charset.NewReaderLabel(c, input) return charset.NewReaderLabel(c, input)
}, },
ConnectTimeout: 300,
}, },
Jid: loadedConfig.Username + "/" + loadedConfig.Resource, Jid: loadedConfig.Username + "/" + loadedConfig.Resource,
Credential: xmpp.Password(loadedConfig.Password), Credential: xmpp.Password(loadedConfig.Password),
Insecure: loadedConfig.Insecure, Insecure: loadedConfig.Insecure,
// StreamLogger: os.Stdout,
StreamManagementEnable: true, StreamManagementEnable: true,
ConnectTimeout: 300,
StreamLogger: xmlLog,
} }
router := xmpp.NewRouter() router := xmpp.NewRouter()
@@ -276,7 +289,9 @@ func main() {
if ok { if ok {
typed_tab.msgs.Append(b) typed_tab.msgs.Append(b)
if current == JidMustParse(m.From).Bare() {
scrollToBottomAfterUpdate(scroller) scrollToBottomAfterUpdate(scroller)
}
} else { } else {
fmt.Println("Got message when the tab does not exist!") fmt.Println("Got message when the tab does not exist!")
} }
@@ -340,7 +355,9 @@ func main() {
if ok { if ok {
typed_tab.msgs.Append(b) typed_tab.msgs.Append(b)
if current == muc {
scrollToBottomAfterUpdate(scroller) scrollToBottomAfterUpdate(scroller)
}
} else { } else {
fmt.Println("Got message when the tab does not exist!") fmt.Println("Got message when the tab does not exist!")
} }
@@ -426,9 +443,11 @@ func main() {
cm := xmpp.NewStreamManager(c, func(c xmpp.Sender) { cm := xmpp.NewStreamManager(c, func(c xmpp.Sender) {
fmt.Println("XMPP client connected") fmt.Println("XMPP client connected")
// Ping
go func() { go func() {
for { for {
time.Sleep(5 * time.Second) time.Sleep(5 * time.Second)
go func() {
pingStatus.AddCSSClass("pending") pingStatus.AddCSSClass("pending")
before := time.Now() before := time.Now()
iq := new(stanza.IQ) iq := new(stanza.IQ)
@@ -439,7 +458,7 @@ func main() {
ctx, _ := context.WithTimeout(context.Background(), 30*time.Second) ctx, _ := context.WithTimeout(context.Background(), 30*time.Second)
mychan, err := client.SendIQ(ctx, iq) mychan, err := client.SendIQ(ctx, iq)
if err != nil { if err != nil {
continue return
} }
_ = <-mychan _ = <-mychan
@@ -447,9 +466,28 @@ func main() {
delay := time.Since(before) / time.Millisecond delay := time.Since(before) / time.Millisecond
pingStatus.SetText(fmt.Sprintf("%d ms", delay)) pingStatus.SetText(fmt.Sprintf("%d ms", delay))
pingTimes[0] = append(pingTimes[0], float64(delay)) pingTimes[0] = append(pingTimes[0], float64(delay))
}()
} }
}() }()
// Throughput
var oldsize int64
var newsize int64
go func() {
for {
time.Sleep(1 * time.Second)
stat, err := xmlLog.Stat()
if err != nil {
panic(err)
}
newsize = stat.Size()
diff := float64(newsize-oldsize) / 1000
sStatus.SetText(fmt.Sprintf("%.2fKB/s", diff))
oldsize = stat.Size()
}
}()
connectionStatus.SetText(fmt.Sprintf("Connected as %s", JidMustParse(clientroot.Session.BindJid).Bare())) connectionStatus.SetText(fmt.Sprintf("Connected as %s", JidMustParse(clientroot.Session.BindJid).Bare()))
connectionStatus.SetTooltipText(fmt.Sprintf("Binded JID: %s\nUsing TLS: %t", clientroot.Session.BindJid, clientroot.Session.TlsEnabled)) connectionStatus.SetTooltipText(fmt.Sprintf("Binded JID: %s\nUsing TLS: %t", clientroot.Session.BindJid, clientroot.Session.TlsEnabled))
connectionIcon.SetFromPaintable(clientAssets["connect"]) connectionIcon.SetFromPaintable(clientAssets["connect"])
@@ -473,7 +511,32 @@ func main() {
res, ok := result.Payload.(*stanza.PubSubGeneric) res, ok := result.Payload.(*stanza.PubSubGeneric)
if ok { if ok {
for _, item := range res.Items.List { for _, item := range res.Items.List {
go func() { jid := item.Id
node := item.Any
autojoin := false
for _, attr := range node.Attrs {
if attr.Name.Local == "autojoin" {
autojoin = attr.Value == "true"
}
}
_, ok := tabs.Load(jid)
if !ok && autojoin {
createTab(jid, true)
b := gtk.NewLabel(jid)
gesture1 := gtk.NewGestureClick()
gesture1.SetButton(1)
gesture1.Connect("pressed", func() {
switchToTab(jid, &window.Window)
})
b.AddController(gesture1)
menu.Append(b)
}
}
for _, item := range res.Items.List {
jid := item.Id jid := item.Id
node := item.Any node := item.Any
autojoin := false autojoin := false
@@ -490,25 +553,13 @@ func main() {
} }
} }
_, ok := tabs.Load(jid) if autojoin {
if !ok && autojoin {
err := joinMuc(client, clientroot.Session.BindJid, jid, nick) err := joinMuc(client, clientroot.Session.BindJid, jid, nick)
if err != nil { if err != nil {
panic(err) panic(err)
} }
createTab(jid, true)
b := gtk.NewLabel(jid)
gesture1 := gtk.NewGestureClick()
gesture1.SetButton(1)
gesture1.Connect("pressed", func() {
switchToTab(jid, &window.Window)
})
b.AddController(gesture1)
menu.Append(b)
} }
}()
} }
} }
} }
@@ -907,6 +958,15 @@ func activate(app *gtk.Application) {
pBox.Append(pingStatus) pBox.Append(pingStatus)
statBar.Append(pBox) statBar.Append(pBox)
sBox := gtk.NewBox(gtk.OrientationHorizontal, 0)
sIcon = gtk.NewImageFromPaintable(clientAssets["car"])
sIcon.AddCSSClass("icon")
sStatus = gtk.NewLabel("-")
sBox.Append(sIcon)
sBox.Append(sStatus)
sStatus.SetTooltipText("Throughput of your XMPP connection in KB/s")
statBar.Append(sBox)
scrollerStatBar := gtk.NewScrolledWindow() scrollerStatBar := gtk.NewScrolledWindow()
scrollerStatBar.SetChild(statBar) scrollerStatBar.SetChild(statBar)
box.Append(scrollerStatBar) box.Append(scrollerStatBar)
+2 -2
View File
@@ -3,10 +3,10 @@ package main
import ( import (
"bytes" "bytes"
"fmt" "fmt"
"image"
"image/png"
"github.com/srwiley/oksvg" "github.com/srwiley/oksvg"
"github.com/srwiley/rasterx" "github.com/srwiley/rasterx"
"image"
"image/png"
) )
func SVGToPNG(svgData []byte) ([]byte, error) { func SVGToPNG(svgData []byte) ([]byte, error) {