|
@@ -56,13 +56,13 @@ func (gt *guildsTree) createFolderNode(folder gateway.GuildFolder) {
|
|
|
root.AddChild(folderNode)
|
|
root.AddChild(folderNode)
|
|
|
|
|
|
|
|
for _, gID := range folder.GuildIDs {
|
|
for _, gID := range folder.GuildIDs {
|
|
|
- g, err := discordState.Cabinet.Guild(gID)
|
|
|
|
|
|
|
+ guild, err := discordState.Cabinet.Guild(gID)
|
|
|
if err != nil {
|
|
if err != nil {
|
|
|
slog.Info("failed to get guild from state", "guild_id", gID, "err", err)
|
|
slog.Info("failed to get guild from state", "guild_id", gID, "err", err)
|
|
|
continue
|
|
continue
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- gt.createGuildNode(folderNode, *g)
|
|
|
|
|
|
|
+ gt.createGuildNode(folderNode, *guild)
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -73,84 +73,84 @@ func (gt *guildsTree) createGuildNode(n *tview.TreeNode, g discord.Guild) {
|
|
|
n.AddChild(guildNode)
|
|
n.AddChild(guildNode)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-func (gt *guildsTree) channelToString(c discord.Channel) string {
|
|
|
|
|
- switch c.Type {
|
|
|
|
|
|
|
+func (gt *guildsTree) channelToString(channel discord.Channel) string {
|
|
|
|
|
+ switch channel.Type {
|
|
|
case discord.DirectMessage, discord.GroupDM:
|
|
case discord.DirectMessage, discord.GroupDM:
|
|
|
- if c.Name != "" {
|
|
|
|
|
- return c.Name
|
|
|
|
|
|
|
+ if channel.Name != "" {
|
|
|
|
|
+ return channel.Name
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- recipients := make([]string, len(c.DMRecipients))
|
|
|
|
|
- for i, r := range c.DMRecipients {
|
|
|
|
|
|
|
+ recipients := make([]string, len(channel.DMRecipients))
|
|
|
|
|
+ for i, r := range channel.DMRecipients {
|
|
|
recipients[i] = r.DisplayOrUsername()
|
|
recipients[i] = r.DisplayOrUsername()
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
return strings.Join(recipients, ", ")
|
|
return strings.Join(recipients, ", ")
|
|
|
|
|
|
|
|
case discord.GuildText:
|
|
case discord.GuildText:
|
|
|
- return "#" + c.Name
|
|
|
|
|
|
|
+ return "#" + channel.Name
|
|
|
case discord.GuildVoice, discord.GuildStageVoice:
|
|
case discord.GuildVoice, discord.GuildStageVoice:
|
|
|
- return "v-" + c.Name
|
|
|
|
|
|
|
+ return "v-" + channel.Name
|
|
|
case discord.GuildAnnouncement:
|
|
case discord.GuildAnnouncement:
|
|
|
- return "a-" + c.Name
|
|
|
|
|
|
|
+ return "a-" + channel.Name
|
|
|
case discord.GuildStore:
|
|
case discord.GuildStore:
|
|
|
- return "s-" + c.Name
|
|
|
|
|
|
|
+ return "s-" + channel.Name
|
|
|
case discord.GuildForum:
|
|
case discord.GuildForum:
|
|
|
- return "f-" + c.Name
|
|
|
|
|
|
|
+ return "f-" + channel.Name
|
|
|
default:
|
|
default:
|
|
|
- return c.Name
|
|
|
|
|
|
|
+ return channel.Name
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-func (gt *guildsTree) createChannelNode(n *tview.TreeNode, c discord.Channel) *tview.TreeNode {
|
|
|
|
|
- if c.Type != discord.DirectMessage && c.Type != discord.GroupDM {
|
|
|
|
|
- ps, err := discordState.Permissions(c.ID, discordState.Ready().User.ID)
|
|
|
|
|
|
|
+func (gt *guildsTree) createChannelNode(node *tview.TreeNode, channel discord.Channel) *tview.TreeNode {
|
|
|
|
|
+ if channel.Type != discord.DirectMessage && channel.Type != discord.GroupDM {
|
|
|
|
|
+ perms, err := discordState.Permissions(channel.ID, discordState.Ready().User.ID)
|
|
|
if err != nil {
|
|
if err != nil {
|
|
|
- slog.Error("failed to get permissions", "err", err, "channel_id", c.ID)
|
|
|
|
|
|
|
+ slog.Error("failed to get permissions", "err", err, "channel_id", channel.ID)
|
|
|
return nil
|
|
return nil
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- if !ps.Has(discord.PermissionViewChannel) {
|
|
|
|
|
|
|
+ if !perms.Has(discord.PermissionViewChannel) {
|
|
|
return nil
|
|
return nil
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- channelNode := tview.NewTreeNode(gt.channelToString(c))
|
|
|
|
|
- channelNode.SetReference(c.ID)
|
|
|
|
|
|
|
+ channelNode := tview.NewTreeNode(gt.channelToString(channel))
|
|
|
|
|
+ channelNode.SetReference(channel.ID)
|
|
|
channelNode.SetColor(tcell.GetColor(gt.cfg.Theme.GuildsTree.ChannelColor))
|
|
channelNode.SetColor(tcell.GetColor(gt.cfg.Theme.GuildsTree.ChannelColor))
|
|
|
- n.AddChild(channelNode)
|
|
|
|
|
|
|
+ node.AddChild(channelNode)
|
|
|
return channelNode
|
|
return channelNode
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-func (gt *guildsTree) createChannelNodes(n *tview.TreeNode, cs []discord.Channel) {
|
|
|
|
|
|
|
+func (gt *guildsTree) createChannelNodes(node *tview.TreeNode, channels []discord.Channel) {
|
|
|
var orphanChs []discord.Channel
|
|
var orphanChs []discord.Channel
|
|
|
- for _, ch := range cs {
|
|
|
|
|
|
|
+ for _, ch := range channels {
|
|
|
if ch.Type != discord.GuildCategory && !ch.ParentID.IsValid() {
|
|
if ch.Type != discord.GuildCategory && !ch.ParentID.IsValid() {
|
|
|
orphanChs = append(orphanChs, ch)
|
|
orphanChs = append(orphanChs, ch)
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
for _, c := range orphanChs {
|
|
for _, c := range orphanChs {
|
|
|
- gt.createChannelNode(n, c)
|
|
|
|
|
|
|
+ gt.createChannelNode(node, c)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
PARENT_CHANNELS:
|
|
PARENT_CHANNELS:
|
|
|
- for _, c := range cs {
|
|
|
|
|
|
|
+ for _, c := range channels {
|
|
|
if c.Type == discord.GuildCategory {
|
|
if c.Type == discord.GuildCategory {
|
|
|
- for _, nested := range cs {
|
|
|
|
|
|
|
+ for _, nested := range channels {
|
|
|
if nested.ParentID == c.ID {
|
|
if nested.ParentID == c.ID {
|
|
|
- gt.createChannelNode(n, c)
|
|
|
|
|
|
|
+ gt.createChannelNode(node, c)
|
|
|
continue PARENT_CHANNELS
|
|
continue PARENT_CHANNELS
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- for _, c := range cs {
|
|
|
|
|
- if c.ParentID.IsValid() {
|
|
|
|
|
|
|
+ for _, channel := range channels {
|
|
|
|
|
+ if channel.ParentID.IsValid() {
|
|
|
var parent *tview.TreeNode
|
|
var parent *tview.TreeNode
|
|
|
- n.Walk(func(node, _ *tview.TreeNode) bool {
|
|
|
|
|
- if node.GetReference() == c.ParentID {
|
|
|
|
|
|
|
+ node.Walk(func(node, _ *tview.TreeNode) bool {
|
|
|
|
|
+ if node.GetReference() == channel.ParentID {
|
|
|
parent = node
|
|
parent = node
|
|
|
return false
|
|
return false
|
|
|
}
|
|
}
|
|
@@ -159,70 +159,70 @@ PARENT_CHANNELS:
|
|
|
})
|
|
})
|
|
|
|
|
|
|
|
if parent != nil {
|
|
if parent != nil {
|
|
|
- gt.createChannelNode(parent, c)
|
|
|
|
|
|
|
+ gt.createChannelNode(parent, channel)
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-func (gt *guildsTree) onSelected(n *tview.TreeNode) {
|
|
|
|
|
|
|
+func (gt *guildsTree) onSelected(node *tview.TreeNode) {
|
|
|
gt.selectedChannelID = 0
|
|
gt.selectedChannelID = 0
|
|
|
|
|
|
|
|
app.messagesText.reset()
|
|
app.messagesText.reset()
|
|
|
app.messageInput.reset()
|
|
app.messageInput.reset()
|
|
|
|
|
|
|
|
- if len(n.GetChildren()) != 0 {
|
|
|
|
|
- n.SetExpanded(!n.IsExpanded())
|
|
|
|
|
|
|
+ if len(node.GetChildren()) != 0 {
|
|
|
|
|
+ node.SetExpanded(!node.IsExpanded())
|
|
|
return
|
|
return
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- switch ref := n.GetReference().(type) {
|
|
|
|
|
|
|
+ switch ref := node.GetReference().(type) {
|
|
|
case discord.GuildID:
|
|
case discord.GuildID:
|
|
|
go discordState.MemberState.Subscribe(ref)
|
|
go discordState.MemberState.Subscribe(ref)
|
|
|
|
|
|
|
|
- cs, err := discordState.Cabinet.Channels(ref)
|
|
|
|
|
|
|
+ channels, err := discordState.Cabinet.Channels(ref)
|
|
|
if err != nil {
|
|
if err != nil {
|
|
|
slog.Error("failed to get channels", "err", err, "guild_id", ref)
|
|
slog.Error("failed to get channels", "err", err, "guild_id", ref)
|
|
|
return
|
|
return
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- sort.Slice(cs, func(i, j int) bool {
|
|
|
|
|
- return cs[i].Position < cs[j].Position
|
|
|
|
|
|
|
+ sort.Slice(channels, func(i, j int) bool {
|
|
|
|
|
+ return channels[i].Position < channels[j].Position
|
|
|
})
|
|
})
|
|
|
|
|
|
|
|
- gt.createChannelNodes(n, cs)
|
|
|
|
|
|
|
+ gt.createChannelNodes(node, channels)
|
|
|
case discord.ChannelID:
|
|
case discord.ChannelID:
|
|
|
- c, err := discordState.Cabinet.Channel(ref)
|
|
|
|
|
|
|
+ channel, err := discordState.Cabinet.Channel(ref)
|
|
|
if err != nil {
|
|
if err != nil {
|
|
|
slog.Error("failed to get channel", "channel_id", ref)
|
|
slog.Error("failed to get channel", "channel_id", ref)
|
|
|
return
|
|
return
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- app.messagesText.drawMsgs(c.ID)
|
|
|
|
|
|
|
+ app.messagesText.drawMsgs(channel.ID)
|
|
|
app.messagesText.ScrollToEnd()
|
|
app.messagesText.ScrollToEnd()
|
|
|
- app.messagesText.SetTitle(gt.channelToString(*c))
|
|
|
|
|
|
|
+ app.messagesText.SetTitle(gt.channelToString(*channel))
|
|
|
|
|
|
|
|
- gt.selectedChannelID = c.ID
|
|
|
|
|
|
|
+ gt.selectedChannelID = channel.ID
|
|
|
gt.app.SetFocus(app.messageInput)
|
|
gt.app.SetFocus(app.messageInput)
|
|
|
case nil: // Direct messages
|
|
case nil: // Direct messages
|
|
|
- cs, err := discordState.PrivateChannels()
|
|
|
|
|
|
|
+ channels, err := discordState.PrivateChannels()
|
|
|
if err != nil {
|
|
if err != nil {
|
|
|
slog.Error("failed to get private channels", "err", err)
|
|
slog.Error("failed to get private channels", "err", err)
|
|
|
return
|
|
return
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- sort.Slice(cs, func(a, b int) bool {
|
|
|
|
|
|
|
+ sort.Slice(channels, func(a, b int) bool {
|
|
|
msgID := func(ch discord.Channel) discord.MessageID {
|
|
msgID := func(ch discord.Channel) discord.MessageID {
|
|
|
if ch.LastMessageID.IsValid() {
|
|
if ch.LastMessageID.IsValid() {
|
|
|
return ch.LastMessageID
|
|
return ch.LastMessageID
|
|
|
}
|
|
}
|
|
|
return discord.MessageID(ch.ID)
|
|
return discord.MessageID(ch.ID)
|
|
|
}
|
|
}
|
|
|
- return msgID(cs[a]) > msgID(cs[b])
|
|
|
|
|
|
|
+ return msgID(channels[a]) > msgID(channels[b])
|
|
|
})
|
|
})
|
|
|
|
|
|
|
|
- for _, c := range cs {
|
|
|
|
|
- gt.createChannelNode(n, c)
|
|
|
|
|
|
|
+ for _, c := range channels {
|
|
|
|
|
+ gt.createChannelNode(node, c)
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|