config: remove buggy prefer* implementation

This commit is contained in:
ayn2op 2025-07-11 15:48:03 -04:00
parent 3ca86d112d
commit d7e0852897
7 changed files with 71 additions and 147 deletions

View file

@ -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, ", ")

View file

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

View file

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

View file

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

View file

@ -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"`
}
)

View file

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

View file

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