Add basic member lists, fixes #8

This commit is contained in:
2025-09-27 13:10:49 +01:00
parent 3f157d06c7
commit adf86896e9

81
main.go
View File

@@ -67,6 +67,7 @@ type ChatTab struct {
isMuc bool isMuc bool
Muc *muc.Channel Muc *muc.Channel
UpdateSidebar bool UpdateSidebar bool
Members map[string]oasisSdk.UserPresence
} }
type ChatTabUI struct { type ChatTabUI struct {
@@ -333,6 +334,7 @@ func addChatTab(isMuc bool, chatJid jid.JID, nick string) {
Nick: nick, Nick: nick,
Messages: []Message{}, Messages: []Message{},
isMuc: isMuc, isMuc: isMuc,
Members: make(map[string]oasisSdk.UserPresence),
} }
myUITab := CreateUITab(chatJid.String()) myUITab := CreateUITab(chatJid.String())
@@ -647,20 +649,32 @@ func main() {
}) })
client.SetPresenceHandler(func(client *oasisSdk.XmppClient, from jid.JID, p oasisSdk.UserPresence) { client.SetPresenceHandler(func(client *oasisSdk.XmppClient, from jid.JID, p oasisSdk.UserPresence) {
fmt.Println(p, p.Indicator, p.Status) bareAcc := from.Bare()
tab, ok := chatTabs[bareAcc.String()]
if !ok {
return
}
if tab.isMuc {
tab.Members[from.String()] = p
}
}) })
client.SetBookmarkHandler(false, func(client *oasisSdk.XmppClient, bookmark bookmarks.Channel) { client.SetBookmarkHandler(false, func(client *oasisSdk.XmppClient, bookmark bookmarks.Channel) {
// FIXME
if bookmark.JID.String() == "conversations-offtopic-reloaded@conference.trashserver.net" {
return
}
if bookmark.Autojoin { if bookmark.Autojoin {
if bookmark.Nick == "" { if bookmark.Nick == "" {
bookmark.Nick = client.Login.DisplayName bookmark.Nick = client.Login.DisplayName
} }
addChatTab(true, bookmark.JID, client.Login.DisplayName)
_, err := client.ConnectMuc(bookmark, oasisSdk.MucLegacyHistoryConfig{}, context.TODO()) _, err := client.ConnectMuc(bookmark, oasisSdk.MucLegacyHistoryConfig{}, context.TODO())
if err != nil { if err != nil {
fmt.Println("ERROR: " + err.Error()) fmt.Println("ERROR: " + err.Error())
return return
} }
addChatTab(true, bookmark.JID, client.Login.DisplayName)
} }
}) })
client.SetDeliveryReceiptHandler( client.SetDeliveryReceiptHandler(
@@ -951,7 +965,7 @@ func main() {
}, w) }, w)
}) })
leaveRoom := fyne.NewMenuItem("Leave current room (experimental)", func() { leaveRoom := fyne.NewMenuItem("Leave current room", func() {
selectedScroller, ok := AppTabs.Selected().Content.(*widget.List) selectedScroller, ok := AppTabs.Selected().Content.(*widget.List)
if !ok { if !ok {
return return
@@ -991,20 +1005,20 @@ func main() {
dialog.ShowError(err, w) dialog.ShowError(err, w)
return return
} }
joinjid, err := myjid.WithResource(login.DisplayName)
if err != nil { mychannel := new(bookmarks.Channel)
d.Hide() mychannel.JID = myjid
dialog.ShowError(err, w) mychannel.Nick = login.DisplayName
return //ch, err := client.MucClient.Join(client.Ctx, joinjid, client.Session)
}
ch, err := client.MucClient.Join(client.Ctx, joinjid, client.Session)
if err != nil {
d.Hide()
dialog.ShowError(err, w)
return
}
client.MucChannels[s] = ch
addChatTab(true, myjid, login.DisplayName) addChatTab(true, myjid, login.DisplayName)
num := uint64(0)
_, err = client.ConnectMuc(*mychannel, oasisSdk.MucLegacyHistoryConfig{MaxCount: &num}, context.TODO())
if err != nil {
d.Hide()
dialog.ShowError(err, w)
return
}
//client.MucChannels[s] = ch
d.Hide() d.Hide()
}() }()
}, w) }, w)
@@ -1365,14 +1379,41 @@ func main() {
} }
chatSidebar = *UITab.Sidebar chatSidebar = *UITab.Sidebar
old := chatSidebar.Position() box := container.NewVBox(widget.NewRichTextFromMarkdown("# "+activeChatJid), widget.NewLabel(fmt.Sprintf("%d members ", len(tab.Members))))
chatSidebar.Objects = []fyne.CanvasObject{}
for name := range tab.Members {
gen, _ := identicon.New("github", 5, 3)
userjid, err := jid.Parse(name)
if err != nil {
fmt.Println("ERROR: " + err.Error())
continue // unrecoverable
}
nickname := userjid.Resourcepart()
ii, err := gen.Draw(nickname)
mention := func() {
entry.SetText(fmt.Sprintf("%s %s", entry.Text, nickname))
}
if err != nil {
fmt.Println("ERROR: " + err.Error())
box.Add(container.NewHBox(widget.NewLabel(nickname), widget.NewButton("Mention", mention)))
} else {
im := ii.Image(25)
imageWidget := canvas.NewImageFromImage(im)
imageWidget.FillMode = canvas.ImageFillOriginal
imageWidget.Refresh()
box.Add(container.NewHBox(imageWidget, widget.NewLabel(nickname), widget.NewButton("Mention", mention)))
}
}
chatSidebar = *container.NewGridWithColumns(1, container.NewVScroll(box))
chatSidebar.Refresh() chatSidebar.Refresh()
chatSidebar.Move(old)
} }
// HACK - disable chatsidebar because it's currently very buggy // HACK - disable chatsidebar because it's currently very buggy
chatSidebar.Hidden = true chatSidebar.Hidden = false
statBar.SetText("") statBar.SetText("")
w.SetContent(container.NewVSplit(container.NewVSplit(AppTabs, container.NewHSplit(entry, container.NewGridWithRows(1, sendbtn, replybtn))), container.NewHSplit(&statBar, &chatInfo))) w.SetContent(container.NewVSplit(container.NewVSplit(container.NewHSplit(AppTabs, &chatSidebar), container.NewHSplit(entry, container.NewGridWithRows(1, sendbtn, replybtn))), container.NewHSplit(&statBar, &chatInfo)))
w.ShowAndRun() w.ShowAndRun()
} }