Add basic member lists, fixes #8
This commit is contained in:
81
main.go
81
main.go
@@ -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()
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user