diff --git a/cmd/guilds_tree.go b/cmd/guilds_tree.go index b56b362..fc92a6c 100644 --- a/cmd/guilds_tree.go +++ b/cmd/guilds_tree.go @@ -79,7 +79,7 @@ func (gt *guildsTree) channelToString(channel discord.Channel) string { recipients := make([]string, len(channel.DMRecipients)) for i, r := range channel.DMRecipients { - recipients[i] = ui.PreferredName(r, gt.cfg.Theme) + recipients[i] = r.DisplayOrUsername() } return strings.Join(recipients, ", ") diff --git a/cmd/message_input.go b/cmd/message_input.go index 1688d41..8d3a275 100644 --- a/cmd/message_input.go +++ b/cmd/message_input.go @@ -381,47 +381,25 @@ func (mi *messageInput) showMentionList(col int) { } func (mi *messageInput) addMentionItem(gID discord.GuildID, m *discord.Member) bool { - username := m.User.Username - if username == "" { - return false - } - dname := "" - if mi.cfg.Theme.MentionsList.PreferNicknames { - dname = m.Nick - } - if dname == "" { - dname = m.User.DisplayName - } - if dname != "" { - dname = tview.Escape(dname) + name := m.User.DisplayOrUsername() + if m != nil && m.Nick != "" { + name = m.Nick } + // this is WAY faster than discordState.MemberColor - if mi.cfg.Theme.MentionsList.ShowUserColors { - if c, ok := state.MemberColor(m, func(id discord.RoleID) *discord.Role { - r, _ := discordState.Cabinet.Role(gID, id) - return r - }); ok { - if dname != "" { - dname = "[" + c.String() + "]" + dname + "[-:]" - } else { - username = "[" + c.String() + "]" + username + "[-:]" - } - } + color, ok := state.MemberColor(m, func(id discord.RoleID) *discord.Role { + r, _ := discordState.Cabinet.Role(gID, id) + return r + }) + if ok { + name = fmt.Sprintf("[%s]%s[-]", color, name) } + if presence, _ := discordState.Cabinet.Presence(gID, m.User.ID); presence == nil || presence.Status == discord.OfflineStatus { - if mi.cfg.Theme.MentionsList.ShowUsernames || dname == "" { - username = "[::d]" + username + "[::D]" - } else { - dname = "[::d]" + dname + "[::D]" - } + name = fmt.Sprintf("[::d]%s[::D]", name) } - if dname != "" { - if mi.cfg.Theme.MentionsList.ShowUsernames { - dname += " (" + username + ")" - } - username = dname - } - mi.mentionsList.AddItem(username, m.User.Username, 0, nil) + + mi.mentionsList.AddItem(name, m.User.Username, 0, nil) return mi.mentionsList.GetItemCount() > int(mi.cfg.AutocompleteLimit) } diff --git a/cmd/messages_list.go b/cmd/messages_list.go index fb5e7a2..de40c07 100644 --- a/cmd/messages_list.go +++ b/cmd/messages_list.go @@ -70,10 +70,14 @@ func (ml *messagesList) drawMsgs(cID discord.ChannelID) { return } - if app.cfg.Theme.PreferNicknames || app.cfg.Theme.MessagesList.ShowUserColors { - if ch, _ := discordState.Cabinet.Channel(cID); ch.GuildID.IsValid() { - ml.requestGuildMembers(ch.GuildID, msgs) - } + channel, err := discordState.Cabinet.Channel(cID) + if err != nil { + slog.Error("failed to get channel from state", "channel_id", cID, "err", err) + return + } + + if guildID := channel.GuildID; guildID.IsValid() { + ml.requestGuildMembers(guildID, msgs) } for _, m := range slices.Backward(msgs) { @@ -143,9 +147,8 @@ func (ml *messagesList) drawTimestamps(ts discord.Timestamp) { } func (ml *messagesList) drawAuthor(msg discord.Message) { - name := "" style := ml.cfg.Theme.MessagesList.AuthorStyle - + name := msg.Author.DisplayOrUsername() if msg.GuildID.IsValid() { member, err := discordState.Cabinet.Member(msg.GuildID, msg.Author.ID) if err != nil { @@ -153,20 +156,18 @@ func (ml *messagesList) drawAuthor(msg discord.Message) { return } - name = ui.PreferredMemberName(member, ml.cfg.Theme) - - if app.cfg.Theme.MessagesList.ShowUserColors { - color, ok := state.MemberColor(member, func(id discord.RoleID) *discord.Role { - r, _ := discordState.Cabinet.Role(msg.GuildID, id) - return r - }) - if ok { - c := tcell.GetColor(color.String()) - style = config.NewStyleWrapper(tcell.StyleDefault.Foreground(c)) - } + if member.Nick != "" { + name = member.Nick + } + + color, ok := state.MemberColor(member, func(id discord.RoleID) *discord.Role { + r, _ := discordState.Cabinet.Role(msg.GuildID, id) + return r + }) + if ok { + c := tcell.GetColor(color.String()) + style = config.NewStyleWrapper(tcell.StyleDefault.Foreground(c)) } - } else { - name = ui.PreferredName(msg.Author, ml.cfg.Theme) } fg, bg, _ := style.Decompose() @@ -498,16 +499,17 @@ func (ml *messagesList) reply(mention bool) { return } - name := "" + name := msg.Author.DisplayOrUsername() if msg.GuildID.IsValid() { member, err := discordState.Cabinet.Member(msg.GuildID, msg.Author.ID) if err != nil { slog.Error("failed to get member from state", "guild_id", msg.GuildID, "member_id", msg.Author.ID, "err", err) return } - name = ui.PreferredMemberName(member, ml.cfg.Theme) - } else { - name = ui.PreferredName(msg.Author, ml.cfg.Theme) + + if member.Nick != "" { + name = member.Nick + } } data := app.messageInput.sendMessageData diff --git a/internal/config/config.toml b/internal/config/config.toml index bb20b39..4668291 100644 --- a/internal/config/config.toml +++ b/internal/config/config.toml @@ -102,44 +102,32 @@ down = "Down" # Applies to all # style = { foreground = "", background = "", attributes = "" or [""] } [theme] -# prefer_nicknames will show nicknames if possible -# This has higher priority than prefer_display_names. -prefer_nicknames = true -# prefer_display_names will show display names if possible. -# This has lower priority than prefer_nicknames. -prefer_display_names = false background_color = "default" [theme.title] -# `"left"`, `"center"`, or `"right"`. -alignment = "left" +alignment = "left" # `"left"`, `"center"`, or `"right"`. normal_style = { attributes = "dim" } active_style = { attributes = "bold" } [theme.border] enabled = true -# [top, bottom, left, right] -padding = [0, 0, 1, 1] -# `"plain"`, `"round"`, `"thick"`, or `"double"`. -set = "plain" -normal_style = { attributes = "dim" } +padding = [0, 0, 1, 1] # [top, bottom, left, right] +set = "plain" # `"plain"`, `"round"`, `"thick"`, or `"double"`. +normal_style = { attributes = "dim" } active_style = { attributes = "bold" } [theme.guilds_tree] auto_expand_folders = true # Give tree-like shape graphics = true -# graphics_color = "default" -# private_channel_style = { foreground = "default" } -# guild_style = { foreground = "default" } -# channel_style = { foreground = "default" } +graphics_color = "default" +private_channel_style = { foreground = "default" } +guild_style = { foreground = "default" } +channel_style = { foreground = "default" } [theme.messages_list] -show_user_colors = true - reply_indicator = ">" forwarded_indicator = "<" - author_style = { foreground = "aqua" } mention_style = { foreground = "blue" } emoji_style = { foreground = "green" } @@ -147,19 +135,10 @@ url_style = { foreground = "blue" } attachment_style = { foreground = "yellow" } [theme.mentions_list] -# prefer_nicknames will show the user's nickname instead of displayname (if -# the user has one). -prefer_nicknames = true -# Show usernames next to display/nickname (username will always be shown if the -# user did not set a display/nickname in their profile). -show_usernames = true -show_user_colors = true - # Note: width and height are capped to the avaliable space # Minimum width # 0 = make the list as wide as possible min_width = 20 - # Maximum height # 0 = make the list as tall as needed max_height = 0 diff --git a/internal/config/theme.go b/internal/config/theme.go index 6245e5f..bdfb255 100644 --- a/internal/config/theme.go +++ b/internal/config/theme.go @@ -126,10 +126,9 @@ type ( } GuildsTreeTheme struct { - AutoExpandFolders bool `toml:"auto_expand_folders"` - - Graphics bool `toml:"graphics"` - GraphicsColor string `toml:"graphics_color"` + AutoExpandFolders bool `toml:"auto_expand_folders"` + Graphics bool `toml:"graphics"` + GraphicsColor string `toml:"graphics_color"` PrivateChannelStyle StyleWrapper `toml:"private_channel_style"` GuildStyle StyleWrapper `toml:"guild_style"` @@ -137,38 +136,27 @@ type ( } MessagesListTheme struct { - ShowUserColors bool `toml:"show_user_colors"` - - ReplyIndicator string `toml:"reply_indicator"` - ForwardedIndicator string `toml:"forwarded_indicator"` - - AuthorStyle StyleWrapper `toml:"author_style"` - MentionStyle StyleWrapper `toml:"mention_style"` - EmojiStyle StyleWrapper `toml:"emoji_style"` - URLStyle StyleWrapper `toml:"url_style"` - AttachmentStyle StyleWrapper `toml:"attachment_style"` + ReplyIndicator string `toml:"reply_indicator"` + ForwardedIndicator string `toml:"forwarded_indicator"` + AuthorStyle StyleWrapper `toml:"author_style"` + MentionStyle StyleWrapper `toml:"mention_style"` + EmojiStyle StyleWrapper `toml:"emoji_style"` + URLStyle StyleWrapper `toml:"url_style"` + AttachmentStyle StyleWrapper `toml:"attachment_style"` } MentionsListTheme struct { - PreferNicknames bool `toml:"prefer_nicknames"` - ShowUsernames bool `toml:"show_usernames"` - ShowUserColors bool `toml:"show_user_colors"` - MinWidth uint `toml:"min_width"` MaxHeight uint `toml:"max_height"` } Theme struct { - PreferNicknames bool `toml:"prefer_nicknames"` - PreferDisplayNames bool `toml:"prefer_display_names"` - BackgroundColor string `toml:"background_color"` - - Title TitleTheme `toml:"title"` - Border BorderTheme `toml:"border"` - - GuildsTree GuildsTreeTheme `toml:"guilds_tree"` - MessagesList MessagesListTheme `toml:"messages_list"` - MentionsList MentionsListTheme `toml:"mentions_list"` + BackgroundColor string `toml:"background_color"` + Title TitleTheme `toml:"title"` + Border BorderTheme `toml:"border"` + GuildsTree GuildsTreeTheme `toml:"guilds_tree"` + MessagesList MessagesListTheme `toml:"messages_list"` + MentionsList MentionsListTheme `toml:"mentions_list"` } ) diff --git a/internal/markdown/renderer.go b/internal/markdown/renderer.go index 958e240..096ca97 100644 --- a/internal/markdown/renderer.go +++ b/internal/markdown/renderer.go @@ -59,7 +59,7 @@ func (r *renderer) Render(w io.Writer, source []byte, node ast.Node) error { case *discordmd.Inline: r.renderInline(w, node, entering) case *discordmd.Mention: - r.renderMention(w, node, entering, theme.PreferNicknames, theme.PreferDisplayNames, theme.MessagesList.MentionStyle.Style) + r.renderMention(w, node, entering, theme.MessagesList.MentionStyle.Style) case *discordmd.Emoji: r.renderEmoji(w, node, entering, theme.MessagesList.EmojiStyle.Style) } @@ -190,7 +190,7 @@ func (r *renderer) renderInline(w io.Writer, node *discordmd.Inline, entering bo } } -func (r *renderer) renderMention(w io.Writer, node *discordmd.Mention, entering, preferNicknames, preferDisplayNames bool, style tcell.Style) { +func (r *renderer) renderMention(w io.Writer, node *discordmd.Mention, entering bool, style tcell.Style) { if entering { fg, bg, _ := style.Decompose() _, _ = fmt.Fprintf(w, "[%s:%s:b]", fg, bg) @@ -199,17 +199,12 @@ func (r *renderer) renderMention(w io.Writer, node *discordmd.Mention, entering, case node.Channel != nil: io.WriteString(w, "#"+node.Channel.Name) case node.GuildUser != nil: - username := "" - if preferNicknames && node.GuildUser.Member != nil { - username = node.GuildUser.Member.Nick + name := node.GuildUser.DisplayOrUsername() + if member := node.GuildUser.Member; member != nil && member.Nick != "" { + name = member.Nick } - if username == "" && !preferDisplayNames { - username = node.GuildUser.DisplayName - } - if username == "" { - username = node.GuildUser.Username - } - io.WriteString(w, "@"+username) + + io.WriteString(w, "@"+name) case node.GuildRole != nil: io.WriteString(w, "@"+node.GuildRole.Name) } diff --git a/internal/ui/util.go b/internal/ui/util.go index d6caf82..0e01656 100644 --- a/internal/ui/util.go +++ b/internal/ui/util.go @@ -3,7 +3,6 @@ package ui import ( "github.com/ayn2op/discordo/internal/config" "github.com/ayn2op/tview" - "github.com/diamondburned/arikawa/v3/discord" ) // ConfigureBox configures the provided box according to the provided theme. @@ -42,20 +41,3 @@ func Centered(p tview.Primitive, width, height int) tview.Primitive { SetRows(0, height, 0). AddItem(p, 1, 1, 1, 1, 0, 0, true) } - -func PreferredMemberName(m *discord.Member, theme config.Theme) string { - if theme.PreferNicknames && m.Nick != "" { - return m.Nick - } - if theme.PreferDisplayNames && m.User.DisplayName != "" { - return m.User.DisplayName - } - return m.User.Username -} - -func PreferredName(u discord.User, theme config.Theme) string { - if theme.PreferDisplayNames && u.DisplayName != "" { - return u.DisplayName - } - return u.Username -}