// handleTimelineNotification processes a timeline notification. func handleTimelineNotification(c appengine.Context, svc *mirror.Service, not *mirror.Notification, transport *oauth.Transport) error { for _, ua := range not.UserActions { if ua.Type != "SHARE" { c.Infof("I don't know what to do with this notification: %+v", ua) continue } t, err := svc.Timeline.Get(not.ItemId).Do() if err != nil { return fmt.Errorf("Unable to retrieve timeline item: %s", err) } nt := &mirror.TimelineItem{ Text: fmt.Sprintf("Echoing your shared item: %s", t.Text), Notification: &mirror.NotificationConfig{Level: "DEFAULT"}, } tic := svc.Timeline.Insert(nt) if t.Attachments != nil && len(t.Attachments) > 0 { a, err := svc.Timeline.Attachments.Get(t.Id, t.Attachments[0].Id).Do() if err != nil { return fmt.Errorf("Unable to retrieve attachment metadata: %s", err) } req, err := http.NewRequest("GET", a.ContentUrl, nil) if err != nil { return fmt.Errorf("Unable to create new HTTP request: %s", err) } resp, err := transport.RoundTrip(req) if err != nil { return fmt.Errorf("Unable to retrieve attachment content: %s", err) } defer resp.Body.Close() tic.Media(resp.Body) } _, err = tic.Do() if err != nil { return fmt.Errorf("Unable to insert timeline item: %s", err) } } return nil }