util.go 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. package ui
  2. import (
  3. "cmp"
  4. "slices"
  5. "strings"
  6. "github.com/ayn2op/discordo/internal/config"
  7. "github.com/ayn2op/tview"
  8. "github.com/diamondburned/arikawa/v3/discord"
  9. )
  10. // ConfigureBox configures the provided box according to the provided theme.
  11. func ConfigureBox(box *tview.Box, cfg *config.Theme) *tview.Box {
  12. border := cfg.Border
  13. normalBorderStyle, activeBorderStyle := border.NormalStyle.Style, border.ActiveStyle.Style
  14. normalBorderSet, activeBorderSet := border.NormalSet.BorderSet, border.ActiveSet.BorderSet
  15. title := cfg.Title
  16. normalTitleStyle, activeTitleStyle := title.NormalStyle.Style, title.ActiveStyle.Style
  17. footer := cfg.Footer
  18. normalFooterStyle, activeFooterStyle := footer.NormalStyle.Style, footer.ActiveStyle.Style
  19. padding := border.Padding
  20. box.
  21. SetBorderStyle(normalBorderStyle).
  22. SetBorderSet(normalBorderSet).
  23. SetBorderPadding(padding[0], padding[1], padding[2], padding[3]).
  24. SetTitleStyle(normalTitleStyle).
  25. SetTitleAlignment(title.Alignment.Alignment).
  26. SetFooterStyle(normalFooterStyle).
  27. SetFooterAlignment(footer.Alignment.Alignment).
  28. SetBlurFunc(func() {
  29. box.
  30. SetBorderStyle(normalBorderStyle).
  31. SetBorderSet(normalBorderSet)
  32. box.SetTitleStyle(normalTitleStyle).SetFooterStyle(normalFooterStyle)
  33. }).
  34. SetFocusFunc(func() {
  35. box.
  36. SetBorderStyle(activeBorderStyle).
  37. SetBorderSet(activeBorderSet)
  38. box.SetTitleStyle(activeTitleStyle).SetFooterStyle(activeFooterStyle)
  39. })
  40. if border.Enabled {
  41. box.SetBorders(tview.BordersAll)
  42. }
  43. return box
  44. }
  45. // Centered creates a new grid with provided primitive aligned in the center.
  46. func Centered(p tview.Primitive, width, height int) tview.Primitive {
  47. return tview.NewGrid().
  48. SetColumns(0, width, 0).
  49. SetRows(0, height, 0).
  50. AddItem(p, 1, 1, 1, 1, 0, 0, true)
  51. }
  52. func ChannelToString(channel discord.Channel, icons config.Icons) string {
  53. var icon string
  54. switch channel.Type {
  55. case discord.DirectMessage, discord.GroupDM:
  56. if channel.Name != "" {
  57. return channel.Name
  58. }
  59. recipients := make([]string, len(channel.DMRecipients))
  60. for i, r := range channel.DMRecipients {
  61. recipients[i] = r.DisplayOrUsername()
  62. }
  63. return strings.Join(recipients, ", ")
  64. case discord.GuildCategory:
  65. icon = icons.GuildCategory
  66. case discord.GuildText:
  67. icon = icons.GuildText
  68. case discord.GuildVoice:
  69. icon = icons.GuildVoice
  70. case discord.GuildStageVoice:
  71. icon = icons.GuildStageVoice
  72. case discord.GuildAnnouncementThread:
  73. icon = icons.GuildAnnouncementThread
  74. case discord.GuildPublicThread:
  75. icon = icons.GuildPublicThread
  76. case discord.GuildPrivateThread:
  77. icon = icons.GuildPrivateThread
  78. case discord.GuildAnnouncement:
  79. icon = icons.GuildAnnouncement
  80. case discord.GuildForum:
  81. icon = icons.GuildForum
  82. case discord.GuildStore:
  83. icon = icons.GuildStore
  84. }
  85. return icon + channel.Name
  86. }
  87. func SortGuildChannels(channels []discord.Channel) {
  88. slices.SortFunc(channels, func(a, b discord.Channel) int {
  89. return cmp.Compare(a.Position, b.Position)
  90. })
  91. }
  92. func SortPrivateChannels(channels []discord.Channel) {
  93. slices.SortFunc(channels, func(a, b discord.Channel) int {
  94. // Descending order
  95. return cmp.Compare(getMessageIDFromChannel(b), getMessageIDFromChannel(a))
  96. })
  97. }
  98. func getMessageIDFromChannel(channel discord.Channel) discord.MessageID {
  99. if channel.LastMessageID.IsValid() {
  100. return channel.LastMessageID
  101. }
  102. return discord.MessageID(channel.ID)
  103. }