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
+125 -65
View File
@@ -40,6 +40,9 @@ var connectionIcon *gtk.Image
var mStatus *gtk.Label
var mIcon *gtk.Image
var sStatus *gtk.Label
var sIcon *gtk.Image
var typingStatus *gtk.Label
var pingStatus *gtk.Label
@@ -91,6 +94,14 @@ func init() {
}
func main() {
// Setup log
xmlLog, err := os.CreateTemp("", "xmpp-log")
if err != nil {
panic(err)
}
defer os.Remove(xmlLog.Name())
pingTimes = append(pingTimes, []float64{})
p, err := ensureConfig()
if err != nil {
@@ -120,12 +131,14 @@ func main() {
CharsetReader: func(c string, input io.Reader) (io.Reader, error) {
return charset.NewReaderLabel(c, input)
},
ConnectTimeout: 300,
},
Jid: loadedConfig.Username + "/" + loadedConfig.Resource,
Credential: xmpp.Password(loadedConfig.Password),
Insecure: loadedConfig.Insecure,
// StreamLogger: os.Stdout,
Jid: loadedConfig.Username + "/" + loadedConfig.Resource,
Credential: xmpp.Password(loadedConfig.Password),
Insecure: loadedConfig.Insecure,
StreamManagementEnable: true,
ConnectTimeout: 300,
StreamLogger: xmlLog,
}
router := xmpp.NewRouter()
@@ -276,7 +289,9 @@ func main() {
if ok {
typed_tab.msgs.Append(b)
scrollToBottomAfterUpdate(scroller)
if current == JidMustParse(m.From).Bare() {
scrollToBottomAfterUpdate(scroller)
}
} else {
fmt.Println("Got message when the tab does not exist!")
}
@@ -340,7 +355,9 @@ func main() {
if ok {
typed_tab.msgs.Append(b)
scrollToBottomAfterUpdate(scroller)
if current == muc {
scrollToBottomAfterUpdate(scroller)
}
} else {
fmt.Println("Got message when the tab does not exist!")
}
@@ -426,28 +443,49 @@ func main() {
cm := xmpp.NewStreamManager(c, func(c xmpp.Sender) {
fmt.Println("XMPP client connected")
// Ping
go func() {
for {
time.Sleep(5 * time.Second)
pingStatus.AddCSSClass("pending")
before := time.Now()
iq := new(stanza.IQ)
iq.From = clientroot.Session.BindJid
iq.To = iq.From
iq.Type = "get"
go func() {
pingStatus.AddCSSClass("pending")
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)
ctx, _ := context.WithTimeout(context.Background(), 30*time.Second)
mychan, err := client.SendIQ(ctx, iq)
if err != nil {
return
}
_ = <-mychan
pingStatus.RemoveCSSClass("pending")
delay := time.Since(before) / time.Millisecond
pingStatus.SetText(fmt.Sprintf("%d ms", 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 {
continue
panic(err)
}
_ = <-mychan
pingStatus.RemoveCSSClass("pending")
delay := time.Since(before) / time.Millisecond
pingStatus.SetText(fmt.Sprintf("%d ms", delay))
pingTimes[0] = append(pingTimes[0], float64(delay))
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()))
@@ -473,42 +511,55 @@ func main() {
res, ok := result.Payload.(*stanza.PubSubGeneric)
if ok {
for _, item := range res.Items.List {
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"
}
jid := item.Id
node := item.Any
autojoin := false
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 {
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
node := item.Any
autojoin := false
nick := loadedConfig.Nick
for _, attr := range node.Attrs {
if attr.Name.Local == "autojoin" {
autojoin = attr.Value == "true"
}
}
_, 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.NewLabel(jid)
gesture1 := gtk.NewGestureClick()
gesture1.SetButton(1)
gesture1.Connect("pressed", func() {
switchToTab(jid, &window.Window)
})
b.AddController(gesture1)
menu.Append(b)
for _, node := range node.Nodes {
if node.XMLName.Local == "nick" {
nick = node.Content
}
}()
}
if autojoin {
err := joinMuc(client, clientroot.Session.BindJid, jid, nick)
if err != nil {
panic(err)
}
}
}
}
}
@@ -693,21 +744,21 @@ func activate(app *gtk.Application) {
_, ok := tabs.Load(t)
jm := func() {
err := joinMuc(client, clientroot.Session.BindJid, t, nick_entry.Text())
if err != nil {
panic(err)
}
err := joinMuc(client, clientroot.Session.BindJid, t, nick_entry.Text())
if err != nil {
panic(err)
}
createTab(t, true)
b := gtk.NewLabel(t)
gesture1 := gtk.NewGestureClick()
gesture1.SetButton(1)
gesture1.Connect("pressed", func() {
switchToTab(t, &window.Window)
})
createTab(t, true)
b := gtk.NewLabel(t)
gesture1 := gtk.NewGestureClick()
gesture1.SetButton(1)
gesture1.Connect("pressed", func() {
switchToTab(t, &window.Window)
})
b.AddController(gesture1)
menu.Append(b)
b.AddController(gesture1)
menu.Append(b)
}
if !ok {
// First check the MUC's disco and see if it's semianon
@@ -907,6 +958,15 @@ func activate(app *gtk.Application) {
pBox.Append(pingStatus)
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.SetChild(statBar)
box.Append(scrollerStatBar)