Przeglądaj źródła

feat: add DM channels functionality (#58)

* feat: add DM channels functionality

* fix: remove main TreeView title
ayntgl 4 lat temu
rodzic
commit
cbfd15ade8
4 zmienionych plików z 67 dodań i 17 usunięć
  1. 17 2
      discord.go
  2. 5 5
      main.go
  3. 19 10
      ui.go
  4. 26 0
      util.go

+ 17 - 2
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) {

+ 5 - 5
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

+ 19 - 10
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

+ 26 - 0
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
+}