discord.go 3.6 KB

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