| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116 |
- // user_info.go implements the user info popup overlay. Opened with the
- // user_info keybind (w), it displays the selected message author's
- // username, display name, roles, and account creation date.
- package chat
- import (
- "fmt"
- "strings"
- "time"
- "github.com/ayn2op/tview"
- "github.com/diamondburned/arikawa/v3/discord"
- "github.com/diamondburned/arikawa/v3/state"
- "github.com/gdamore/tcell/v3"
- )
- const userInfoLayerName = "userInfo"
- func (ml *messagesList) showUserInfo() {
- msg, err := ml.selectedMessage()
- if err != nil {
- return
- }
- var lines []tview.Line
- b := tview.NewLineBuilder()
- boldStyle := tcell.StyleDefault.Bold(true)
- dimStyle := tcell.StyleDefault.Dim(true)
- normalStyle := tcell.StyleDefault
- // Username
- b.Write("Username: ", dimStyle)
- b.Write(msg.Author.DisplayOrUsername(), boldStyle)
- lines = append(lines, b.Finish()...)
- if msg.Author.DisplayName != "" && msg.Author.DisplayName != msg.Author.Username {
- b = tview.NewLineBuilder()
- b.Write("Display: ", dimStyle)
- b.Write(msg.Author.DisplayName, normalStyle)
- lines = append(lines, b.Finish()...)
- }
- // Account created (derived from snowflake ID)
- b = tview.NewLineBuilder()
- created := discord.Snowflake(msg.Author.ID).Time()
- b.Write("Created: ", dimStyle)
- b.Write(created.Format("Jan 2, 2006"), normalStyle)
- lines = append(lines, b.Finish()...)
- // Guild-specific info
- if msg.GuildID.IsValid() {
- member, err := ml.chatView.state.Cabinet.Member(msg.GuildID, msg.Author.ID)
- if err == nil && member != nil {
- // Join date
- if member.Joined.IsValid() {
- b = tview.NewLineBuilder()
- b.Write("Joined: ", dimStyle)
- b.Write(member.Joined.Time().In(time.Local).Format("Jan 2, 2006"), normalStyle)
- lines = append(lines, b.Finish()...)
- }
- // Nickname
- if member.Nick != "" {
- b = tview.NewLineBuilder()
- b.Write("Nickname: ", dimStyle)
- b.Write(member.Nick, normalStyle)
- lines = append(lines, b.Finish()...)
- }
- // Roles
- if len(member.RoleIDs) > 0 {
- b = tview.NewLineBuilder()
- b.Write("Roles: ", dimStyle)
- var roleNames []string
- for _, roleID := range member.RoleIDs {
- role, err := ml.chatView.state.Cabinet.Role(msg.GuildID, roleID)
- if err != nil {
- continue
- }
- roleNames = append(roleNames, role.Name)
- }
- if len(roleNames) > 0 {
- b.Write(strings.Join(roleNames, ", "), normalStyle)
- lines = append(lines, b.Finish()...)
- }
- }
- // Top role color indicator
- roleColor, ok := state.MemberColor(member, func(id discord.RoleID) *discord.Role {
- r, _ := ml.chatView.state.Cabinet.Role(msg.GuildID, id)
- return r
- })
- if ok {
- b = tview.NewLineBuilder()
- b.Write("Color: ", dimStyle)
- colorHex := fmt.Sprintf("#%06X", uint32(roleColor))
- b.Write(colorHex, normalStyle.Foreground(tcell.NewHexColor(int32(roleColor))))
- lines = append(lines, b.Finish()...)
- }
- }
- }
- // User ID
- b = tview.NewLineBuilder()
- b.Write("ID: ", dimStyle)
- b.Write(msg.Author.ID.String(), normalStyle)
- lines = append(lines, b.Finish()...)
- tv := tview.NewTextView().
- SetWrap(true).
- SetWordWrap(true).
- SetLines(lines)
- tv.SetTitle(msg.Author.DisplayOrUsername())
- ml.chatView.showUserInfoOverlay(tv)
- }
|