refactor: preload (append to guild TreeNode) channels upon receiving READY event (#64)

This commit is contained in:
ayntgl 2021-09-29 12:28:49 +04:00 • committed by GitHub
parent 80179a8246
commit 85438d0799
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 30 additions and 55 deletions

View file

@ -48,8 +48,7 @@ func onSessionReady(_ *discordgo.Session, r *discordgo.Ready) {
})
for _, c := range r.PrivateChannels {
cn := tview.NewTreeNode(genChannelRepr(c)).
SetReference(c.ID)
cn := tview.NewTreeNode(generateChannelRepr(c)).SetReference(c.ID)
dmNode.AddChild(cn)
}
@ -71,9 +70,20 @@ func onSessionReady(_ *discordgo.Session, r *discordgo.Ready) {
})
for _, g := range r.Guilds {
gn := tview.NewTreeNode(g.Name).
SetReference(g.ID)
gn := tview.NewTreeNode(g.Name).Collapse()
n.AddChild(gn)
cs := g.Channels
sort.Slice(cs, func(i, j int) bool {
return cs[i].Position < cs[j].Position
})
// Top-level channels
createTopLevelChannelsTreeNodes(gn, cs)
// Category channels
createCategoryChannelsTreeNodes(gn, cs)
// Second-level channels
createSecondLevelChannelsTreeNodes(cs)
}
channelsTree.SetCurrentNode(n)

65
ui.go
View file

@ -1,7 +1,6 @@
package main
import (
"sort"
"strings"
"github.com/atotto/clipboard"
@ -63,71 +62,37 @@ func onChannelsTreeSelected(n *tview.TreeNode) {
// Unhighlight the already-highlighted regions.
messagesTextView.Highlight()
switch n.GetLevel() {
case 1:
if len(n.GetChildren()) != 0 {
n.SetExpanded(!n.IsExpanded())
return
}
if n.GetText() == "Direct Messages" {
return
}
gID := n.GetReference().(string)
g, err := session.State.Guild(gID)
if err != nil {
return
}
cs := g.Channels
sort.Slice(cs, func(i, j int) bool {
return cs[i].Position < cs[j].Position
})
// Top-level channels
createTopLevelChannelsTreeNodes(n, cs)
// Category channels
createCategoryChannelsTreeNodes(n, cs)
// Second-level channels
createSecondLevelChannelsTreeNodes(cs)
default:
if len(n.GetChildren()) != 0 {
n.SetExpanded(!n.IsExpanded())
} else {
cID := n.GetReference().(string)
c, err := session.State.Channel(cID)
if err != nil {
return
}
if c.Type == discordgo.ChannelTypeGuildCategory {
n.SetExpanded(!n.IsExpanded())
} else if c.Type == discordgo.ChannelTypeGuildNews || c.Type == discordgo.ChannelTypeGuildText {
selectedChannel = c
app.SetFocus(messageInputField)
selectedChannel = c
app.SetFocus(messageInputField)
title := genChannelRepr(c)
switch c.Type {
case discordgo.ChannelTypeGuildText, discordgo.ChannelTypeGuildNews:
title := generateChannelRepr(c)
if c.Topic != "" {
title += " - " + c.Topic
}
messagesTextView.
Clear().
SetTitle(title)
go renderMessages(c.ID)
} else if c.Type == discordgo.ChannelTypeDM || c.Type == discordgo.ChannelTypeGroupDM {
selectedChannel = c
app.SetFocus(messageInputField)
messagesTextView.
Clear().
SetTitle(genChannelRepr(c))
go renderMessages(c.ID)
messagesTextView.SetTitle(title)
case discordgo.ChannelTypeDM, discordgo.ChannelTypeGroupDM:
messagesTextView.SetTitle(generateChannelRepr(c))
}
messagesTextView.Clear()
go renderMessages(c.ID)
}
}
func newTextChannelTreeNode(c *discordgo.Channel) *tview.TreeNode {
n := tview.NewTreeNode("[::d]" + genChannelRepr(c) + "[::-]").
n := tview.NewTreeNode("[::d]" + generateChannelRepr(c) + "[::-]").
SetReference(c.ID)
return n

View file

@ -6,7 +6,7 @@ import (
"github.com/ayntgl/discordgo"
)
func genChannelRepr(c *discordgo.Channel) string {
func generateChannelRepr(c *discordgo.Channel) string {
var repr string
if c.Name != "" {
repr = "#" + c.Name