discord.go 4.6 KB

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