|
|
@@ -10,6 +10,7 @@ import (
|
|
|
"time"
|
|
|
|
|
|
"github.com/atotto/clipboard"
|
|
|
+ "github.com/ayn2op/discordo/internal/config"
|
|
|
"github.com/ayn2op/discordo/internal/markdown"
|
|
|
"github.com/diamondburned/arikawa/v3/discord"
|
|
|
"github.com/diamondburned/ningen/v3/discordmd"
|
|
|
@@ -21,13 +22,15 @@ import (
|
|
|
|
|
|
type MessagesText struct {
|
|
|
*tview.TextView
|
|
|
+ cfg *config.Config
|
|
|
app *tview.Application
|
|
|
selectedMessageID discord.MessageID
|
|
|
}
|
|
|
|
|
|
-func newMessagesText(app *tview.Application) *MessagesText {
|
|
|
+func newMessagesText(app *tview.Application, cfg *config.Config) *MessagesText {
|
|
|
mt := &MessagesText{
|
|
|
TextView: tview.NewTextView(),
|
|
|
+ cfg: cfg,
|
|
|
app: app,
|
|
|
}
|
|
|
|
|
|
@@ -40,21 +43,21 @@ func newMessagesText(app *tview.Application) *MessagesText {
|
|
|
app.Draw()
|
|
|
})
|
|
|
|
|
|
- mt.SetTextColor(tcell.GetColor(cfg.Theme.MessagesText.ContentColor))
|
|
|
- mt.SetBackgroundColor(tcell.GetColor(cfg.Theme.BackgroundColor))
|
|
|
+ mt.SetTextColor(tcell.GetColor(mt.cfg.Theme.MessagesText.ContentColor))
|
|
|
+ mt.SetBackgroundColor(tcell.GetColor(mt.cfg.Theme.BackgroundColor))
|
|
|
|
|
|
mt.SetTitle("Messages")
|
|
|
- mt.SetTitleColor(tcell.GetColor(cfg.Theme.TitleColor))
|
|
|
+ mt.SetTitleColor(tcell.GetColor(mt.cfg.Theme.TitleColor))
|
|
|
mt.SetTitleAlign(tview.AlignLeft)
|
|
|
|
|
|
- p := cfg.Theme.BorderPadding
|
|
|
- mt.SetBorder(cfg.Theme.Border)
|
|
|
- mt.SetBorderColor(tcell.GetColor(cfg.Theme.BorderColor))
|
|
|
+ p := mt.cfg.Theme.BorderPadding
|
|
|
+ mt.SetBorder(mt.cfg.Theme.Border)
|
|
|
+ mt.SetBorderColor(tcell.GetColor(mt.cfg.Theme.BorderColor))
|
|
|
mt.SetBorderPadding(p[0], p[1], p[2], p[3])
|
|
|
|
|
|
markdown.DefaultRenderer.AddOptions(
|
|
|
- renderer.WithOption("emojiColor", cfg.Theme.MessagesText.EmojiColor),
|
|
|
- renderer.WithOption("linkColor", cfg.Theme.MessagesText.LinkColor),
|
|
|
+ renderer.WithOption("emojiColor", mt.cfg.Theme.MessagesText.EmojiColor),
|
|
|
+ renderer.WithOption("linkColor", mt.cfg.Theme.MessagesText.LinkColor),
|
|
|
)
|
|
|
|
|
|
mt.SetHighlightedFunc(mt.onHighlighted)
|
|
|
@@ -63,7 +66,7 @@ func newMessagesText(app *tview.Application) *MessagesText {
|
|
|
}
|
|
|
|
|
|
func (mt *MessagesText) drawMsgs(cID discord.ChannelID) {
|
|
|
- ms, err := discordState.Messages(cID, uint(cfg.MessagesLimit))
|
|
|
+ ms, err := discordState.Messages(cID, uint(mt.cfg.MessagesLimit))
|
|
|
if err != nil {
|
|
|
slog.Error("failed to get messages", "err", err, "channel_id", cID)
|
|
|
return
|
|
|
@@ -97,7 +100,7 @@ func (mt *MessagesText) createMessage(m discord.Message) {
|
|
|
mt.startRegion(m.ID)
|
|
|
defer mt.endRegion()
|
|
|
|
|
|
- if cfg.HideBlockedUsers {
|
|
|
+ if mt.cfg.HideBlockedUsers {
|
|
|
isBlocked := discordState.UserIsBlocked(m.Author.ID)
|
|
|
if isBlocked {
|
|
|
fmt.Fprintln(mt, "[:red:b]Blocked message[:-:-]")
|
|
|
@@ -107,7 +110,7 @@ func (mt *MessagesText) createMessage(m discord.Message) {
|
|
|
|
|
|
switch m.Type {
|
|
|
case discord.ChannelPinnedMessage:
|
|
|
- fmt.Fprint(mt, "["+cfg.Theme.MessagesText.ContentColor+"]"+m.Author.Username+" pinned a message"+"[-:-:-]")
|
|
|
+ fmt.Fprint(mt, "["+mt.cfg.Theme.MessagesText.ContentColor+"]"+m.Author.Username+" pinned a message"+"[-:-:-]")
|
|
|
case discord.DefaultMessage, discord.InlinedReplyMessage:
|
|
|
if m.ReferencedMessage != nil {
|
|
|
mt.createHeader(mt, *m.ReferencedMessage, true)
|
|
|
@@ -127,16 +130,16 @@ func (mt *MessagesText) createMessage(m discord.Message) {
|
|
|
}
|
|
|
|
|
|
func (mt *MessagesText) createHeader(w io.Writer, m discord.Message, isReply bool) {
|
|
|
- if cfg.Timestamps {
|
|
|
- time := m.Timestamp.Time().In(time.Local).Format(cfg.TimestampsFormat)
|
|
|
+ if mt.cfg.Timestamps {
|
|
|
+ time := m.Timestamp.Time().In(time.Local).Format(mt.cfg.TimestampsFormat)
|
|
|
fmt.Fprintf(w, "[::d]%s[::-] ", time)
|
|
|
}
|
|
|
|
|
|
if isReply {
|
|
|
- fmt.Fprintf(mt, "[::d]%s", cfg.Theme.MessagesText.ReplyIndicator)
|
|
|
+ fmt.Fprintf(mt, "[::d]%s", mt.cfg.Theme.MessagesText.ReplyIndicator)
|
|
|
}
|
|
|
|
|
|
- fmt.Fprintf(w, "[%s]%s[-:-:-] ", cfg.Theme.MessagesText.AuthorColor, m.Author.Username)
|
|
|
+ fmt.Fprintf(w, "[%s]%s[-:-:-] ", mt.cfg.Theme.MessagesText.AuthorColor, m.Author.Username)
|
|
|
}
|
|
|
|
|
|
func (mt *MessagesText) createBody(w io.Writer, m discord.Message, isReply bool) {
|
|
|
@@ -156,10 +159,10 @@ func (mt *MessagesText) createBody(w io.Writer, m discord.Message, isReply bool)
|
|
|
func (mt *MessagesText) createFooter(w io.Writer, m discord.Message) {
|
|
|
for _, a := range m.Attachments {
|
|
|
fmt.Fprintln(w)
|
|
|
- if cfg.ShowAttachmentLinks {
|
|
|
- fmt.Fprintf(w, "[%s][%s]:\n%s[-]", cfg.Theme.MessagesText.AttachmentColor, a.Filename, a.URL)
|
|
|
+ if mt.cfg.ShowAttachmentLinks {
|
|
|
+ fmt.Fprintf(w, "[%s][%s]:\n%s[-]", mt.cfg.Theme.MessagesText.AttachmentColor, a.Filename, a.URL)
|
|
|
} else {
|
|
|
- fmt.Fprintf(w, "[%s][%s][-]", cfg.Theme.MessagesText.AttachmentColor, a.Filename)
|
|
|
+ fmt.Fprintf(w, "[%s][%s][-]", mt.cfg.Theme.MessagesText.AttachmentColor, a.Filename)
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
@@ -194,22 +197,22 @@ func (mt *MessagesText) getSelectedMessageIndex() (int, error) {
|
|
|
|
|
|
func (mt *MessagesText) onInputCapture(event *tcell.EventKey) *tcell.EventKey {
|
|
|
switch event.Name() {
|
|
|
- case cfg.Keys.SelectPrevious, cfg.Keys.SelectNext, cfg.Keys.SelectFirst, cfg.Keys.SelectLast, cfg.Keys.MessagesText.SelectReply, cfg.Keys.MessagesText.SelectPin:
|
|
|
+ case mt.cfg.Keys.SelectPrevious, mt.cfg.Keys.SelectNext, mt.cfg.Keys.SelectFirst, mt.cfg.Keys.SelectLast, mt.cfg.Keys.MessagesText.SelectReply, mt.cfg.Keys.MessagesText.SelectPin:
|
|
|
mt._select(event.Name())
|
|
|
return nil
|
|
|
- case cfg.Keys.MessagesText.Yank:
|
|
|
+ case mt.cfg.Keys.MessagesText.Yank:
|
|
|
mt.yank()
|
|
|
return nil
|
|
|
- case cfg.Keys.MessagesText.Open:
|
|
|
+ case mt.cfg.Keys.MessagesText.Open:
|
|
|
mt.open()
|
|
|
return nil
|
|
|
- case cfg.Keys.MessagesText.Reply:
|
|
|
+ case mt.cfg.Keys.MessagesText.Reply:
|
|
|
mt.reply(false)
|
|
|
return nil
|
|
|
- case cfg.Keys.MessagesText.ReplyMention:
|
|
|
+ case mt.cfg.Keys.MessagesText.ReplyMention:
|
|
|
mt.reply(true)
|
|
|
return nil
|
|
|
- case cfg.Keys.MessagesText.Delete:
|
|
|
+ case mt.cfg.Keys.MessagesText.Delete:
|
|
|
mt.delete()
|
|
|
return nil
|
|
|
}
|
|
|
@@ -231,7 +234,7 @@ func (mt *MessagesText) _select(name string) {
|
|
|
}
|
|
|
|
|
|
switch name {
|
|
|
- case cfg.Keys.SelectPrevious:
|
|
|
+ case mt.cfg.Keys.SelectPrevious:
|
|
|
// If no message is currently selected, select the latest message.
|
|
|
if len(mt.GetHighlights()) == 0 {
|
|
|
mt.selectedMessageID = ms[0].ID
|
|
|
@@ -242,7 +245,7 @@ func (mt *MessagesText) _select(name string) {
|
|
|
return
|
|
|
}
|
|
|
}
|
|
|
- case cfg.Keys.SelectNext:
|
|
|
+ case mt.cfg.Keys.SelectNext:
|
|
|
// If no message is currently selected, select the latest message.
|
|
|
if len(mt.GetHighlights()) == 0 {
|
|
|
mt.selectedMessageID = ms[0].ID
|
|
|
@@ -253,11 +256,11 @@ func (mt *MessagesText) _select(name string) {
|
|
|
return
|
|
|
}
|
|
|
}
|
|
|
- case cfg.Keys.SelectFirst:
|
|
|
+ case mt.cfg.Keys.SelectFirst:
|
|
|
mt.selectedMessageID = ms[len(ms)-1].ID
|
|
|
- case cfg.Keys.SelectLast:
|
|
|
+ case mt.cfg.Keys.SelectLast:
|
|
|
mt.selectedMessageID = ms[0].ID
|
|
|
- case cfg.Keys.MessagesText.SelectReply:
|
|
|
+ case mt.cfg.Keys.MessagesText.SelectReply:
|
|
|
if mt.selectedMessageID == 0 {
|
|
|
return
|
|
|
}
|
|
|
@@ -269,7 +272,7 @@ func (mt *MessagesText) _select(name string) {
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
- case cfg.Keys.MessagesText.SelectPin:
|
|
|
+ case mt.cfg.Keys.MessagesText.SelectPin:
|
|
|
if ref := ms[messageIdx].Reference; ref != nil {
|
|
|
for _, m := range ms {
|
|
|
if ref.MessageID == m.ID {
|