21 SpoilerText string |
20 SpoilerText string |
22 Visibility string // "direct", "private", "unlisted" or "public" |
21 Visibility string // "direct", "private", "unlisted" or "public" |
23 } |
22 } |
24 |
23 |
25 // queryStatusData queries the statuses API |
24 // queryStatusData queries the statuses API |
26 // The subquery can be empty or "status" (the status itself), "context", |
25 // The operation 'op' can be empty or "status" (the status itself), "context", |
27 // "card", "reblogged_by", "favourited_by". |
26 // "card", "reblogged_by", "favourited_by". |
28 // The data argument will receive the object(s) returned by the API server. |
27 // The data argument will receive the object(s) returned by the API server. |
29 func (g *Client) queryStatusData(statusID int, subquery string, data interface{}) error { |
28 func (g *Client) queryStatusData(statusID int, op string, data interface{}) error { |
30 endPoint := "statuses/" + strconv.Itoa(statusID) |
|
31 |
|
32 if statusID < 1 { |
29 if statusID < 1 { |
33 return ErrInvalidID |
30 return ErrInvalidID |
34 } |
31 } |
35 |
32 |
36 if subquery != "" && subquery != "status" { |
33 endPoint := "statuses/" + strconv.Itoa(statusID) |
37 switch subquery { |
34 |
|
35 if op != "" && op != "status" { |
|
36 switch op { |
38 case "context", "card", "reblogged_by", "favourited_by": |
37 case "context", "card", "reblogged_by", "favourited_by": |
39 default: |
38 default: |
40 return ErrInvalidParameter |
39 return ErrInvalidParameter |
41 } |
40 } |
42 |
41 |
43 endPoint += "/" + subquery |
42 endPoint += "/" + op |
44 } |
43 } |
45 req := g.prepareRequest(endPoint) |
44 |
46 r, err := rest.API(req) |
45 return g.apiCall(endPoint, rest.Get, nil, data) |
47 if err != nil { |
|
48 return fmt.Errorf("status/%s API query: %s", subquery, err.Error()) |
|
49 } |
|
50 |
|
51 // Check for error reply |
|
52 var errorResult Error |
|
53 if err := json.Unmarshal([]byte(r.Body), &errorResult); err == nil { |
|
54 // The empty object is not an error |
|
55 if errorResult.Text != "" { |
|
56 return fmt.Errorf("%s", errorResult.Text) |
|
57 } |
|
58 } |
|
59 |
|
60 // Not an error reply; let's unmarshal the data |
|
61 err = json.Unmarshal([]byte(r.Body), &data) |
|
62 if err != nil { |
|
63 return fmt.Errorf("status/%s API: %s", subquery, err.Error()) |
|
64 } |
|
65 return nil |
|
66 } |
46 } |
67 |
47 |
68 // updateStatusData updates the statuses |
48 // updateStatusData updates the statuses |
69 // The subquery can be empty or "status" (to post a status), "delete" (for |
49 // The operation 'op' can be empty or "status" (to post a status), "delete" |
70 // deleting a status), "reblog", "unreblog", "favourite", "unfavourite". |
50 // (for deleting a status), "reblog", "unreblog", "favourite", "unfavourite". |
71 // The data argument will receive the object(s) returned by the API server. |
51 // The data argument will receive the object(s) returned by the API server. |
72 func (g *Client) updateStatusData(subquery string, opts updateStatusOptions, data interface{}) error { |
52 func (g *Client) updateStatusData(op string, opts updateStatusOptions, data interface{}) error { |
73 method := rest.Post |
53 method := rest.Post |
74 endPoint := "statuses" |
54 endPoint := "statuses" |
75 |
55 params := make(apiCallParams) |
76 switch subquery { |
56 |
|
57 switch op { |
77 case "", "status": |
58 case "", "status": |
78 subquery = "status" |
59 op = "status" |
79 if opts.Status == "" { |
60 if opts.Status == "" { |
80 return ErrInvalidParameter |
61 return ErrInvalidParameter |
81 } |
62 } |
82 switch opts.Visibility { |
63 switch opts.Visibility { |
83 case "", "direct", "private", "unlisted", "public": |
64 case "", "direct", "private", "unlisted", "public": |
96 endPoint += "/" + strconv.Itoa(opts.ID) |
77 endPoint += "/" + strconv.Itoa(opts.ID) |
97 case "reblog", "unreblog", "favourite", "unfavourite": |
78 case "reblog", "unreblog", "favourite", "unfavourite": |
98 if opts.ID < 1 { |
79 if opts.ID < 1 { |
99 return ErrInvalidID |
80 return ErrInvalidID |
100 } |
81 } |
101 endPoint += "/" + strconv.Itoa(opts.ID) + "/" + subquery |
82 endPoint += "/" + strconv.Itoa(opts.ID) + "/" + op |
102 default: |
83 default: |
103 return ErrInvalidParameter |
84 return ErrInvalidParameter |
104 } |
85 } |
105 |
86 |
106 req := g.prepareRequest(endPoint) |
|
107 req.Method = method |
|
108 |
|
109 // Form items for a new toot |
87 // Form items for a new toot |
110 if subquery == "status" { |
88 if op == "status" { |
111 req.QueryParams["status"] = opts.Status |
89 params["status"] = opts.Status |
112 if opts.InReplyToID > 0 { |
90 if opts.InReplyToID > 0 { |
113 req.QueryParams["in_reply_to_id"] = strconv.Itoa(opts.InReplyToID) |
91 params["in_reply_to_id"] = strconv.Itoa(opts.InReplyToID) |
114 } |
92 } |
115 for i, id := range opts.MediaIDs { |
93 for i, id := range opts.MediaIDs { |
116 qID := fmt.Sprintf("media_ids[%d]", i+1) |
94 qID := fmt.Sprintf("media_ids[%d]", i+1) |
117 req.QueryParams[qID] = strconv.Itoa(id) |
95 params[qID] = strconv.Itoa(id) |
118 } |
96 } |
119 if opts.Sensitive { |
97 if opts.Sensitive { |
120 req.QueryParams["sensitive"] = "true" |
98 params["sensitive"] = "true" |
121 } |
99 } |
122 if opts.SpoilerText != "" { |
100 if opts.SpoilerText != "" { |
123 req.QueryParams["spoiler_text"] = opts.SpoilerText |
101 params["spoiler_text"] = opts.SpoilerText |
124 } |
102 } |
125 if opts.Visibility != "" { |
103 if opts.Visibility != "" { |
126 req.QueryParams["visibility"] = opts.Visibility |
104 params["visibility"] = opts.Visibility |
127 } |
105 } |
128 } |
106 } |
129 |
107 |
130 r, err := rest.API(req) |
108 return g.apiCall(endPoint, method, params, data) |
131 if err != nil { |
|
132 return fmt.Errorf("status/%s API query: %s", subquery, err.Error()) |
|
133 } |
|
134 |
|
135 // Check for error reply |
|
136 var errorResult Error |
|
137 if err := json.Unmarshal([]byte(r.Body), &errorResult); err == nil { |
|
138 // The empty object is not an error |
|
139 if errorResult.Text != "" { |
|
140 return fmt.Errorf("%s", errorResult.Text) |
|
141 } |
|
142 } |
|
143 |
|
144 // Not an error reply; let's unmarshal the data |
|
145 err = json.Unmarshal([]byte(r.Body), &data) |
|
146 if err != nil { |
|
147 return fmt.Errorf("status/%s API: %s", subquery, err.Error()) |
|
148 } |
|
149 return nil |
|
150 } |
109 } |
151 |
110 |
152 // GetStatus returns a status |
111 // GetStatus returns a status |
153 // The returned status can be nil if there is an error or if the |
112 // The returned status can be nil if there is an error or if the |
154 // requested ID does not exist. |
113 // requested ID does not exist. |