From 7ef168e3ddc58b3fc19ca3daf1bd191b123e0e07 Mon Sep 17 00:00:00 2001 From: Yasuhiro Matsumoto Date: Fri, 14 Apr 2017 11:49:52 +0900 Subject: [PATCH] add ErrorEvent --- cmd/mstdn/main.go | 10 +++--- mastodon.go | 85 ++++++++++++++++++++++++++++++----------------- 2 files changed, 59 insertions(+), 36 deletions(-) diff --git a/cmd/mstdn/main.go b/cmd/mstdn/main.go index 423269d..fefe2b1 100644 --- a/cmd/mstdn/main.go +++ b/cmd/mstdn/main.go @@ -30,11 +30,7 @@ func extractText(node *html.Node, w *bytes.Buffer) { if node.Type == html.TextNode { data := strings.Trim(node.Data, "\r\n") if data != "" { - w.WriteString(data) - } - } else if node.Type == html.ElementNode { - if node.Data == "li" { - w.WriteString("\n* ") + w.WriteString(data + "\n") } } for c := node.FirstChild; c != nil; c = c.NextSibling { @@ -166,6 +162,10 @@ func main() { fmt.Println(t.Status.Account.Username) color.Set(color.Reset) fmt.Println(textContent(t.Status.Content)) + case *mastodon.ErrorEvent: + color.Set(color.FgYellow) + fmt.Println(t.Error()) + color.Set(color.Reset) } } return diff --git a/mastodon.go b/mastodon.go index a410ecf..7cb762e 100644 --- a/mastodon.go +++ b/mastodon.go @@ -5,8 +5,10 @@ import ( "context" "encoding/json" "fmt" + "io" "net/http" "net/url" + "os" "path" "strings" "time" @@ -231,7 +233,9 @@ func (c *client) GetTimelineHome() ([]*Status, error) { func (c *client) PostStatus(toot *Toot) (*Status, error) { params := url.Values{} params.Set("status", toot.Status) - //params.Set("in_reply_to_id", fmt.Sprint(toot.InReplyToID)) + if toot.InReplyToID > 0 { + params.Set("in_reply_to_id", fmt.Sprint(toot.InReplyToID)) + } // TODO: media_ids, senstitive, spoiler_text, visibility //params.Set("visibility", "public") @@ -277,6 +281,13 @@ type DeleteEvent struct { func (e *DeleteEvent) event() {} +type ErrorEvent struct { + err error +} + +func (e *ErrorEvent) Error() string { return e.err.Error() } +func (e *ErrorEvent) event() {} + type Event interface { event() } @@ -288,46 +299,58 @@ func (c *client) StreamingPublic(ctx context.Context) (chan Event, error) { } url.Path = path.Join(url.Path, "/api/v1/streaming/public") - req, err := http.NewRequest("GET", url.String(), nil) - if err != nil { - return nil, err - } - req.Header.Set("Authorization", "Bearer "+c.config.AccessToken) - resp, err := c.Do(req) - if err != nil { - return nil, err - } + var resp *http.Response - q := make(chan Event) + q := make(chan Event, 10) go func() { defer ctx.Done() - name := "" - s := bufio.NewScanner(resp.Body) - for s.Scan() { - line := s.Text() - token := strings.SplitN(line, ":", 2) - if len(token) != 2 { - continue + + for { + req, err := http.NewRequest("GET", url.String(), nil) + if err == nil { + req.Header.Set("Authorization", "Bearer "+c.config.AccessToken) + resp, err = c.Do(req) } - switch strings.TrimSpace(token[0]) { - case "event": - name = strings.TrimSpace(token[1]) - case "data": - switch name { - case "update": - var status Status - json.Unmarshal([]byte(token[1]), &status) - q <- &UpdateEvent{&status} - case "notification": - case "delete": + if err == nil { + name := "" + s := bufio.NewScanner(io.TeeReader(resp.Body, os.Stdout)) + for s.Scan() { + line := s.Text() + token := strings.SplitN(line, ":", 2) + if len(token) != 2 { + continue + } + switch strings.TrimSpace(token[0]) { + case "event": + name = strings.TrimSpace(token[1]) + case "data": + switch name { + case "update": + var status Status + json.Unmarshal([]byte(token[1]), &status) + q <- &UpdateEvent{&status} + case "notification": + case "delete": + } + default: + } } + resp.Body.Close() + err = ctx.Err() + if err == nil { + break + } + } else { + q <- &ErrorEvent{err} } + time.Sleep(3 * time.Second) } - fmt.Println(s.Err()) }() go func() { <-ctx.Done() - resp.Body.Close() + if resp != nil && resp.Body != nil { + resp.Body.Close() + } }() return q, nil }