From 9f57d6688b908e917d5c28d4c15cbe5c6123894f Mon Sep 17 00:00:00 2001 From: sunglocto Date: Wed, 6 Aug 2025 10:27:27 +0100 Subject: [PATCH] General code changes + new pane --- main.go | 67 ++++++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 62 insertions(+), 5 deletions(-) diff --git a/main.go b/main.go index f1d14fb..7f9435d 100644 --- a/main.go +++ b/main.go @@ -10,6 +10,8 @@ import ( "net/url" "os" "strings" + "time" + // gui - required "fyne.io/fyne/v2" "fyne.io/fyne/v2/app" @@ -21,8 +23,11 @@ import ( "fyne.io/fyne/v2/widget" // xmpp - required + _ "mellium.im/xmlstream" + _ "mellium.im/xmpp" "mellium.im/xmpp/jid" "mellium.im/xmpp/muc" + _ "mellium.im/xmpp/stanza" oasisSdk "pain.agency/oasis-sdk" // gui - optional @@ -34,6 +39,8 @@ import ( var version string = "3.1a" var statBar widget.Label var chatInfo fyne.Container +var chatSidebar fyne.Container + // by sunglocto // license AGPL @@ -180,6 +187,8 @@ func addChatTab(isMuc bool, chatJid jid.JID, nick string) { selectedId = id } + scroller.CreateItem() + tabData.Scroller = scroller chatTabs[mucJidStr] = tabData @@ -254,7 +263,7 @@ func dropToSignInPage(reason string) { } func main() { - + muc.Since(time.Now()) config = piConfig{} bytes, err := os.ReadFile("./pi.xml") @@ -328,12 +337,21 @@ func main() { } }, func(client *oasisSdk.XmppClient, muc *muc.Channel, msg *oasisSdk.XMPPChatMessage) { + // HACK: IGNORING ALL MESSAGES FROM CLASSIC MUC HISTORY IN PREPARATION OF MAM SUPPORT + ignore := false + for _, v := range msg.Unknown { + if v.XMLName.Local == "delay" { // CLasic history message + ignore = true + fmt.Println("ignoring!") + } + } + var ImageID string = "" mucJidStr := msg.From.Bare().String() if tab, ok := chatTabs[mucJidStr]; ok { chatTabs[mucJidStr].Muc = muc str := *msg.CleanedBody - if notifications { + if !ignore && notifications { if strings.Contains(str, login.DisplayName) || (msg.Reply != nil && strings.Contains(msg.Reply.To, login.DisplayName)) { a.SendNotification(fyne.NewNotification(fmt.Sprintf("Mentioned in %s", mucJidStr), str)) } @@ -371,7 +389,9 @@ func main() { Raw: *msg, ImageURL: ImageID, } - tab.Messages = append(tab.Messages, myMessage) + if !ignore { + tab.Messages = append(tab.Messages, myMessage) + } fyne.Do(func() { tab.Scroller.Refresh() if scrollDownOnNewMessage { @@ -420,6 +440,29 @@ func main() { log.Fatalln("Could not create client - " + err.Error()) } +/* + client.Session.Serve(xmpp.HandlerFunc(func(t xmlstream.TokenReadEncoder, start *xml.StartElement) error { + d := xml.NewTokenDecoder(t) + + // Ignore anything that's not a message. + if start.Name.Local != "message" { + return nil + } + + msg := struct { + stanza.Message + Body string `xml:"body"` + }{} + err := d.DecodeElement(&msg, start) + if err != nil { + return err + } + if msg.Body != "" { + log.Println("Got message: %q", msg.Body) + } + return nil +})) +*/ go func() { for connection { err = client.Connect() @@ -437,6 +480,8 @@ func main() { } }() + + a = app.New() a.Settings().SetTheme(myTheme{}) w = a.NewWindow("pi") @@ -585,6 +630,9 @@ func main() { }, w) })*/ + deb := fyne.NewMenuItem("DEBUG: Attempt to get MAM history from a user", func() { + //res, err := history.Fetch(client.Ctx, history.Query{}, jid.MustParse("ringen@muc.isekai.rocks"), client.Session) + }) mic := fyne.NewMenuItem("upload a file", func() { var link string var bytes []byte @@ -633,7 +681,7 @@ func main() { }, w) }) - menu_help := fyne.NewMenu("π", mit, reconnect) + menu_help := fyne.NewMenu("π", mit, reconnect,deb) menu_changeroom := fyne.NewMenu("β", mic) menu_configureview := fyne.NewMenu("γ", mia, mis, jtt, jtb) bit := fyne.NewMenuItem("mark selected message as read", func() { @@ -735,9 +783,18 @@ func main() { } else { chatInfo = *container.NewHBox(widget.NewLabel(tab.Jid.String())) } + + if tab.isMuc { + fyne.Do(func() { + desc := widget.NewLabel("A MUC is a chatroom that can have multiple members. Eventually this pane will display information about this room, such as the members in it, the name of the MUC and its topic.") + desc.Wrapping = fyne.TextWrapBreak + chatSidebar = *container.NewStack(container.NewVScroll(container.NewVBox(widget.NewRichTextFromMarkdown(fmt.Sprintf("# %s", tab.Muc.Addr().Localpart())), widget.NewRichTextFromMarkdown(tab.Muc.Addr().String()), desc))) + //chatSidebar.Refresh() + }) + } } statBar.SetText("nothing seems to be happening right now...") - w.SetContent(container.NewVSplit(container.NewVSplit(tabs, container.NewHSplit(entry, sendbtn)), container.NewHSplit(&statBar,&chatInfo))) + w.SetContent(container.NewVSplit(container.NewVSplit(container.NewHSplit(tabs, &chatSidebar), container.NewHSplit(entry, sendbtn)), container.NewHSplit(&statBar,&chatInfo))) w.ShowAndRun() }