BibleBot/rdrama.go

85 lines
1.6 KiB
Go

package main
import (
"encoding/json"
"fmt"
"net/http"
"net/url"
"time"
)
type RDramaClient struct {
baseURL string
apiKey string
}
func NewRDramaClient(baseURL, apiKey string) *RDramaClient {
return &RDramaClient{
baseURL: baseURL,
apiKey: apiKey,
}
}
func (c *RDramaClient) makeRequest(method, path string, v interface{}) error {
url := c.baseURL + path
req, err := http.NewRequest(method, url, nil)
if err != nil {
return err
}
req.Header.Add("Authorization", fmt.Sprintf("%s", c.apiKey))
client := http.Client{}
resp, err := client.Do(req)
if err != nil {
return err
}
defer resp.Body.Close()
if !(resp.StatusCode >= 200 && resp.StatusCode < 300) {
return fmt.Errorf("unexpected status code: %d", resp.StatusCode)
}
return json.NewDecoder(resp.Body).Decode(v)
}
type CommentResponse struct {
Data []Comment `json:"data"`
}
type Comment struct {
ID int `json:"id"`
Author string `json:"author_name"`
Text string `json:"body"`
}
type SearchParams struct {
Hole string
After time.Time
Before time.Time
}
func (c *RDramaClient) GetComments(params SearchParams) ([]Comment, error) {
var s string
if params.Hole != "" {
s += fmt.Sprintf("hole:%s", params.Hole)
}
nullTime := time.Time{}
if params.After != nullTime {
s += fmt.Sprintf(" after:%d", params.After.Unix())
}
if params.Before != nullTime {
s += fmt.Sprintf(" before:%d", params.Before.Unix())
}
v := url.Values{}
v.Set("q", s)
url := "/search/comments?" + v.Encode()
fmt.Printf("URL: %s\n", url)
var comments CommentResponse
if err := c.makeRequest("GET", url, &comments); err != nil {
return nil, err
}
return comments.Data, nil
}