This commit is contained in:
2026-05-03 11:10:15 +01:00
parent 58c7165ce5
commit 82aa2abfbd
3 changed files with 126 additions and 77 deletions
+105 -72
View File
@@ -20,7 +20,6 @@ import (
"github.com/BurntSushi/toml"
"gosrc.io/xmpp"
"gosrc.io/xmpp/stanza"
"mellium.im/xmpp/jid"
"time"
_ "embed"
@@ -396,44 +395,9 @@ func main() {
} else { // This is a presence stanza from a regular user
// The code is basically the exact same as above, we just don't check for mucuser
user := jid.MustParse(presence.From).Bare().String()
_, ok := userdevices.Load(user)
_, mok := mucmembers.Load(user)
if !ok && !mok { // FIXME: The initial muc presence gets picked up from this check
ok := createTab(user, false, user)
if ok {
userdevices.Store(user, userUnit{})
b := gtk.NewLabel(user)
gesture1 := gtk.NewGestureClick()
gesture1.SetButton(1)
gesture1.Connect("pressed", func() {
switchToTab(user, &window.Window)
})
b.AddController(gesture1)
menu.Append(b)
}
}
unit, ok := userdevices.Load(user)
if !ok {
return
}
resource := jid.MustParse(presence.From).Resourcepart()
typed_unit := unit.(userUnit)
if presence.Type != "unavailable" {
typed_unit.Devices.Store(resource, presence)
} else {
typed_unit.Devices.Delete(resource)
}
userdevices.Store(user, typed_unit)
// TODO: Presence handling code goes here
}
time.Sleep(1 * time.Second)
})
c, err := xmpp.NewClient(&config, router, func(err error) {
@@ -482,33 +446,33 @@ func main() {
// Throughput
/*
var oldsize int64
var newsize int64
var diff float64
go func() {
for {
time.Sleep(5 * time.Second)
stat, err := xmlLog.Stat()
if err != nil {
panic(err)
}
var oldsize int64
var newsize int64
var diff float64
go func() {
for {
time.Sleep(5 * time.Second)
stat, err := xmlLog.Stat()
if err != nil {
panic(err)
}
newsize = stat.Size()
diff = float64(newsize-oldsize) / 1000
newsize = stat.Size()
diff = float64(newsize-oldsize) / 1000
ic := clientAssets["car"]
if diff >= 25 {
ic = clientAssets["car_high"]
}
ic := clientAssets["car"]
if diff >= 25 {
ic = clientAssets["car_high"]
}
glib.IdleAdd(func() {
sStatus.SetText(fmt.Sprintf("%.2f%s", diff, loadedLocale["KBPerSecond"]))
sIcon.SetFromPaintable(ic)
})
glib.IdleAdd(func() {
sStatus.SetText(fmt.Sprintf("%.2f%s", diff, loadedLocale["KBPerSecond"]))
sIcon.SetFromPaintable(ic)
})
oldsize = newsize
}
}()
oldsize = newsize
}
}()
*/
glib.IdleAdd(func() {
@@ -526,6 +490,55 @@ func main() {
</iq>
`, clientroot.Session.BindJid))
// Fetch roster
i, err := stanza.NewIQ(stanza.Attrs{
Type: "get",
})
if err != nil {
panic(err)
}
roster := i.RosterItems()
i.Payload = roster
mychan, err := c.SendIQ(context.TODO(), i)
result := <-mychan
if err == nil {
items, ok := result.Payload.(*stanza.RosterItems)
if ok {
for _, v := range items.Items {
name := v.Name
jid := v.Jid
if name == "" {
name = jid
}
createTab(jid, false, name)
glib.IdleAdd(func() {
box := gtk.NewBox(gtk.OrientationHorizontal, 10)
b := gtk.NewLabel(name)
gesture1 := gtk.NewGestureClick()
gesture1.SetButton(1)
gesture1.Connect("pressed", func() {
switchToTab(jid, &window.Window)
})
box.Append(b)
go func() {
new_im := getAvatar(jid, jid) // TODO: Use PEP avatar and do not use JID as hash
glib.IdleAdd(func() {
new_im.SetPixelSize(40)
box.Prepend(new_im)
})
}()
box.AddController(gesture1)
menu.Append(box)
menu.Append(gtk.NewSeparator(gtk.OrientationHorizontal))
})
}
}
}
// Join rooms in bookmarks
if loadedConfig.JoinBookmarks {
books, err := stanza.NewItemsRequest("", "urn:xmpp:bookmarks:1", 0)
@@ -539,7 +552,7 @@ func main() {
jid := item.Id
node := item.Any
autojoin := false
name := ""
name := jid
password := ""
nick := loadedConfig.Nick
for _, attr := range node.Attrs {
@@ -582,15 +595,25 @@ func main() {
joinMuc(client, clientroot.Session.BindJid, jid, nick, password)
createTab(jid, true, name)
glib.IdleAdd(func() {
box := gtk.NewBox(gtk.OrientationHorizontal, 10)
b := gtk.NewLabel(name)
gesture1 := gtk.NewGestureClick()
gesture1.SetButton(1)
gesture1.Connect("pressed", func() {
switchToTab(jid, &window.Window)
})
box.Append(b)
go func() {
new_im := getAvatar(jid, jid)
glib.IdleAdd(func() {
new_im.SetPixelSize(40)
box.Prepend(new_im)
})
}()
b.AddController(gesture1)
menu.Append(b)
box.AddController(gesture1)
menu.Append(box)
menu.Append(gtk.NewSeparator(gtk.OrientationHorizontal))
})
}
@@ -820,7 +843,16 @@ func activate(app *gtk.Application) {
}
createTab(t, true, n)
box := gtk.NewBox(gtk.OrientationHorizontal, 10)
go func() {
new_im := getAvatar(t, t)
glib.IdleAdd(func() {
new_im.SetPixelSize(40)
box.Prepend(new_im)
})
}()
b := gtk.NewLabel(n)
box.Append(b)
gesture1 := gtk.NewGestureClick()
gesture1.SetButton(1)
gesture1.Connect("pressed", func() {
@@ -828,7 +860,8 @@ func activate(app *gtk.Application) {
})
b.AddController(gesture1)
menu.Append(b)
menu.Append(box)
menu.Append(gtk.NewSeparator(gtk.OrientationHorizontal))
}
if !ok {
@@ -1100,14 +1133,14 @@ func activate(app *gtk.Application) {
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(loadedLocale["throughputTooltip"])
statBar.Append(sBox)
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(loadedLocale["throughputTooltip"])
statBar.Append(sBox)
*/
scrollerStatBar := gtk.NewScrolledWindow()