Просмотр исходного кода

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

ayntgl 4 лет назад
Родитель
Сommit
85438d0799
3 измененных файлов с 30 добавлено и 55 удалено
  1. 14 4
      discord.go
  2. 15 50
      ui.go
  3. 1 1
      util.go

+ 14 - 4
discord.go

@@ -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)

+ 15 - 50
ui.go

@@ -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

+ 1 - 1
util.go

@@ -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