discord.go 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. package util
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "strings"
  6. "github.com/rigormorrtiss/discordgo"
  7. "github.com/rivo/tview"
  8. )
  9. // WriteMessage parses and writes the parsed message to the provided textview.
  10. func WriteMessage(v *tview.TextView, m *discordgo.Message, clientID string) {
  11. var b strings.Builder
  12. switch m.Type {
  13. case discordgo.MessageTypeDefault, discordgo.MessageTypeReply:
  14. parseReferencedMessage(&b, m.ReferencedMessage, clientID)
  15. parseAuthor(&b, m.Author, clientID)
  16. if m.Content != "" {
  17. m.Content = parseMessageMentions(m.Content, m.Mentions, clientID)
  18. b.WriteString(m.Content)
  19. }
  20. if m.EditedTimestamp != "" {
  21. b.WriteString(" [::d](edited)[::-]")
  22. }
  23. for range m.Embeds {
  24. b.WriteString("\n<EMBED>")
  25. }
  26. for _, a := range m.Attachments {
  27. b.WriteString("\n[")
  28. b.WriteString(a.Filename)
  29. b.WriteString("]: ")
  30. b.WriteString(a.URL)
  31. }
  32. fmt.Fprintln(v, b.String())
  33. case discordgo.MessageTypeGuildMemberJoin:
  34. b.WriteString("[#5865F2]")
  35. b.WriteString(m.Author.Username)
  36. b.WriteString("[-]")
  37. b.WriteString(" joined the server")
  38. fmt.Fprintln(v, b.String())
  39. }
  40. }
  41. func parseMessageMentions(content string, mentions []*discordgo.User, clientID string) string {
  42. for _, mUser := range mentions {
  43. var color string
  44. if mUser.ID == clientID {
  45. color = "[#000000:#FEE75C]"
  46. } else {
  47. color = "[:#5865F2]"
  48. }
  49. content = strings.NewReplacer(
  50. // <@USER_ID>
  51. "<@"+mUser.ID+">",
  52. color+"@"+mUser.Username+"[-:-]",
  53. // <@!USER_ID>
  54. "<@!"+mUser.ID+">",
  55. color+"@"+mUser.Username+"[-:-]",
  56. ).Replace(content)
  57. }
  58. return content
  59. }
  60. func parseAuthor(b *strings.Builder, u *discordgo.User, clientID string) {
  61. if u.ID == clientID {
  62. b.WriteString("[#57F287]")
  63. } else {
  64. b.WriteString("[#ED4245]")
  65. }
  66. b.WriteString(u.Username)
  67. b.WriteString("[-] ")
  68. if u.Bot {
  69. b.WriteString("[#EB459E]BOT[-] ")
  70. }
  71. }
  72. func parseReferencedMessage(b *strings.Builder, rm *discordgo.Message, clientID string) {
  73. if rm != nil {
  74. b.WriteString(" ╭ ")
  75. b.WriteString("[::d]")
  76. parseAuthor(b, rm.Author, clientID)
  77. if rm.Content != "" {
  78. rm.Content = parseMessageMentions(rm.Content, rm.Mentions, clientID)
  79. b.WriteString(rm.Content)
  80. }
  81. b.WriteString("[::-]\n")
  82. }
  83. }
  84. type loginResponse struct {
  85. MFA bool `json:"mfa"`
  86. SMS bool `json:"sms"`
  87. Ticket string `json:"ticket"`
  88. Token string `json:"token"`
  89. }
  90. // Login creates a new request to the `/login` endpoint for essential login information.
  91. func Login(s *discordgo.Session, email, password string) (*loginResponse, error) {
  92. data := struct {
  93. Email string `json:"email"`
  94. Password string `json:"password"`
  95. }{email, password}
  96. resp, err := s.RequestWithBucketID("POST", discordgo.EndpointLogin, data, discordgo.EndpointLogin)
  97. if err != nil {
  98. return nil, err
  99. }
  100. var lr loginResponse
  101. err = json.Unmarshal(resp, &lr)
  102. if err != nil {
  103. return nil, err
  104. }
  105. return &lr, nil
  106. }
  107. // TOTP creates a new request to `/mfa/totp` endpoint for time-based one-time
  108. // passcode for essential login information
  109. func TOTP(s *discordgo.Session, code, ticket string) (*loginResponse, error) {
  110. var data struct {
  111. Code string `json:"code"`
  112. Ticket string `json:"ticket"`
  113. }
  114. data.Code = code
  115. data.Ticket = ticket
  116. e := discordgo.EndpointAuth + "mfa/totp"
  117. resp, err := s.RequestWithBucketID("POST", e, data, e)
  118. if err != nil {
  119. return nil, err
  120. }
  121. var lr *loginResponse
  122. err = json.Unmarshal(resp, &lr)
  123. if err != nil {
  124. return nil, err
  125. }
  126. return lr, nil
  127. }
  128. // HasPermission returns a boolean representing whether the provided user has given permissions or not.
  129. func HasPermission(s *discordgo.State, uID string, cID string, perm int64) bool {
  130. p, err := s.UserChannelPermissions(uID, cID)
  131. if err != nil {
  132. return false
  133. }
  134. return p&perm == perm
  135. }