Continue last commit

This commit is contained in:
2025-08-07 22:29:40 +01:00
parent 150f42bc58
commit 4015107de0

170
main.go
View File

@@ -56,12 +56,15 @@ type ChatTab struct {
Jid jid.JID
Nick string
Messages []Message
Scroller *widget.List `xml:"-"`
isMuc bool
Muc *muc.Channel `xml:"-"`
Sidebar *fyne.Container `xml:"-"`
Muc muc.Channel
UpdateSidebar bool
SidebarUpdateMethod func(client oasisSdk.XmppClient) `xml:"-"`
}
type ChatTabUI struct {
Internal *ChatTab
Scroller *widget.List `xml:"-"`
Sidebar *fyne.Container `xml:"-"`
}
type piConfig struct {
@@ -75,7 +78,9 @@ var login oasisSdk.LoginInfo
var DMs []string
var chatTabs = make(map[string]*ChatTab)
var tabs *container.AppTabs
var UITabs = make(map[string]*ChatTabUI)
var AppTabs *container.AppTabs
var selectedId widget.ListItemID
var replying bool = false
var notifications bool
@@ -106,41 +111,11 @@ var scrollDownOnNewMessage bool = true
var w fyne.Window
var a fyne.App
func addChatTab(isMuc bool, chatJid jid.JID, nick string) {
mucJidStr := chatJid.String()
if _, ok := chatTabs[mucJidStr]; ok {
// Tab already exists
return
}
tabData := &ChatTab{
Jid: chatJid,
Nick: nick,
Messages: []Message{},
isMuc: isMuc,
Sidebar: container.NewVBox(widget.NewRichTextFromMarkdown("# "+chatJid.Localpart()), widget.NewLabel("please wait for more information...")),
UpdateSidebar: true,
}
if isMuc {
tabData.SidebarUpdateMethod = func(client oasisSdk.XmppClient) {
fyne.Do(func() {
if chatTabs[mucJidStr].UpdateSidebar {
i, _ := disco.GetInfo(client.Ctx, "identity", tabData.Jid, client.Session)
name := i.XMLName
chatTabs[mucJidStr].Sidebar = container.NewVBox(widget.NewRichTextFromMarkdown("# "+chatJid.Localpart()), widget.NewLabel(fmt.Sprintf("%d messages loaded", len(tabData.Messages))), widget.NewLabel(name.Space))
chatTabs[mucJidStr].UpdateSidebar = false
chatSidebar = *chatTabs[mucJidStr].Sidebar
chatSidebar.Refresh()
}
})
}
}
func CreateUITab(chatJidStr string) ChatTabUI {
var scroller *widget.List
scroller = widget.NewList(
func() int {
return len(tabData.Messages)
return len(chatTabs[chatJidStr].Messages)
},
func() fyne.CanvasObject {
author := widget.NewLabel("author")
@@ -159,22 +134,22 @@ func addChatTab(isMuc bool, chatJid jid.JID, nick string) {
author := vbox.Objects[0].(*widget.Label)
content := vbox.Objects[1].(*widget.Label)
btn := vbox.Objects[2].(*widget.Button)
if tabData.Messages[i].Important {
if chatTabs[chatJidStr].Messages[i].Important {
//content.Importance = widget.DangerImportance TODO: Fix highlighting messages with mentions, it's currently broken
}
btn.Hidden = true // Hide by default
msgContent := tabData.Messages[i].Content
if tabData.Messages[i].ImageURL != "" {
msgContent := chatTabs[chatJidStr].Messages[i].Content
if chatTabs[chatJidStr].Messages[i].ImageURL != "" {
btn.Hidden = false
btn.OnTapped = func() {
fyne.Do(func() {
u, err := storage.ParseURI(tabData.Messages[i].ImageURL)
u, err := storage.ParseURI(chatTabs[chatJidStr].Messages[i].ImageURL)
if err != nil {
dialog.ShowError(err, w)
return
}
if strings.HasSuffix(tabData.Messages[i].ImageURL, "mp4") {
url, err := url.Parse(tabData.Messages[i].ImageURL)
if strings.HasSuffix(chatTabs[chatJidStr].Messages[i].ImageURL, "mp4") {
url, err := url.Parse(chatTabs[chatJidStr].Messages[i].ImageURL)
if err != nil {
dialog.ShowError(err, w)
return
@@ -199,25 +174,53 @@ func addChatTab(isMuc bool, chatJid jid.JID, nick string) {
//content.ParseMarkdown(msgContent)
content.SetText(msgContent)
if tabData.Messages[i].ReplyID != "PICLIENT:UNAVAILABLE" {
author.SetText(fmt.Sprintf("%s > %s", tabData.Messages[i].Author, jid.MustParse(tabData.Messages[i].Raw.Reply.To).Resourcepart()))
if chatTabs[chatJidStr].Messages[i].ReplyID != "PICLIENT:UNAVAILABLE" {
author.SetText(fmt.Sprintf("%s > %s", chatTabs[chatJidStr].Messages[i].Author, jid.MustParse(chatTabs[chatJidStr].Messages[i].Raw.Reply.To).Resourcepart()))
} else {
author.SetText(tabData.Messages[i].Author)
author.SetText(chatTabs[chatJidStr].Messages[i].Author)
}
scroller.SetItemHeight(i, vbox.MinSize().Height)
},
)
scroller.OnSelected = func(id widget.ListItemID) {
selectedId = id
}
myUITab := ChatTabUI{}
scroller.CreateItem()
tabData.Scroller = scroller
myUITab.Scroller = scroller
myUITab.Sidebar = container.NewVBox(widget.NewLabel("Data goes here"))
chatTabs[mucJidStr] = tabData
return myUITab
}
func addChatTab(isMuc bool, chatJid jid.JID, nick string) {
tabItem := container.NewTabItem(chatJid.Localpart(), scroller)
tabs.Append(tabItem)
chatJidStr := chatJid.String()
if _, ok := chatTabs[chatJidStr]; ok {
// Tab already exists
return
}
myChatTab := ChatTab{
Jid: chatJid,
Nick: nick,
Messages: []Message{},
isMuc: isMuc,
}
myUITab := CreateUITab(chatJid.String())
myUITab.Internal = &myChatTab
chatTabs[chatJidStr] = &myChatTab
UITabs[chatJidStr] = &myUITab
fyne.Do(func() {
AppTabs.Append(container.NewTabItem(chatJid.String(), myUITab.Scroller))
})
}
func dropToSignInPage(reason string) {
@@ -360,9 +363,9 @@ func main() {
tab.Messages = append(tab.Messages, myMessage)
fyne.Do(func() {
tab.Scroller.Refresh()
UITabs[userJidStr].Scroller.Refresh()
if scrollDownOnNewMessage {
tab.Scroller.ScrollToBottom()
UITabs[userJidStr].Scroller.ScrollToBottom()
}
})
}
@@ -388,7 +391,7 @@ func main() {
var ImageID string = ""
mucJidStr := msg.From.Bare().String()
if tab, ok := chatTabs[mucJidStr]; ok {
chatTabs[mucJidStr].Muc = muc
chatTabs[mucJidStr].Muc = *muc
str := *msg.CleanedBody
if strings.Contains(str, login.DisplayName) {
fmt.Println(str)
@@ -430,7 +433,7 @@ func main() {
if tab.Messages[i].Raw.From.String() == msg.From.String() {
tab.Messages[i].Content = *msg.CleanedBody + " (edited)"
fyne.Do(func() {
tab.Scroller.Refresh()
UITabs[mucJidStr].Scroller.Refresh()
})
return
}
@@ -450,9 +453,9 @@ func main() {
tab.Messages = append(tab.Messages, myMessage)
}
fyne.Do(func() {
tab.Scroller.Refresh()
UITabs[mucJidStr].Scroller.Refresh()
if scrollDownOnNewMessage {
tab.Scroller.ScrollToBottom()
UITabs[mucJidStr].Scroller.ScrollToBottom()
}
})
}
@@ -522,21 +525,21 @@ func main() {
SendCallback := func() {
text := entry.Text
if tabs.Selected() == nil || tabs.Selected().Content == nil || text == "" {
if AppTabs.Selected() == nil || AppTabs.Selected().Content == nil || text == "" {
return
}
selectedScroller, ok := tabs.Selected().Content.(*widget.List)
selectedScroller, ok := AppTabs.Selected().Content.(*widget.List)
if !ok {
return
}
var activeMucJid string
var isMuc bool
for jid, tabData := range chatTabs {
for jid, tabData := range UITabs {
if tabData.Scroller == selectedScroller {
activeMucJid = jid
isMuc = tabData.isMuc
isMuc = chatTabs[activeMucJid].isMuc
break
}
}
@@ -578,7 +581,7 @@ func main() {
})
fyne.Do(func() {
if scrollDownOnNewMessage {
chatTabs[activeMucJid].Scroller.ScrollToBottom()
UITabs[activeMucJid].Scroller.ScrollToBottom()
}
})
}
@@ -633,8 +636,9 @@ func main() {
}, w)
})
jtb := fyne.NewMenuItem("jump to bottom", func() {
selectedScroller, ok := tabs.Selected().Content.(*widget.List)
selectedScroller, ok := AppTabs.Selected().Content.(*widget.List)
if !ok {
return
}
@@ -642,7 +646,7 @@ func main() {
})
jtt := fyne.NewMenuItem("jump to top", func() {
selectedScroller, ok := tabs.Selected().Content.(*widget.List)
selectedScroller, ok := AppTabs.Selected().Content.(*widget.List)
if !ok {
return
}
@@ -767,21 +771,6 @@ func main() {
}, w)
})
rel := fyne.NewMenuItem("Forcefully reload tab sidebar", func() {
selectedScroller, ok := tabs.Selected().Content.(*widget.List)
if !ok {
return
}
var activeMucJid string
for jid, tabData := range chatTabs {
if tabData.Scroller == selectedScroller {
activeMucJid = jid
break
}
}
chatTabs[activeMucJid].UpdateSidebar = true
go chatTabs[activeMucJid].SidebarUpdateMethod(*client)
})
savedata := fyne.NewMenuItem("DEBUG: Save tab data to disk", func() {
d := []ChatTab{}
@@ -796,7 +785,7 @@ func main() {
os.Create("test.xml")
os.WriteFile("text.xml", b, os.ModeAppend)
})
menu_help := fyne.NewMenu("π", mit, reconnect, rel, savedata)
menu_help := fyne.NewMenu("π", mit, reconnect, savedata)
menu_changeroom := fyne.NewMenu("β", mic, servDisc)
menu_configureview := fyne.NewMenu("γ", mia, mis, jtt, jtb)
hafjag := fyne.NewMenuItem("Hafjag", func() {
@@ -817,12 +806,12 @@ func main() {
})
menu_jokes := fyne.NewMenu("Δ", mycurrenttime, hafjag, hotfuck)
bit := fyne.NewMenuItem("mark selected message as read", func() {
selectedScroller, ok := tabs.Selected().Content.(*widget.List)
selectedScroller, ok := AppTabs.Selected().Content.(*widget.List)
if !ok {
return
}
var activeMucJid string
for jid, tabData := range chatTabs {
for jid, tabData := range UITabs {
if tabData.Scroller == selectedScroller {
activeMucJid = jid
break
@@ -840,13 +829,13 @@ func main() {
bic := fyne.NewMenuItem("show message XML", func() {
pre := widget.NewLabel("")
selectedScroller, ok := tabs.Selected().Content.(*widget.List)
selectedScroller, ok := AppTabs.Selected().Content.(*widget.List)
if !ok {
return
}
var activeChatJid string
for jid, tabData := range chatTabs {
for jid, tabData := range UITabs {
if tabData.Scroller == selectedScroller {
activeChatJid = jid
break
@@ -868,7 +857,7 @@ func main() {
ma := fyne.NewMainMenu(menu_help, menu_changeroom, menu_configureview, menu_messageoptions, menu_jokes)
w.SetMainMenu(ma)
tabs = container.NewAppTabs(
AppTabs = container.NewAppTabs(
container.NewTabItem("τίποτα", widget.NewLabel(`
pi
`)),
@@ -889,34 +878,35 @@ func main() {
}
}
tabs.OnSelected = func(ti *container.TabItem) {
selectedScroller, ok := tabs.Selected().Content.(*widget.List)
AppTabs.OnSelected = func(ti *container.TabItem) {
selectedScroller, ok := AppTabs.Selected().Content.(*widget.List)
if !ok {
return
}
var activeChatJid string
for jid, tabData := range chatTabs {
for jid, tabData := range UITabs {
if tabData.Scroller == selectedScroller {
activeChatJid = jid
break
}
}
chatTabs[activeChatJid].SidebarUpdateMethod(*client)
tab := chatTabs[activeChatJid]
UITab := UITabs[activeChatJid]
if tab.isMuc {
chatInfo = *container.NewHBox(widget.NewLabel(tab.Muc.Addr().String()))
} else {
chatInfo = *container.NewHBox(widget.NewLabel(tab.Jid.String()))
}
chatSidebar = *tab.Sidebar
chatSidebar = *UITab.Sidebar
chatSidebar.Refresh()
}
statBar.SetText("")
w.SetContent(container.NewVSplit(container.NewVSplit(container.NewHSplit(tabs, &chatSidebar), container.NewHSplit(entry, sendbtn)), container.NewHSplit(&statBar, &chatInfo)))
w.SetContent(container.NewVSplit(container.NewVSplit(container.NewHSplit(AppTabs, &chatSidebar), container.NewHSplit(entry, sendbtn)), container.NewHSplit(&statBar, &chatInfo)))
w.ShowAndRun()
}