From 3f40d3da29b8f9f1cdbe6ca64f5962ac3f1035a0 Mon Sep 17 00:00:00 2001 From: sunglocto Date: Tue, 17 Feb 2026 09:27:46 +0000 Subject: [PATCH] stat bar --- assets/chart_bar.png | Bin 0 -> 541 bytes assets/disconnect.png | Bin 0 -> 796 bytes main.go | 130 ++++++++++++++++++++++++++++++++---------- style.css | 4 ++ 4 files changed, 105 insertions(+), 29 deletions(-) create mode 100644 assets/chart_bar.png create mode 100644 assets/disconnect.png diff --git a/assets/chart_bar.png b/assets/chart_bar.png new file mode 100644 index 0000000000000000000000000000000000000000..9051fbc609b92b15af9be410e368b7adc20283b8 GIT binary patch literal 541 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s7SkfJR9T^zbpD<_bdda}R zAX(xXQ4*Y=R#Ki=l*-_klAn~S;F+74o*I;zm{M7IGS!BGfpNX3i(`nz>7|o*XN3g{ zxLxm5&r+FiDq*tIgb(3KYs;2x{J{F=64$gvWo33v+nN&IGB4Q@?0BSHAn56*`Fo$| z6*jqes7%mgPdodIEp3ICUhw0{v*GiMUOx6?bs z?s9#8@++(0#$$W7{xXHhicN}5i{(2jE~;#3*n0KRhdmsr=N|Cg-`^;GXYcXC;9aVd z&k6pz%9vlq=TO4t!Cq|e+<|N363?W-HSyj>Gi~nQ)(v*Qx*@MaBDpN_sO+u=$rVL= ze0GWX3itjLyE*B2wEssAB^mF>kEfUS-1IZ+ZqVBC_-tD9{)Q#9lJoxj`O9sZ`1_gc ztxd+yt~@_@Esfc@XlBV@@d>&H;j{cYIFp>>%Z|;Gn$!2dZ`+c&MgiJh4lx;*1ca|l zHRDY7Q=k3bzJa4)`K-lpcWy--6+Y4>}Dmdj{$ojod-=UE{zFGb~W>iwVmTe_CmGR@oJ&%nUI;OXk;vd$@?2>>E;?)?A& literal 0 HcmV?d00001 diff --git a/assets/disconnect.png b/assets/disconnect.png new file mode 100644 index 0000000000000000000000000000000000000000..b335cb11c4d1a397b307883adcfe1e00c4cf8e6a GIT binary patch literal 796 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s7SkfJR9T^zbpD<_bdda}R zAX(xXQ4*Y=R#Ki=l*-_klAn~S;F+74o*I;zm{M7IGS!BGfoYwmi(`nz>8X=Wdrt|J zIClTN)#u9X1s}pDt(YJ!?zq53`sFsw7xn_DTrZq*GAOud)HIFNlbdtOi346IFP!qe za>&4Ut(&xI;T*~5yXStMd%H%Ky-PvV>O&si^PhX)|DNN{d02qYiuv+3Ki2ijLasb$ z2v=~LopSe^p=`0>&LuJ|6*e=sE-C2YzUDQP;g}_d-@&dG6Fhc(sJ&dhQvQmpaMj%_ zhpt^>66H9}xUg$a@WF4KF1)OlBA3_R=X}?nGt2H_S?El`qb&}nILjIzu*-Dm@`{CD z{*aveeA%w}@2j7$TG9Mr?$ssAt|CfB*VecnC=;yUa8`TDxb^ST`mhRR`Q*|;!>^EQ6m+8!N(;I7GroJ?ztG1mJNal>;zY&22?pk(?FU>-D;wUdI^D-D=$zRSa3HN_n)wvr z+Pb=Z{K+-0VK052r5JNJT|6~Q=(O+e2|i2qJuBK``JRz4!&Gh0#se%DrpQRN&;GJq zTP@bi&wk1yc8-NBk9|05{%p}^?fF6(+8e)4>0XdpxM%ir+YbV383lwy4!KD=CWbJ+ z4(L5O&2Imy_3O=(HcIgD@%3GQshsOwce_y2=g&7C{sO~w7eprHwF`+k6tz2MHu7yf zF4c2#r}>3PM;ir@BB6o&DJz z89TRKFVDWcv3uE>FA=UYS6bFFER%74YTG-?-<@`+8x9l+<(aAiXu~(j literal 0 HcmV?d00001 diff --git a/main.go b/main.go index b844b3b..848886d 100644 --- a/main.go +++ b/main.go @@ -32,6 +32,9 @@ var loadedConfig lambdaConfig var empty_dialog *gtk.Image +var connectionStatus *gtk.Label +var pingStatus *gtk.Label + // var msgs *gtk.ListBox var content *gtk.Widgetter @@ -114,6 +117,14 @@ var largeGroupB64 string = base64.StdEncoding.EncodeToString(largeGroupBytes) var worldBytes []byte var worldB64 string = base64.StdEncoding.EncodeToString(worldBytes) +//go:embed assets/disconnect.png +var disconnectBytes []byte +var disconnectB64 string = base64.StdEncoding.EncodeToString(disconnectBytes) + +//go:embed assets/chart_bar.png +var barBytes []byte +var barB64 string = base64.StdEncoding.EncodeToString(barBytes) + var clientAssets map[string]gdk.Paintabler = make(map[string]gdk.Paintabler) var lockedJIDs map[string]bool = make(map[string]bool) @@ -240,6 +251,22 @@ func init() { loader.Close() clientAssets["world"] = gdk.NewTextureForPixbuf(loader.Pixbuf()) + + loader = gdkpixbuf.NewPixbufLoader() + + disconnectData, _ := base64.StdEncoding.DecodeString(disconnectB64) + loader.Write(disconnectData) + loader.Close() + + clientAssets["disconnect"] = gdk.NewTextureForPixbuf(loader.Pixbuf()) + + loader = gdkpixbuf.NewPixbufLoader() + + barData, _ := base64.StdEncoding.DecodeString(barB64) + loader.Write(barData) + loader.Close() + + clientAssets["chart_bar"] = gdk.NewTextureForPixbuf(loader.Pixbuf()) } func main() { @@ -510,6 +537,28 @@ func main() { cm := xmpp.NewStreamManager(c, func(c xmpp.Sender) { fmt.Println("XMPP client connected") + go func() { + for { + time.Sleep(5 * time.Second) + before := time.Now() + iq := new(stanza.IQ) + iq.From = clientroot.Session.BindJid + iq.To = iq.From + iq.Type = "get" + + ctx, _ := context.WithTimeout(context.Background(), 30 * time.Second) + mychan, err := client.SendIQ(ctx, iq) + if err != nil { + panic(err) + } + _ = <- mychan + + pingStatus.SetText(fmt.Sprintf("%d ms", time.Since(before) / time.Millisecond)) + + } + }() + connectionStatus.SetText(fmt.Sprintf("Connected as %s", JidMustParse(clientroot.Session.BindJid).Bare())) + // Join rooms in bookmarks books, err := stanza.NewItemsRequest("", "urn:xmpp:bookmarks:1", 0) if err == nil { mychan, err := c.SendIQ(context.TODO(), books) @@ -518,37 +567,39 @@ func main() { res, ok := result.Payload.(*stanza.PubSubGeneric) if ok { for _, item := range res.Items.List { - jid := item.Id - node := item.Any - autojoin := false - nick := loadedConfig.Nick - for _, attr := range node.Attrs { - if attr.Name.Local == "autojoin" { - autojoin = attr.Value == "true" - } - } - - for _, node := range node.Nodes { - if node.XMLName.Local == "nick" { - nick = node.Content - } - } - - _, ok := tabs.Load(jid) - if !ok && autojoin { - err := joinMuc(client, clientroot.Session.BindJid, jid, nick) - if err != nil { - panic(err) + go func() { + jid := item.Id + node := item.Any + autojoin := false + nick := loadedConfig.Nick + for _, attr := range node.Attrs { + if attr.Name.Local == "autojoin" { + autojoin = attr.Value == "true" + } } - createTab(jid, true) - b := gtk.NewButtonWithLabel(jid) - b.ConnectClicked(func() { - b.AddCSSClass("accent") - switchToTab(jid, &window.Window) - }) - menu.Append(b) - } + for _, node := range node.Nodes { + if node.XMLName.Local == "nick" { + nick = node.Content + } + } + + _, ok := tabs.Load(jid) + if !ok && autojoin { + err := joinMuc(client, clientroot.Session.BindJid, jid, nick) + if err != nil { + panic(err) + } + + createTab(jid, true) + b := gtk.NewButtonWithLabel(jid) + b.ConnectClicked(func() { + b.AddCSSClass("accent") + switchToTab(jid, &window.Window) + }) + menu.Append(b) + } + }() } } } @@ -557,6 +608,7 @@ func main() { go func() { time.Sleep(3 * time.Second) + connectionStatus.SetText("Connecting...") err = cm.Run() if err != nil { showErrorDialog(err) @@ -706,6 +758,26 @@ func activate(app *gtk.Application) { box := gtk.NewBox(gtk.OrientationVertical, 0) box.Append(the_menuBar) + statBar := gtk.NewBox(gtk.OrientationHorizontal, 0) + + cBox := gtk.NewBox(gtk.OrientationHorizontal, 0) + cBox.Append(gtk.NewImageFromPaintable(clientAssets["disconnect"])) + connectionStatus = gtk.NewLabel("Disconnected") + cBox.Append(connectionStatus) + statBar.Append(cBox) + + + pBox := gtk.NewBox(gtk.OrientationHorizontal, 0) + pBox.SetTooltipText("Ping between you and your XMPP server") + i := (gtk.NewImageFromPaintable(clientAssets["chart_bar"])) + i.AddCSSClass("icon") + pBox.Append(i) + pingStatus = gtk.NewLabel("...") + pBox.Append(pingStatus) + statBar.Append(pBox) + + box.Append(statBar) + // scroller.SetChild(empty_dialog) scroller.SetChild(empty_dialog) menu_scroll := gtk.NewScrolledWindow() diff --git a/style.css b/style.css index 39db015..ef2cdd7 100644 --- a/style.css +++ b/style.css @@ -43,3 +43,7 @@ .subject { color: lime; } + +.icon { + padding: 2px; +}