user_info.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. // user_info.go implements the user info popup overlay. Opened with the
  2. // user_info keybind (w), it displays the selected message author's
  3. // username, display name, roles, and account creation date.
  4. package chat
  5. import (
  6. "fmt"
  7. "strings"
  8. "time"
  9. "github.com/ayn2op/tview"
  10. "github.com/diamondburned/arikawa/v3/discord"
  11. "github.com/diamondburned/arikawa/v3/state"
  12. "github.com/gdamore/tcell/v3"
  13. )
  14. const userInfoLayerName = "userInfo"
  15. func (ml *messagesList) showUserInfo() {
  16. msg, err := ml.selectedMessage()
  17. if err != nil {
  18. return
  19. }
  20. var lines []tview.Line
  21. b := tview.NewLineBuilder()
  22. boldStyle := tcell.StyleDefault.Bold(true)
  23. dimStyle := tcell.StyleDefault.Dim(true)
  24. normalStyle := tcell.StyleDefault
  25. // Username
  26. b.Write("Username: ", dimStyle)
  27. b.Write(msg.Author.DisplayOrUsername(), boldStyle)
  28. lines = append(lines, b.Finish()...)
  29. if msg.Author.DisplayName != "" && msg.Author.DisplayName != msg.Author.Username {
  30. b = tview.NewLineBuilder()
  31. b.Write("Display: ", dimStyle)
  32. b.Write(msg.Author.DisplayName, normalStyle)
  33. lines = append(lines, b.Finish()...)
  34. }
  35. // Account created (derived from snowflake ID)
  36. b = tview.NewLineBuilder()
  37. created := discord.Snowflake(msg.Author.ID).Time()
  38. b.Write("Created: ", dimStyle)
  39. b.Write(created.Format("Jan 2, 2006"), normalStyle)
  40. lines = append(lines, b.Finish()...)
  41. // Guild-specific info
  42. if msg.GuildID.IsValid() {
  43. member, err := ml.chatView.state.Cabinet.Member(msg.GuildID, msg.Author.ID)
  44. if err == nil && member != nil {
  45. // Join date
  46. if member.Joined.IsValid() {
  47. b = tview.NewLineBuilder()
  48. b.Write("Joined: ", dimStyle)
  49. b.Write(member.Joined.Time().In(time.Local).Format("Jan 2, 2006"), normalStyle)
  50. lines = append(lines, b.Finish()...)
  51. }
  52. // Nickname
  53. if member.Nick != "" {
  54. b = tview.NewLineBuilder()
  55. b.Write("Nickname: ", dimStyle)
  56. b.Write(member.Nick, normalStyle)
  57. lines = append(lines, b.Finish()...)
  58. }
  59. // Roles
  60. if len(member.RoleIDs) > 0 {
  61. b = tview.NewLineBuilder()
  62. b.Write("Roles: ", dimStyle)
  63. var roleNames []string
  64. for _, roleID := range member.RoleIDs {
  65. role, err := ml.chatView.state.Cabinet.Role(msg.GuildID, roleID)
  66. if err != nil {
  67. continue
  68. }
  69. roleNames = append(roleNames, role.Name)
  70. }
  71. if len(roleNames) > 0 {
  72. b.Write(strings.Join(roleNames, ", "), normalStyle)
  73. lines = append(lines, b.Finish()...)
  74. }
  75. }
  76. // Top role color indicator
  77. roleColor, ok := state.MemberColor(member, func(id discord.RoleID) *discord.Role {
  78. r, _ := ml.chatView.state.Cabinet.Role(msg.GuildID, id)
  79. return r
  80. })
  81. if ok {
  82. b = tview.NewLineBuilder()
  83. b.Write("Color: ", dimStyle)
  84. colorHex := fmt.Sprintf("#%06X", uint32(roleColor))
  85. b.Write(colorHex, normalStyle.Foreground(tcell.NewHexColor(int32(roleColor))))
  86. lines = append(lines, b.Finish()...)
  87. }
  88. }
  89. }
  90. // User ID
  91. b = tview.NewLineBuilder()
  92. b.Write("ID: ", dimStyle)
  93. b.Write(msg.Author.ID.String(), normalStyle)
  94. lines = append(lines, b.Finish()...)
  95. tv := tview.NewTextView().
  96. SetWrap(true).
  97. SetWordWrap(true).
  98. SetLines(lines)
  99. tv.SetTitle(msg.Author.DisplayOrUsername())
  100. ml.chatView.showUserInfoOverlay(tv)
  101. }