search.go 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. package anaconda
  2. import (
  3. "net/url"
  4. )
  5. type SearchMetadata struct {
  6. CompletedIn float32 `json:"completed_in"`
  7. MaxId int64 `json:"max_id"`
  8. MaxIdString string `json:"max_id_str"`
  9. Query string `json:"query"`
  10. RefreshUrl string `json:"refresh_url"`
  11. Count int `json:"count"`
  12. SinceId int64 `json:"since_id"`
  13. SinceIdString string `json:"since_id_str"`
  14. NextResults string `json:"next_results"`
  15. }
  16. type SearchResponse struct {
  17. Statuses []Tweet `json:"statuses"`
  18. Metadata SearchMetadata `json:"search_metadata"`
  19. }
  20. func (sr *SearchResponse) GetNext(a *TwitterApi) (SearchResponse, error) {
  21. if sr.Metadata.NextResults == "" {
  22. return SearchResponse{}, nil
  23. }
  24. nextUrl, err := url.Parse(sr.Metadata.NextResults)
  25. if err != nil {
  26. return SearchResponse{}, err
  27. }
  28. v := nextUrl.Query()
  29. // remove the q parameter from the url.Values so that it
  30. // can be added back via the next GetSearch method call.
  31. delete(v, "q")
  32. q, _ := url.QueryUnescape(sr.Metadata.Query)
  33. if err != nil {
  34. return SearchResponse{}, err
  35. }
  36. newSr, err := a.GetSearch(q, v)
  37. return newSr, err
  38. }
  39. func (a TwitterApi) GetSearch(queryString string, v url.Values) (sr SearchResponse, err error) {
  40. v = cleanValues(v)
  41. v.Set("q", queryString)
  42. response_ch := make(chan response)
  43. a.queryQueue <- query{a.baseUrl + "/search/tweets.json", v, &sr, _GET, response_ch}
  44. // We have to read from the response channel before assigning to timeline
  45. // Otherwise this will happen before the responses have been written
  46. resp := <-response_ch
  47. err = resp.err
  48. return sr, err
  49. }