newsletter.go 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. // Copyright (c) 2023 Tulir Asokan
  2. //
  3. // This Source Code Form is subject to the terms of the Mozilla Public
  4. // License, v. 2.0. If a copy of the MPL was not distributed with this
  5. // file, You can obtain one at http://mozilla.org/MPL/2.0/.
  6. package types
  7. import (
  8. "bytes"
  9. "encoding/json"
  10. "fmt"
  11. "time"
  12. "go.mau.fi/util/jsontime"
  13. "go.mau.fi/whatsmeow/proto/waE2E"
  14. )
  15. type NewsletterVerificationState string
  16. func (nvs *NewsletterVerificationState) UnmarshalText(text []byte) error {
  17. *nvs = NewsletterVerificationState(bytes.ToLower(text))
  18. return nil
  19. }
  20. const (
  21. NewsletterVerificationStateVerified NewsletterVerificationState = "verified"
  22. NewsletterVerificationStateUnverified NewsletterVerificationState = "unverified"
  23. )
  24. type NewsletterPrivacy string
  25. func (np *NewsletterPrivacy) UnmarshalText(text []byte) error {
  26. *np = NewsletterPrivacy(bytes.ToLower(text))
  27. return nil
  28. }
  29. const (
  30. NewsletterPrivacyPrivate NewsletterPrivacy = "private"
  31. NewsletterPrivacyPublic NewsletterPrivacy = "public"
  32. )
  33. type NewsletterReactionsMode string
  34. const (
  35. NewsletterReactionsModeAll NewsletterReactionsMode = "all"
  36. NewsletterReactionsModeBasic NewsletterReactionsMode = "basic"
  37. NewsletterReactionsModeNone NewsletterReactionsMode = "none"
  38. NewsletterReactionsModeBlocklist NewsletterReactionsMode = "blocklist"
  39. )
  40. type NewsletterState string
  41. func (ns *NewsletterState) UnmarshalText(text []byte) error {
  42. *ns = NewsletterState(bytes.ToLower(text))
  43. return nil
  44. }
  45. const (
  46. NewsletterStateActive NewsletterState = "active"
  47. NewsletterStateSuspended NewsletterState = "suspended"
  48. NewsletterStateGeoSuspended NewsletterState = "geosuspended"
  49. )
  50. type NewsletterMuted struct {
  51. Muted bool
  52. }
  53. type WrappedNewsletterState struct {
  54. Type NewsletterState `json:"type"`
  55. }
  56. type NewsletterMuteState string
  57. func (nms *NewsletterMuteState) UnmarshalText(text []byte) error {
  58. *nms = NewsletterMuteState(bytes.ToLower(text))
  59. return nil
  60. }
  61. const (
  62. NewsletterMuteOn NewsletterMuteState = "on"
  63. NewsletterMuteOff NewsletterMuteState = "off"
  64. )
  65. type NewsletterRole string
  66. func (nr *NewsletterRole) UnmarshalText(text []byte) error {
  67. *nr = NewsletterRole(bytes.ToLower(text))
  68. return nil
  69. }
  70. const (
  71. NewsletterRoleSubscriber NewsletterRole = "subscriber"
  72. NewsletterRoleGuest NewsletterRole = "guest"
  73. NewsletterRoleAdmin NewsletterRole = "admin"
  74. NewsletterRoleOwner NewsletterRole = "owner"
  75. )
  76. type NewsletterMetadata struct {
  77. ID JID `json:"id"`
  78. State WrappedNewsletterState `json:"state"`
  79. ThreadMeta NewsletterThreadMetadata `json:"thread_metadata"`
  80. ViewerMeta *NewsletterViewerMetadata `json:"viewer_metadata"`
  81. }
  82. type NewsletterViewerMetadata struct {
  83. Mute NewsletterMuteState `json:"mute"`
  84. Role NewsletterRole `json:"role"`
  85. }
  86. type NewsletterKeyType string
  87. const (
  88. NewsletterKeyTypeJID NewsletterKeyType = "JID"
  89. NewsletterKeyTypeInvite NewsletterKeyType = "INVITE"
  90. )
  91. type NewsletterReactionSettings struct {
  92. Value NewsletterReactionsMode `json:"value"`
  93. }
  94. type NewsletterSettings struct {
  95. ReactionCodes NewsletterReactionSettings `json:"reaction_codes"`
  96. }
  97. type NewsletterThreadMetadata struct {
  98. CreationTime jsontime.UnixString `json:"creation_time"`
  99. InviteCode string `json:"invite"`
  100. Name NewsletterText `json:"name"`
  101. Description NewsletterText `json:"description"`
  102. SubscriberCount int `json:"subscribers_count,string"`
  103. VerificationState NewsletterVerificationState `json:"verification"`
  104. Picture *ProfilePictureInfo `json:"picture"`
  105. Preview ProfilePictureInfo `json:"preview"`
  106. Settings NewsletterSettings `json:"settings"`
  107. //NewsletterMuted `json:"-"`
  108. //PrivacyType NewsletterPrivacy `json:"-"`
  109. //ReactionsMode NewsletterReactionsMode `json:"-"`
  110. //State NewsletterState `json:"-"`
  111. }
  112. type NewsletterText struct {
  113. Text string `json:"text"`
  114. ID string `json:"id"`
  115. UpdateTime jsontime.UnixMicroString `json:"update_time"`
  116. }
  117. type NewsletterMessage struct {
  118. MessageServerID MessageServerID
  119. MessageID MessageID
  120. Type string
  121. Timestamp time.Time
  122. ViewsCount int
  123. ReactionCounts map[string]int
  124. // This is only present when fetching messages, not in live updates
  125. Message *waE2E.Message
  126. }
  127. type GraphQLErrorExtensions struct {
  128. ErrorCode int `json:"error_code"`
  129. IsRetryable bool `json:"is_retryable"`
  130. Severity string `json:"severity"`
  131. }
  132. type GraphQLError struct {
  133. Extensions GraphQLErrorExtensions `json:"extensions"`
  134. Message string `json:"message"`
  135. Path []string `json:"path"`
  136. }
  137. func (gqle GraphQLError) Error() string {
  138. return fmt.Sprintf("%d %s (%s)", gqle.Extensions.ErrorCode, gqle.Message, gqle.Extensions.Severity)
  139. }
  140. type GraphQLErrors []GraphQLError
  141. func (gqles GraphQLErrors) Unwrap() []error {
  142. errs := make([]error, len(gqles))
  143. for i, gqle := range gqles {
  144. errs[i] = gqle
  145. }
  146. return errs
  147. }
  148. func (gqles GraphQLErrors) Error() string {
  149. if len(gqles) == 0 {
  150. return ""
  151. } else if len(gqles) == 1 {
  152. return gqles[0].Error()
  153. } else {
  154. return fmt.Sprintf("%v (and %d other errors)", gqles[0], len(gqles)-1)
  155. }
  156. }
  157. type GraphQLResponse struct {
  158. Data json.RawMessage `json:"data"`
  159. Errors GraphQLErrors `json:"errors"`
  160. }