package twitter
import (
"encoding/json"
"errors"
"net/http"
"strings"
"github.com/garyburd/go-oauth/oauth"
)
var (
ErrBadTweetURL = errors.New("bad tweet url")
)
type Publisher struct {
client *http.Client
baseURL string
oauth *oauth.Client
credentials *oauth.Credentials
}
func (p *Publisher) Publish(data map[string][]interface{}) (string, error) {
if like, ok := data["u-like-of"]; ok && len(like) == 1 {
tweetID, err := tweetIDFromURL(like[0].(string))
if err != nil {
return "", err
}
likeURL := p.baseURL + "/1.1/favorites/create.json?id=" + tweetID
req, err := http.NewRequest("POST", likeURL, nil)
if err != nil {
return "", err
}
req.Header.Set("Content-Type", "application/json")
req.Header.Set("Authorization", p.oauth.AuthorizationHeader(p.credentials, req.Method, req.URL, nil))
resp, err := p.client.Do(req)
if err != nil {
return "", err
}
defer resp.Body.Close()
var out struct {
Location string
}
if err := json.NewDecoder(resp.Body).Decode(&out); err != nil {
return "", err
}
return out.Location, nil
}
return "", nil
}
func tweetIDFromURL(u string) (string, error) {
parts := strings.Split(u, "/status/")
if len(parts) != 2 || !strings.HasPrefix(parts[0], "https://twitter.com/") {
return "", ErrBadTweetURL
}
return parts[1], nil
}