diff --git a/main.go b/main.go index 6275251..12817a3 100644 --- a/main.go +++ b/main.go @@ -67,6 +67,7 @@ type ChatTab struct { isMuc bool Muc *muc.Channel UpdateSidebar bool + Members map[string]oasisSdk.UserPresence } type ChatTabUI struct { @@ -333,6 +334,7 @@ func addChatTab(isMuc bool, chatJid jid.JID, nick string) { Nick: nick, Messages: []Message{}, isMuc: isMuc, + Members: make(map[string]oasisSdk.UserPresence), } myUITab := CreateUITab(chatJid.String()) @@ -647,20 +649,32 @@ func main() { }) 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) { + // FIXME + if bookmark.JID.String() == "conversations-offtopic-reloaded@conference.trashserver.net" { + return + } if bookmark.Autojoin { if bookmark.Nick == "" { bookmark.Nick = client.Login.DisplayName } + addChatTab(true, bookmark.JID, client.Login.DisplayName) _, err := client.ConnectMuc(bookmark, oasisSdk.MucLegacyHistoryConfig{}, context.TODO()) if err != nil { fmt.Println("ERROR: " + err.Error()) return } - addChatTab(true, bookmark.JID, client.Login.DisplayName) } }) client.SetDeliveryReceiptHandler( @@ -951,7 +965,7 @@ func main() { }, w) }) - leaveRoom := fyne.NewMenuItem("Leave current room (experimental)", func() { + leaveRoom := fyne.NewMenuItem("Leave current room", func() { selectedScroller, ok := AppTabs.Selected().Content.(*widget.List) if !ok { return @@ -991,20 +1005,20 @@ func main() { dialog.ShowError(err, w) return } - joinjid, err := myjid.WithResource(login.DisplayName) - if err != nil { - d.Hide() - dialog.ShowError(err, w) - return - } - ch, err := client.MucClient.Join(client.Ctx, joinjid, client.Session) - if err != nil { - d.Hide() - dialog.ShowError(err, w) - return - } - client.MucChannels[s] = ch + + mychannel := new(bookmarks.Channel) + mychannel.JID = myjid + mychannel.Nick = login.DisplayName + //ch, err := client.MucClient.Join(client.Ctx, joinjid, client.Session) 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() }() }, w) @@ -1365,14 +1379,41 @@ func main() { } 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.Move(old) + } // HACK - disable chatsidebar because it's currently very buggy - chatSidebar.Hidden = true + chatSidebar.Hidden = false 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() }