users.go 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. package discourse
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "io/ioutil"
  6. "net/http"
  7. "strings"
  8. "time"
  9. "github.com/sirupsen/logrus"
  10. )
  11. // UserResponse - Structure of a discourse user api response// UserResponse - Structure of a discourse user api response
  12. // type UserResponse struct {
  13. // User User `json:"user"`
  14. // Errors []string `json:"errors"`
  15. // ErrorType string `json:"error_type"`
  16. // }
  17. // User - A discoruse User
  18. // type User struct {
  19. // ID int `json:"id" schema:"external_id"`
  20. // Username string `json:"username"`
  21. // CanSendPM bool `json:"can_send_private_messages"`
  22. // Moderator bool `json:"moderator"`
  23. // Admin bool `json:"admin"`
  24. // TrustLevel int `json:"trust_level"`
  25. // Groups []Group `json:"groups"`
  26. // GroupStr string `schema:"groups"`
  27. // }
  28. // Generated by https://quicktype.io
  29. // type User struct {
  30. // ID int64 `json:"id"`
  31. // Username string `json:"username"`
  32. // Name interface{} `json:"name"`
  33. // AvatarTemplate string `json:"avatar_template"`
  34. // Email string `json:"email"`
  35. // SecondaryEmails []interface{} `json:"secondary_emails"`
  36. // Active bool `json:"active"`
  37. // Admin bool `json:"admin"`
  38. // Moderator bool `json:"moderator"`
  39. // LastSeenAt interface{} `json:"last_seen_at"`
  40. // LastEmailedAt interface{} `json:"last_emailed_at"`
  41. // CreatedAt string `json:"created_at"`
  42. // LastSeenAge interface{} `json:"last_seen_age"`
  43. // LastEmailedAge interface{} `json:"last_emailed_age"`
  44. // CreatedAtAge interface{} `json:"created_at_age"`
  45. // TrustLevel int64 `json:"trust_level"`
  46. // ManualLockedTrustLevel interface{} `json:"manual_locked_trust_level"`
  47. // FlagLevel int64 `json:"flag_level"`
  48. // Title interface{} `json:"title"`
  49. // TimeRead int64 `json:"time_read"`
  50. // Staged bool `json:"staged"`
  51. // DaysVisited int64 `json:"days_visited"`
  52. // PostsReadCount int64 `json:"posts_read_count"`
  53. // TopicsEntered int64 `json:"topics_entered"`
  54. // PostCount int64 `json:"post_count"`
  55. // }
  56. // Generated by https://quicktype.io
  57. // type GroupMembers struct {
  58. // Members []Member `json:"members"`
  59. // Owners []Member `json:"owners"`
  60. // Meta Meta `json:"meta"`
  61. // Errors []string `json:"errors"`
  62. // ErrorType string `json:"error_type"`
  63. // }
  64. // type Member struct {
  65. // ID int64 `json:"id"`
  66. // Username string `json:"username"`
  67. // Name interface{} `json:"name"`
  68. // AvatarTemplate string `json:"avatar_template"`
  69. // Title interface{} `json:"title"`
  70. // LastPostedAt string `json:"last_posted_at"`
  71. // LastSeenAt string `json:"last_seen_at"`
  72. // AddedAt string `json:"added_at"`
  73. // Timezone string `json:"timezone"`
  74. // }
  75. // type Meta struct {
  76. // Total int64 `json:"total"`
  77. // Limit int64 `json:"limit"`
  78. // Offset int64 `json:"offset"`
  79. // }
  80. // GetUser - Get a discourse user
  81. func GetUser(config APIConfig, username string) (User, error) {
  82. url := fmt.Sprintf("%s/users/%s.json", config.Endpoint, username)
  83. fmt.Println(url)
  84. req, _ := newGetRequest(config, url)
  85. client := getClient(rl)
  86. response, _ := client.Do(req)
  87. var result *UserResponse
  88. json.NewDecoder(response.Body).Decode(&result)
  89. if result.ErrorType != "" {
  90. return User{}, fmt.Errorf("Failed to get discourse user. Error: %s", strings.Join(result.Errors, "; "))
  91. }
  92. return result.User, nil
  93. }
  94. func GetUserByID(config APIConfig, userID int) (User, error) {
  95. url := fmt.Sprintf("%s/admin/users/%d.json", config.Endpoint, userID)
  96. req, _ := newGetRequest(config, url)
  97. client := getClient(rl)
  98. response, _ := client.Do(req)
  99. if response.StatusCode != http.StatusOK {
  100. var errorResult *UserResponse
  101. json.NewDecoder(response.Body).Decode(&errorResult)
  102. if errorResult.ErrorType != "" {
  103. return User{}, fmt.Errorf("failed to get discourse user. Error: %s", strings.Join(errorResult.Errors, "; "))
  104. }
  105. }
  106. var result *User
  107. json.NewDecoder(response.Body).Decode(&result)
  108. return *result, nil
  109. }
  110. func GetUsersByMinTrustLevel(config APIConfig, minTrustLevel int64) ([]User, error) {
  111. page := 1
  112. getMoreResults := true
  113. var users []User
  114. for getMoreResults {
  115. var pageResults, _ = GetUsersPage(config, page)
  116. if len(pageResults) > 0 {
  117. for _, v := range pageResults {
  118. if v.Staged == false && v.TrustLevel >= minTrustLevel {
  119. u, err := GetUser(config, v.Username)
  120. if err != nil {
  121. return nil, err
  122. }
  123. users = append(users, u)
  124. }
  125. }
  126. page++
  127. } else {
  128. getMoreResults = false
  129. }
  130. }
  131. return users, nil
  132. }
  133. func GetUsersPage(config APIConfig, page int) ([]User, error) {
  134. url := fmt.Sprintf("%s/admin/users/list/active.json?page=%d&?filter=&show_emails=false", config.Endpoint, page)
  135. fmt.Println(url)
  136. req, _ := newGetRequest(config, url)
  137. client := getClient(rl)
  138. response, _ := client.Do(req)
  139. time.Sleep(1 * time.Second)
  140. bodyBytes, err := ioutil.ReadAll(response.Body)
  141. if err != nil {
  142. logrus.Fatal(err)
  143. }
  144. var users []User
  145. json.Unmarshal(bodyBytes, &users)
  146. return users, nil
  147. }