From cbfd15ade84b48a40762617eace01d0f5e1c890d Mon Sep 17 00:00:00 2001 From: ayntgl <90600421+ayntgl@users.noreply.github.com> Date: Sat, 25 Sep 2021 12:52:15 +0400 Subject: [PATCH] feat: add DM channels functionality (#58) * feat: add DM channels functionality * fix: remove main TreeView title --- discord.go | 19 +++++++++++++++++-- main.go | 10 +++++----- ui.go | 29 +++++++++++++++++++---------- util.go | 26 ++++++++++++++++++++++++++ 4 files changed, 67 insertions(+), 17 deletions(-) create mode 100644 util.go diff --git a/discord.go b/discord.go index c4c27b0..5186713 100644 --- a/discord.go +++ b/discord.go @@ -37,6 +37,22 @@ func newSession() *discordgo.Session { } func onSessionReady(_ *discordgo.Session, r *discordgo.Ready) { + dmNode := tview.NewTreeNode("Direct Messages"). + Collapse() + + n := mainTreeView.GetRoot() + n.AddChild(dmNode) + + sort.Slice(r.PrivateChannels, func(i, j int) bool { + return r.PrivateChannels[i].LastMessageID > r.PrivateChannels[j].LastMessageID + }) + + for _, c := range r.PrivateChannels { + cn := tview.NewTreeNode(genChannelRepr(c)). + SetReference(c.ID) + dmNode.AddChild(cn) + } + sort.Slice(r.Guilds, func(a, b int) bool { found := false for _, gID := range r.Settings.GuildPositions { @@ -54,14 +70,13 @@ func onSessionReady(_ *discordgo.Session, r *discordgo.Ready) { return false }) - n := guildsTreeView.GetRoot() for _, g := range r.Guilds { gn := tview.NewTreeNode(g.Name). SetReference(g.ID) n.AddChild(gn) } - guildsTreeView.SetCurrentNode(n) + mainTreeView.SetCurrentNode(n) } func onSessionMessageCreate(_ *discordgo.Session, m *discordgo.MessageCreate) { diff --git a/main.go b/main.go index d9f596f..3fa69c3 100644 --- a/main.go +++ b/main.go @@ -12,7 +12,7 @@ func main() { tview.Styles = conf.Theme app = newApplication() - guildsTreeView = newGuildsTreeView() + mainTreeView = newMainTreeView() messagesTextView = newMessagesTextView() messageInputField = newMessageInputField() @@ -21,7 +21,7 @@ func main() { AddItem(messagesTextView, 0, 1, false). AddItem(messageInputField, 3, 1, false) mainFlex = tview.NewFlex(). - AddItem(guildsTreeView, 0, 1, false). + AddItem(mainTreeView, 0, 1, false). AddItem(rightFlex, 0, 4, false) token := conf.Token @@ -32,7 +32,7 @@ func main() { if token != "" { app. SetRoot(mainFlex, true). - SetFocus(guildsTreeView) + SetFocus(mainTreeView) session = newSession() session.Token = token @@ -67,7 +67,7 @@ func onLoginFormLoginButtonSelected() { if lr.Token != "" && !lr.MFA { app. SetRoot(mainFlex, true). - SetFocus(guildsTreeView) + SetFocus(mainTreeView) session.Token = lr.Token session.Identify.Token = lr.Token @@ -91,7 +91,7 @@ func onLoginFormLoginButtonSelected() { app. SetRoot(mainFlex, true). - SetFocus(guildsTreeView) + SetFocus(mainTreeView) session.Token = lr.Token session.Identify.Token = lr.Token diff --git a/ui.go b/ui.go index 2558920..da2187a 100644 --- a/ui.go +++ b/ui.go @@ -13,7 +13,7 @@ import ( var ( app *tview.Application loginForm *tview.Form - guildsTreeView *tview.TreeView + mainTreeView *tview.TreeView messagesTextView *tview.TextView messageInputField *tview.InputField mainFlex *tview.Flex @@ -31,7 +31,7 @@ func newApplication() *tview.Application { func onAppInputCapture(e *tcell.EventKey) *tcell.EventKey { switch e.Name() { case conf.Keybindings.GuildsTreeViewFocus: - app.SetFocus(guildsTreeView) + app.SetFocus(mainTreeView) case conf.Keybindings.MessagesTextViewFocus: app.SetFocus(messagesTextView) case conf.Keybindings.MessageInputFieldFocus: @@ -41,21 +41,19 @@ func onAppInputCapture(e *tcell.EventKey) *tcell.EventKey { return e } -func newGuildsTreeView() *tview.TreeView { +func newMainTreeView() *tview.TreeView { w := tview.NewTreeView() w. - SetSelectedFunc(onGuildsTreeViewSelected). + SetSelectedFunc(onMainTreeViewSelected). SetTopLevel(1). SetRoot(tview.NewTreeNode("")). SetBorder(true). - SetBorderPadding(0, 0, 1, 0). - SetTitle("Guilds"). - SetTitleAlign(tview.AlignLeft) + SetBorderPadding(0, 0, 1, 0) return w } -func onGuildsTreeViewSelected(n *tview.TreeNode) { +func onMainTreeViewSelected(n *tview.TreeNode) { selectedChannel = nil selectedMessage = nil messagesTextView. @@ -72,7 +70,9 @@ func onGuildsTreeViewSelected(n *tview.TreeNode) { return } - n.ClearChildren() + if n.GetText() == "Direct Messages" { + return + } gID := n.GetReference().(string) g, err := session.State.Guild(gID) @@ -112,6 +112,15 @@ func onGuildsTreeViewSelected(n *tview.TreeNode) { 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) } } @@ -186,7 +195,7 @@ func createSecondLevelChannelsTreeNodes(cs []*discordgo.Channel) { } func getTreeNodeByReference(r interface{}) (mn *tview.TreeNode) { - guildsTreeView.GetRoot().Walk(func(n, _ *tview.TreeNode) bool { + mainTreeView.GetRoot().Walk(func(n, _ *tview.TreeNode) bool { if n.GetReference() == r { mn = n return false diff --git a/util.go b/util.go new file mode 100644 index 0000000..c173f76 --- /dev/null +++ b/util.go @@ -0,0 +1,26 @@ +package main + +import ( + "strings" + + "github.com/ayntgl/discordgo" +) + +func genChannelRepr(c *discordgo.Channel) string { + var repr string + if c.Name != "" { + repr = c.Name + } else if len(c.Recipients) == 1 { + rp := c.Recipients[0] + repr = rp.Username + "#" + rp.Discriminator + } else { + rps := make([]string, len(c.Recipients)) + for i, r := range c.Recipients { + rps[i] = r.Username + "#" + r.Discriminator + } + + repr = strings.Join(rps, ", ") + } + + return repr +}