In my true love's dying breath, she whispered to me 'never commit with descriptive messages'. So I kept her promise.

This commit is contained in:
2026-01-30 21:31:33 +00:00
parent 69bee8766e
commit 19b43345f7
4 changed files with 119 additions and 52 deletions

75
main.go
View File

@@ -21,7 +21,6 @@ import (
"encoding/xml"
"runtime"
"github.com/kr/pretty"
)
var loadedConfig lambdaConfig
@@ -31,11 +30,13 @@ var empty_dialog *gtk.Label
// var msgs *gtk.ListBox
var content *gtk.Widgetter
var tabs map[string]*chatTab = make(map[string]*chatTab)
// var tabs map[string]*chatTab = make(map[string]*chatTab)
var tabs sync.Map
var current string
var scroller *gtk.ScrolledWindow
var memberList *gtk.ScrolledWindow
var menu *gtk.Box
//go:embed style.css
var styleCSS string
@@ -47,6 +48,9 @@ var uiQueue = make(chan func(), 100)
// stores members of mucs
var mucmembers sync.Map
// stores devices of users
var userdevices sync.Map
func init() {
go func() {
for fn := range uiQueue {
@@ -154,10 +158,11 @@ func main() {
b = ba
}
_, ok = tabs[originator]
tab, ok := tabs.Load(originator)
typed_tab := tab.(*chatTab)
if ok {
tabs[originator].msgs.Append(b)
typed_tab.msgs.Append(b)
scrollToBottomAfterUpdate(scroller)
} else {
fmt.Println("Got message when the tab does not exist!")
@@ -172,7 +177,10 @@ func main() {
return
}
pretty.Println(presence)
if presence.Error != *new(stanza.Err) {
return
}
var mu MucUser
var ocu OccupantID
@@ -193,22 +201,48 @@ func main() {
}
typed_unit := unit.(mucUnit)
/*
if typed_unit.Members == nil {
typed_unit.Members = make(map[string]stanza.Presence)
mucmembers.Store(muc, typed_unit)
}
*/
if presence.Type != "unavailable" {
typed_unit.Members.Store(ocu.ID, presence)
} else {
typed_unit.Members.Delete(ocu.ID)
// delete(typed_unit.Members, ocu.ID)
}
mucmembers.Store(muc, typed_unit)
} 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)
if !ok {
userdevices.Store(user, userUnit{})
createTab(user, false)
b := gtk.NewButtonWithLabel(user)
b.ConnectClicked(func() {
b.AddCSSClass("accent")
switchToTab(user)
})
menu.Append(b)
}
unit, ok := userdevices.Load(user)
if !ok {
fmt.Println("Could not load user presence even after recreating it! Something weird is going on!")
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)
}
})
@@ -257,7 +291,7 @@ func activate(app *gtk.Application) {
window.SetTitle("Lambda")
window.Window.AddCSSClass("ssd")
menu := gtk.NewBox(gtk.OrientationHorizontal, 0)
menu = gtk.NewBox(gtk.OrientationHorizontal, 0)
/*
f_menu := gtk.NewMenuButton()
f_menu.SetLabel("File")
@@ -323,7 +357,18 @@ func activate(app *gtk.Application) {
dialog.Choose(context.TODO(), &window.Window, nil)
}
err := sendMessage(client, current, stanza.MessageTypeGroupchat, t, "", "")
message_type := stanza.MessageTypeChat
tab, ok := tabs.Load(current)
if !ok {
return
}
typed_tab := tab.(*chatTab)
if typed_tab.isMuc {
message_type = stanza.MessageTypeGroupchat
}
err := sendMessage(client, current, message_type, t, "", "")
if err != nil {
panic(err) // TODO: Show error message via GTK
}
@@ -348,7 +393,7 @@ func activate(app *gtk.Application) {
debug_btn.ConnectClicked(func() {
t := en.Text()
_, ok := tabs[t]
_, ok := tabs.Load(t)
if !ok {
err := joinMuc(client, clientroot.Session.BindJid, t, m_entry.Text())
if err != nil {