mastodon-cpp  0.110.0
mastodon-cpp.hpp
1 /* This file is part of mastodon-cpp.
2  * Copyright © 2018, 2019 tastytea <tastytea@tastytea.de>
3  *
4  * This program is free software: you can redistribute it and/or modify
5  * it under the terms of the GNU Affero General Public License as published by
6  * the Free Software Foundation, version 3.
7  *
8  * This program is distributed in the hope that it will be useful,
9  * but WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11  * GNU Affero General Public License for more details.
12  *
13  * You should have received a copy of the GNU Affero General Public License
14  * along with this program. If not, see <http://www.gnu.org/licenses/>.
15  */
16 
17 #ifndef MASTODON_CPP_HPP
18 #define MASTODON_CPP_HPP
19 
20 #include <string>
21 #include <vector>
22 #include <memory>
23 #include <array>
24 #include <mutex>
25 #include <ostream>
26 #include <thread>
27 #include <cstdint>
28 #include <Poco/Net/HTMLForm.h>
29 
30 #include "return_types.hpp"
31 #include "types.hpp"
32 
33 using std::string;
34 using std::uint8_t;
35 using std::unique_ptr;
36 using Poco::Net::HTMLForm;
37 
47 namespace Mastodon
48 {
69  class API
70  {
71  public:
77  class http
78  {
79  public:
89  explicit http(const API &api, const string &instance,
90  const string &access_token);
91  ~http();
92  return_call request(const http_method &meth, const string &path);
93 
103  return_call request(const http_method &meth,
104  const string &path,
105  HTMLForm &formdata);
106 
115  void request_stream(const string &path, string &stream);
116 
120  void get_headers(string &headers) const;
121 
131  void cancel_stream();
132 
143  std::mutex &get_mutex();
144 
153  void set_proxy(const string &hostport, const string &userpw = "");
154 
155  private:
156  const API &parent;
157  const string _instance;
158  const string _access_token;
159  string _headers;
160  bool _cancel_stream;
161  std::mutex _mutex;
162  std::thread _streamthread;
163 
164  return_call request_common(const http_method &meth,
165  const string &path,
166  HTMLForm &formdata,
167  string &answer);
168  size_t callback_write(char* data, size_t size, size_t nmemb,
169  string *oss);
170  double callback_progress(double /* dltotal */, double /* dlnow */,
171  double /* ultotal */, double /* ulnow */);
172  };
173 
181  enum class v1
182  {
183  // Mastodon
184  accounts_id,
185  accounts,
186  accounts_verify_credentials,
187  accounts_update_credentials,
188  accounts_id_followers,
189  accounts_id_following,
190  accounts_id_statuses,
191  accounts_id_follow,
192  accounts_id_unfollow,
193  accounts_relationships,
194  accounts_search,
195 
196  apps,
197  apps_verify_credentials,
198 
199  blocks,
200  accounts_id_block,
201  accounts_id_unblock,
202 
203  custom_emojis,
204 
205  domain_blocks,
206 
207  endorsements,
208  accounts_id_pin,
209  accounts_id_unpin,
210 
211  favourites,
212  statuses_id_favourite,
213  statuses_id_unfavourite,
214 
215  filters,
216  filters_id,
217 
218  follow_requests,
219  follow_requests_id_authorize,
220  follow_requests_id_reject,
221 
222  suggestions,
223  suggestions_accountid,
224 
225  instance,
226 
227  lists,
228  accounts_id_lists,
229  lists_id_accounts,
230  lists_id,
231 
232  media,
233  media_id,
234 
235  mutes,
236  accounts_id_mute,
237  accounts_id_unmute,
238  statuses_id_mute,
239  statuses_id_unmute,
240 
241  notifications,
242  notifications_id,
243  notifications_clear,
244  notifications_dismiss,
245  push_subscription,
246 
247  polls_id,
248  polls_id_votes,
249 
250  reports,
251 
252  // scheduled_statuses,
253  // scheduled_statuses_id,
254 
255  statuses_id,
256  statuses_id_context,
257  statuses_id_card,
258  statuses_id_reblogged_by,
259  statuses_id_favourited_by,
260  statuses,
261  statuses_id_reblog,
262  statuses_id_unreblog,
263  statuses_id_pin,
264  statuses_id_unpin,
265 
266  timelines_home,
267  conversations,
268  timelines_public,
269  timelines_tag_hashtag,
270  timelines_list_list_id,
271 
272  streaming_health,
273  streaming_user,
274  streaming_public,
275  streaming_public_local,
276  streaming_hashtag,
277  streaming_hashtag_local,
278  streaming_list,
279  streaming_direct,
280 
281  // Glitch-Soc
282  bookmarks,
283  statuses_id_bookmark,
284  statuses_id_unbookmark
285  };
286 
294  enum class v2
295  {
296  search
297  };
298 
310  explicit API(const string &instance, const string &access_token);
311 
317  virtual ~API();
318 
326  void set_useragent(const string &useragent);
327 
335  const string get_useragent() const;
336 
344  const string get_instance() const;
345 
355  [[deprecated("Replaced by Mastodon::urlencode")]]
356  static const string urlencode(const string &str);
357 
367  [[deprecated("Replaced by Mastodon::urldecode")]]
368  static const string urldecode(const string &str);
369 
385  return_call register_app1(const string &client_name,
386  const string &redirect_uri,
387  const string &scopes,
388  const string &website,
389  string &client_id,
390  string &client_secret,
391  string &url);
392 
393 
407  return_call register_app2(const string &client_id,
408  const string &client_secret,
409  const string &redirect_uri,
410  const string &code,
411  string &access_token);
412 
422  const string get_header(const string &header) const;
423 
435  bool exceptions(const bool &value);
436 
440  bool exceptions() const;
441 
447  [[deprecated("Replaced by Mastodon::unescape_html")]]
448  static const string unescape_html(const string &html);
449 
461  void set_proxy(const string &hostport, const string &userpw = "");
462 
470  const return_call get(const Mastodon::API::v1 &call);
471 
481  const return_call get(const Mastodon::API::v1 &call,
482  const parameters &parameters);
483 
493  const return_call get(const Mastodon::API::v2 &call,
494  const parameters &parameters);
495 
503  const return_call get(const string &call);
504 
516  void get_stream(const Mastodon::API::v1 &call,
517  const parameters &parameters,
518  unique_ptr<Mastodon::API::http> &ptr,
519  string &stream);
520 
530  void get_stream(const Mastodon::API::v1 &call,
531  unique_ptr<Mastodon::API::http> &ptr,
532  string &stream);
533 
543  void get_stream(const string &call,
544  unique_ptr<Mastodon::API::http> &ptr,
545  string &stream);
546 
558  return_call patch(const Mastodon::API::v1 &call,
559  const parameters &parameters);
560 
568  return_call post(const Mastodon::API::v1 &call);
569 
581  return_call post(const Mastodon::API::v1 &call,
582  const parameters &parameters);
583 
595  return_call post(const string &call,
596  const parameters &parameters);
597 
607  return_call put(const Mastodon::API::v1 &call,
608  const parameters &parameters);
609 
619  return_call put(const string &call, const parameters &parameters);
620 
630  return_call del(const Mastodon::API::v1 &call,
631  const parameters &parameters);
632 
642  return_call del(const string &call, const parameters &parameters);
643 
644  private:
645  const string _instance;
646  string _access_token;
647  string _useragent;
648  http _http;
649  bool _exceptions;
650 
659  const string maptostr(const parameters &map,
660  const bool &firstparam = true);
661 
669  unique_ptr<HTMLForm> maptoformdata(const parameters &map);
670 
681  const parameters delete_params(const parameters &params,
682  const vector<string> &keys);
683  };
684 
701  const string urlencode(const string &str);
702 
714  const string urldecode(const string &str);
715 
728  const string unescape_html(const string &html);
729 }
730 
731 #endif
Interface to the Mastodon API.
Definition: mastodon-cpp.hpp:69
void get_headers(string &headers) const
Get all headers in a string.
Definition: http.cpp:347
const return_call get(const Mastodon::API::v1 &call)
Make a GET request that doesn't require parameters.
Definition: get.cpp:298
return_call register_app2(const string &client_id, const string &client_secret, const string &redirect_uri, const string &code, string &access_token)
Register application, step 2/2.
Definition: mastodon-cpp.cpp:235
return_call register_app1(const string &client_name, const string &redirect_uri, const string &scopes, const string &website, string &client_id, string &client_secret, string &url)
Register application, step 1/2.
Definition: mastodon-cpp.cpp:185
v1
A list of all v1 API calls.
Definition: mastodon-cpp.hpp:181
Return type for API calls.
Definition: return_types.hpp:93
return_call patch(const Mastodon::API::v1 &call, const parameters &parameters)
Make a PATCH request.
Definition: patch.cpp:24
v2
A list of all v2 API calls.
Definition: mastodon-cpp.hpp:294
Vector of Mastodon::param, used for passing parameters in calls.
Definition: types.hpp:62
const string get_header(const string &header) const
Gets the header from the last answer.
Definition: mastodon-cpp.cpp:268
http_method
HTTP methods. Used in API calls.
Definition: types.hpp:87
void set_proxy(const string &hostport, const string &userpw="")
Sets the proxy.
Definition: mastodon-cpp.cpp:294
virtual ~API()
Destroys the object.
Definition: mastodon-cpp.cpp:59
void request_stream(const string &path, string &stream)
HTTP Request for streams.
Definition: http.cpp:150
API(const string &instance, const string &access_token)
Constructs a new API object.
Definition: mastodon-cpp.cpp:33
return_call post(const Mastodon::API::v1 &call)
Make a POST request that doesn't require parameters.
Definition: post.cpp:213
const string unescape_html(const string &html)
Replaces HTML entities with UTF-8 characters.
Definition: mastodon-cpp.cpp:334
void cancel_stream()
Cancels the stream. Use only with streams.
Definition: http.cpp:352
bool exceptions() const
Returns true if exceptions are turned on, false otherwise.
Definition: mastodon-cpp.cpp:289
void set_proxy(const string &hostport, const string &userpw="")
Set proxy. Do not call this directly.
Definition: http.cpp:96
return_call del(const Mastodon::API::v1 &call, const parameters &parameters)
Make a DELETE request that requires parameters.
Definition: delete.cpp:23
return_call put(const Mastodon::API::v1 &call, const parameters &parameters)
Make a PUT request that requires parameters.
Definition: put.cpp:23
void set_useragent(const string &useragent)
Sets the useragent. Default is mastodon-cpp/version.
Definition: mastodon-cpp.cpp:62
Collection of things to interface with server software that implements the Mastodon API.
Definition: mastodon-cpp.hpp:47
void get_stream(const Mastodon::API::v1 &call, const parameters &parameters, unique_ptr< Mastodon::API::http > &ptr, string &stream)
Make a streaming GET request.
static const string unescape_html(const string &html)
Alias for Mastodon::unescape_html.
Definition: mastodon-cpp.cpp:648
static const string urlencode(const string &str)
Alias for Mastodon::urlencode.
Definition: mastodon-cpp.cpp:638
const string urlencode(const string &str)
Percent-encodes a string.
const string get_instance() const
Returns the instance.
Definition: mastodon-cpp.cpp:72
const string urldecode(const string &str)
Decodes a percent-encoded string.
http(const API &api, const string &instance, const string &access_token)
Constructs new http object.
Definition: http.cpp:49
http class. Do not use this directly.
Definition: mastodon-cpp.hpp:77
const string get_useragent() const
Gets the useragent.
Definition: mastodon-cpp.cpp:67
static const string urldecode(const string &str)
Alias for Mastodon::urldecode.
Definition: mastodon-cpp.cpp:643
std::mutex & get_mutex()
Gets the mutex guarding the string that is written to.
Definition: http.cpp:358