ayn2op 3 лет назад
Родитель
Сommit
57cd2824d4
6 измененных файлов с 58 добавлено и 24 удалено
  1. 10 5
      config.go
  2. 2 1
      discordmd/discordmd_test.go
  3. 3 1
      guilds_tree.go
  4. 5 2
      main.go
  5. 32 12
      messages_text.go
  6. 6 3
      state.go

+ 10 - 5
config.go

@@ -47,6 +47,7 @@ type (
 
 	MessagesTextThemeConfig struct {
 		CommonThemeConfig `yaml:",inline"`
+		AuthorColor       string `yaml:"author_color"`
 	}
 
 	MessageInputThemeConfig struct {
@@ -76,7 +77,8 @@ func newConfig() (*Config, error) {
 	}
 
 	path = filepath.Join(path, name)
-	if err = os.MkdirAll(path, os.ModePerm); err != nil {
+	err = os.MkdirAll(path, os.ModePerm)
+	if err != nil {
 		return nil, err
 	}
 
@@ -116,6 +118,7 @@ func newConfig() (*Config, error) {
 			},
 			MessagesText: MessagesTextThemeConfig{
 				CommonThemeConfig: commonTheme,
+				AuthorColor:       "aqua",
 			},
 			MessageInput: MessageInputThemeConfig{
 				CommonThemeConfig: commonTheme,
@@ -123,15 +126,16 @@ func newConfig() (*Config, error) {
 		},
 	}
 	path = filepath.Join(path, "config.yml")
-	if _, err = os.Stat(path); os.IsNotExist(err) {
+	_, err = os.Stat(path)
+	if os.IsNotExist(err) {
 		f, err := os.Create(path)
 		if err != nil {
 			return nil, err
 		}
 		defer f.Close()
 
-		e := yaml.NewEncoder(f)
-		if err = e.Encode(c); err != nil {
+		err = yaml.NewEncoder(f).Encode(c)
+		if err != nil {
 			return nil, err
 		}
 	} else {
@@ -141,7 +145,8 @@ func newConfig() (*Config, error) {
 		}
 		defer f.Close()
 
-		if err = yaml.NewDecoder(f).Decode(&c); err != nil {
+		err = yaml.NewDecoder(f).Decode(&c)
+		if err != nil {
 			return nil, err
 		}
 	}

+ 2 - 1
discordmd/discordmd_test.go

@@ -9,7 +9,8 @@ const input = `**Lorem** ipsum dolor sit amet, consectetur adipiscing __elit.__
 func TestParse(t *testing.T) {
 	const want = `[::b]Lorem[::-] ipsum dolor sit amet, consectetur adipiscing [::u]elit.[::-] Nullam ante magna, luctus in [::s]molestie non, elementum sit[::-] amet tortor. Nunc euismod urna ac massa dictum ultrices. Donec tempor [::u]dignissim[::-] ullamcorper. Mauris ultricies, risus non malesuada consectetur, [::i]purus leo interdum purus[::-], nec vestibulum lacus neque non nulla.`
 
-	if got := Parse(input); got != want {
+	got := Parse(input)
+	if got != want {
 		t.Errorf("got %s; want %s", got, want)
 	}
 }

+ 3 - 1
guilds_tree.go

@@ -184,12 +184,14 @@ func (gt *GuildsTree) onSelected(n *tview.TreeNode) {
 		}
 
 		for i := len(ms) - 1; i >= 0; i-- {
-			if messagesText.newMessage(&ms[i]); err != nil {
+			err = messagesText.newMessage(&ms[i])
+			if err != nil {
 				log.Println(err)
 				continue
 			}
 		}
 
+		messagesText.ScrollToEnd()
 		app.SetFocus(messageInput)
 	case nil: // Direct messages
 		cs, err := discordState.Cabinet.PrivateChannels()

+ 5 - 2
main.go

@@ -41,7 +41,8 @@ func main() {
 	messageInput = newMessageInput()
 
 	discordState = newState(token)
-	if err = discordState.Open(context.Background()); err != nil {
+	err = discordState.Open(context.Background())
+	if err != nil {
 		log.Fatal(err)
 	}
 
@@ -55,7 +56,9 @@ func main() {
 
 	app.EnableMouse(cfg.Mouse)
 	app.SetRoot(flex, true)
-	if err = app.Run(); err != nil {
+
+	err = app.Run()
+	if err != nil {
 		log.Fatal(err)
 	}
 }

+ 32 - 12
messages_text.go

@@ -1,7 +1,7 @@
 package main
 
 import (
-	"fmt"
+	"bytes"
 	"log"
 	"time"
 
@@ -11,9 +11,12 @@ import (
 	"github.com/rivo/tview"
 )
 
+const replyIndicator = '╭'
+
 type MessagesText struct {
 	*tview.TextView
 
+	buffer          bytes.Buffer
 	selectedMessage *discord.Message
 }
 
@@ -43,14 +46,20 @@ func newMessagesText() *MessagesText {
 }
 
 func (mt *MessagesText) newMessage(m *discord.Message) error {
+	mt.buffer.Reset()
+
 	switch m.Type {
 	case discord.DefaultMessage, discord.InlinedReplyMessage:
 		// Region tags are square brackets that contain a region ID in double quotes
 		// https://pkg.go.dev/github.com/rivo/tview#hdr-Regions_and_Highlights
-		fmt.Fprintf(mt, `["%s"]`, m.ID)
+		mt.buffer.WriteString(`["`)
+		mt.buffer.WriteString(m.ID.String())
+		mt.buffer.WriteString(`"]`)
 
 		if m.ReferencedMessage != nil {
-			fmt.Fprint(mt, "[::d] ╭ ")
+			mt.buffer.WriteString("[::d] ")
+			mt.buffer.WriteRune(replyIndicator)
+			mt.buffer.WriteByte(' ')
 
 			// Author
 			mt.newAuthor(m.ReferencedMessage)
@@ -58,8 +67,7 @@ func (mt *MessagesText) newMessage(m *discord.Message) error {
 			// Content
 			mt.newContent(m.ReferencedMessage)
 
-			fmt.Fprint(mt, "[::-]")
-			fmt.Fprintln(mt)
+			mt.buffer.WriteString("[::-]\n")
 		}
 
 		if cfg.Timestamps {
@@ -77,28 +85,40 @@ func (mt *MessagesText) newMessage(m *discord.Message) error {
 		mt.newAttachments(m)
 
 		// Tags with no region ID ([""]) don't start new regions. They can therefore be used to mark the end of a region.
-		fmt.Fprint(mt, `[""]`)
+		mt.buffer.WriteString(`[""]`)
+		mt.buffer.WriteByte('\n')
 	}
 
-	fmt.Fprintln(mt)
-	return nil
+	_, err := mt.buffer.WriteTo(mt)
+	return err
 }
 
 func (mt *MessagesText) newAuthor(m *discord.Message) {
-	fmt.Fprintf(mt, "[blue]%s[-] ", m.Author.Username)
+	mt.buffer.WriteByte('[')
+	mt.buffer.WriteString(cfg.Theme.MessagesText.AuthorColor)
+	mt.buffer.WriteByte(']')
+	mt.buffer.WriteString(m.Author.Username)
+	mt.buffer.WriteString("[-] ")
 }
 
 func (mt *MessagesText) newTimestamp(m *discord.Message) {
-	fmt.Fprintf(mt, "[::d]%s[::-] ", m.Timestamp.Format(time.Kitchen))
+	mt.buffer.WriteString("[::d]")
+	mt.buffer.WriteString(m.Timestamp.Format(time.Kitchen))
+	mt.buffer.WriteString("[::-] ")
 }
 
 func (mt *MessagesText) newContent(m *discord.Message) {
-	fmt.Fprint(mt, discordmd.Parse(tview.Escape(m.Content)))
+	mt.buffer.WriteString(discordmd.Parse(tview.Escape(m.Content)))
 }
 
 func (mt *MessagesText) newAttachments(m *discord.Message) {
 	for _, a := range m.Attachments {
-		fmt.Fprintf(mt, "\n[%s]: %s", a.Filename, a.URL)
+		mt.buffer.WriteByte('\n')
+
+		mt.buffer.WriteByte('[')
+		mt.buffer.WriteString(a.Filename)
+		mt.buffer.WriteString("]: ")
+		mt.buffer.WriteString(a.URL)
 	}
 }
 

+ 6 - 3
state.go

@@ -42,7 +42,8 @@ func (s *State) onReady(r *gateway.ReadyEvent) {
 	for _, gf := range r.UserSettings.GuildFolders {
 		/// If the ID of the guild folder is zero, the guild folder only contains single guild.
 		if gf.ID == 0 {
-			if err := guildsTree.createGuildNodeFromID(guildsTree.root, gf.GuildIDs[0]); err != nil {
+			err := guildsTree.createGuildNodeFromID(guildsTree.root, gf.GuildIDs[0])
+			if err != nil {
 				log.Println(err)
 				continue
 			}
@@ -51,7 +52,8 @@ func (s *State) onReady(r *gateway.ReadyEvent) {
 			guildsTree.root.AddChild(gfNode)
 
 			for _, gid := range gf.GuildIDs {
-				if err := guildsTree.createGuildNodeFromID(gfNode, gid); err != nil {
+				err := guildsTree.createGuildNodeFromID(gfNode, gid)
+				if err != nil {
 					log.Println(err)
 					continue
 				}
@@ -65,7 +67,8 @@ func (s *State) onReady(r *gateway.ReadyEvent) {
 
 func (s *State) onMessageCreate(m *gateway.MessageCreateEvent) {
 	if guildsTree.selectedChannel != nil && guildsTree.selectedChannel.ID == m.ChannelID {
-		if err := messagesText.newMessage(&m.Message); err != nil {
+		err := messagesText.newMessage(&m.Message)
+		if err != nil {
 			log.Println(err)
 			return
 		}