| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111 |
- package ui
- import (
- "sort"
- "github.com/ayntgl/discordgo"
- "github.com/ayntgl/discordo/discord"
- "github.com/rivo/tview"
- )
- type GuildsList struct {
- *tview.List
- app *App
- }
- func NewGuildsList(app *App) *GuildsList {
- gl := &GuildsList{
- List: tview.NewList(),
- app: app,
- }
- gl.ShowSecondaryText(false)
- gl.SetTitle("Guilds")
- gl.SetTitleAlign(tview.AlignLeft)
- gl.SetBorder(true)
- gl.SetBorderPadding(0, 0, 1, 1)
- gl.SetSelectedFunc(gl.onSelected)
- return gl
- }
- func (gl *GuildsList) onSelected(idx int, mainText string, secondaryText string, shortcut rune) {
- rootTreeNode := gl.app.ChannelsTreeView.GetRoot()
- rootTreeNode.ClearChildren()
- gl.app.SelectedMessage = -1
- gl.app.MessagesTextView.
- Highlight().
- Clear()
- gl.app.MessageInputField.SetText("")
- // If the user is a bot account, the direct messages item does not exist in the guilds list.
- if gl.app.Session.State.User.Bot && idx == 0 {
- idx = 1
- }
- if idx == 0 { // Direct Messages
- cs := gl.app.Session.State.PrivateChannels
- sort.Slice(cs, func(i, j int) bool {
- return cs[i].LastMessageID > cs[j].LastMessageID
- })
- for _, c := range cs {
- channelTreeNode := tview.NewTreeNode(discord.ChannelToString(c)).
- SetReference(c.ID)
- rootTreeNode.AddChild(channelTreeNode)
- }
- } else { // Guild
- cs := gl.app.Session.State.Guilds[idx-1].Channels
- sort.Slice(cs, func(i, j int) bool {
- return cs[i].Position < cs[j].Position
- })
- for _, c := range cs {
- if (c.Type == discordgo.ChannelTypeGuildText || c.Type == discordgo.ChannelTypeGuildNews) && (c.ParentID == "") {
- channelTreeNode := tview.NewTreeNode(discord.ChannelToString(c)).
- SetReference(c.ID)
- rootTreeNode.AddChild(channelTreeNode)
- }
- }
- CATEGORY:
- for _, c := range cs {
- if c.Type == discordgo.ChannelTypeGuildCategory {
- for _, nestedChannel := range cs {
- if nestedChannel.ParentID == c.ID {
- channelTreeNode := tview.NewTreeNode(c.Name).
- SetReference(c.ID)
- rootTreeNode.AddChild(channelTreeNode)
- continue CATEGORY
- }
- }
- channelTreeNode := tview.NewTreeNode(c.Name).
- SetReference(c.ID)
- rootTreeNode.AddChild(channelTreeNode)
- }
- }
- for _, c := range cs {
- if (c.Type == discordgo.ChannelTypeGuildText || c.Type == discordgo.ChannelTypeGuildNews) && (c.ParentID != "") {
- var parentTreeNode *tview.TreeNode
- rootTreeNode.Walk(func(node, _ *tview.TreeNode) bool {
- if node.GetReference() == c.ParentID {
- parentTreeNode = node
- return false
- }
- return true
- })
- if parentTreeNode != nil {
- channelTreeNode := tview.NewTreeNode(discord.ChannelToString(c)).
- SetReference(c.ID)
- parentTreeNode.AddChild(channelTreeNode)
- }
- }
- }
- }
- gl.app.ChannelsTreeView.SetCurrentNode(rootTreeNode)
- gl.app.SetFocus(gl.app.ChannelsTreeView)
- }
|