users.go 5.2 KB

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