state.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. package ui
  2. import (
  3. "context"
  4. "fmt"
  5. "runtime"
  6. "strings"
  7. "github.com/ayntgl/discordo/config"
  8. "github.com/diamondburned/arikawa/v3/api"
  9. "github.com/diamondburned/arikawa/v3/discord"
  10. "github.com/diamondburned/arikawa/v3/gateway"
  11. "github.com/diamondburned/arikawa/v3/state"
  12. "github.com/rivo/tview"
  13. )
  14. func init() {
  15. api.UserAgent = fmt.Sprintf("%s/%s %s/%s", config.Name, "0.1", "arikawa", "v3")
  16. gateway.DefaultIdentity = gateway.IdentifyProperties{
  17. OS: runtime.GOOS,
  18. Browser: config.Name,
  19. }
  20. }
  21. type State struct {
  22. *state.State
  23. core *Core
  24. }
  25. func NewState(token string, c *Core) *State {
  26. return &State{
  27. State: state.New(token),
  28. core: c,
  29. }
  30. }
  31. func (s *State) Run() error {
  32. // Add the essential intents to the identify data for bot accounts.
  33. if strings.HasPrefix(s.Token, "Bot") {
  34. s.AddIntents(gateway.IntentGuilds | gateway.IntentGuildMessages)
  35. }
  36. s.AddHandler(s.ready)
  37. s.AddHandler(s.guildCreate)
  38. s.AddHandler(s.guildDelete)
  39. s.AddHandler(s.messageCreate)
  40. return s.Open(context.Background())
  41. }
  42. func (s *State) ready(r *gateway.ReadyEvent) {
  43. rootNode := s.core.GuildsTree.GetRoot()
  44. for _, gf := range r.UserSettings.GuildFolders {
  45. if gf.ID == 0 {
  46. for _, gID := range gf.GuildIDs {
  47. g, err := s.State.Cabinet.Guild(gID)
  48. if err != nil {
  49. return
  50. }
  51. guildNode := tview.NewTreeNode(g.Name)
  52. guildNode.SetReference(g.ID)
  53. rootNode.AddChild(guildNode)
  54. }
  55. } else {
  56. var b strings.Builder
  57. if gf.Color != discord.NullColor {
  58. b.WriteByte('[')
  59. b.WriteString(gf.Color.String())
  60. b.WriteByte(']')
  61. } else {
  62. b.WriteString("[#ED4245]")
  63. }
  64. if gf.Name != "" {
  65. b.WriteString(gf.Name)
  66. } else {
  67. b.WriteString("Folder")
  68. }
  69. b.WriteString("[-]")
  70. folderNode := tview.NewTreeNode(b.String())
  71. rootNode.AddChild(folderNode)
  72. for _, gID := range gf.GuildIDs {
  73. g, err := s.State.Cabinet.Guild(gID)
  74. if err != nil {
  75. return
  76. }
  77. guildNode := tview.NewTreeNode(g.Name)
  78. guildNode.SetReference(g.ID)
  79. folderNode.AddChild(guildNode)
  80. }
  81. }
  82. }
  83. s.core.GuildsTree.SetCurrentNode(rootNode)
  84. s.core.Application.SetFocus(s.core.GuildsTree)
  85. }
  86. func (s *State) guildCreate(g *gateway.GuildCreateEvent) {
  87. guildNode := tview.NewTreeNode(g.Name)
  88. guildNode.SetReference(g.ID)
  89. rootNode := s.core.GuildsTree.GetRoot()
  90. rootNode.AddChild(guildNode)
  91. s.core.GuildsTree.SetCurrentNode(rootNode)
  92. s.core.Application.SetFocus(s.core.GuildsTree)
  93. s.core.Application.Draw()
  94. }
  95. func (s *State) guildDelete(g *gateway.GuildDeleteEvent) {
  96. rootNode := s.core.GuildsTree.GetRoot()
  97. var parentNode *tview.TreeNode
  98. rootNode.Walk(func(node, _ *tview.TreeNode) bool {
  99. if node.GetReference() == g.ID {
  100. parentNode = node
  101. return false
  102. }
  103. return true
  104. })
  105. if parentNode != nil {
  106. rootNode.RemoveChild(parentNode)
  107. }
  108. s.core.Application.Draw()
  109. }
  110. func (s *State) messageCreate(m *gateway.MessageCreateEvent) {
  111. if s.core.ChannelsTree.SelectedChannel != nil && s.core.ChannelsTree.SelectedChannel.ID == m.ChannelID {
  112. _, err := s.core.MessagesPanel.Write(buildMessage(s.core, m.Message))
  113. if err != nil {
  114. return
  115. }
  116. if len(s.core.MessagesPanel.GetHighlights()) == 0 {
  117. s.core.MessagesPanel.ScrollToEnd()
  118. }
  119. }
  120. }