浏览代码

main: sort channels with accordance to their levels

rigormorrtiss 4 年之前
父节点
当前提交
459167ab1e
共有 2 个文件被更改,包括 87 次插入70 次删除
  1. 61 70
      discordo.go
  2. 26 0
      util/treeview.go

+ 61 - 70
discordo.go

@@ -9,7 +9,7 @@ import (
 	"github.com/diamondburned/arikawa/v3/api"
 	"github.com/diamondburned/arikawa/v3/discord"
 	"github.com/diamondburned/arikawa/v3/gateway"
-	"github.com/diamondburned/arikawa/v3/session"
+	"github.com/diamondburned/arikawa/v3/state"
 	"github.com/gdamore/tcell/v2"
 	"github.com/rigormorrtiss/discordo/ui"
 	"github.com/rigormorrtiss/discordo/util"
@@ -25,12 +25,10 @@ var (
 	messageInputField *tview.InputField
 	mainFlex          *tview.Flex
 
-	conf           *util.Config
-	discordSession *session.Session
-	clientID       discord.UserID
-	guilds         []gateway.GuildCreateEvent
-	guild          gateway.GuildCreateEvent
-	channel        discord.Channel
+	conf         *util.Config
+	discordState *state.State
+	guild        gateway.GuildCreateEvent
+	channel      *discord.Channel
 )
 
 func main() {
@@ -77,7 +75,7 @@ func main() {
 			SetRoot(mainFlex, true).
 			SetFocus(guildsList)
 
-		discordSession = newSession(token)
+		discordState = newState(token)
 	} else {
 		loginForm = ui.NewLoginForm(onLoginFormLoginButtonSelected)
 		app.SetRoot(loginForm, true)
@@ -111,7 +109,7 @@ func onMessageInputFieldInputCapture(e *tcell.EventKey) *tcell.EventKey {
 			return nil
 		}
 
-		discordSession.SendMessage(channel.ID, t)
+		discordState.SendMessage(channel.ID, t)
 		messageInputField.SetText("")
 	case tcell.KeyCtrlV:
 		text, _ := clipboard.ReadAll()
@@ -122,7 +120,7 @@ func onMessageInputFieldInputCapture(e *tcell.EventKey) *tcell.EventKey {
 	return e
 }
 
-func newSession(token string) (s *session.Session) {
+func newState(token string) (s *state.State) {
 	api.UserAgent = "" +
 		"Mozilla/5.0 (X11; Linux x86_64) " +
 		"AppleWebKit/537.36 (KHTML, like Gecko) " +
@@ -132,7 +130,7 @@ func newSession(token string) (s *session.Session) {
 	gateway.DefaultIdentity.Device = ""
 
 	var err error
-	s, err = session.New(token)
+	s, err = state.New(token)
 	if err != nil {
 		panic(err)
 	}
@@ -147,16 +145,15 @@ func newSession(token string) (s *session.Session) {
 }
 
 func onSessionReady(r *gateway.ReadyEvent) {
-	clientID = r.User.ID
-	guilds = r.Guilds
 	for _, g := range r.Guilds {
 		guildsList.AddItem(g.Name, "", 0, nil)
 	}
 }
 
 func onSessionMessageCreate(m *gateway.MessageCreateEvent) {
-	if channel.ID == m.ChannelID {
-		util.WriteMessage(messagesTextView, clientID, m.Message)
+	if channel != nil && channel.ID == m.ChannelID {
+		me, _ := discordState.Cabinet.Me()
+		util.WriteMessage(messagesTextView, me.ID, m.Message)
 	}
 }
 
@@ -165,69 +162,62 @@ func onGuildsListSelected(i int, _ string, _ string, _ rune) {
 	messagesTextView.SetTitle("")
 	messagesTextView.Clear()
 
-	n := channelsTreeView.GetRoot()
-	n.ClearChildren()
-
-	guild = guilds[i]
-	sort.SliceStable(guild.Channels, func(i, j int) bool {
+	guild = discordState.Ready().Guilds[i]
+	cs := guild.Channels
+	sort.Slice(cs, func(i, j int) bool {
 		return guild.Channels[i].Position < guild.Channels[j].Position
 	})
 
-	for _, c := range guild.Channels {
-		switch c.Type {
-		case discord.GuildCategory:
-			cn := tview.NewTreeNode(c.Name).
-				SetReference(c)
+	n := channelsTreeView.GetRoot()
+	n.ClearChildren()
+	// Top-level channels
+	for _, c := range cs {
+		if (c.Type == discord.GuildText || c.Type == discord.GuildNews) && (c.ParentID == 0 || c.ParentID == discord.NullChannelID) {
+			cn := util.NewTextChannelTreeNode(c)
 			n.AddChild(cn)
-		case discord.GuildText, discord.GuildNews:
-			if c.ParentID == 0 || c.ParentID == discord.NullChannelID {
-				cn := tview.NewTreeNode("[::d]#" + c.Name + "[::-]").
-					SetReference(c)
-				n.AddChild(cn)
+			continue
+		}
+	}
+	// Category channels
+CategoryLoop:
+	for _, c := range cs {
+		if c.Type == discord.GuildCategory {
+			for _, child := range cs {
+				if child.ParentID == c.ID {
+					cn := tview.NewTreeNode(c.Name).
+						SetReference(c.ID)
+					n.AddChild(cn)
+					continue CategoryLoop
+				}
 			}
-		case discord.GuildStageVoice, discord.GuildVoice:
-			if c.ParentID == 0 || c.ParentID == discord.NullChannelID {
-				cn := tview.NewTreeNode("[::d]🔊" + c.Name + "[::-]").
-					SetReference(c)
-				n.AddChild(cn)
+		}
+	}
+	// Second-level channels
+	for _, c := range cs {
+		if (c.Type == discord.GuildText || c.Type == discord.GuildNews) && (c.ParentID != 0 && c.ParentID != discord.NullChannelID) {
+			if pn := util.GetTreeNodeByReference(c.ParentID, channelsTreeView); pn != nil {
+				cn := util.NewTextChannelTreeNode(c)
+				pn.AddChild(cn)
 			}
 		}
 	}
 }
 
 func onChannelsTreeViewSelected(n *tview.TreeNode) {
-	r := n.GetReference().(discord.Channel)
-	switch r.Type {
+	cID := n.GetReference().(discord.ChannelID)
+	c, _ := discordState.Cabinet.Channel(cID)
+	switch c.Type {
 	case discord.GuildCategory:
-		if len(n.GetChildren()) == 0 {
-			for _, c := range guild.Channels {
-				switch c.Type {
-				case discord.GuildText, discord.GuildNews:
-					if c.ParentID == r.ID {
-						cn := tview.NewTreeNode("[::d]#" + c.Name + "[::-]").
-							SetReference(c)
-						n.AddChild(cn)
-					}
-				case discord.GuildStageVoice, discord.GuildVoice:
-					if c.ParentID == r.ID {
-						cn := tview.NewTreeNode("[::d]🔊" + c.Name + "[::-]").
-							SetReference(c)
-						n.AddChild(cn)
-					}
-				}
-			}
-		} else {
-			n.SetExpanded(!n.IsExpanded())
-		}
+		n.SetExpanded(!n.IsExpanded())
 	case discord.GuildText, discord.GuildNews:
 		if len(n.GetChildren()) == 0 {
-			channel = r
+			channel = c
 			app.SetFocus(messageInputField)
 			messagesTextView.Clear()
 
-			title := "#" + r.Name
-			if r.Topic != "" {
-				title += " - " + r.Topic
+			title := "#" + c.Name
+			if c.Topic != "" {
+				title += " - " + c.Topic
 			}
 			messagesTextView.SetTitle(title)
 
@@ -239,27 +229,28 @@ func onChannelsTreeViewSelected(n *tview.TreeNode) {
 				}
 			}
 
-			go writeMessages(r.ID)
+			go writeMessages(c.ID)
 		} else {
 			n.SetExpanded(!n.IsExpanded())
 		}
 	case discord.GuildNewsThread, discord.GuildPrivateThread, discord.GuildPublicThread:
-		channel = r
+		channel = c
 		app.SetFocus(messageInputField)
 		messagesTextView.Clear()
-		messagesTextView.SetTitle(r.Name)
+		messagesTextView.SetTitle(c.Name)
 
-		go writeMessages(r.ID)
+		go writeMessages(c.ID)
 	case discord.GuildStageVoice, discord.GuildVoice:
 		messagesTextView.Clear()
-		messagesTextView.SetTitle(r.Name)
+		messagesTextView.SetTitle(c.Name)
 	}
 }
 
 func writeMessages(cID discord.ChannelID) {
-	msgs, _ := discordSession.Messages(cID, conf.GetMessagesLimit)
+	msgs, _ := discordState.Messages(cID, conf.GetMessagesLimit)
 	for i := len(msgs) - 1; i >= 0; i-- {
-		util.WriteMessage(messagesTextView, clientID, msgs[i])
+		me, _ := discordState.Cabinet.Me()
+		util.WriteMessage(messagesTextView, me.ID, msgs[i])
 	}
 }
 
@@ -283,7 +274,7 @@ func onLoginFormLoginButtonSelected() {
 			SetRoot(guildsList, true).
 			SetFocus(channelsTreeView)
 
-		discordSession = newSession(l.Token)
+		discordState = newState(l.Token)
 		go util.SetPassword("token", l.Token)
 	} else if l.MFA {
 		loginForm = ui.NewMfaLoginForm(func() {
@@ -301,7 +292,7 @@ func onLoginFormLoginButtonSelected() {
 				SetRoot(mainFlex, true).
 				SetFocus(guildsList)
 
-			discordSession = newSession(l.Token)
+			discordState = newState(l.Token)
 			go util.SetPassword("token", l.Token)
 		})
 

+ 26 - 0
util/treeview.go

@@ -0,0 +1,26 @@
+package util
+
+import (
+	"github.com/diamondburned/arikawa/v3/discord"
+	"github.com/rivo/tview"
+)
+
+func GetTreeNodeByReference(r interface{}, treeV *tview.TreeView) (mn *tview.TreeNode) {
+	treeV.GetRoot().Walk(func(n, _ *tview.TreeNode) bool {
+		if n.GetReference() == r {
+			mn = n
+			return false
+		}
+
+		return true
+	})
+
+	return
+}
+
+func NewTextChannelTreeNode(c discord.Channel) (n *tview.TreeNode) {
+	n = tview.NewTreeNode("[::d]#" + c.Name + "[::-]").
+		SetReference(c.ID)
+
+	return
+}