feat: add DM channels functionality (#58)

* feat: add DM channels functionality

* fix: remove main TreeView title
This commit is contained in:
ayntgl 2021-09-25 12:52:15 +04:00 • committed by GitHub
parent 7ea5aab4f5
commit cbfd15ade8
4 changed files with 67 additions and 17 deletions

View file

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

10
main.go
View file

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

29
ui.go
View file

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

26
util.go Normal file
View file

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