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