Compare commits

...

178 Commits

Author SHA1 Message Date
tastytea 4b7215036b
Recommend switching to mastodonpp.
continuous-integration/drone/push Build is passing Details
2020-01-16 23:47:25 +01:00
tastytea e65fadfba6
Add low-maintenance note.
continuous-integration/drone/push Build is passing Details
2020-01-03 06:20:38 +01:00
tastytea fd407094a2
Add package for Ubuntu bionic. 2019-12-26 03:19:32 +01:00
tastytea 76e12d7093
Drone: Install lsb-release.
continuous-integration/drone/push Build is passing Details
2019-12-25 21:16:47 +01:00
tastytea 2a9219ce7e
Drone: Don't fail if file to delete doesn't exist. 2019-12-25 21:06:57 +01:00
tastytea cacc2c3a5b
Build packages for Debian stretch and buster. 2019-12-25 20:53:14 +01:00
tastytea ceda771700
Version bump 0.111.3.
continuous-integration/drone/push Build is passing Details
2019-12-19 15:16:24 +01:00
tastytea c6ad04e6ee
Typo in CMake config.
continuous-integration/drone/push Build was killed Details
2019-12-19 15:15:21 +01:00
tastytea 9671407556
Different indentation for CMake files. 2019-12-19 15:14:59 +01:00
tastytea c35dab8350
Merge branch 'develop'
continuous-integration/drone/push Build is passing Details
2019-10-14 12:06:43 +02:00
tastytea c772d7b60e
Improved introduction.
continuous-integration/drone/push Build is passing Details
2019-10-14 00:01:13 +02:00
tastytea e1b61b5041
Deprecated return_entity(_vector) and some high-level abstractions.
send_post(), send_toot() and get_notifications().
I don't have the energy to implement and maintain an useful set of high-level
abstractions.
2019-10-13 23:56:39 +02:00
tastytea db95855ab6
Merge branch 'develop'
continuous-integration/drone/push Build is passing Details
2019-10-13 21:05:34 +02:00
tastytea 5dce94a4a3
Add Emoji example.
continuous-integration/drone/push Build is passing Details
2019-10-13 17:39:49 +02:00
tastytea 7adad67dd9
Install examples into the correct directory. 2019-10-13 16:34:42 +02:00
tastytea 5275ab73ac
Version bump 0.111.2.
continuous-integration/drone/push Build is passing Details
2019-10-07 23:07:32 +02:00
tastytea a50d28e9a2
Merge branch 'develop' 2019-10-07 23:07:16 +02:00
tastytea 57238020a3
Do not return lowercased header, but the original one. 2019-10-07 23:06:15 +02:00
tastytea d37e720a11
Version bump 0.111.1.
continuous-integration/drone/push Build is passing Details
2019-10-06 17:20:44 +02:00
tastytea ad0773d5a7
Install documentation into ${CMAKE_INSTALL_DOCDIR}/${PROJECT_NAME}/. 2019-10-06 17:20:07 +02:00
tastytea bfe77f1b18
Don't install HTML documentation with autogenerated packages. 2019-10-06 17:19:07 +02:00
tastytea 10947148a1
Don't support versions pre 0.100.0.
continuous-integration/drone/push Build is passing Details
2019-10-06 16:43:13 +02:00
tastytea ec49399d39
Version bump 0.111.0 2019-10-06 16:40:22 +02:00
tastytea b4d6e37c96
Merge branch 'develop' 2019-10-06 16:39:38 +02:00
tastytea 719f8a7664
Actually delete parameters in delete_params(). 2019-10-06 16:39:06 +02:00
tastytea c3a5df62e5
Add Link::min_id() and allow for alphanumeric IDs. 2019-10-06 16:39:06 +02:00
tastytea 8b197134ab
Added favourites-example. 2019-10-06 16:39:06 +02:00
tastytea d43b1c72db
Match headers case-insensitively. 2019-10-06 14:58:04 +02:00
tastytea 2fa3bff89c
Re-add support for getting headers. 2019-10-06 14:35:06 +02:00
tastytea fe526f8e94
Merge branch 'develop'
continuous-integration/drone/push Build is passing Details
2019-09-27 03:54:53 +02:00
tastytea 28919cdaa8
Include contribution guidelines in readme.
continuous-integration/drone/push Build is failing Details
2019-09-27 03:52:58 +02:00
tastytea ff846a63cb
Make more use of variables in contribution guidelines. 2019-09-27 03:52:38 +02:00
tastytea 7857b17b8b
Fix contact-variable in COC. 2019-09-27 03:52:22 +02:00
tastytea f65cc6bac6
Add “patch via email”-paragraph to contributing guidelines.
continuous-integration/drone/push Build is passing Details
2019-09-23 19:27:26 +02:00
tastytea 453d8fc272
Fix path to CONTRIBUTING.adoc.
continuous-integration/drone/push Build is passing Details
2019-09-22 03:48:06 +02:00
tastytea a99fdc0742
Merge branch 'develop'
continuous-integration/drone/push Build was killed Details
2019-09-22 03:45:55 +02:00
tastytea 22754226f2
Replaced “mastodon-cpp” with variable “{project}” in readme.
continuous-integration/drone/push Build was killed Details
2019-09-22 03:45:18 +02:00
tastytea 66d41fec46
Add contributing guidelines, a COC and EditorConfig. 2019-09-22 03:38:14 +02:00
tastytea ff43aea4ab
Add CentOS 7 workaround.
continuous-integration/drone/push Build is passing Details
2019-09-20 03:55:13 +02:00
tastytea 83819c5f33
CI: Add openssl-devel to rpm dependencies. 2019-09-20 03:40:59 +02:00
tastytea 9b13db149b
Add package description workaround for CMake < 3.9. 2019-09-20 03:30:54 +02:00
tastytea 795bf14e51
Corrected version in documentation from 0.107.0 to 0.110.0.
continuous-integration/drone/push Build is passing Details
2019-09-20 02:58:58 +02:00
tastytea 47adbe0281
Merge branch 'develop' 2019-09-20 02:55:32 +02:00
tastytea 14d2e53cfc
Add support for the streaming event “filters_changed”. 2019-09-20 02:52:56 +02:00
tastytea f8ed45dcc4
Deleted report from return types and added Poll and Conversations.
continuous-integration/drone/push Build is passing Details
2019-09-20 02:41:27 +02:00
tastytea d100d1a2b6
Add support for GET /api/v1/streaming/direct. 2019-09-20 02:38:56 +02:00
tastytea ff649fd2eb
Add support for /api/v1/streaming/hashtag/local. 2019-09-20 02:37:33 +02:00
tastytea 7f80bff4e1
Add support for /api/v1/streaming/health. 2019-09-20 02:36:16 +02:00
tastytea 3446bbf5d6
Deleted Easy::Report and GET /api/v1/reports.
continuous-integration/drone/push Build is failing Details
They are no longer documented by Mastodon.
2019-09-20 02:29:45 +02:00
tastytea 14a1d92442
Added /api/v1/conversations. 2019-09-20 02:26:47 +02:00
tastytea c3e00e2e31
Added Easy::Conversation. 2019-09-20 02:26:07 +02:00
tastytea 1b514df555
Added /api/v1/polls/:id and /api/v1/polls/:id/votes.
continuous-integration/drone/push Build is passing Details
2019-09-20 00:40:22 +02:00
tastytea 416675a667
Added Entity Easy::Poll. 2019-09-20 00:07:17 +02:00
tastytea 4d5b331a0f
Removed /api/v1/search.
Because it is not documented by tootsuite anymore.
2019-09-19 23:21:58 +02:00
tastytea 2b265a5831
Merge branch 'develop'
continuous-integration/drone/push Build is passing Details
Switched from curlpp to POCO, modernized cmake recipes.
2019-08-30 08:20:48 +02:00
tastytea 08ae30835c
Confirmed that proxies work, added debug message with proxy info.
continuous-integration/drone/push Build is passing Details
2019-08-30 08:06:48 +02:00
tastytea 707771c7bf
Bugfix: Do not try to set proxy in parent class.
continuous-integration/drone/push Build is passing Details
2019-08-25 05:27:00 +02:00
tastytea 6b070dec98
Percent-decode proxy username and password. 2019-08-25 05:08:37 +02:00
tastytea d2a4d835de
Moved set_proxy() to API::http().
continuous-integration/drone/push Build is failing Details
API::set_proxy() calls API::http::set_proxy(). Deleted API::get_proxy().
2019-08-25 04:50:08 +02:00
tastytea acbcb6224e
Mastodon::http inherits proxy config from parent.
continuous-integration/drone/push Build is passing Details
Ff set_proxy() is called, _http.inherit_proxy() is called.
2019-08-21 11:06:41 +02:00
tastytea 188033a0c1
Simplify get_proxy(). 2019-08-21 10:52:06 +02:00
tastytea 41a580b32b
Rewrite parsing of http_proxy environment variable.
The regex matches host, port, username and password.
2019-08-21 10:42:59 +02:00
tastytea 915c85e9e9
Changed error codes and introduced error constants.
continuous-integration/drone/push Build is passing Details
2019-08-21 08:00:46 +02:00
tastytea 5ddea09924
Repair domain-change detection on HTTP redirect.
Also added debug statements.
2019-08-21 07:28:28 +02:00
tastytea c48c1a66f2
Removed and replaced last bits of curlpp.
continuous-integration/drone/push Build is passing Details
2019-08-21 04:54:17 +02:00
tastytea ed989935ac
Test with clang7. 2019-08-21 04:37:13 +02:00
tastytea a6f70263b8
Remove curlpp from drone recipe. 2019-08-21 04:36:04 +02:00
tastytea d0bac6779f
Replace curlpp with POCO in README. 2019-08-21 04:31:18 +02:00
tastytea 565317115c
Replace curlpp with POCO in RPM dependencies. 2019-08-21 04:27:24 +02:00
tastytea 9da01c0398
Add POCO to drone recipe.
continuous-integration/drone/push Build is failing Details
2019-08-21 04:25:20 +02:00
tastytea 62d28c523a
Updated TODOs and FIXMEs. 2019-08-21 04:20:25 +02:00
tastytea d16454e169
Merge branch 'develop' of schlomp.space:tastytea/mastodon-cpp into develop
continuous-integration/drone/push Build is failing Details
2019-08-21 04:10:37 +02:00
tastytea 12c0b896db
Use references for HTMLForm, where possible.
HTMLForm can't be copied, so I'm returning using unique_ptr in maptoformdata()
and references everywhere else.
2019-08-21 03:53:51 +02:00
tastytea ecb49c7e00
Actually send forms. 2019-08-21 03:36:25 +02:00
tastytea bc58a977f0
Add more debug statements around forms. 2019-08-21 03:35:44 +02:00
tastytea f97608ecfa
[WIP] Switch from curlpp to POCO.
Compilable, but untested and unfinished.
2019-08-20 18:13:51 +02:00
tastytea bd07dc6f9c
Change license in package generation recipe. 2019-08-16 02:09:12 +02:00
tastytea 1273518a5c
Add pkg-config recipe. 2019-08-16 02:08:14 +02:00
tastytea 5f73020056
Modernized CMake recipes. 2019-08-16 02:08:14 +02:00
tastytea ac3538aed2
Change license in readme.
continuous-integration/drone/push Build is passing Details
2019-08-16 02:07:45 +02:00
tastytea 231663b07e
Changed license to AGPL3.
continuous-integration/drone/push Build is passing Details
2019-08-15 22:53:38 +02:00
tastytea 72efbb515d
Add pkg-config recipe.
continuous-integration/drone/push Build is failing Details
2019-08-14 00:19:12 +02:00
tastytea 740890e402
Modernized CMake recipes. 2019-08-14 00:15:04 +02:00
tastytea 22d1232240
Only build tests once in CI.
continuous-integration/drone/push Build is passing Details
2019-08-13 14:27:03 +02:00
tastytea 0998ee5ef9
Do tests only one time in CI.
continuous-integration/drone/push Build is passing Details
2019-08-12 23:39:41 +02:00
tastytea e4937c954f
Set CXX for rpm build in CI. 2019-08-12 23:27:56 +02:00
tastytea f7af97ad73
Version bump 0.106.0.
continuous-integration/drone/push Build is passing Details
2019-08-12 23:06:29 +02:00
tastytea c49518981b
Added tests for Easy::Tag.
continuous-integration/drone/push Build is passing Details
2019-08-12 05:49:56 +02:00
tastytea f159f0c391
Get numbers in Easy::Tag::History::accounts() and ::use().
We were trying to get strings before.
2019-08-12 05:48:26 +02:00
tastytea 2a7d02fba8
Marked members of Easy::Tag::History const. 2019-08-12 05:47:49 +02:00
tastytea a5e7f12fd1
Fixed test description for Easy::Results. 2019-08-12 05:27:56 +02:00
tastytea dc09d3db5b
Fixed tests for Easy::Status.
The data was invalid JSON.
2019-08-12 05:27:49 +02:00
tastytea 4922fc79fe
Added tests for Easy::Status.
continuous-integration/drone/push Build is failing Details
2019-08-12 04:55:32 +02:00
tastytea 39af18fe35
Removed nonsensical ifdefs. 2019-08-12 04:55:31 +02:00
tastytea 61a2d4aeef
Added tests for Easy::Results. 2019-08-12 04:54:48 +02:00
tastytea 338274e368
Removed old TODOs. 2019-08-12 03:29:55 +02:00
tastytea 919f67b123
marked operators bool and uint8_t of return_base const.
continuous-integration/drone/push Build is passing Details
2019-07-22 22:09:50 +02:00
tastytea 581e4a96bb
Added tests for Easy::Relationship.
continuous-integration/drone/push Build is passing Details
2019-07-21 02:55:57 +02:00
tastytea 7874ca7830
Updated Easy::Relationship. 2019-07-21 02:48:48 +02:00
tastytea d9fa878136
Added tests for Easy::PushSubscription. 2019-07-21 02:36:03 +02:00
tastytea b1afd2533d
Fixed validity-check for push subscriptions. 2019-07-21 02:33:28 +02:00
tastytea b2b58990df
Clarified reasons for blocked instances.
continuous-integration/drone/push Build is passing Details
2019-07-18 17:48:32 +02:00
tastytea dbce486c9b
Blocked Kiwi Farms, added explanation in README.
continuous-integration/drone/push Build is passing Details
2019-07-14 18:01:10 +02:00
tastytea 9b0c68f2bf
Prevent usage with Gab domains.
continuous-integration/drone/push Build is passing Details
2019-06-26 02:35:35 +02:00
tastytea f293d54a63
Added tests for Easy::Notification. 2019-06-26 02:14:52 +02:00
tastytea 449bb65303
Fixed tests with catch 1.x.
continuous-integration/drone/push Build is passing Details
2019-06-10 18:33:44 +02:00
tastytea 4922f79bf2
Moved cmake config for tests to tests/.
continuous-integration/drone/push Build is failing Details
2019-06-10 17:40:00 +02:00
tastytea bbac2b7c51
Added tests for Easy::Mention. 2019-06-10 17:28:22 +02:00
tastytea d4e1f68235
Added tests for Easy::List. 2019-06-10 17:28:22 +02:00
tastytea 9090515a99
CI: Only test g++ 6/9. 2019-05-26 22:18:53 +02:00
tastytea 86ebbf90a2
Fixed drone-notification. 2019-05-18 06:17:20 +02:00
tastytea 57bf54ed32
Fixed regex in unescape_html(). 2019-05-18 06:16:54 +02:00
tastytea a79d0157fc
Added tests for Easy::Instance.
continuous-integration/drone/push Build is passing Details
2019-05-13 23:09:12 +02:00
tastytea 3a36744d72
Fixed Instance::stats(). 2019-05-13 23:08:04 +02:00
tastytea 5cebe53c3f
Corrected error in test-description. 2019-05-13 22:01:45 +02:00
tastytea 8f5d40ff7f
Updated Easy::Instance.
Added urls() and stats() and removed streaming_api().
2019-05-13 21:52:28 +02:00
tastytea 8a6bef8c2c
Made type names more consistent. 2019-05-13 21:31:38 +02:00
tastytea 51c9180128
Added tests for Easy::Filter.
continuous-integration/drone/push Build is passing Details
2019-05-12 17:59:10 +02:00
tastytea 69109ffc91
Updated Easy::Filter. Only cosmetic changes. 2019-05-12 17:34:34 +02:00
tastytea ae7ffc2908
Better and more consistent wording. 2019-05-11 02:19:34 +02:00
tastytea d614696260
Added tests for Easy::Emoji.
continuous-integration/drone/push Build is passing Details
2019-05-10 22:43:14 +02:00
tastytea 6ca1b9b7dc
Cosmetic change in Easy::Context test. 2019-05-10 22:31:08 +02:00
tastytea 26f43a1682
Updated Easy::Emoji.
Added visible_in_picker().
2019-05-10 22:21:08 +02:00
tastytea 920421edf1
Added tests for Easy::Context.
continuous-integration/drone/push Build is passing Details
2019-05-10 21:01:40 +02:00
tastytea fb689bcac0
Updated Easy::Context. Removed superfluous debug messages. 2019-05-10 20:23:34 +02:00
tastytea 81d2f923b1
Added tests for Easy::Card.
continuous-integration/drone/push Build is passing Details
2019-05-05 14:20:07 +02:00
tastytea 622c4c1baf
Updated Easy::Card.
Deleted excess debug statement, added undocumented attribute
embed_url.
2019-05-05 14:18:57 +02:00
tastytea f69dcc9e98
Added tests for Easy::Attachment.
continuous-integration/drone/push Build is passing Details
2019-05-01 20:17:06 +02:00
tastytea 8fe607d43e
Updated Easy::Attachment.
Moved Metadata into Attachment::meta.
2019-05-01 19:51:50 +02:00
tastytea 6ae56a05b4
Moved tests for Easy::Application into entities/. 2019-05-01 19:10:50 +02:00
tastytea 385245f421
Deprecated was on the wrong line. 2019-05-01 13:02:23 +02:00
tastytea 909b4edc86
Added tests for Easy::Application.
continuous-integration/drone/push Build is passing Details
2019-05-01 13:01:00 +02:00
tastytea f7ccda7004
Added tests for Easy::Account. 2019-05-01 12:50:33 +02:00
tastytea 0b72c80d94
Fixed Account::privacy() and Account::Source::privacy(). 2019-05-01 12:43:02 +02:00
tastytea 14593ccf17
Changed wording a bit. 2019-05-01 01:28:46 +02:00
tastytea 8448d8e720
Updated Easy::Account.
continuous-integration/drone/push Build is passing Details
Removed all setters, changed the type for account fields, added new
attributes.
2019-05-01 00:57:00 +02:00
tastytea ea0c3c5250
Fixed Easy::string_to_time() definition. 2019-05-01 00:10:19 +02:00
tastytea 42b263897b
Split up checklists in calls and entities. 2019-04-30 23:50:19 +02:00
tastytea a98351905b
Added Easy::account_field_type and Easy::account_fields. 2019-04-30 23:49:55 +02:00
tastytea de78019cb3
Added Easy::string_to_time(). 2019-04-30 23:29:05 +02:00
tastytea 6543ea4b51
CI: Renamed pipelines.
continuous-integration/drone/push Build is passing Details
2019-04-29 20:43:56 +02:00
tastytea 570aa32edf
CI: ARM pipeline.
continuous-integration/drone/push Build was killed Details
2019-04-29 19:31:30 +02:00
tastytea 2d56af7d5e
CI: Renamed notification pipeline. 2019-04-29 18:38:21 +02:00
tastytea d9a1872d1e
Fixed tests for (un)muting statuses. 2019-04-29 18:35:20 +02:00
tastytea 667150d18a
Added tests for API::v1::statuses_id_unmute.
continuous-integration/drone/push Build is passing Details
2019-04-29 18:26:03 +02:00
tastytea 95b9dd868d
Added tests for API::v1::statuses_id_mute. 2019-04-29 18:25:43 +02:00
tastytea 5714d29d95
Added tests for API::v1::accounts_id_unmute. 2019-04-29 18:19:04 +02:00
tastytea b17d09490f
Added tests for API::v1::accounts_id_mute. 2019-04-29 18:17:04 +02:00
tastytea c626462c0b
Added tests for API::v1::mutes. 2019-04-29 18:09:07 +02:00
tastytea e8eab3b947
Moved API tests to tests/api. 2019-04-29 17:59:34 +02:00
tastytea 761246c03b
Don't test API in CI. 2019-04-29 17:58:50 +02:00
tastytea 77b86bd8c0
Typo & typo % typo.
continuous-integration/drone/push Build is failing Details
2019-04-29 11:18:11 +02:00
tastytea 9c278db9b3
Added list of Pleroma API endpoints.
continuous-integration/drone/push Build is passing Details
2019-04-29 02:03:23 +02:00
tastytea ca9e0a71e1
Drone: Notify on success *and* failure.
continuous-integration/drone/push Build is passing Details
2019-04-29 00:48:44 +02:00
tastytea 9d1726acd5
Replaced README.md in build files.
continuous-integration/drone/push Build is passing Details
2019-04-29 00:38:10 +02:00
tastytea 41dfc410f1
Replaced README.md with README.adoc.
continuous-integration/drone/push Build is failing Details
2019-04-29 00:29:30 +02:00
tastytea c857e7d379
pull: true -> pull: always. 2019-04-28 18:23:40 +02:00
tastytea c341b8936e
Converted drone config to new format.
continuous-integration/drone/push Build is passing Details
2019-04-28 14:29:50 +02:00
tastytea d8739e14ae
Fixed test arguments.
the build was successful Details
2019-04-27 23:13:30 +02:00
tastytea f24fae28e9
Added the tag [auth] for tests that need authentication.
the build is pending Details
continuous-integration/drone/push Build was killed Details
2019-04-27 22:44:41 +02:00
tastytea 3705ae8d78
Added tests for API::v1::media_id.
the build is pending Details
continuous-integration/drone/push Build was killed Details
2019-04-27 22:33:01 +02:00
tastytea 3f09180b85
Added tests for API::v1::media. 2019-04-27 22:03:16 +02:00
tastytea 892a05e9fb
Removed mentions of base64. 2019-04-27 21:48:15 +02:00
tastytea a766ff001c
Check if files exists. 2019-04-27 21:38:01 +02:00
tastytea 8b3eaf1e73
Added tests for PUT and DELETE to API::v1::lists_id.
the build was successful Details
2019-04-25 17:25:39 +02:00
tastytea 9301586082
Added POST and DELETE to API::v1::lists_id_accounts. 2019-04-25 17:10:27 +02:00
tastytea 4302093684
Added tests for POST API::v1::lists.
the build was successful Details
2019-04-25 16:24:02 +02:00
tastytea b806dbfeb8
Added tests for API::v1::lists_id. 2019-04-25 15:45:03 +02:00
tastytea e9ac12efe3
Added tests for API::v1::lists_id_accounts. 2019-04-25 15:39:50 +02:00
tastytea 91ef34faa4
Added tests for API::v1::accounts_id_lists. 2019-04-25 15:27:54 +02:00
tastytea 5e6bf432a8
Harmonize calls to Entity::check_valid(). 2019-04-25 14:55:45 +02:00
tastytea a2aa33cf27
Added tests for API::v1::lists.
the build was successful Details
2019-04-25 14:26:14 +02:00
tastytea c3cdf6233a
Improved description of types.
the build was successful Details
2019-04-23 20:08:30 +02:00
tastytea 318eda9101
Confirmed that Account::moved() works
and changed my mind about writable Status::Attachment.
2019-04-22 05:15:03 +02:00
tastytea 5ddc0f20fe
Added dependency-install examples for Debian Stretch and CentOS 7.
the build was successful Details
2019-04-22 04:01:18 +02:00
tastytea 2287a4753c
Fixed operator << warnings.
the build was successful Details
2019-04-21 13:59:31 +02:00
tastytea d3d9f0f4e4
Fixed operator << for Easy::return_entity. 2019-04-21 13:17:39 +02:00
tastytea 7558c73648
Reformatted switch. 2019-04-21 06:15:37 +02:00
155 changed files with 6372 additions and 2674 deletions

View File

@ -1,235 +1,269 @@
pipeline: kind: pipeline
gcc6: name: x86_64
image: debian:stretch-slim
pull: true
when:
event: [push, pull_request]
environment:
- LANG=C.utf8
- CXX=g++-6
- CXXFLAGS=-pipe -O2
secrets:
- mastodon_cpp_access_token
commands:
- rm /etc/apt/apt.conf.d/docker-clean
- echo "APT::Default-Release \"stretch\";" >> /etc/apt/apt.conf.d/00default_release
- echo "deb http://deb.debian.org/debian sid main" >> /etc/apt/sources.list.d/sid.list
- apt-get update -q
- apt-get install -qy build-essential cmake pkg-config
- apt-get install -qy libcurl4-openssl-dev libjsoncpp-dev doxygen catch
- apt-get install -qy -t sid libcurlpp-dev
- rm -rf build && mkdir -p build && cd build
- cmake -DWITH_EXAMPLES=YES -DWITH_TESTS=YES -DEXTRA_TEST_ARGS="[pleroma]" ..
- make VERBOSE=1
- make install DESTDIR=install
- ctest
volumes:
- /var/cache/debian-package-cache:/var/cache/apt/archives
gcc7: platform:
image: debian:stretch-slim os: linux
pull: true arch: amd64
when:
event: [push, pull_request]
environment:
- LANG=C.utf8
- CXX=g++-7
- CXXFLAGS=-pipe -O2
secrets:
- mastodon_cpp_access_token
commands:
- rm /etc/apt/apt.conf.d/docker-clean
- apt-get update -q
- echo "APT::Default-Release \"stretch\";" >> /etc/apt/apt.conf.d/00default_release
- echo "deb http://deb.debian.org/debian sid main" >> /etc/apt/sources.list.d/sid.list
- echo "deb http://ppa.launchpad.net/ubuntu-toolchain-r/test/ubuntu xenial main" >> /etc/apt/sources.list.d/ubuntu-toolchain-r.list
- apt-get install -qy gnupg
- gpg --keyserver hkp://keyserver.ubuntu.com --recv-keys 0x60c317803a41ba51845e371a1e9377a2ba9ef27f
- gpg --armor --export 0x60c317803a41ba51845e371a1e9377a2ba9ef27f | apt-key add -
- apt-get update -q
- apt-get install -qy build-essential cmake pkg-config
- apt-get install -qy -t xenial g++-7
- apt-get install -qy libcurl4-openssl-dev libjsoncpp-dev doxygen catch
- apt-get install -qy -t sid libcurlpp-dev
- rm -rf build && mkdir -p build && cd build
- cmake -DWITH_EXAMPLES=YES -DWITH_TESTS=YES -DEXTRA_TEST_ARGS="[pleroma]" ..
- make VERBOSE=1
- make install DESTDIR=install
- ctest
volumes:
- /var/cache/debian-package-cache:/var/cache/apt/archives
gcc8: volumes:
image: debian:stretch-slim - name: debian-package-cache
pull: true host:
when: path: /var/cache/debian-package-cache
event: [push, pull_request]
environment:
- LANG=C.utf8
- CXX=g++-8
- CXXFLAGS=-pipe -O2
secrets:
- mastodon_cpp_access_token
commands:
- rm /etc/apt/apt.conf.d/docker-clean
- apt-get update -q
- echo "APT::Default-Release \"stretch\";" >> /etc/apt/apt.conf.d/00default_release
- echo "deb http://deb.debian.org/debian sid main" >> /etc/apt/sources.list.d/sid.list
- echo "deb http://ppa.launchpad.net/ubuntu-toolchain-r/test/ubuntu xenial main" >> /etc/apt/sources.list.d/ubuntu-toolchain-r.list
- apt-get install -qy gnupg
- gpg --keyserver hkp://keyserver.ubuntu.com --recv-keys 0x60c317803a41ba51845e371a1e9377a2ba9ef27f
- gpg --armor --export 0x60c317803a41ba51845e371a1e9377a2ba9ef27f | apt-key add -
- apt-get update -q
- apt-get install -qy build-essential cmake pkg-config
- apt-get install -qy -t xenial g++-8
- apt-get install -qy libcurl4-openssl-dev libjsoncpp-dev doxygen catch
- apt-get install -qy -t sid libcurlpp-dev
- rm -rf build && mkdir -p build && cd build
- cmake -DWITH_EXAMPLES=YES -DWITH_TESTS=YES -DEXTRA_TEST_ARGS="[pleroma]" ..
- make VERBOSE=1
- make install DESTDIR=install
- ctest
volumes:
- /var/cache/debian-package-cache:/var/cache/apt/archives
clang5: trigger:
image: debian:stretch-slim event:
pull: true exclude:
when: - tag
event: [push, pull_request]
environment:
- LANG=C.utf8
- CXX=clang++-5.0
- CXXFLAGS=-pipe -O2
secrets:
- mastodon_cpp_access_token
commands:
- rm /etc/apt/apt.conf.d/docker-clean
- apt-get update -q
- echo "APT::Default-Release \"stretch\";" >> /etc/apt/apt.conf.d/00default_release
- echo "deb http://deb.debian.org/debian stretch-backports main" >> /etc/apt/sources.list.d/stretch.list
- echo "deb http://deb.debian.org/debian sid main" >> /etc/apt/sources.list.d/sid.list
- apt-get update -q
- apt-get install -qy build-essential cmake pkg-config
- apt-get install -qy -t stretch-backports clang-5.0
- apt-get install -qy libcurl4-openssl-dev libjsoncpp-dev doxygen catch
- apt-get install -qy -t sid libcurlpp-dev
- rm -rf build && mkdir -p build && cd build
- cmake -DWITH_EXAMPLES=YES -DWITH_TESTS=YES -DEXTRA_TEST_ARGS="[pleroma]" ..
- make VERBOSE=1
- make install DESTDIR=install
- ctest
volumes:
- /var/cache/debian-package-cache:/var/cache/apt/archives
clang6: steps:
image: debian:stretch-slim - name: gcc6
pull: true image: debian:stretch-slim
when: pull: true
event: [push, pull_request] environment:
environment: CXX: g++-6
- LANG=C.utf8 CXXFLAGS: -pipe -O2
- CXX=clang++-6.0 MASTODON_CPP_ACCESS_TOKEN:
- CXXFLAGS=-pipe -O2 from_secret: mastodon_cpp_access_token
secrets: commands:
- mastodon_cpp_access_token - rm -f /etc/apt/apt.conf.d/docker-clean
commands: - rm -f /var/cache/apt/archives/lock
- rm /etc/apt/apt.conf.d/docker-clean - apt-get update -q
- apt-get update -q - apt-get install -qy build-essential cmake
- echo "APT::Default-Release \"stretch\";" >> /etc/apt/apt.conf.d/00default_release - apt-get install -qy libpoco-dev libjsoncpp-dev doxygen catch
- echo "deb http://deb.debian.org/debian stretch-backports main" >> /etc/apt/sources.list.d/stretch.list - rm -rf build && mkdir -p build && cd build
- echo "deb http://deb.debian.org/debian sid main" >> /etc/apt/sources.list.d/sid.list - cmake -DWITH_EXAMPLES=YES -DWITH_TESTS=YES -DEXTRA_TEST_ARGS="~[api]" ..
- apt-get update -q - make VERBOSE=1
- apt-get install -qy build-essential cmake pkg-config - make install DESTDIR=install
- apt-get install -qy -t stretch-backports clang-6.0 - cd tests && ctest
- apt-get install -qy libcurl4-openssl-dev libjsoncpp-dev doxygen catch volumes:
- apt-get install -qy -t sid libcurlpp-dev - name: debian-package-cache
- rm -rf build && mkdir -p build && cd build path: /var/cache/apt/archives
- cmake -DWITH_EXAMPLES=YES -DWITH_TESTS=YES -DEXTRA_TEST_ARGS="[pleroma]" ..
- make VERBOSE=1
- make install DESTDIR=install
- ctest
volumes:
- /var/cache/debian-package-cache:/var/cache/apt/archives
package_deb: - name: gcc9
image: debian:stretch-slim image: debian:stretch-slim
pull: true pull: true
when: environment:
event: tag CXX: g++-9
environment: CXXFLAGS: -pipe -O2
- LANG=C.utf8 MASTODON_CPP_ACCESS_TOKEN:
- CXXFLAGS=-pipe -O2 from_secret: mastodon_cpp_access_token
commands: commands:
- rm /etc/apt/apt.conf.d/docker-clean - rm -f /etc/apt/apt.conf.d/docker-clean
- echo "APT::Default-Release \"stretch\";" >> /etc/apt/apt.conf.d/00default_release - rm -f /var/cache/apt/archives/lock
- echo "deb http://deb.debian.org/debian sid main" >> /etc/apt/sources.list.d/sid.list - apt-get update -q
- apt-get update -q - echo "APT::Default-Release \"stretch\";" >> /etc/apt/apt.conf.d/00default_release
- apt-get install -qy build-essential cmake pkg-config - echo "deb http://ppa.launchpad.net/ubuntu-toolchain-r/test/ubuntu xenial main" >> /etc/apt/sources.list.d/ubuntu-toolchain-r.list
- apt-get install -qy libcurl4-openssl-dev libjsoncpp-dev doxygen - apt-get install -qy gnupg
- apt-get install -qy -t sid libcurlpp-dev - gpg --keyserver hkp://keyserver.ubuntu.com --recv-keys 0x60c317803a41ba51845e371a1e9377a2ba9ef27f
- apt-get install -qy file - gpg --armor --export 0x60c317803a41ba51845e371a1e9377a2ba9ef27f | apt-key add -
- rm -rf build && mkdir -p build && cd build - apt-get update -q
- cmake -DWITH_EXAMPLES=NO -DWITH_TESTS=NO .. - apt-get install -qy build-essential cmake
- make package - apt-get install -qy -t xenial g++-9
- cmake -DWITH_DEB=YES .. - apt-get install -qy libpoco-dev libjsoncpp-dev doxygen catch
- make package - rm -rf build && mkdir -p build && cd build
- cp -v mastodon-cpp-${DRONE_TAG}_x86_64.tar.gz .. - cmake -DWITH_EXAMPLES=YES ..
- cp -v libmastodon-cpp_${DRONE_TAG}-0_amd64.deb .. - make VERBOSE=1
volumes: - make install DESTDIR=install
- /var/cache/debian-package-cache:/var/cache/apt/archives volumes:
- name: debian-package-cache
path: /var/cache/apt/archives
package_rpm: - name: clang5
image: centos:7 image: debian:stretch-slim
pull: true pull: true
when: environment:
event: tag CXX: clang++-5.0
environment: CXXFLAGS: -pipe -O2
- LANG=C.utf8 MASTODON_CPP_ACCESS_TOKEN:
- CXXFLAGS=-pipe -O2 from_secret: mastodon_cpp_access_token
commands: commands:
- sed -i 's/keepcache=0/keepcache=1/' /etc/yum.conf - rm -f /etc/apt/apt.conf.d/docker-clean
- curl -s -o /var/cache/yum/epel-release-latest-7.noarch.rpm http://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm - rm -f /var/cache/apt/archives/lock
- rpm -i /var/cache/yum/epel-release-latest-7.noarch.rpm - apt-get update -q
- yum install -qy centos-release-scl - echo "APT::Default-Release \"stretch\";" >> /etc/apt/apt.conf.d/00default_release
- yum install -qy devtoolset-6 - echo "deb http://deb.debian.org/debian stretch-backports main" >> /etc/apt/sources.list.d/stretch.list
- scl enable devtoolset-6 bash - apt-get update -q
- yum install -qy libcurl-devel doxygen rpm-build - apt-get install -qy build-essential cmake
- yum --enablerepo=epel install -qy cmake3 jsoncpp-devel - apt-get install -qy -t stretch-backports clang-5.0
- curl -s -o /var/cache/yum/curlpp-devel-0.7.3-5.el6.x86_64.rpm https://download.fedoraproject.org/pub/epel/6/x86_64/Packages/c/curlpp-devel-0.7.3-5.el6.x86_64.rpm - apt-get install -qy libpoco-dev libjsoncpp-dev doxygen catch
- curl -s -o /var/cache/yum/curlpp-0.7.3-5.el6.x86_64.rpm https://download.fedoraproject.org/pub/epel/6/x86_64/Packages/c/curlpp-0.7.3-5.el6.x86_64.rpm - rm -rf build && mkdir -p build && cd build
- yum localinstall -qy /var/cache/yum/curlpp-* - cmake -DWITH_EXAMPLES=YES ..
- rm -rf build && mkdir -p build && cd build - make VERBOSE=1
- cmake3 -DWITH_EXAMPLES=NO -DWITH_TESTS=NO .. - make install DESTDIR=install
- make package volumes:
- cmake3 -DWITH_RPM=YES .. - name: debian-package-cache
- make package path: /var/cache/apt/archives
- cp -v libmastodon-cpp-${DRONE_TAG}-0.x86_64.rpm ..
volumes:
- /var/cache/centos-package-cache:/var/cache/yum/
gitea_release: - name: clang7
image: plugins/gitea-release image: debian:buster-slim
pull: true pull: true
when: environment:
event: tag LANG: C.utf8
CXX: clang++
CXXFLAGS: -pipe -O2
MASTODON_CPP_ACCESS_TOKEN:
from_secret: mastodon_cpp_access_token
commands:
- rm -f /etc/apt/apt.conf.d/docker-clean
- rm -f /var/cache/apt/archives/lock
- apt-get update -q
- apt-get update -q
- apt-get install -qy build-essential cmake clang
- apt-get install -qy libpoco-dev libjsoncpp-dev doxygen catch
- rm -rf build && mkdir -p build && cd build
- cmake -DWITH_EXAMPLES=YES ..
- make VERBOSE=1
- make install DESTDIR=install
volumes:
- name: debian-package-cache
path: /var/cache/apt/archives
- name: notification
image: drillster/drone-email
pull: always
settings:
host: cryptoparty-celle.de
from: drone@tzend.de
username:
from_secret: email_username
password:
from_secret: email_password
when:
status: [ changed, failure ]
---
kind: pipeline
name: packages x86_64
platform:
os: linux
arch: amd64
volumes:
- name: debian-package-cache
host:
path: /var/cache/debian-package-cache
- name: centos-package-cache
host:
path: /var/cache/centos-package-cache
trigger:
event:
- tag
steps:
- name: Debian stretch
image: debian:stretch-slim
pull: always
environment:
CXXFLAGS: -pipe -O2
LANG: C.utf8
commands:
- rm -f /etc/apt/apt.conf.d/docker-clean
- rm -f /var/cache/apt/archives/lock
- apt-get update -q
- apt-get install -qy build-essential cmake lsb-release
- apt-get install -qy libpoco-dev libjsoncpp-dev file
- rm -rf build && mkdir -p build && cd build
- cmake -DWITH_DEB=YES -DWITH_DOC=NO ..
- make package
- cp -v libmastodon-cpp_${DRONE_TAG}-0_stretch_amd64.deb ..
volumes:
- name: debian-package-cache
path: /var/cache/apt/archives
- name: Debian buster
image: debian:buster-slim
pull: always
environment:
CXXFLAGS: -pipe -O2
LANG: C.utf8
commands:
- rm -f /etc/apt/apt.conf.d/docker-clean
- rm -f /var/cache/apt/archives/lock
- apt-get update -q
- apt-get install -qy build-essential cmake lsb-release
- apt-get install -qy libpoco-dev libjsoncpp-dev file
- rm -rf build && mkdir -p build && cd build
- cmake -DWITH_DEB=YES -DWITH_DOC=NO ..
- make package
- cp -v libmastodon-cpp_${DRONE_TAG}-0_buster_amd64.deb ..
volumes:
- name: debian-package-cache
path: /var/cache/apt/archives
- name: Ubuntu bionic
image: ubuntu:bionic
pull: always
environment:
CXXFLAGS: -pipe -O2
LANG: C.utf8
commands:
- rm -f /etc/apt/apt.conf.d/docker-clean
- rm -f /var/cache/apt/archives/lock
- apt-get update -q
- apt-get install -qy build-essential cmake lsb-release
- apt-get install -qy libpoco-dev libjsoncpp-dev file
- rm -rf build && mkdir -p build && cd build
- cmake -DWITH_DEB=YES -DWITH_DOC=NO ..
- make package
- cp -v libmastodon-cpp_${DRONE_TAG}-0_bionic_amd64.deb ..
volumes:
- name: debian-package-cache
path: /var/cache/apt/archives
- name: CentOS 7
image: centos:7
pull: always
environment:
CXX: /opt/rh/devtoolset-6/root/usr/bin/g++
CXXFLAGS: -pipe -O2
LANG: C.utf8
commands:
- sed -i 's/keepcache=0/keepcache=1/' /etc/yum.conf
- curl -s -o /var/cache/yum/epel-release-latest-7.noarch.rpm http://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
- rpm -i /var/cache/yum/epel-release-latest-7.noarch.rpm
- yum install -qy centos-release-scl
- yum install -qy devtoolset-6
- scl enable devtoolset-6 bash
- yum install -qy poco-devel openssl-devel doxygen rpm-build
- yum --enablerepo=epel install -qy cmake3 jsoncpp-devel
- rm -rf build && mkdir -p build && cd build
- cmake3 -DWITH_RPM=YES -DWITH_DOC=NO ..
- make package
- cp -v libmastodon-cpp-${DRONE_TAG}-0.x86_64.rpm ..
volumes:
- name: centos-package-cache
path: /var/cache/yum
- name: gitea_release
image: plugins/gitea-release
pull: always
settings:
base_url: https://schlomp.space base_url: https://schlomp.space
secrets: [ gitea_token ] api_key:
from_secret: gitea_token
title: ${DRONE_TAG} title: ${DRONE_TAG}
prerelease: true prerelease: true
files: files:
- mastodon-cpp-${DRONE_TAG}_x86_64.tar.gz - libmastodon-cpp_${DRONE_TAG}-0_stretch_amd64.deb
- libmastodon-cpp_${DRONE_TAG}-0_amd64.deb - libmastodon-cpp_${DRONE_TAG}-0_buster_amd64.deb
- libmastodon-cpp_${DRONE_TAG}-0_bionic_amd64.deb
- libmastodon-cpp-${DRONE_TAG}-0.x86_64.rpm - libmastodon-cpp-${DRONE_TAG}-0.x86_64.rpm
checksum: checksum:
- sha256 - sha256
- sha512 - sha512
notify: - name: notification
when: image: drillster/drone-email
status: [ changed, failure ] pull: always
image: drillster/drone-email settings:
pull: true
host: cryptoparty-celle.de host: cryptoparty-celle.de
secrets: [ email_username, email_password ]
from: drone@tzend.de from: drone@tzend.de
username:
from_secret: email_username
password:
from_secret: email_password
when:
status: [ changed, failure ]

20
.editorconfig Normal file
View File

@ -0,0 +1,20 @@
# Configuration file for EditorConfig.
# More information is available under <https://editorconfig.org/>.
root = true
[*]
indent_style = space
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
max_line_length = 80
[*.?pp]
indent_size = 4
tab_width = 4
[{CMakeLists.txt,*.cmake}]
indent_size = 2
tab_width = 2

View File

@ -1,127 +1,86 @@
cmake_minimum_required (VERSION 3.6) # Support version 3.6 and above, but use policy settings up to 3.14.
project (mastodon-cpp # 3.6 is needed because of IMPORTED_TARGET in pkg_check_modules().
VERSION 0.105.0 cmake_minimum_required(VERSION 3.6...3.14)
LANGUAGES CXX # Ranges are supported from 3.12, set policy to current for < 3.12.
) if(${CMAKE_VERSION} VERSION_LESS 3.12)
cmake_policy(VERSION ${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION})
set(WITH_EASY "YES" CACHE STRING "WITH_EASY defaults to \"YES\"") endif()
set(WITH_EXAMPLES "NO" CACHE STRING "WITH_EXAMPLES defaults to \"NO\"")
set(WITH_TESTS "NO" CACHE STRING "WITH_TESTS defaults to \"NO\"")
set(WITH_DOC "YES" CACHE STRING "WITH_DOC defaults to \"YES\"")
set(WITH_DEB "NO" CACHE STRING "WITH_DEB defaults to \"NO\"")
set(WITH_RPM "NO" CACHE STRING "WITH_RPM defaults to \"NO\"")
include(GNUInstallDirs) include(GNUInstallDirs)
find_package(PkgConfig REQUIRED)
find_package(PkgConfig REQUIRED) project (mastodon-cpp
pkg_check_modules(CURLPP REQUIRED curlpp) VERSION 0.111.5
if(WITH_EASY) LANGUAGES CXX)
pkg_check_modules(JSONCPP REQUIRED jsoncpp)
# DESCRIPTION was introduced in version 3.9.
if(NOT (${CMAKE_VERSION} VERSION_LESS 3.9))
set(PROJECT_DESCRIPTION
"C++ wrapper for the Mastodon API.")
endif() endif()
option(WITH_EASY "Compile Easy interface." YES)
option(WITH_EXAMPLES "Compile examples." NO)
option(WITH_TESTS "Compile tests." NO)
option(WITH_DOC "Generate HTML documentation." YES)
option(WITH_DEB "Prepare for the building of .deb packages." NO)
option(WITH_RPM "Prepare for the building of .rpm packages." NO)
option(BUILD_SHARED_LIBS "Build shared libraries." YES)
set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Build type, Release or Debug.")
set(CMAKE_CXX_STANDARD 14) set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF) set(CMAKE_CXX_EXTENSIONS OFF)
set(CMAKE_CXX_FLAGS_DEBUG set(DEBUG_CXXFLAGS
"${CMAKE_CXX_FLAGS_DEBUG} -Wall -Wextra -Wpedantic -ftrapv -fsanitize=undefined -g -Og -fno-omit-frame-pointer") "-Wall"
"-Wextra"
# Do not complain about compatibility-wrapper "-Wpedantic"
if(NOT CMAKE_BUILD_TYPE STREQUAL "Debug") "-ftrapv"
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-deprecated-declarations") "-fsanitize=undefined"
"-g"
"-Og"
"-fno-omit-frame-pointer"
"-Wno-deprecated-declarations")
set(DEBUG_LDFLAGS
"-fsanitize=undefined")
add_compile_options("$<$<CONFIG:Debug>:${DEBUG_CXXFLAGS}>")
# add_link_options was introduced in version 3.13.
if(${CMAKE_VERSION} VERSION_LESS 3.13)
set(CMAKE_SHARED_LINKER_FLAGS_DEBUG "${DEBUG_LDFLAGS}")
else()
add_link_options("$<$<CONFIG:Debug>:${DEBUG_LDFLAGS}>")
endif() endif()
include_directories(${PROJECT_SOURCE_DIR}/src) # Turn on debug output.
include_directories(${PROJECT_BINARY_DIR})
include_directories(${CURL_INCLUDE_DIRS})
include_directories(${CURLPP_INCLUDE_DIRS})
include_directories(${JSONCPP_INCLUDE_DIRS})
link_directories(${CURL_LIBRARY_DIRS})
link_directories(${CURLPP_LIBRARY_DIRS})
link_directories(${JSONCPP_LIBRARY_DIRS})
# Write version in header
configure_file (
"${PROJECT_SOURCE_DIR}/src/version.hpp.in"
"${PROJECT_BINARY_DIR}/version.hpp"
)
# Announce that we are compiling mastodon-cpp (used to figure out where the
# headers are)
add_definitions(-DMASTODON_CPP=1)
if(CMAKE_BUILD_TYPE STREQUAL "Debug") if(CMAKE_BUILD_TYPE STREQUAL "Debug")
add_definitions(-DDEBUG=1) add_definitions("-DDEBUG=1")
endif() endif()
if(NOT WITH_EASY) if(NOT WITH_EASY)
add_definitions(-DWITHOUT_EASY=1) add_definitions("-DWITHOUT_EASY=1")
endif() endif()
# Compile library add_subdirectory("src")
if(WITH_EASY)
file(GLOB sources src/*.cpp src/api/*.cpp
src/easy/*.cpp src/easy/entities/*.cpp)
else()
file(GLOB sources src/*.cpp src/api/*.cpp)
endif()
add_library(${PROJECT_NAME} SHARED ${sources})
set_target_properties(${PROJECT_NAME} PROPERTIES
VERSION ${PROJECT_VERSION}
SOVERSION ${${PROJECT_NAME}_VERSION_MAJOR}
)
if(WITH_EASY)
target_link_libraries(${PROJECT_NAME}
${CURLPP_LIBRARIES} pthread ${JSONCPP_LIBRARIES})
else()
target_link_libraries(${PROJECT_NAME}
${CURLPP_LIBRARIES} pthread)
endif()
# Compile examples
if(WITH_EXAMPLES) if(WITH_EXAMPLES)
file(GLOB sources_examples examples/*.cpp) add_subdirectory("examples")
foreach(src ${sources_examples})
get_filename_component(bin ${src} NAME_WE)
add_executable(${bin} ${src})
target_link_libraries(${bin} pthread ${JSONCPP_LIBRARIES} ${PROJECT_NAME})
endforeach()
endif() endif()
# Compile tests
if(WITH_TESTS) if(WITH_TESTS)
include(tests.CMakeLists.txt) add_subdirectory("tests")
endif() endif()
# Install library and header files
install(TARGETS ${PROJECT_NAME} LIBRARY
DESTINATION ${CMAKE_INSTALL_LIBDIR})
install(FILES src/mastodon-cpp.hpp src/return_types.hpp src/types.hpp
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME})
if(WITH_EASY)
file(GLOB easy_header src/easy/*.hpp)
install(FILES ${easy_header}
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME}/easy)
file(GLOB easy_entities_header src/easy/entities/*.hpp)
install(FILES ${easy_entities_header}
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME}/easy/entities)
endif()
# Compile & install documentation
if(WITH_DOC) if(WITH_DOC)
add_custom_command(OUTPUT ${PROJECT_SOURCE_DIR}/doc/html add_custom_command(OUTPUT ${PROJECT_SOURCE_DIR}/doc/html
COMMAND ./build_doc.sh WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}) COMMAND "./build_doc.sh" WORKING_DIRECTORY ${PROJECT_SOURCE_DIR})
add_custom_target(doc DEPENDS doc/html) add_custom_target(doc DEPENDS doc/html)
add_dependencies(${PROJECT_NAME} doc) add_dependencies(${PROJECT_NAME} doc)
install(DIRECTORY ${PROJECT_SOURCE_DIR}/doc/html install(DIRECTORY ${PROJECT_SOURCE_DIR}/doc/html
DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/doc/${PROJECT_NAME}-${PROJECT_VERSION}) DESTINATION "${CMAKE_INSTALL_DOCDIR}/${PROJECT_NAME}")
file(GLOB examples examples/example*.cpp)
install(FILES ${examples}
DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/doc/${PROJECT_NAME}-${PROJECT_VERSION}/examples)
endif() endif()
# Packages add_subdirectory("cmake")
include(packages.CMakeLists.txt) add_subdirectory("pkg-config")
include("cmake/packages.cmake")

49
CODE_OF_CONDUCT.adoc Normal file
View File

@ -0,0 +1,49 @@
:contact-coc: tastytea@tastytea.de
== Code of Conduct
In the interest of fostering an open and welcoming environment, we as
contributors and maintainers pledge to making participation in our project and
our community a harassment-free experience for everyone, regardless of age, body
size, disability, education, ethnicity, gender identity and expression, level of
experience, nationality, personal appearance, race, religion, sex
characteristics, sexual identity and orientation or socio-economic status.
=== Examples
Examples of behavior that contributes to creating a positive environment
include:
* Using welcoming and inclusive language.
* Being respectful of differing viewpoints and experiences.
* Gracefully accepting constructive criticism.
* Focusing on what is best for the community.
* Showing empathy towards other community members.
Examples of unacceptable behavior by participants include:
* The use of sexualized language or imagery and unwelcome sexual attention or
advances.
* Trolling, insulting/derogatory comments, and personal attacks.
* Public or private harassment.
* Publishing others private information, such as a physical or electronic
address, without explicit permission.
=== Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported by contacting the project team at {contact-coc}.
All complaints will be reviewed and investigated and will result in a response
that is deemed necessary and appropriate to the circumstances. The project team
is obligated to maintain confidentiality with regard to the reporter of an
incident.
=== Attribution
This Code of Conduct is adapted from the Contributor Covenant, version 1.4,
available at
https://www.contributor-covenant.org/version/1/4/code-of-conduct.html
For answers to common questions about this code of conduct, see
https://www.contributor-covenant.org/faq

29
CONTRIBUTING.adoc Normal file
View File

@ -0,0 +1,29 @@
:project: mastodon-cpp
:uri-base: https://schlomp.space/tastytea/{project}
:uri-coc: {uri-base}/src/branch/master/CODE_OF_CONDUCT.adoc
:contact-email: tastytea@tastytea.de
:contact-xmpp: {contact-email}
:contact-fediverse: https://likeable.space/users/tastytea
== How to contribute
Read the link:{uri-coc}[Code of Conduct].
=== Reporting bugs or suggesting enhancements
Before reporting a bug, please
https://schlomp.space/tastytea/{project}/issues[perform a search] to see if the
problem has already been reported. If it has, add a comment to the existing
issue instead of opening a new one. Same for enhancements.
You can also contact me via mailto:{contact-email}[E-Mail],
link:xmpp:{contact-xmpp}[XMPP] or the {contact-fediverse}[Fediverse] if you
don't want to open an account.
=== Pull requests
Please use similar coding conventions as the rest of the project. The basic rule
to remember is to write code in the same style as the existing/surrounding code.
You can also send me your patches via mailto:{contact-email}[E-Mail], ideally
using `git format-patch` or `git send-email`.

View File

@ -1,16 +0,0 @@
# How to contribute
## Reporting bugs or suggesting enhancements
Before reporting a bug , please
[perform a search](https://schlomp.space/tastytea/mastodon-cpp/issues)
to see if the problem has already been reported. If it has, add a comment to the
existing issue instead of opening a new one. Same for enhancements.
You can also contact me via the Fediverse if you don't want to open an account.
My account is [@tastytea@likeable.space](https://likeable.space/users/tastytea).
## Pull requests
Please use similar coding conventions as the rest of the project. The basic rule
to remember is to write code in the same style as the existing/surrounding code.

View File

@ -1,8 +1,7 @@
DOXYFILE_ENCODING = UTF-8 DOXYFILE_ENCODING = UTF-8
PROJECT_NAME = "mastodon-cpp" PROJECT_NAME = "mastodon-cpp"
PROJECT_NUMBER = 0.0.0 PROJECT_NUMBER = 0.0.0
INPUT = README.md src/ src/api/ src/easy/ src/easy/entities/ INPUT = src/ src/api/ src/easy/ src/easy/entities/
USE_MDFILE_AS_MAINPAGE = README.md
CREATE_SUBDIRS = NO CREATE_SUBDIRS = NO
ALLOW_UNICODE_NAMES = YES ALLOW_UNICODE_NAMES = YES
OUTPUT_LANGUAGE = English OUTPUT_LANGUAGE = English

147
LICENSE
View File

@ -1,23 +1,21 @@
GNU GENERAL PUBLIC LICENSE GNU AFFERO GENERAL PUBLIC LICENSE
Version 3, 29 June 2007 Version 3, 19 November 2007
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed. of this license document, but changing it is not allowed.
Preamble Preamble
The GNU General Public License is a free, copyleft license for The GNU Affero General Public License is a free, copyleft license for
software and other kinds of works. software and other kinds of works, specifically designed to ensure
cooperation with the community in the case of network server software.
The licenses for most software and other practical works are designed The licenses for most software and other practical works are designed
to take away your freedom to share and change the works. By contrast, to take away your freedom to share and change the works. By contrast,
the GNU General Public License is intended to guarantee your freedom to our General Public Licenses are intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free share and change all versions of a program--to make sure it remains free
software for all its users. We, the Free Software Foundation, use the software for all its users.
GNU General Public License for most of our software; it applies also to
any other work released this way by its authors. You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you price. Our General Public Licenses are designed to make sure that you
@ -26,44 +24,34 @@ them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things. free programs, and that you know you can do these things.
To protect your rights, we need to prevent others from denying you Developers that use our General Public Licenses protect your rights
these rights or asking you to surrender the rights. Therefore, you have with two steps: (1) assert copyright on the software, and (2) offer
certain responsibilities if you distribute copies of the software, or if you this License which gives you legal permission to copy, distribute
you modify it: responsibilities to respect the freedom of others. and/or modify the software.
For example, if you distribute copies of such a program, whether A secondary benefit of defending all users' freedom is that
gratis or for a fee, you must pass on to the recipients the same improvements made in alternate versions of the program, if they
freedoms that you received. You must make sure that they, too, receive receive widespread use, become available for other developers to
or can get the source code. And you must show them these terms so they incorporate. Many developers of free software are heartened and
know their rights. encouraged by the resulting cooperation. However, in the case of
software used on network servers, this result may fail to come about.
The GNU General Public License permits making a modified version and
letting the public access it on a server without ever releasing its
source code to the public.
Developers that use the GNU GPL protect your rights with two steps: The GNU Affero General Public License is designed specifically to
(1) assert copyright on the software, and (2) offer you this License ensure that, in such cases, the modified source code becomes available
giving you legal permission to copy, distribute and/or modify it. to the community. It requires the operator of a network server to
provide the source code of the modified version running there to the
users of that server. Therefore, public use of a modified version, on
a publicly accessible server, gives the public access to the source
code of the modified version.
For the developers' and authors' protection, the GPL clearly explains An older license, called the Affero General Public License and
that there is no warranty for this free software. For both users' and published by Affero, was designed to accomplish similar goals. This is
authors' sake, the GPL requires that modified versions be marked as a different license, not a version of the Affero GPL, but Affero has
changed, so that their problems will not be attributed erroneously to released a new version of the Affero GPL which permits relicensing under
authors of previous versions. this license.
Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer
can do so. This is fundamentally incompatible with the aim of
protecting users' freedom to change the software. The systematic
pattern of such abuse occurs in the area of products for individuals to
use, which is precisely where it is most unacceptable. Therefore, we
have designed this version of the GPL to prohibit the practice for those
products. If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.
Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary. To prevent this, the GPL assures that
patents cannot be used to render the program non-free.
The precise terms and conditions for copying, distribution and The precise terms and conditions for copying, distribution and
modification follow. modification follow.
@ -72,7 +60,7 @@ modification follow.
0. Definitions. 0. Definitions.
"This License" refers to version 3 of the GNU General Public License. "This License" refers to version 3 of the GNU Affero General Public License.
"Copyright" also means copyright-like laws that apply to other kinds of "Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks. works, such as semiconductor masks.
@ -549,35 +537,45 @@ to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program. License would be to refrain entirely from conveying the Program.
13. Use with the GNU Affero General Public License. 13. Remote Network Interaction; Use with the GNU General Public License.
Notwithstanding any other provision of this License, if you modify the
Program, your modified version must prominently offer all users
interacting with it remotely through a computer network (if your version
supports such interaction) an opportunity to receive the Corresponding
Source of your version by providing access to the Corresponding Source
from a network server at no charge, through some standard or customary
means of facilitating copying of software. This Corresponding Source
shall include the Corresponding Source for any work covered by version 3
of the GNU General Public License that is incorporated pursuant to the
following paragraph.
Notwithstanding any other provision of this License, you have Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed permission to link or combine any covered work with a work licensed
under version 3 of the GNU Affero General Public License into a single under version 3 of the GNU General Public License into a single
combined work, and to convey the resulting work. The terms of this combined work, and to convey the resulting work. The terms of this
License will continue to apply to the part which is the covered work, License will continue to apply to the part which is the covered work,
but the special requirements of the GNU Affero General Public License, but the work with which it is combined will remain governed by version
section 13, concerning interaction through a network will apply to the 3 of the GNU General Public License.
combination as such.
14. Revised Versions of this License. 14. Revised Versions of this License.
The Free Software Foundation may publish revised and/or new versions of The Free Software Foundation may publish revised and/or new versions of
the GNU General Public License from time to time. Such new versions will the GNU Affero General Public License from time to time. Such new versions
be similar in spirit to the present version, but may differ in detail to will be similar in spirit to the present version, but may differ in detail to
address new problems or concerns. address new problems or concerns.
Each version is given a distinguishing version number. If the Each version is given a distinguishing version number. If the
Program specifies that a certain numbered version of the GNU General Program specifies that a certain numbered version of the GNU Affero General
Public License "or any later version" applies to it, you have the Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software version or of any later version published by the Free Software
Foundation. If the Program does not specify a version number of the Foundation. If the Program does not specify a version number of the
GNU General Public License, you may choose any version ever published GNU Affero General Public License, you may choose any version ever published
by the Free Software Foundation. by the Free Software Foundation.
If the Program specifies that a proxy can decide which future If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that proxy's versions of the GNU Affero General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you public statement of acceptance of a version permanently authorizes you
to choose that version for the Program. to choose that version for the Program.
@ -635,40 +633,29 @@ the "copyright" line and a pointer to where the full notice is found.
Copyright (C) <year> <name of author> Copyright (C) <year> <name of author>
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU Affero General Public License as published by
the Free Software Foundation, either version 3 of the License, or the Free Software Foundation, either version 3 of the License, or
(at your option) any later version. (at your option) any later version.
This program is distributed in the hope that it will be useful, This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details. GNU Affero General Public License for more details.
You should have received a copy of the GNU General Public License You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. along with this program. If not, see <https://www.gnu.org/licenses/>.
Also add information on how to contact you by electronic and paper mail. Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short If your software can interact with users remotely through a computer
notice like this when it starts in an interactive mode: network, you should also make sure that it provides a way for users to
get its source. For example, if your program is a web application, its
<program> Copyright (C) <year> <name of author> interface could display a "Source" link that leads users to an archive
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. of the code. There are many ways you could offer source, and different
This is free software, and you are welcome to redistribute it solutions will be better for different programs; see section 13 for the
under certain conditions; type `show c' for details. specific requirements.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, your program's commands
might be different; for a GUI interface, you would use an "about box".
You should also get your employer (if you work as a programmer) or school, You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary. if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU GPL, see For more information on this, and how to apply and follow the GNU AGPL, see
<http://www.gnu.org/licenses/>. <https://www.gnu.org/licenses/>.
The GNU General Public License does not permit incorporating your program
into proprietary programs. If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with
the library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License. But first, please read
<http://www.gnu.org/philosophy/why-not-lgpl.html>.

494
README.adoc Normal file
View File

@ -0,0 +1,494 @@
= mastodon-cpp
:toc: preamble
:project: mastodon-cpp
:uri-base: https://schlomp.space/tastytea/{project}
:uri-branch-main: {uri-base}/src/branch/master
:uri-mastodonpp: https://schlomp.space/tastytea/mastodonpp
[IMPORTANT]
This project has become too complicated to maintain by myself and I can't find
the energy to add features. **You can find a complete rewrite, with cleaner and
much easier to understand code at link:{uri-mastodonpp}[mastodonpp].** I
recommend switching to it. You can still report bugs here and I will respond,
but I won't put too much work in it. If you want to take over maintainership,
get in touch.
*{project}* is a C++ wrapper for the Mastodon API. You submit an API call
and get the raw JSON that you can then transform into easy to use abstractions.
== Usage
The HTML reference can be generated with `build_doc.sh`, if doxygen is
installed. It is also available at
https://doc.schlomp.space/{project}/annotated.html[doc.schlomp.space/{project}/].
There are more {uri-branch-main}/examples[examples] in `examples/`.
=== Examples
.Print own account as JSON to stdout.
====
[source,c++]
----
#include <iostream>
#include <mastodon-cpp/mastodon-cpp.hpp>
int main()
{
Mastodon::API masto("social.example.com", "auth_token");
std::cout << masto.get(Mastodon::API::v1::accounts_verify_credentials);
std::cout << std::endl;
}
----
====
.Use the `Easy` interface to get the last posts from the federated timeline.
====
[source,c++]
----
#include <iostream>
#include <string>
#include <mastodon-cpp/mastodon-cpp.hpp>
#include <mastodon-cpp/easy/all.hpp>
using Mastodon;
int main()
{
Easy::API masto("social.example", "");
return_call ret = masto.get(API::v1::timelines_public);
for (const std::string &str : Easy::json_array_to_vector(ret.answer))
{
Easy::Status status(str);
std::cout << " " << status.account().acct() << " wrote:\n";
std::cout << status.content() << '\n';
}
}
----
====
=== Compiling your project
A project consisting of one file can be compiled as follows:
[source,shell]
----
g++ --std=c++14 -lmastodon-cpp example.cpp
----
=== List of types
Learn more at <https://doc.schlomp.space/mastodon-cpp/namespaceMastodon.html>
and <https://doc.schlomp.space/mastodon-cpp/namespaceMastodon_1_1Easy.html>.
Not included in this list are entities.
==== Return types
* `Mastodon::return_call`: Contains the response from `Mastodon::API` calls.
==== Other types
* `Mastodon::parameters`: Vector of `Mastodon::param` with custom `find()`, for
specifying parameters to an `Mastodon::API` call.
* `Mastodon::http_method`: HTTP method of an `Mastodon::API` call.
* `Mastodon::Easy::event_type`: Event types returned in streams.
* `Mastodon::Easy::visibility_type`: Describes the visibility of a post.
* `Mastodon::Easy::attachment_type`: Describes the type of attachment.
* `Mastodon::Easy::card_type`: Describes the type of card.
* `Mastodon::Easy::notification_type`: The type of the notification.
* `Mastodon::Easy::context_type`: Describes the context of a filter.
* `Mastodon::Easy::stream_event_type`: Type and data of an events returned in
streams.
* `Mastodon::Easy::alert_type`, used for push subscriptions.
* `Mastodon::Easy::time_type`: Type for time, can be converted to `time_point`
and `string`.
* `Mastodon::Easy::account_field_type`: Type for fields in accounts.
* `Mastodon::Easy::urls_type`: Type for URLs returned by `Instance::urls()`.
* `Mastodon::Easy::stats_type`: Type for statistics returned by
`Instance::stats()`.
* `Mastodon::Easy::poll_options_type`: Type for poll options returned by
`Poll::options()`.
=== Error codes
[options="header",cols=">,<"]
|===================================================
| Code | Explanation
| 0 | No error
| 1 | Invalid argument
| 10 | URL changed (HTTP 301 or 308)
| 11 | Connection timed out
| 12 | Connection refused (check http_error_code)
| 13 | No route to host / Could not resolve host
| 14 | Encryption error
| 127 | Unknown error
|===================================================
If you use a debug build, you get more verbose error messages.
=== Useful links
* https://docs.joinmastodon.org/[Mastodon documentation]
* https://git.pleroma.social/pleroma/pleroma/tree/develop/docs/api[Pleroma documentation]
* https://glitch-soc.github.io/docs/#whats-different[glitch-soc documentation]
== Install
=== Upgrading from versions below 0.100.0
Starting with version `0.100.0`, large parts of the library have been rewritten.
Upgrading from previous versions will require extensive code changes.
=== Packages
Every https://schlomp.space/tastytea/{project}/releases[release] includes
packages for Debian and Centos. Gentoo packages are available in my overlay.
==== Gentoo
Add my https://schlomp.space/tastytea/overlay[repository] and
install it from there.
[source,shell]
----
eselect repository enable tastytea
echo 'dev-cpp/mastodon-cpp ~amd64' >> /etc/portage/package.accept_keywords/mastodon-cpp
emaint sync -r tastytea
emerge -a dev-cpp/mastodon-cpp
----
==== DEB and RPM
Prebuilt DEB and RPM packages for x86_64(amd64) are provided with each release.
`.deb` packages are built on Debian stretch and `.rpm` packages are built on
CentOS 7. These packages are automatically built and not tested.
=== From source
==== Dependencies
* Tested OS: Linux
* C++ compiler (tested: https://gcc.gnu.org/[gcc] 6/8/9,
https://llvm.org/[clang] 5/7)
* https://cmake.org/[cmake] (at least: 3.6)
* https://pocoproject.org/[POCO] (tested: 1.9 / 1.7)
* Optional
** Easy interface & Examples:
https://github.com/open-source-parsers/jsoncpp[jsoncpp] (tested: 1.8 / 1.7)
** Documentation: https://www.stack.nl/~dimitri/doxygen/[doxygen] (tested: 1.8)
** DEB package: https://packages.qa.debian.org/dpkg[dpkg] (tested: 1.18)
** RPM package: http://www.rpm.org[rpm-build] (tested: 4.11)
** Tests: https://github.com/catchorg/Catch2[catch] (tested: 2.5 / 1.2)
.Install dependencies in Debian stretch.
====
[source,shell]
----
apt-get install build-essential cmake libpoco-dev libjsoncpp-dev doxygen
----
====
==== Get sourcecode
===== Release
Download the current release at
https://schlomp.space/tastytea/{project}/releases[schlomp.space].
===== Development version
[source,shell]
----
git clone https://schlomp.space/tastytea/mastodon-cpp.git
----
==== Compile
[source,shell]
----
mkdir build
cd build/
cmake ..
cmake --build . -- -j$(nproc --ignore=1)
----
.cmake options:
* `-DCMAKE_BUILD_TYPE=Debug` for a debug build.
* `-DWITH_EASY=NO` to not build the Easy abstractions and to get rid of the
jsoncpp-dependency (not recommended).
* `-DWITH_EXAMPLES=YES` if you want to compile the examples.
* `-DWITH_TESTS=YES` if you want to compile the tests.
* `-DEXTRA_TEST_ARGS` to run only some tests
(https://github.com/catchorg/Catch2/blob/master/docs/command-line.md#specifying-which-tests-to-run[format]).
** Possible tags: `[api]`, `[auth]`, `[mastodon]`, `[glitch-soc]`,
`[pleroma]`, `[upload]`, `[entity]`.
* `-DWITH_DOC=NO` if you don't want to compile the HTML reference.
* One of:
** `-DWITH_DEB=YES` if you want to be able to generate a deb-package.
** `-DWITH_RPM=YES` if you want to be able to generate an rpm-package.
.Run only tests for glitch-soc features that don't upload any files.
====
[source,shell]
----
cmake -DWITH_TESTS=YES -DEXTRA_TEST_ARGS=[glitch-soc]~[upload] ..
----
====
==== Tests
You can run the tests with `ctest` inside the build directory. You need to set
the environment variable `MASTODON_CPP_ACCESS_TOKEN` to an access token with the
scopes _read_, _write_ and _follow_ for tests tagged with `[auth]`.
You can select the instance to use with `MASTODON_CPP_INSTANCE`, the default is
_likeable.space_. You can select the user ID with `MASTODON_CPP_USER_ID`, the
default is _9hnrrVPriLiLVAhfVo_. You can select the status ID with
`MASTODON_CPP_STATUS_ID`, the default is _9hwnuJMq3eTdO4s1PU_. You can select
the filter ID with `MASTODON_CPP_FILTER_ID`. You can select the list ID with
`MASTODON_CPP_LIST_ID`, the default is _2_. You can select the media ID with
`MASTODON_CPP_MEDIA_ID`, the default is _2127742613_.
.Requirements for the test-user:
* Have at least 1 follower.
* Follow at least 1 account.
* Have at least 1 account endorsed.
* Have at least 1 public or unlisted status.
* Have at least 1 post favourited.
* Have no follow requests.
* Have at least 1 list with at least one account in it.
* have at least 1 account muted.
include::{uri-base}/raw/branch/master/CONTRIBUTING.adoc[]
== Status of implementation
You can still use unsupported calls by using `API::get` and the others with
strings and you can use unsupported fields in an `Entity` by converting it to
`Json::Value`.
=== Mastodon API
==== Calls
* Accounts
** [x] GET /api/v1/accounts/:id
** [x] POST /api/v1/accounts
** [x] GET /api/v1/accounts/verify_credentials
** [x] PATCH /api/v1/accounts/update_credentials
** [x] GET /api/v1/accounts/:id/followers
** [x] GET /api/v1/accounts/:id/following
** [x] GET /api/v1/accounts/:id/statuses
** [x] POST /api/v1/accounts/:id/follow
** [x] POST /api/v1/accounts/:id/unfollow
** [x] GET /api/v1/accounts/relationships
** [x] GET /api/v1/accounts/search
* Apps
** [x] POST /api/v1/apps
** [x] GET /api/v1/apps/verify_credentials
* Blocks
** [x] GET /api/v1/blocks
** [x] POST /api/v1/accounts/:id/block
** [x] POST /api/v1/accounts/:id/unblock
* Custom emoji
** [x] GET /api/v1/custom_emojis
* Domain blocks
** [x] GET /api/v1/domain_blocks
** [x] POST /api/v1/domain_blocks
** [x] DELETE /api/v1/domain_blocks
* Endorsements
** [x] GET /api/v1/endorsements
** [x] POST /api/v1/accounts/:id/pin
** [x] POST /api/v1/accounts/:id/unpin
* Favourites
** [x] GET /api/v1/favourites
** [x] POST /api/v1/statuses/:id/favourite
** [x] POST /api/v1/statuses/:id/unfavourite
* Filters
** [x] GET /api/v1/filters
** [x] POST /api/v1/filters
** [x] GET /api/v1/filters/:id
** [x] PUT /api/v1/filters/:id
** [x] DELETE /api/v1/filters/:id
* Follow requests
** [x] GET /api/v1/follow_requests
** [x] POST /api/v1/follow_requests/:id/authorize
** [x] POST /api/v1/follow_requests/:id/reject
* Follow suggestions
** [x] GET /api/v1/suggestions
** [x] DELETE /api/v1/suggestions/:account_id
* Instances
** [x] GET /api/v1/instance
* Lists
** [x] GET /api/v1/lists
** [x] GET /api/v1/accounts/:id/lists
** [x] GET /api/v1/lists/:id/accounts
** [x] GET /api/v1/lists/:id
** [x] POST /api/v1/lists
** [x] PUT /api/v1/lists/:id
** [x] DELETE /api/v1/lists/:id
** [x] POST /api/v1/lists/:id/accounts
** [x] DELETE /api/v1/lists/:id/accounts
* Media attachments
** [x] POST /api/v1/media
** [x] PUT /api/v1/media/:id
* Mutes
** [x] GET /api/v1/mutes
** [x] POST /api/v1/accounts/:id/mute
** [x] POST /api/v1/accounts/:id/unmute
** [x] POST /api/v1/statuses/:id/mute
** [x] POST /api/v1/statuses/:id/unmute
* Notifications
** [x] GET /api/v1/notifications
** [x] GET /api/v1/notifications/:id
** [x] POST /api/v1/notifications/clear
** [x] POST /api/v1/notifications/dismiss
** [x] POST /api/v1/push/subscription
** [x] GET /api/v1/push/subscription
** [x] PUT /api/v1/push/subscription
** [x] DELETE /api/v1/push/subscription
* Polls
** [x] GET /api/v1/polls/:id
** [x] POST /api/v1/polls/:id/votes
* Reports
** [x] POST /api/v1/reports
* Scheduled Statuses
** [ ] GET /api/v1/scheduled_statuses
** [ ] GET /api/v1/scheduled_statuses/:id
** [ ] PUT /api/v1/scheduled_statuses/:id
** [ ] DELETE /api/v1/scheduled_statuses/:id
* Search
** [x] GET /api/v2/search
* Statuses
** [x] GET /api/v1/statuses/:id
** [x] GET /api/v1/statuses/:id/context
** [x] GET /api/v1/statuses/:id/card
** [x] GET /api/v1/statuses/:id/reblogged_by
** [x] GET /api/v1/statuses/:id/favourited_by
** [x] POST /api/v1/statuses
** [x] DELETE /api/v1/statuses/:id
** [x] POST /api/v1/statuses/:id/reblog
** [x] POST /api/v1/statuses/:id/unreblog
** [x] POST /api/v1/statuses/:id/pin
** [x] POST /api/v1/statuses/:id/unpin
* Timelines
** [x] GET /api/v1/timelines/home
** [x] GET /api/v1/conversations
** [x] GET /api/v1/timelines/public
** [x] GET /api/v1/timelines/tag/:hashtag
** [x] GET /api/v1/timelines/list/:list_id
* Streaming API
** [x] GET /api/v1/streaming/health
** [x] GET /api/v1/streaming/user
** [x] GET /api/v1/streaming/public
** [x] GET /api/v1/streaming/public/local
** [x] GET /api/v1/streaming/hashtag
** [x] GET /api/v1/streaming/hashtag/local
** [x] GET /api/v1/streaming/list
** [x] GET /api/v1/streaming/direct
==== Entities
* [x] Account
* [x] Application
* [x] Attachment
* [x] Card
* [x] Context
* [x] Conversation
* [x] Emoji
* [x] Filter
* [x] Instance
* [x] List
* [x] Mention
* [x] Notification
* [x] Poll
* [x] PushSubscription
* [x] Relationship
* [x] Results
* [x] Status
* [ ] ScheduledStatus
* [x] Tag
* [ ] Token
=== glitch-soc API
==== Calls
* [x] GET /api/v1/bookmarks
* [x] POST /api/v1/statuses/:id/bookmark
* [x] POST /api/v1/statuses/:id/unbookmark
==== Entities
* [x] `max_toot_chars` in Instance
=== Pleroma API
==== Calls
* [ ] `preview` and `content_type` in POST /api/v1/statuses
* [ ] `no_rich_text`, `hide_followers`, `hide_follows`, `hide_favorites` and
`show_role` in /api/v1/update_credentials
* [ ] GET /api/pleroma/emoji
* [ ] POST /api/pleroma/follow_import
* [ ] GET /api/pleroma/captcha
* [ ] POST /api/pleroma/delete_account
* [ ] POST /api/account/register
* [ ] POST /api/v1/pleroma/flavour/:flavour
* [ ] GET /api/v1/pleroma/flavour
* [ ] POST /api/pleroma/notifications/read
* [ ] POST /api/v1/pleroma/accounts/:id/subscribe
* [ ] POST /api/v1/pleroma/accounts/:id/unsubscribe
* [ ] GET /api/v1/pleroma/accounts/:id/favourites
* [ ] PUT /api/pleroma/notification_settings
* [ ] GET /api/pleroma/healthcheck
* Admin API
** [ ] GET /api/pleroma/admin/users
** [ ] DELETE /api/pleroma/admin/user
** [ ] POST /api/pleroma/admin/user
** [ ] POST /api/pleroma/admin/user/follow
** [ ] POST /api/pleroma/admin/user/unfollow
** [ ] PATCH /api/pleroma/admin/users/:nickname/toggle_activation
** [ ] PUT /api/pleroma/admin/users/tag
** [ ] DELETE /api/pleroma/admin/users/tag
** [ ] GET /api/pleroma/admin/permission_group/:nickname
** [ ] GET /api/pleroma/admin/permission_group/:nickname/:permission_group
** [ ] POST /api/pleroma/admin/permission_group/:nickname/:permission_group
** [ ] DELETE /api/pleroma/admin/permission_group/:nickname/:permission_group
** [ ] PUT /api/pleroma/admin/activation_status/:nickname
** [ ] GET /api/pleroma/admin/users/:nickname
** [ ] POST /api/pleroma/admin/relay
** [ ] DELETE /api/pleroma/admin/relay
** [ ] GET /api/pleroma/admin/invite_token
** [ ] GET /api/pleroma/admin/invites
** [ ] POST /api/pleroma/admin/revoke_invite
** [ ] POST /api/pleroma/admin/email_invite
** [ ] GET /api/pleroma/admin/password_reset
==== Entities
* `pleroma` object in:
** [ ] Status
** [ ] Attachment
** [ ] Account
** [ ] Source
** [ ] Notification
== Blocked instances
Instances that are frequently used to hurt marginalized people are blocked from
using this library.
.List of blocked instances:
* https://en.wikipedia.org/wiki/Gab_(social_network)[Gab]
* https://en.wikipedia.org/wiki/Kiwi_Farms[Kiwi Farms]
== Copyright
[source,text]
----
Copyright © 2018, 2019 tastytea <tastytea@tastytea.de>.
License AGPLv3: <https://www.gnu.org/licenses/agpl-3.0.html>.
This program comes with ABSOLUTELY NO WARRANTY. This is free software,
and you are welcome to redistribute it under certain conditions.
----

358
README.md
View File

@ -1,358 +0,0 @@
**mastodon-cpp** is a C++ wrapper for the Mastodon API. You submit an API call
and get the raw JSON or easy to use abstractions.
**The ABI will be unstable in versions < 1.0.0**
[Subscribe to mastodon-cpp releases](https://rss.schlomp.space/?repo=tastytea/mastodon-cpp).
# Usage
The HTML reference can be generated with `build_doc.sh`, if doxygen is
installed. It is also available at
[doc.schlomp.space/mastodon-cpp/](https://doc.schlomp.space/mastodon-cpp/annotated.html).
There are [examples](https://schlomp.space/tastytea/mastodon-cpp/src/branch/master/examples)
in `examples/`.
## Most basic example
```c++
#include <iostream>
#include <mastodon-cpp/mastodon-cpp.hpp>
int main()
{
Mastodon::API masto("social.example.com", "auth_token");
std::cout << masto.get(Mastodon::API::v1::accounts_verify_credentials);
std::cout << std::endl;
}
```
## Another simple example
Using the `Easy` interface.
```c++
#include <iostream>
#include <string>
#include <mastodon-cpp/mastodon-cpp.hpp>
#include <mastodon-cpp/easy/all.hpp>
using Mastodon;
int main()
{
Easy::API masto("social.example", "");
return_call ret = masto.get(API::v1::timelines_public);
for (const std::string &str : Easy::json_array_to_vector(ret.answer))
{
Easy::Status status(str);
std::cout << " " << status.account().acct() << " wrote:\n";
std::cout << status.content() << '\n';
}
}
```
## Compiling your project
A project consisting of one file can be compiled as follows:
``` shellsession
g++ -std=c++14 -lmastodon-cpp example.cpp
```
## List of types
Learn more at <https://doc.schlomp.space/mastodon-cpp/namespaceMastodon.html>
and <https://doc.schlomp.space/mastodon-cpp/namespaceMastodon_1_1Easy.html>.
### Return types
* `Mastodon::return_call`: Contains the response from `Mastodon::API` calls.
* `Mastodon::Easy::return_entity`: Contains the response from
`Mastodon::Easy::API` calls that return a single `Mastodon::Easy::Entity`.
* `Mastodon::Easy::return_entities_vector`: Contains the response from
`Mastodon::Easy::API` calls that return multiple `Mastodon::Easy::Entity`.
### Other types
* `Mastodon::param`: A single parameter to an `Mastodon::API` call. Normally you
don't need this.
* `Mastodon::parameters`: All parameters to an `Mastodon::API` call.
* `Mastodon::http_method`: HTTP method of an `Mastodon::API` call.
* `Mastodon::Easy::event_type`: Event types returned in streams.
* `Mastodon::Easy::visibility_type`: Describes the visibility of a post.
* `Mastodon::Easy::attachment_type`: Describes the type of attachment.
* `Mastodon::Easy::card_type`: Describes the type of card.
* `Mastodon::Easy::notification_type`: The type of the notification.
* `Mastodon::Easy::context_type`: Describes the context of a filter.
* `Mastodon::Easy::stream_event`: Type and data of an events returned in
streams.
* `Mastodon::Easy::alert_type`: Type for a single alert.
* `Mastodon::Easy::alerts`: Vector of `Mastodon::Easy::alert_type`, used for
push subscriptions.
* `Mastodon::Easy::time`: Type for time, can be converted to `time_point` and
`string`.
## Error codes
| Code | Explanation |
| --------: |:-------------------------------------------|
| 0 | No error |
| 22 | Invalid argument |
| 78 | URL changed (HTTP 301 or 308) |
| 110 | Connection timed out |
| 111 | Connection refused (check http_error_code) |
| 113 | No route to host / Could not resolve host |
| 192 | curlpp runtime error |
| 193 | curlpp logic error |
| 255 | Unknown error |
If you use a debug build, you get more verbose error messages.
## Useful links
* [Mastodon documentation](https://docs.joinmastodon.org/)
* [Pleroma documentation](https://git.pleroma.social/pleroma/pleroma/tree/develop/docs/api)
* [glitch-soc documentation](https://glitch-soc.github.io/docs/#whats-different)
# Install
## Upgrading from versions below 0.100.0
Starting with version `0.100.0`, large parts of the library have been rewritten.
Upgrading from previous versions will require extensive code changes. You can
keep using the old version, it is archived in the branch
[pre-0.100.0](https://schlomp.space/tastytea/mastodon-cpp/src/branch/pre-0.100.0).
It will receive bug-fixes for a while but no new features.
## Packages
Every [release](https://schlomp.space/tastytea/mastodon-cpp/releases) includes
packages for Debian and Centos. Gentoo packages are available in my overlay.
### Gentoo
Add my [repository](https://schlomp.space/tastytea/overlay) and
install it from there.
```shellsession
eselect repository enable tastytea
echo 'dev-cpp/mastodon-cpp ~amd64' >> /etc/portage/package.accept_keywords/mastodon-cpp
emaint sync -r tastytea
emerge -a dev-cpp/mastodon-cpp
```
### DEB and RPM
Prebuilt DEB and RPM packages for x86_64(amd64) are provided with each release.
`.deb` packages are built on Debian stretch and `.rpm` packages are built on
CentOS 7. These packages are automatically built and not tested.
To use the DEB`.deb` package on Debian stretch, you will need
[libcurlpp0](https://packages.debian.org/libcurlpp0) from sid.
To use the `.rpm` package on CentOS 7, you will need
[libcurlpp](https://download.fedoraproject.org/pub/epel/6/x86_64/Packages/c/)
from EPEL 6.
## From source
### Dependencies
* Tested OS: Linux
* C++ compiler (tested: [gcc](https://gcc.gnu.org/) 6/7/8,
[clang](https://llvm.org/) 5/6)
* [cmake](https://cmake.org/) (at least: 3.6)
* [pkgconfig](https://pkgconfig.freedesktop.org/wiki/) (tested: 0.29 / 0.27)
* [curlpp](http://www.curlpp.org/) (tested: 0.8)
* Optional
* Easy interface & Examples: [jsoncpp](https://github.com/open-source-parsers/jsoncpp) (tested: 1.8 / 1.7)
* Documentation: [doxygen](https://www.stack.nl/~dimitri/doxygen/) (tested: 1.8)
* DEB package: [dpkg](https://packages.qa.debian.org/dpkg) (tested: 1.18)
* RPM package: [rpm-build](http://www.rpm.org) (tested: 4.11)
* Tests: [catch](https://github.com/catchorg/Catch2) (tested: 2.5 / 1.2)
### Get sourcecode
#### Release
Download the current release at
[schlomp.space](https://schlomp.space/tastytea/mastodon-cpp/releases).
#### Development version
```shellsession
git clone https://schlomp.space/tastytea/mastodon-cpp.git
```
### Compile
```shellsession
mkdir build
cd build/
cmake ..
cmake --build . -- -j$(nproc --ignore=1)
```
cmake options:
* `-DCMAKE_BUILD_TYPE=Debug` for a debug build
* `-DWITH_EASY=NO` to not build the Easy abstractions and to get rid of the
jsoncpp-dependency (not recommended)
* `-DWITH_EXAMPLES=YES` if you want to compile the examples
* `-DWITH_TESTS=YES` if you want to compile the tests
* `-DEXTRA_TEST_ARGS` to run only some tests
* Possible values: `[api]`, `[mastodon]`, `[glitch-soc]`, `[pleroma]`
* Example: `-DEXTRA_TEST_ARGS=[pleroma]![mastodon]` to run the tests for features
in Pleroma that are not in Mastodon.
* `-DWITH_DOC=NO` if you don't want to compile the HTML reference
* One of:
* `-DWITH_DEB=YES` if you want to be able to generate a deb-package
* `-DWITH_RPM=YES` if you want to be able to generate an rpm-package
Install with `make install`.
### Tests
You can run the tests with `ctest` inside the build directory. You need to set
the environment variable `MASTODON_CPP_ACCESS_TOKEN` to an access token with the
scopes *read*, *write* and *follow* for some tests.
You can select the instance to use with `MASTODON_CPP_INSTANCE`, the default is
*likeable.space*. You can select the user ID with `MASTODON_CPP_USER_ID`, the
default is *9hnrrVPriLiLVAhfVo*. You can select the status ID with
`MASTODON_CPP_STATUS_ID`, the default is *9hwnuJMq3eTdO4s1PU*. You can select
the filter ID with `MASTODON_CPP_FILTER_ID`.
Requirements for the test-user:
* Have at least 1 follower.
* Follow at least 1 account.
* Have at least 1 account endorsed.
* Have at least 1 public or unlisted status.
* Have at least 1 post favourited.
* Have no follow requests.
### Packages
#### DEB and RPM
Compile with `-DWITH_DEB=ON` or `-DWITH_RPM=ON`.
Run `make package` from the build directory to generate a DEB/RPM package.
#### Other
Run `make package` from the build directory to generate a tar.gz archive.
# Status of implementation
~~Feature complete as of Mastodon 2.6.1~~
* [x] GET /api/v1/accounts/:id
* [x] POST /api/v1/accounts
* [x] GET /api/v1/accounts/verify_credentials
* [x] PATCH /api/v1/accounts/update_credentials
* [x] GET /api/v1/accounts/:id/followers
* [x] GET /api/v1/accounts/:id/following
* [x] GET /api/v1/accounts/:id/statuses
* [x] POST /api/v1/accounts/:id/follow
* [x] POST /api/v1/accounts/:id/unfollow
* [x] GET /api/v1/accounts/relationships
* [x] GET /api/v1/accounts/search
* [x] POST /api/v1/apps
* [x] GET /api/v1/apps/verify_credentials
* [x] GET /api/v1/blocks
* [x] POST /api/v1/accounts/:id/block
* [x] POST /api/v1/accounts/:id/unblock
* [x] GET /api/v1/custom_emojis
* [x] GET /api/v1/domain_blocks
* [x] POST /api/v1/domain_blocks
* [x] DELETE /api/v1/domain_blocks
* [x] GET /api/v1/endorsements
* [x] POST /api/v1/accounts/:id/pin
* [x] POST /api/v1/accounts/:id/unpin
* [x] GET /api/v1/favourites
* [x] POST /api/v1/statuses/:id/favourite
* [x] POST /api/v1/statuses/:id/unfavourite
* [x] GET /api/v1/filters
* [x] POST /api/v1/filters
* [x] GET /api/v1/filters/:id
* [x] PUT /api/v1/filters/:id
* [x] DELETE /api/v1/filters/:id
* [x] GET /api/v1/follow_requests
* [x] POST /api/v1/follow_requests/:id/authorize
* [x] POST /api/v1/follow_requests/:id/reject
* [x] GET /api/v1/suggestions
* [x] DELETE /api/v1/suggestions/:account_id
* [x] GET /api/v1/instance
* [x] GET /api/v1/lists
* [x] GET /api/v1/accounts/:id/lists
* [x] GET /api/v1/lists/:id/accounts
* [x] GET /api/v1/lists/:id
* [x] POST /api/v1/lists
* [x] PUT /api/v1/lists/:id
* [x] DELETE /api/v1/lists/:id
* [x] POST /api/v1/lists/:id/accounts
* [x] DELETE /api/v1/lists/:id/accounts
* [x] POST /api/v1/media
* [x] PUT /api/v1/media/:id
* [x] GET /api/v1/mutes
* [x] POST /api/v1/accounts/:id/mute
* [x] POST /api/v1/accounts/:id/unmute
* [x] POST /api/v1/statuses/:id/mute
* [x] POST /api/v1/statuses/:id/unmute
* [x] GET /api/v1/notifications
* [x] GET /api/v1/notifications/:id
* [x] POST /api/v1/notifications/clear
* [x] POST /api/v1/notifications/dismiss
* [x] POST /api/v1/push/subscription
* [x] GET /api/v1/push/subscription
* [x] PUT /api/v1/push/subscription
* [x] DELETE /api/v1/push/subscription
* [x] ~~GET /api/v1/reports~~ (Deprecated)
* [x] POST /api/v1/reports
* [ ] GET /api/v1/scheduled_statuses
* [ ] GET /api/v1/scheduled_statuses/:id
* [ ] PUT /api/v1/scheduled_statuses/:id
* [ ] DELETE /api/v1/scheduled_statuses/:id
* [x] ~~GET /api/v1/search~~ (Deprecated)
* [x] GET /api/v2/search
* [x] GET /api/v1/statuses/:id
* [x] GET /api/v1/statuses/:id/context
* [x] GET /api/v1/statuses/:id/card
* [x] GET /api/v1/statuses/:id/reblogged_by
* [x] GET /api/v1/statuses/:id/favourited_by
* [x] POST /api/v1/statuses
* [x] DELETE /api/v1/statuses/:id
* [x] POST /api/v1/statuses/:id/reblog
* [x] POST /api/v1/statuses/:id/unreblog
* [x] POST /api/v1/statuses/:id/pin
* [x] POST /api/v1/statuses/:id/unpin
* [x] GET /api/v1/timelines/home
* [ ] GET /api/v1/conversations
* [x] GET /api/v1/timelines/public
* [x] GET /api/v1/timelines/tag/:hashtag
* [x] GET /api/v1/timelines/list/:list_id
* [x] GET /api/v1/streaming/user
* [x] GET /api/v1/streaming/public
* [x] GET /api/v1/streaming/public/local
* [x] GET /api/v1/streaming/hashtag
* [ ] GET /api/v1/streaming/hashtag/local
* [x] GET /api/v1/streaming/list
* [ ] GET /api/v1/streaming/direct
## Glitch-Soc support
* [x] max_toot_chars in /api/v1/instance
* [x] GET /api/v1/bookmarks
* [x] POST /api/v1/statuses/:id/bookmark
* [x] POST /api/v1/statuses/:id/unbookmark
# Copyright
``` text
Copyright © 2018, 2019 tastytea <tastytea@tastytea.de>.
License GPLv3: GNU GPL version 3 <https://www.gnu.org/licenses/gpl-3.0.html>.
This program comes with ABSOLUTELY NO WARRANTY. This is free software,
and you are welcome to redistribute it under certain conditions.
```

19
cmake/CMakeLists.txt Normal file
View File

@ -0,0 +1,19 @@
include(CMakePackageConfigHelpers)
include(GNUInstallDirs)
write_basic_package_version_file("${PROJECT_NAME}ConfigVersion.cmake"
VERSION ${PACKAGE_VERSION}
COMPATIBILITY ExactVersion) # TODO: Set to SameMajorVersion when stable.
install(EXPORT ${PROJECT_NAME}Targets
FILE "${PROJECT_NAME}Targets.cmake"
NAMESPACE "${PROJECT_NAME}::"
DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}")
configure_file("${PROJECT_NAME}Config.cmake.in"
"${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake" @ONLY)
install(FILES
"${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake"
"${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake"
DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}")

View File

@ -0,0 +1,7 @@
include(CMakeFindDependencyMacro)
include(GNUInstallDirs)
find_dependency(jsoncpp CONFIG REQUIRED)
find_package(Poco COMPONENTS Foundation Net NetSSL CONFIG REQUIRED)
include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake")

46
cmake/packages.cmake Normal file
View File

@ -0,0 +1,46 @@
set(CPACK_PACKAGE_NAME ${PROJECT_NAME})
set(CPACK_PACKAGE_VERSION_MAJOR ${${PROJECT_NAME}_VERSION_MAJOR})
set(CPACK_PACKAGE_VERSION_MINOR ${${PROJECT_NAME}_VERSION_MINOR})
set(CPACK_PACKAGE_VERSION_PATCH ${${PROJECT_NAME}_VERSION_PATCH})
set(CPACK_PACKAGE_VERSION ${mastodon-cpp_VERSION})
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "${PROJECT_DESCRIPTION}")
if(CPACK_PACKAGE_DESCRIPTION_SUMMARY STREQUAL "") # CMake < 3.9
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "C++ wrapper for the Mastodon API.")
endif()
set(CPACK_PACKAGE_CONTACT "tastytea <tastytea@tastytea.de>")
set(CPACK_RESOURCE_FILE_LICENSE "${PROJECT_SOURCE_DIR}/LICENSE")
set(CPACK_RESOURCE_FILE_README "${PROJECT_SOURCE_DIR}/README.adoc")
execute_process(COMMAND uname -m
OUTPUT_VARIABLE CPACK_PACKAGE_ARCHITECTURE OUTPUT_STRIP_TRAILING_WHITESPACE)
set(CPACK_PACKAGE_FILE_NAME
"${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}_${CPACK_PACKAGE_ARCHITECTURE}")
set(CPACK_GENERATOR "TGZ")
if (WITH_DEB)
set(CPACK_PACKAGE_NAME "lib${PROJECT_NAME}")
set(CPACK_GENERATOR "DEB")
set(CPACK_DEBIAN_PACKAGE_HOMEPAGE
"https://schlomp.space/tastytea/${PROJECT_NAME}")
set(CPACK_DEBIAN_PACKAGE_SHLIBDEPS ON)
execute_process(COMMAND dpkg --print-architecture
OUTPUT_VARIABLE CPACK_DEBIAN_PACKAGE_ARCHITECTURE
OUTPUT_STRIP_TRAILING_WHITESPACE)
execute_process(COMMAND lsb_release --codename --short
OUTPUT_VARIABLE DEBIAN_CODENAME
OUTPUT_STRIP_TRAILING_WHITESPACE)
set(CPACK_PACKAGE_FILE_NAME
"${CPACK_PACKAGE_NAME}_${CPACK_PACKAGE_VERSION}-0_${DEBIAN_CODENAME}_${CPACK_DEBIAN_PACKAGE_ARCHITECTURE}")
endif()
if (WITH_RPM)
set(CPACK_PACKAGE_NAME "lib${PROJECT_NAME}")
set(CPACK_GENERATOR "RPM")
set(CPACK_RPM_PACKAGE_LICENSE "AGPL-3")
set(CPACK_RPM_PACKAGE_URL "https://schlomp.space/tastytea/${PROJECT_NAME}")
set(CPACK_RPM_PACKAGE_REQUIRES "poco-netssl >= 1.6, jsoncpp >= 1.7.4")
set(CPACK_PACKAGE_FILE_NAME
"${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}-0.${CPACK_PACKAGE_ARCHITECTURE}")
endif()
include(CPack)

11
examples/CMakeLists.txt Normal file
View File

@ -0,0 +1,11 @@
file(GLOB sources_examples *.cpp)
foreach(src ${sources_examples})
get_filename_component(bin ${src} NAME_WE)
add_executable(${bin} ${src})
target_link_libraries(${bin} PRIVATE ${PROJECT_NAME})
endforeach()
if(WITH_DOC)
install(FILES ${sources_examples}
DESTINATION "${CMAKE_INSTALL_DOCDIR}/${PROJECT_NAME}/examples")
endif()

View File

@ -8,13 +8,8 @@
#include <string> #include <string>
#include <cstdint> #include <cstdint>
#include <regex> #include <regex>
#ifdef MASTODON_CPP #include "mastodon-cpp.hpp"
#include "mastodon-cpp.hpp" #include "easy/all.hpp"
#include "easy/all.hpp"
#else
#include <mastodon-cpp/mastodon-cpp.hpp>
#include <mastodon-cpp/easy/all.hpp>
#endif
using std::cout; using std::cout;
using std::cerr; using std::cerr;

View File

@ -10,13 +10,8 @@
#include <mutex> #include <mutex>
#include <chrono> #include <chrono>
#include <vector> #include <vector>
#ifdef MASTODON_CPP #include "mastodon-cpp.hpp"
#include "mastodon-cpp.hpp" #include "easy/all.hpp"
#include "easy/all.hpp"
#else
#include <mastodon-cpp/mastodon-cpp.hpp>
#include <mastodon-cpp/easy/all.hpp>
#endif
using std::cout; using std::cout;
using std::cerr; using std::cerr;
@ -51,11 +46,12 @@ int main(int argc, char *argv[])
// Acquire lock for the stream variable to avoid simultaneous access. // Acquire lock for the stream variable to avoid simultaneous access.
std::lock_guard<std::mutex> lock(ptr->get_mutex()); std::lock_guard<std::mutex> lock(ptr->get_mutex());
// Parse event stream into a vector. // Parse event stream into a vector.
std::vector<Easy::stream_event> events = Easy::parse_stream(stream); std::vector<Easy::stream_event_type> events
= Easy::parse_stream(stream);
// Clear the stream buffer. // Clear the stream buffer.
stream.clear(); stream.clear();
for (const Easy::stream_event &event : events) for (const Easy::stream_event_type &event : events)
{ {
// Print out some information about the events. // Print out some information about the events.
switch (event.type) switch (event.type)

View File

@ -0,0 +1,91 @@
// This file is part of mastodon-cpp.
// Get 2 pages of 5 favourites each.
// Don't compile this if the Easy-interface is turned off
#ifndef WITHOUT_EASY
#include <iostream>
#include <string>
#include <vector>
#include "mastodon-cpp.hpp"
#include "easy/all.hpp"
using std::cout;
using std::cerr;
using std::endl;
using std::string;
using std::vector;
using namespace Mastodon;
void print_favs(Easy::API &masto, const string &max_id = "")
{
// Set up parameters.
Mastodon::parameters params =
{
{ "limit", { "5" } },
{ "exclude_types", { "follow", "reblog", "mention" } }
};
// Set max_id if given.
if (!max_id.empty())
{
params.push_back({ "max_id", { max_id } });
}
// Retrieve the last 5 favourites.
return_call ret = masto.get(API::v1::notifications, params);
// If no error was returned.
if (ret)
{
// Convert answer to vector of strings, loop through vector.
for (const string &str : Easy::json_array_to_vector(ret.answer))
{
// Construct Mastodon::Easy::Notification from string.
const Easy::Notification notif(str);
cout << notif.created_at().strtime("%F %T: ");
cout << notif.account().display_name() << " favourited a status.\n";
}
}
else
{
// Print error message.
cerr << ret.error_message << endl;
// Print HTTP status code, if there is one.
if (ret.http_error_code != 0)
{
cerr << "HTTP status code: "
<< std::to_string(ret.http_error_code) << endl;
}
}
}
int main(int argc, char *argv[])
{
const vector<string> args(argv, argv + argc);
if (args.size() < 3)
{
std::cerr << "usage: " << args[0] << " <instance> <auth token>\n";
return 1;
}
// Construct a Mastodon::Easy object.
Easy::API masto(args[1], args[2]);
print_favs(masto);
cout << "\nLink header is: " << masto.get_header("link") << "\n\n";
// Get the max_id for pagination.
// See <https://docs.joinmastodon.org/api/rest/notifications/#pagination>
print_favs(masto, masto.get_link().max_id());
// The same: print_favs(masto, masto.get_link().next());
return 0;
}
#else
#include <iostream>
int main()
{
std::cout << "mastodon-cpp was compiled without Easy support.\n";
return 255;
}
#endif // WITHOUT_EASY

View File

@ -0,0 +1,48 @@
// This file is part of mastodon-cpp.
// Prints shortcode + URL for each custom emoji.
// Don't compile this if the Easy-interface is turned off
#ifndef WITHOUT_EASY
#include <iostream>
#include <string>
#include <vector>
#include "mastodon-cpp.hpp"
#include "easy/all.hpp"
using std::string;
using std::vector;
using namespace Mastodon;
int main(int argc, char *argv[])
{
const vector<string> args(argv, argv + argc);
if (args.size() < 2)
{
std::cerr << "usage: " << args[0] << " <instance>\n";
return 1;
}
// Construct a Mastodon::Easy object.
Easy::API masto(args[1], "");
const return_call ret = masto.get(API::v1::custom_emojis);
// Convert JSON array into vector of strings.
for (const string &str : Easy::json_array_to_vector(ret))
{
// Construct Emoji object from string.
const Easy::Emoji emoji(str);
std::cout << ':' << emoji.shortcode() << ": <" << emoji.url() << ">\n";
}
return 0;
}
#else
#include <iostream>
int main()
{
std::cout << "mastodon-cpp was compiled without Easy support.\n";
return 255;
}
#endif // WITHOUT_EASY

View File

@ -1,54 +0,0 @@
set(CPACK_PACKAGE_NAME ${PROJECT_NAME})
set(CPACK_PACKAGE_VERSION_MAJOR ${${PROJECT_NAME}_VERSION_MAJOR})
set(CPACK_PACKAGE_VERSION_MINOR ${${PROJECT_NAME}_VERSION_MINOR})
set(CPACK_PACKAGE_VERSION_PATCH ${${PROJECT_NAME}_VERSION_PATCH})
set(CPACK_PACKAGE_VERSION ${mastodon-cpp_VERSION})
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "C++ wrapper for the Mastodon API")
set(CPACK_PACKAGE_CONTACT "tastytea <tastytea@tastytea.de>")
set(CPACK_RESOURCE_FILE_LICENSE "${PROJECT_SOURCE_DIR}/LICENSE")
set(CPACK_RESOURCE_FILE_README "${PROJECT_SOURCE_DIR}/README.md")
list(APPEND CPACK_SOURCE_IGNORE_FILES "/\\\\.git"
"/.gitignore"
"/build/"
"/doc/"
"\\\\.sublime-"
"/update_doc.sh"
"/.drone.yml"
"/ISSUE_TEMPLATE.md$")
execute_process(COMMAND uname -m
OUTPUT_VARIABLE CPACK_PACKAGE_ARCHITECTURE
OUTPUT_STRIP_TRAILING_WHITESPACE)
set(CPACK_PACKAGE_FILE_NAME
"${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}_${CPACK_PACKAGE_ARCHITECTURE}")
set(CPACK_GENERATOR "TGZ")
set(CPACK_SOURCE_GENERATOR "TGZ")
if (WITH_DEB)
set(CPACK_PACKAGE_NAME "lib${PROJECT_NAME}")
set(CPACK_GENERATOR "DEB")
set(CPACK_SOURCE_GENERATOR "DEB")
set(CPACK_DEBIAN_PACKAGE_HOMEPAGE "https://schlomp.space/tastytea/mastodon-cpp")
set(CPACK_DEBIAN_PACKAGE_SHLIBDEPS ON)
execute_process(COMMAND dpkg --print-architecture
OUTPUT_VARIABLE CPACK_DEBIAN_PACKAGE_ARCHITECTURE
OUTPUT_STRIP_TRAILING_WHITESPACE)
set(CPACK_PACKAGE_FILE_NAME
"${CPACK_PACKAGE_NAME}_${CPACK_PACKAGE_VERSION}-0_${CPACK_DEBIAN_PACKAGE_ARCHITECTURE}")
set(CPACK_SOURCE_PACKAGE_FILE_NAME
"${CPACK_PACKAGE_NAME}_${CPACK_PACKAGE_VERSION}-0_src")
endif()
if (WITH_RPM)
set(CPACK_PACKAGE_NAME "lib${PROJECT_NAME}")
set(CPACK_GENERATOR "RPM")
set(CPACK_SOURCE_GENERATOR "RPM")
set(CPACK_RPM_PACKAGE_LICENSE "GPL-3")
set(CPACK_RPM_PACKAGE_URL "https://schlomp.space/tastytea/mastodon-cpp")
set(CPACK_RPM_PACKAGE_REQUIRES "curlpp >= 0.8.1 jsoncpp, >= 1.7.4")
set(CPACK_PACKAGE_FILE_NAME
"${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}-0.${CPACK_PACKAGE_ARCHITECTURE}")
set(CPACK_SOURCE_PACKAGE_FILE_NAME
"${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}-0.src")
endif()
include(CPack)

View File

@ -0,0 +1,7 @@
include(GNUInstallDirs)
configure_file("${PROJECT_NAME}.pc.in"
"${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.pc" @ONLY)
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.pc"
DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig")

View File

@ -0,0 +1,12 @@
name=@PROJECT_NAME@
prefix=@CMAKE_INSTALL_PREFIX@
libdir=${prefix}/@CMAKE_INSTALL_LIBDIR@
includedir=${prefix}/@CMAKE_INSTALL_INCLUDEDIR@
Name: ${name}
Description: @PROJECT_DESCRIPTION@
Version: @PROJECT_VERSION@
Cflags: -I${includedir}
Libs: -L${libdir} -l${name} -lpthread -lPocoNet
Requires: jsoncpp
Libs.private: -lPocoFoundation -lPocoNetSSL

71
src/CMakeLists.txt Normal file
View File

@ -0,0 +1,71 @@
include(GNUInstallDirs)
if(WITH_EASY)
find_package(jsoncpp CONFIG REQUIRED)
endif()
# Some distributions do not contain Poco*Config.cmake recipes.
find_package(Poco COMPONENTS Foundation Net NetSSL CONFIG)
if(WITH_EASY)
file(GLOB_RECURSE sources *.cpp *.hpp)
else()
file(GLOB sources *.cpp api/*.cpp *.hpp api/*.hpp)
endif()
# Write version in header
configure_file ("version.hpp.in"
"${CMAKE_CURRENT_BINARY_DIR}/version.hpp")
add_library(${PROJECT_NAME} ${sources})
set_target_properties(${PROJECT_NAME} PROPERTIES
VERSION ${PROJECT_VERSION}
SOVERSION ${${PROJECT_NAME}_VERSION_MAJOR})
target_include_directories(${PROJECT_NAME}
PRIVATE
"$<BUILD_INTERFACE:${PROJECT_BINARY_DIR}>"
"$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>"
PUBLIC
"$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/src>"
"$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>")
if(WITH_EASY)
target_link_libraries(${PROJECT_NAME}
PUBLIC pthread jsoncpp_lib)
endif()
# If no Poco*Config.cmake recipes are found, look for headers in standard dirs.
if(PocoNetSSL_FOUND)
target_link_libraries(${PROJECT_NAME}
PRIVATE Poco::Foundation Poco::Net Poco::NetSSL)
else()
find_file(Poco_h NAMES "Poco/Poco.h"
PATHS "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_INCLUDEDIR}")
if("${Poco_h}" STREQUAL "Poco_h-NOTFOUND")
message(FATAL_ERROR "Could not find POCO.")
else()
message(WARNING
"Your distribution of POCO doesn't contain the *Config.cmake recipes, "
"but the files seem to be in the standard directories. "
"Let's hope this works.")
target_link_libraries(${PROJECT_NAME}
PRIVATE PocoFoundation PocoNet PocoNetSSL)
endif()
endif()
install(TARGETS ${PROJECT_NAME}
EXPORT "${PROJECT_NAME}Targets"
LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}"
ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}")
install(FILES mastodon-cpp.hpp return_types.hpp types.hpp
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME})
if(WITH_EASY)
file(GLOB easy_header easy/*.hpp)
install(FILES ${easy_header}
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME}/easy)
file(GLOB easy_entities_header easy/entities/*.hpp)
install(FILES ${easy_entities_header}
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME}/easy/entities)
endif()

View File

@ -2,15 +2,15 @@
* Copyright © 2018 tastytea <tastytea@tastytea.de> * Copyright © 2018 tastytea <tastytea@tastytea.de>
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, version 3. * the Free Software Foundation, version 3.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU Affero General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
@ -78,7 +78,7 @@ return_call API::del(const Mastodon::API::v1 &call,
default: default:
{ {
ttdebug << "ERROR: Invalid argument.\n"; ttdebug << "ERROR: Invalid argument.\n";
return { 22, "Invalid argument", 0, "" }; return { error::INVALID_ARGUMENT, "Invalid argument", 0, "" };
} }
} }
@ -88,5 +88,5 @@ return_call API::del(const Mastodon::API::v1 &call,
return_call API::del(const std::string &call, const parameters &params) return_call API::del(const std::string &call, const parameters &params)
{ {
return _http.request(http_method::DELETE, call, maptoformdata(params)); return _http.request(http_method::DELETE, call, *maptoformdata(params));
} }

View File

@ -2,15 +2,15 @@
* Copyright © 2018, 2019 tastytea <tastytea@tastytea.de> * Copyright © 2018, 2019 tastytea <tastytea@tastytea.de>
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, version 3. * the Free Software Foundation, version 3.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU Affero General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
@ -86,11 +86,6 @@ const return_call API::get(const Mastodon::API::v1 &call,
strcall = "/api/v1/notifications"; strcall = "/api/v1/notifications";
break; break;
} }
case v1::reports:
{
strcall = "/api/v1/reports";
break;
}
case v1::timelines_home: case v1::timelines_home:
{ {
strcall = "/api/v1/timelines/home"; strcall = "/api/v1/timelines/home";
@ -151,11 +146,6 @@ const return_call API::get(const Mastodon::API::v1 &call,
strcall = "/api/v1/notifications/" + strid; strcall = "/api/v1/notifications/" + strid;
break; break;
} }
case v1::search:
{
strcall = "/api/v1/search";
break;
}
case v1::statuses_id: case v1::statuses_id:
{ {
strcall = "/api/v1/statuses/" + strid; strcall = "/api/v1/statuses/" + strid;
@ -192,7 +182,7 @@ const return_call API::get(const Mastodon::API::v1 &call,
else else
{ {
ttdebug << "ERROR: Invalid argument.\n"; ttdebug << "ERROR: Invalid argument.\n";
return { 22, "Invalid argument", 0, "" }; return { error::INVALID_ARGUMENT, "Invalid argument", 0, "" };
} }
break; break;
} }
@ -236,10 +226,25 @@ const return_call API::get(const Mastodon::API::v1 &call,
strcall = "/api/v1/suggestions"; strcall = "/api/v1/suggestions";
break; break;
} }
case v1::polls_id:
{
strcall = "/api/v1/polls/" + strid;
break;
}
case v1::conversations:
{
strcall = "/api/v1/conversations";
break;
}
case v1::streaming_health:
{
strcall = "/api/v1/streaming/health";
break;
}
default: default:
{ {
ttdebug << "ERROR: Invalid argument.\n"; ttdebug << "ERROR: Invalid argument.\n";
return { 22, "Invalid argument", 0, "" }; return { error::INVALID_ARGUMENT, "Invalid argument", 0, "" };
} }
} }
@ -276,7 +281,7 @@ const return_call API::get(const Mastodon::API::v2 &call,
default: default:
{ {
ttdebug << "ERROR: Invalid argument.\n"; ttdebug << "ERROR: Invalid argument.\n";
return { 22, "Invalid argument", 0, "" }; return { error::INVALID_ARGUMENT, "Invalid argument", 0, "" };
} }
} }

View File

@ -2,15 +2,15 @@
* Copyright © 2018, 2019 tastytea <tastytea@tastytea.de> * Copyright © 2018, 2019 tastytea <tastytea@tastytea.de>
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, version 3. * the Free Software Foundation, version 3.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU Affero General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
@ -20,36 +20,60 @@
using namespace Mastodon; using namespace Mastodon;
using std::cerr; using std::cerr;
using std::to_string;
void API::get_stream(const Mastodon::API::v1 &call, void API::get_stream(const Mastodon::API::v1 &call,
const parameters &params, const parameters &params,
std::unique_ptr<Mastodon::API::http> &ptr, std::unique_ptr<Mastodon::API::http> &ptr,
string &stream) string &stream)
{ {
string strcall = ""; string strcall = "";
switch (call) switch (call)
{ {
case v1::streaming_user: case Mastodon::API::v1::streaming_user:
strcall = "/api/v1/streaming/user"; {
break; strcall = "/api/v1/streaming/user";
case v1::streaming_public: break;
strcall = "/api/v1/streaming/public"; }
break; case v1::streaming_public:
case v1::streaming_public_local: {
strcall = "/api/v1/streaming/public/local"; strcall = "/api/v1/streaming/public";
break; break;
case v1::streaming_hashtag: }
strcall = "/api/v1/streaming/hashtag"; case v1::streaming_public_local:
break; {
case v1::streaming_list: strcall = "/api/v1/streaming/public/local";
strcall = "/api/v1/streaming/list"; break;
break; }
default: case v1::streaming_hashtag:
ttdebug << "ERROR: Invalid call.\n"; {
stream = "event: ERROR\ndata: {\"error_code\":22}\n"; strcall = "/api/v1/streaming/hashtag";
return; break;
break; }
case v1::streaming_hashtag_local:
{
strcall = "/api/v1/streaming/hashtag/local";
break;
}
case v1::streaming_list:
{
strcall = "/api/v1/streaming/list";
break;
}
case v1::streaming_direct:
{
strcall = "/api/v1/streaming/direct";
break;
}
default:
{
const uint8_t err = static_cast<uint8_t>(error::INVALID_ARGUMENT);
ttdebug << "ERROR: Invalid call.\n";
stream = "event: ERROR\ndata: "
"{\"error_code\":" + to_string(err) + "}\n";
return;
}
} }
if (params.size() > 0) if (params.size() > 0)

View File

@ -2,15 +2,15 @@
* Copyright © 2018, 2019 tastytea <tastytea@tastytea.de> * Copyright © 2018, 2019 tastytea <tastytea@tastytea.de>
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, version 3. * the Free Software Foundation, version 3.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU Affero General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
@ -32,10 +32,9 @@ return_call API::patch(const Mastodon::API::v1 &call,
break; break;
default: default:
ttdebug << "ERROR: Invalid argument.\n"; ttdebug << "ERROR: Invalid argument.\n";
return { 22, "Invalid argument", 0, "" }; return { error::INVALID_ARGUMENT, "Invalid argument", 0, "" };
break; break;
} }
return _http.request(http_method::PATCH, return _http.request(http_method::PATCH, strcall, *maptoformdata(params));
strcall, maptoformdata(params));
} }

View File

@ -2,15 +2,15 @@
* Copyright © 2018, 2019 tastytea <tastytea@tastytea.de> * Copyright © 2018, 2019 tastytea <tastytea@tastytea.de>
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, version 3. * the Free Software Foundation, version 3.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU Affero General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
@ -195,10 +195,15 @@ return_call API::post(const Mastodon::API::v1 &call,
strcall = "/api/v1/filters"; strcall = "/api/v1/filters";
break; break;
} }
case v1::polls_id_votes:
{
strcall = "/api/v1/polls/" + strid + "/votes";
break;
}
default: default:
{ {
ttdebug << "ERROR: Invalid argument.\n"; ttdebug << "ERROR: Invalid argument.\n";
return { 22, "Invalid argument", 0, ""}; return { error::INVALID_ARGUMENT, "Invalid argument", 0, ""};
} }
} }
@ -214,5 +219,5 @@ return_call API::post(const Mastodon::API::v1 &call)
return_call API::post(const string &call, const parameters &params) return_call API::post(const string &call, const parameters &params)
{ {
return _http.request(http_method::POST, call, maptoformdata(params)); return _http.request(http_method::POST, call, *maptoformdata(params));
} }

View File

@ -2,15 +2,15 @@
* Copyright © 2018, 2019 tastytea <tastytea@tastytea.de> * Copyright © 2018, 2019 tastytea <tastytea@tastytea.de>
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, version 3. * the Free Software Foundation, version 3.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU Affero General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
@ -58,7 +58,7 @@ return_call API::put(const Mastodon::API::v1 &call,
default: default:
{ {
ttdebug << "ERROR: Invalid argument.\n"; ttdebug << "ERROR: Invalid argument.\n";
return { 22, "Invalid argument", 0, "" }; return { error::INVALID_ARGUMENT, "Invalid argument", 0, "" };
} }
} }
@ -68,5 +68,5 @@ return_call API::put(const Mastodon::API::v1 &call,
return_call API::put(const string &call, const parameters &params) return_call API::put(const string &call, const parameters &params)
{ {
return _http.request(http_method::PUT, call, maptoformdata(params)); return _http.request(http_method::PUT, call, *maptoformdata(params));
} }

View File

@ -2,15 +2,15 @@
* Copyright © 2018, 2019 tastytea <tastytea@tastytea.de> * Copyright © 2018, 2019 tastytea <tastytea@tastytea.de>
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, version 3. * the Free Software Foundation, version 3.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU Affero General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */

View File

@ -2,62 +2,40 @@
* Copyright © 2018 tastytea <tastytea@tastytea.de> * Copyright © 2018 tastytea <tastytea@tastytea.de>
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, version 3. * the Free Software Foundation, version 3.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU Affero General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
#ifndef MASTODON_CPP_EASY_ALL_HPP #ifndef MASTODON_CPP_EASY_ALL_HPP
#define MASTODON_CPP_EASY_ALL_HPP #define MASTODON_CPP_EASY_ALL_HPP
// If we are compiling mastodon-cpp, use another include path #include "easy.hpp"
#ifdef MASTODON_CPP #include "entities/account.hpp"
#include "easy/easy.hpp" #include "entities/application.hpp"
#include "easy/entities/account.hpp" #include "entities/attachment.hpp"
#include "easy/entities/application.hpp" #include "entities/card.hpp"
#include "easy/entities/attachment.hpp" #include "entities/context.hpp"
#include "easy/entities/card.hpp" #include "entities/emoji.hpp"
#include "easy/entities/context.hpp" #include "entities/instance.hpp"
#include "easy/entities/emoji.hpp" #include "entities/list.hpp"
#include "easy/entities/instance.hpp" #include "entities/mention.hpp"
#include "easy/entities/list.hpp" #include "entities/notification.hpp"
#include "easy/entities/mention.hpp" #include "entities/relationship.hpp"
#include "easy/entities/notification.hpp" #include "entities/results.hpp"
#include "easy/entities/relationship.hpp" #include "entities/status.hpp"
#include "easy/entities/report.hpp" #include "entities/tag.hpp"
#include "easy/entities/results.hpp" #include "entities/token.hpp"
#include "easy/entities/status.hpp" #include "entities/pushsubscription.hpp"
#include "easy/entities/tag.hpp" #include "entities/filter.hpp"
#include "easy/entities/token.hpp" #include "entities/poll.hpp"
#include "easy/entities/pushsubscription.hpp" #include "entities/conversation.hpp"
#include "easy/entities/filter.hpp"
#else
#include <mastodon-cpp/easy/easy.hpp>
#include <mastodon-cpp/easy/entities/account.hpp>
#include <mastodon-cpp/easy/entities/application.hpp>
#include <mastodon-cpp/easy/entities/attachment.hpp>
#include <mastodon-cpp/easy/entities/card.hpp>
#include <mastodon-cpp/easy/entities/context.hpp>
#include <mastodon-cpp/easy/entities/emoji.hpp>
#include <mastodon-cpp/easy/entities/instance.hpp>
#include <mastodon-cpp/easy/entities/list.hpp>
#include <mastodon-cpp/easy/entities/mention.hpp>
#include <mastodon-cpp/easy/entities/notification.hpp>
#include <mastodon-cpp/easy/entities/relationship.hpp>
#include <mastodon-cpp/easy/entities/report.hpp>
#include <mastodon-cpp/easy/entities/results.hpp>
#include <mastodon-cpp/easy/entities/status.hpp>
#include <mastodon-cpp/easy/entities/tag.hpp>
#include <mastodon-cpp/easy/entities/token.hpp>
#include <mastodon-cpp/easy/entities/pushsubscription.hpp>
#include <mastodon-cpp/easy/entities/filter.hpp>
#endif
#endif // MASTODON_CPP_EASY_ALL_HPP #endif // MASTODON_CPP_EASY_ALL_HPP

View File

@ -2,15 +2,15 @@
* Copyright © 2018, 2019 tastytea <tastytea@tastytea.de> * Copyright © 2018, 2019 tastytea <tastytea@tastytea.de>
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, version 3. * the Free Software Foundation, version 3.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU Affero General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
@ -49,13 +49,14 @@ const std::vector<string> Easy::json_array_to_vector(const string &json)
return {}; return {};
} }
const vector<Easy::stream_event> Easy::parse_stream( const vector<Easy::stream_event_type> Easy::parse_stream(
const std::string &streamdata) const std::string &streamdata)
{ {
string stream = streamdata; string stream = streamdata;
std::regex reevent("event: (update|notification|delete|ERROR)\ndata: (.*)\n"); std::regex reevent("event: (update|notification|delete|filters_changed"
"|ERROR)\ndata: (.*)\n");
std::smatch match; std::smatch match;
std::vector<stream_event> vec = {}; std::vector<stream_event_type> vec = {};
while (std::regex_search(stream, match, reevent)) while (std::regex_search(stream, match, reevent))
{ {
@ -63,14 +64,16 @@ const vector<Easy::stream_event> Easy::parse_stream(
const string &data = match[2].str(); const string &data = match[2].str();
event_type type = event_type::Undefined; event_type type = event_type::Undefined;
if (event.compare("update") == 0) if (event == "update")
type = event_type::Update; type = event_type::Update;
else if (event.compare("notification") == 0) else if (event == "notification")
type = event_type::Notification; type = event_type::Notification;
else if (event.compare("delete") == 0) else if (event == "delete")
type = event_type::Delete; type = event_type::Delete;
else if (event.compare("ERROR") == 0) else if (event == "ERROR")
type = event_type::Error; type = event_type::Error;
else if (event == "filters_changed")
type = event_type::Filters_changed;
vec.push_back({ type, data }); vec.push_back({ type, data });
stream = match.suffix().str(); stream = match.suffix().str();
@ -79,6 +82,16 @@ const vector<Easy::stream_event> Easy::parse_stream(
return vec; return vec;
} }
const Easy::time_type Easy::string_to_time(const string &strtime)
{
std::stringstream sstime(strtime);
struct std::tm tm = {};
tm.tm_isdst = -1; // Detect daylight saving time.
sstime >> std::get_time(&tm, "%Y-%m-%dT%T");
std::time_t time = timegm(&tm); // Assume time is UTC.
return { system_clock::from_time_t(time) };
}
const Easy::Link Easy::API::get_link() const const Easy::Link Easy::API::get_link() const
{ {
return Link(get_header("Link")); return Link(get_header("Link"));
@ -88,8 +101,8 @@ Easy::Link::Link(const string &link_header)
: _next() : _next()
, _prev() , _prev()
{ {
std::regex renext("max_id=([[:digit:]]*)"); std::regex renext("max_id=([[:alnum:]]*)");
std::regex reprev("since_id=([[:digit:]]*)"); std::regex reprev("(?:since|min)_id=([[:alnum:]]*)");
std::smatch match; std::smatch match;
if (std::regex_search(link_header, match, renext)) if (std::regex_search(link_header, match, renext))
@ -121,3 +134,8 @@ const string Easy::Link::since_id() const
{ {
return _prev; return _prev;
} }
const string Easy::Link::min_id() const
{
return _prev;
}

View File

@ -2,15 +2,15 @@
* Copyright © 2018, 2019 tastytea <tastytea@tastytea.de> * Copyright © 2018, 2019 tastytea <tastytea@tastytea.de>
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, version 3. * the Free Software Foundation, version 3.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU Affero General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
@ -24,20 +24,11 @@
#include <ostream> #include <ostream>
#include <jsoncpp/json/json.h> #include <jsoncpp/json/json.h>
// If we are compiling mastodon-cpp, use another include path #include "../mastodon-cpp.hpp"
#ifdef MASTODON_CPP #include "return_types_easy.hpp"
#include "mastodon-cpp.hpp" #include "types_easy.hpp"
#include "easy/return_types_easy.hpp" #include "entities/notification.hpp"
#include "easy/types_easy.hpp" #include "entities/status.hpp"
#include "easy/entities/notification.hpp"
#include "easy/entities/status.hpp"
#else
#include <mastodon-cpp/mastodon-cpp.hpp>
#include <mastodon-cpp/easy/return_types_easy.hpp>
#include <mastodon-cpp/easy/types_easy.hpp>
#include <mastodon-cpp/easy/entities/notification.hpp>
#include <mastodon-cpp/easy/entities/status.hpp>
#endif
using std::string; using std::string;
using std::vector; using std::vector;
@ -98,6 +89,13 @@ namespace Easy
*/ */
const string since_id() const; const string since_id() const;
/*!
* @brief Returns min_id.
*
* @since 0.111.0
*/
const string min_id() const;
private: private:
string _next; string _next;
string _prev; string _prev;
@ -112,7 +110,7 @@ namespace Easy
* *
* @since before 0.11.0 * @since before 0.11.0
*/ */
const std::vector<string> json_array_to_vector(const string &json); const vector<string> json_array_to_vector(const string &json);
/*! /*!
* @brief Split stream into a vector of events * @brief Split stream into a vector of events
@ -123,7 +121,14 @@ namespace Easy
* *
* @since before 0.11.0 * @since before 0.11.0
*/ */
const std::vector<stream_event> parse_stream(const std::string &streamdata); const vector<stream_event_type> parse_stream(const std::string &streamdata);
/*!
* @brief Convert ISO 8601 time string to Easy::time.
*
* @param strtime Time string as returned by Mastodon.
*/
const Easy::time_type string_to_time(const string &strtime);
/*! /*!
* @brief Child of Mastodon::API with abstract methods. * @brief Child of Mastodon::API with abstract methods.
@ -162,6 +167,7 @@ namespace Easy
* *
* @since 0.100.0 * @since 0.100.0
*/ */
[[deprecated("Will go away in 1.0.0 with no replacement.")]]
const return_entity<Easy::Status> send_post(const Status &status); const return_entity<Easy::Status> send_post(const Status &status);
/*! /*!
@ -169,6 +175,7 @@ namespace Easy
* *
* @since 0.100.0 * @since 0.100.0
*/ */
[[deprecated("Will go away in 1.0.0 with no replacement.")]]
const return_entity<Easy::Status> send_toot(const Status &status); const return_entity<Easy::Status> send_toot(const Status &status);
/*! /*!
@ -182,6 +189,7 @@ namespace Easy
* *
* @since 0.100.0 * @since 0.100.0
*/ */
[[deprecated("Will go away in 1.0.0 with no replacement.")]]
const return_entity_vector<Easy::Notification> get_notifications( const return_entity_vector<Easy::Notification> get_notifications(
const uint16_t limit = 20, const string since_id = "", const uint16_t limit = 20, const string since_id = "",
const string max_id = ""); const string max_id = "");

View File

@ -2,49 +2,47 @@
* Copyright © 2018, 2019 tastytea <tastytea@tastytea.de> * Copyright © 2018, 2019 tastytea <tastytea@tastytea.de>
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, version 3. * the Free Software Foundation, version 3.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU Affero General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
#include <array>
#include <algorithm> #include <algorithm>
#include "account.hpp" #include "account.hpp"
#include "debug.hpp" #include "debug.hpp"
#include "easy/easy.hpp"
using namespace Mastodon; using namespace Mastodon;
using Account = Easy::Account; using Account = Easy::Account;
bool Account::valid() const bool Account::valid() const
{ {
const std::vector<string> attributes = return Entity::check_valid(
{{ {
"id", "id",
"username", "username",
"acct", "acct",
"display_name", "display_name",
"locked", "locked",
"created_at", "created_at",
"followers_count", "followers_count",
"following_count", "following_count",
"statuses_count", "statuses_count",
"note", "note",
"url", "url",
"avatar", "avatar",
"avatar_static", "avatar_static",
"header", "header",
"header_static", "header_static",
"emojis" "emojis"
}}; });
return Entity::check_valid(attributes);
} }
const string Account::acct() const const string Account::acct() const
@ -57,12 +55,6 @@ const string Account::avatar() const
return get_string("avatar"); return get_string("avatar");
} }
Account Account::avatar(const string &avatar)
{
set("avatar", Json::Value(avatar));
return *this;
}
const string Account::avatar_static() const const string Account::avatar_static() const
{ {
return get_string("avatar_static"); return get_string("avatar_static");
@ -73,7 +65,7 @@ bool Account::bot() const
return get_bool("bot"); return get_bool("bot");
} }
const Easy::time Account::created_at() const const Easy::time_type Account::created_at() const
{ {
return get_time("created_at"); return get_time("created_at");
} }
@ -83,45 +75,46 @@ const string Account::display_name() const
return get_string("display_name"); return get_string("display_name");
} }
Account Account::display_name(const string &display_name) const std::vector<Easy::Emoji> Account::emojis()
{ {
set("display_name", Json::Value(display_name)); const Json::Value &node = get("emojis");
return *this;
}
const std::vector<Account::fields_pair> Account::fields() const
{
const Json::Value &node = get("fields");
if (node.isArray()) if (node.isArray())
{ {
std::vector<Account::fields_pair> vec; std::vector<Easy::Emoji> vec;
std::transform(node.begin(), node.end(), std::back_inserter(vec), std::transform(node.begin(), node.end(), std::back_inserter(vec),
[](const Json::Value &value) [](const Json::Value &value)
{ {
return Account::fields_pair return Easy::Emoji(value);
(value["name"].asString(), });
value["value"].asString());
});
return vec; return vec;
} }
return {}; return {};
} }
Account Account::fields(std::vector<Account::fields_pair> &fields) const vector<Easy::account_field_type> Account::fields() const
{ {
Json::Value jsonarray(Json::arrayValue); const Json::Value &node = get("fields");
for (const fields_pair &field : fields) if (node.isArray())
{ {
Json::Value jsonkeyval(Json::objectValue); vector<Easy::account_field_type> vec;
jsonkeyval["name"] = field.first; std::transform(node.begin(), node.end(), std::back_inserter(vec),
jsonkeyval["value"] = field.second; [](const Json::Value &value)
jsonarray.append(jsonkeyval); {
return Easy::account_field_type(
{
value["name"].asString(),
value["value"].asString(),
Easy::string_to_time(
value["verified_at"].asString())
});
});
return vec;
} }
set("fields", jsonarray);
return *this; return {};
} }
std::uint64_t Account::followers_count() const std::uint64_t Account::followers_count() const
@ -139,12 +132,6 @@ const string Account::header() const
return get_string("header"); return get_string("header");
} }
Account Account::header(const string &header)
{
set("header", Json::Value(header));
return *this;
}
const string Account::header_static() const const string Account::header_static() const
{ {
return get_string("header_static"); return get_string("header_static");
@ -160,12 +147,6 @@ bool Account::locked() const
return get_bool("locked"); return get_bool("locked");
} }
Account Account::locked(const bool &locked)
{
set("locked", Json::Value(locked));
return *this;
}
bool Account::has_moved() const bool Account::has_moved() const
{ {
if (get("moved").isObject()) if (get("moved").isObject())
@ -180,8 +161,7 @@ const Account Account::moved() const
{ {
if (has_moved()) if (has_moved())
{ {
// TODO: Find an account with moved-node and test return Account(get("moved"));
return Account(get("moved").toStyledString());
} }
return Account(); return Account();
@ -192,25 +172,18 @@ const string Account::note() const
return get_string("note"); return get_string("note");
} }
Account Account::note(const string &note)
{
set("note", Json::Value(note));
return *this;
}
Easy::visibility_type Account::privacy() const Easy::visibility_type Account::privacy() const
{ {
const string strprivacy = get_string("source.privacy"); const string strprivacy = get_string("privacy");
if (strprivacy.compare("public") == 0) if (strprivacy == "public")
return visibility_type::Public; return visibility_type::Public;
else if (strprivacy.compare("unlisted") == 0) else if (strprivacy == "unlisted")
return visibility_type::Unlisted; return visibility_type::Unlisted;
else if (strprivacy.compare("private") == 0) else if (strprivacy == "private")
return visibility_type::Private; return visibility_type::Private;
else if (strprivacy.compare("direct") == 0) else if (strprivacy == "direct")
return visibility_type::Direct; return visibility_type::Direct;
ttdebug << "Could not get data: source.privacy\n";
return visibility_type::Undefined; return visibility_type::Undefined;
} }
@ -219,131 +192,11 @@ bool Account::sensitive() const
return get_bool("source.sensitive"); return get_bool("source.sensitive");
} }
bool Account::Source::valid() const
{
return true;
}
const std::vector<Account::fields_pair> Account::Source::fields() const
{
const Json::Value &node = get("fields");
if (node.isArray())
{
std::vector<Account::fields_pair> vec;
std::transform(node.begin(), node.end(), std::back_inserter(vec),
[](const Json::Value &value)
{
return Account::fields_pair
(value["name"].asString(),
value["value"].asString());
});
return vec;
}
return {};
}
Account::Source Account::Source::fields
(std::vector<Account::fields_pair> &fields)
{
Json::Value jsonarray(Json::arrayValue);
for (const fields_pair &field : fields)
{
Json::Value jsonkeyval(Json::objectValue);
jsonkeyval["name"] = field.first;
jsonkeyval["value"] = field.second;
jsonarray.append(jsonkeyval);
}
set("fields", jsonarray);
return *this;
}
const string Account::Source::note() const
{
return get_string("note");
}
Account::Source Account::Source::note(const string &note)
{
set("note", Json::Value(note));
return *this;
}
Easy::visibility_type Account::Source::privacy() const
{
const string strprivacy = get_string("privacy");
if (strprivacy.compare("public") == 0)
return visibility_type::Public;
else if (strprivacy.compare("unlisted") == 0)
return visibility_type::Unlisted;
else if (strprivacy.compare("private") == 0)
return visibility_type::Private;
else if (strprivacy.compare("direct") == 0)
return visibility_type::Direct;
ttdebug << "Could not get data: source.privacy\n";
return visibility_type::Undefined;
}
Account::Source Account::Source::privacy(const Easy::visibility_type &privacy)
{
string strprivacy = "";
switch (privacy)
{
case visibility_type::Public:
{
strprivacy = "public";
break;
}
case visibility_type::Unlisted:
{
strprivacy = "unlisted";
break;
}
case visibility_type::Private:
{
strprivacy = "private";
break;
}
case visibility_type::Direct:
{
strprivacy = "direct";
break;
}
default:
{
strprivacy = "undefined";
break;
}
}
set("privacy", Json::Value(strprivacy));
return *this;
}
bool Account::Source::sensitive() const
{
return get_bool("sensitive");
}
Account::Source Account::Source::sensitive(const bool &sensitive)
{
set("source", Json::Value(sensitive));
return *this;
}
const Account::Source Account::source() const const Account::Source Account::source() const
{ {
return Account::Source(get("source")); return Account::Source(get("source"));
} }
Account Account::source(const Account::Source &source)
{
set("source", Json::Value(source.to_object()));
return *this;
}
std::uint64_t Account::statuses_count() const std::uint64_t Account::statuses_count() const
{ {
return get_uint64("statuses_count"); return get_uint64("statuses_count");
@ -358,3 +211,66 @@ const string Account::username() const
{ {
return get_string("username"); return get_string("username");
} }
bool Account::Source::valid() const
{
return Entity::check_valid(
{
"note",
"fields"
});
}
const vector<Easy::account_field_type> Account::Source::fields() const
{
const Json::Value &node = get("fields");
if (node.isArray())
{
vector<Easy::account_field_type> vec;
std::transform(node.begin(), node.end(), std::back_inserter(vec),
[](const Json::Value &value)
{
return Easy::account_field_type(
{
value["name"].asString(),
value["value"].asString(),
Easy::string_to_time(
value["verified_at"].asString())
});
});
return vec;
}
return {};
}
const string Account::Source::language() const
{
return get_string("language");
}
const string Account::Source::note() const
{
return get_string("note");
}
Easy::visibility_type Account::Source::privacy() const
{
const string strprivacy = get_string("privacy");
if (strprivacy == "public")
return visibility_type::Public;
else if (strprivacy == "unlisted")
return visibility_type::Unlisted;
else if (strprivacy == "private")
return visibility_type::Private;
else if (strprivacy == "direct")
return visibility_type::Direct;
return visibility_type::Undefined;
}
bool Account::Source::sensitive() const
{
return get_bool("sensitive");
}

View File

@ -2,15 +2,15 @@
* Copyright © 2018, 2019 tastytea <tastytea@tastytea.de> * Copyright © 2018, 2019 tastytea <tastytea@tastytea.de>
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, version 3. * the Free Software Foundation, version 3.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU Affero General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
@ -22,17 +22,13 @@
#include <vector> #include <vector>
#include <utility> #include <utility>
// If we are compiling mastodon-cpp, use another include path #include "../../mastodon-cpp.hpp"
#ifdef MASTODON_CPP #include "../entity.hpp"
#include "mastodon-cpp.hpp" #include "emoji.hpp"
#include "easy/entity.hpp"
#else
#include <mastodon-cpp/mastodon-cpp.hpp>
#include <mastodon-cpp/easy/entity.hpp>
#endif
using std::string; using std::string;
using std::uint64_t; using std::uint64_t;
using std::vector;
namespace Mastodon namespace Mastodon
{ {
@ -48,13 +44,6 @@ namespace Easy
public: public:
using Entity::Entity; using Entity::Entity;
/*!
* @brief Describes a field. Format: name, value
*
* @since 0.16.1
*/
using fields_pair = std::pair<const string, const string>;
virtual bool valid() const override; virtual bool valid() const override;
/*! /*!
@ -68,130 +57,98 @@ namespace Easy
const string acct() const; const string acct() const;
/*! /*!
* @brief Returns URL of avatar * @brief Returns URL of avatar.
* *
* @since before 0.11.0 * @since before 0.11.0
*/ */
const string avatar() const; const string avatar() const;
/*! /*!
* @brief Sets avatar * @brief Returns URL of static avatar.
*
* Filename or base64-encoded
*
* @since 0.18.5
*/
Account avatar(const string &avatar);
/*!
* @brief Returns URL of static avatar
* *
* @since before 0.11.0 * @since before 0.11.0
*/ */
const string avatar_static() const; const string avatar_static() const;
/*! /*!
* @brief Returns true if the account performs automated actions * @brief Returns true if the account performs automated actions.
* *
* @since 0.16.0 * @since 0.16.0
*/ */
bool bot() const; bool bot() const;
/*! /*!
* @brief Returns time of creation * @brief Returns time of creation.
* *
* @since before 0.11.0 * @since before 0.11.0
*/ */
const Easy::time created_at() const; const Easy::time_type created_at() const;
/*! /*!
* @brief Returns display name * @brief Returns display name.
* *
* @since before 0.11.0 * @since before 0.11.0
*/ */
const string display_name() const; const string display_name() const;
/*! /*!
* @brief Sets display name * @brief Returns emojis.
* *
* @since 0.18.5 * @since 0.106.0
*/ */
Account display_name(const string &display_name); const std::vector<Easy::Emoji> emojis();
/*! /*!
* @brief Returns metadata fields * @brief Returns metadata fields.
* *
* @since 0.16.1 * @since 0.16.1
*/ */
const std::vector<fields_pair> fields() const; const vector<Easy::account_field_type> fields() const;
/*! /*!
* @brief Sets metadata fields * @brief Returns number of followers.
*
* @since 0.18.5
*/
Account fields(std::vector<fields_pair> &fields);
/*!
* @brief Returns number of followers
* *
* @since before 0.11.0 * @since before 0.11.0
*/ */
uint64_t followers_count() const; uint64_t followers_count() const;
/*! /*!
* @brief Returns number of people this account follows * @brief Returns number of people this account follows.
* *
* @since before 0.11.0 * @since before 0.11.0
*/ */
uint64_t following_count() const; uint64_t following_count() const;
/*! /*!
* @brief Returns URL of header image * @brief Returns URL of header image.
* *
* @since before 0.11.0 * @since before 0.11.0
*/ */
const string header() const; const string header() const;
/*! /*!
* @brief Sets header image * @brief Returns URL of static header image.
*
* Filename or base64-encoded.
*
* @since 0.18.5
*/
Account header(const string &header);
/*!
* @brief Returns URL of static header image
* *
* @since before 0.11.0 * @since before 0.11.0
*/ */
const string header_static() const; const string header_static() const;
/*! /*!
* @brief Returns account-ID * @brief Returns account-ID.
* *
* @since before 0.11.0 * @since before 0.11.0
*/ */
const string id() const; const string id() const;
/*! /*!
* @brief Returns true if the account is locked * @brief Returns true if the account is locked.
* *
* @since before 0.11.0 * @since before 0.11.0
*/ */
bool locked() const; bool locked() const;
/*! /*!
* @brief Sets locked state * @brief Returns true if the account has been moved. (Deprecated)
*
* @since 0.18.5
*/
Account locked(const bool &locked);
/*!
* @brief Returns true if the account has been moved
* *
* @since before 0.11.0 * @since before 0.11.0
*/ */
@ -199,42 +156,35 @@ namespace Easy
/*! /*!
* @brief If the owner decided to switch accounts, new account is in * @brief If the owner decided to switch accounts, new account is in
* this attribute * this attribute.
* *
* @since before 0.11.0 * @since before 0.11.0
*/ */
const Account moved() const; const Account moved() const;
/*! /*!
* @brief Returns note * @brief Returns account description, or biography.
* *
* @since before 0.11.0 * @since before 0.11.0
*/ */
const string note() const; const string note() const;
/*! /*!
* @brief Sets note * @brief Returns default privacy of new toots.
*
* @since 0.18.5
*/
Account note(const string &note);
/*!
* @brief Returns default privacy of new toots
* *
* @since before 0.11.0 * @since before 0.11.0
*/ */
visibility_type privacy() const; visibility_type privacy() const;
/*! /*!
* @brief Returns if media is marked as sensitive by default * @brief Returns if media is marked as sensitive by default.
* *
* @since before 0.11.0 * @since before 0.11.0
*/ */
bool sensitive() const; bool sensitive() const;
/*! /*!
* @brief Class to hold source attribute * @brief Class to hold source attribute.
* *
* @since 0.18.5 * @since 0.18.5
*/ */
@ -246,60 +196,39 @@ namespace Easy
virtual bool valid() const override; virtual bool valid() const override;
/*! /*!
* @brief Returns metadata fields * @brief Returns metadata fields.
* *
* @since 0.18.5 * @since 0.18.5
*/ */
const std::vector<fields_pair> fields() const; const vector<Easy::account_field_type> fields() const;
/*! /*!
* @brief Sets metadata fields * @brief Returns the language as ISO 6391 string.
* *
* @since 0.18.5 * @since 0.106.0
*/ */
Source fields(std::vector<fields_pair> &fields); const string language() const;
/*! /*!
* @brief Returns note in plain text * @brief Returns account description in plain text.
* *
* @since 0.18.5 * @since 0.18.5
*/ */
const string note() const; const string note() const;
/*! /*!
* @brief Sets note * @brief Returns default privacy of new toots.
*
* @since 0.18.5
*/
Source note(const string &note);
/*!
* @brief Returns default privacy of new toots
* *
* @since 0.18.5 * @since 0.18.5
*/ */
visibility_type privacy() const; visibility_type privacy() const;
/*! /*!
* @brief Sets default privacy of new toots * @brief Returns if media is marked as sensitive by default.
*
* @since 0.18.5
*/
Source privacy(const visibility_type &privacy);
/*!
* @brief Returns if media is marked as sensitive by default
* *
* @since 0.18.5 * @since 0.18.5
*/ */
bool sensitive() const; bool sensitive() const;
/*!
* @brief Sets if media is marked as sensitive by default
*
* @since 0.18.5
*/
Source sensitive(const bool &sensitive);
}; };
/*! /*!
@ -309,13 +238,6 @@ namespace Easy
*/ */
const Source source() const; const Source source() const;
/*!
* @brief Set source.
*
* @since before 0.100.0
*/
Account source(const Source &source);
/*! /*!
* @brief Returns number of statuses * @brief Returns number of statuses
* *

View File

@ -2,15 +2,15 @@
* Copyright © 2018, 2019 tastytea <tastytea@tastytea.de> * Copyright © 2018, 2019 tastytea <tastytea@tastytea.de>
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, version 3. * the Free Software Foundation, version 3.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU Affero General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */

View File

@ -2,15 +2,15 @@
* Copyright © 2018, 2019 tastytea <tastytea@tastytea.de> * Copyright © 2018, 2019 tastytea <tastytea@tastytea.de>
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, version 3. * the Free Software Foundation, version 3.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU Affero General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
@ -19,14 +19,8 @@
#include <string> #include <string>
// If we are compiling mastodon-cpp, use another include path #include "../../mastodon-cpp.hpp"
#ifdef MASTODON_CPP #include "../entity.hpp"
#include "mastodon-cpp.hpp"
#include "easy/entity.hpp"
#else
#include <mastodon-cpp/mastodon-cpp.hpp>
#include <mastodon-cpp/easy/entity.hpp>
#endif
using std::string; using std::string;

View File

@ -2,15 +2,15 @@
* Copyright © 2018, 2019 tastytea <tastytea@tastytea.de> * Copyright © 2018, 2019 tastytea <tastytea@tastytea.de>
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, version 3. * the Free Software Foundation, version 3.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU Affero General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
@ -23,30 +23,13 @@ using Attachment = Easy::Attachment;
bool Attachment::valid() const bool Attachment::valid() const
{ {
const std::vector<string> attributes = return Entity::check_valid(
{{ {
"id", "id",
"type", "type",
"url", "url",
"preview_url" "preview_url"
}}; });
return Entity::check_valid(attributes);
}
double Attachment::aspect() const
{
return get_double("meta.original.aspect");
}
double Attachment::aspect_small() const
{
return get_double("meta.small.aspect");
}
uint64_t Attachment::bitrate() const
{
return get_uint64("meta.original.bitrate");
} }
const string Attachment::description() const const string Attachment::description() const
@ -60,13 +43,6 @@ Attachment Attachment::description(const string &description)
return *this; return *this;
} }
const std::chrono::duration<double> Attachment::duration() const
{
const double sec = get_double("meta.original.duration");
return std::chrono::duration<double>(sec);
}
const string Attachment::file() const const string Attachment::file() const
{ {
return get_string("file"); return get_string("file");
@ -102,40 +78,16 @@ Attachment Attachment::focus(const std::array<double, 2> &focus)
return *this; return *this;
} }
double Attachment::framerate() const
{
string strframes = get_string("meta.original.frame_rate");
if (!strframes.empty())
{
std::size_t pos = strframes.find('/');
if (pos != std::string::npos)
{
std::uint16_t frames = std::stoul(strframes.substr(0, pos));
std::uint16_t divider = std::stoul(strframes.substr(pos + 1));
return frames / divider;
}
}
return 0.0;
}
uint64_t Attachment::height() const
{
return get_uint64("meta.original.height");
}
uint64_t Attachment::height_small() const
{
return get_uint64("meta.small.height");
}
const string Attachment::id() const const string Attachment::id() const
{ {
return get_string("id"); return get_string("id");
} }
const Attachment::Meta Attachment::meta() const
{
return Meta(get("meta"));
}
const string Attachment::preview_url() const const string Attachment::preview_url() const
{ {
return get_string("preview_url"); return get_string("preview_url");
@ -146,16 +98,6 @@ const string Attachment::remote_url() const
return get_string("remote_url"); return get_string("remote_url");
} }
const string Attachment::size() const
{
return get_string("meta.original.size");
}
const string Attachment::size_small() const
{
return get_string("meta.small.size");
}
const string Attachment::text_url() const const string Attachment::text_url() const
{ {
return get_string("text_url"); return get_string("text_url");
@ -182,12 +124,78 @@ const string Attachment::url() const
return get_string("url"); return get_string("url");
} }
uint64_t Attachment::width() const bool Attachment::Meta::valid() const
{ {
return get_uint64("meta.original.width"); return true;
} }
uint64_t Attachment::width_small() const double Attachment::Meta::aspect() const
{ {
return get_uint64("meta.small.width"); return get_double("original.aspect");
}
double Attachment::Meta::aspect_small() const
{
return get_double("small.aspect");
}
uint64_t Attachment::Meta::bitrate() const
{
return get_uint64("original.bitrate");
}
const std::chrono::duration<double> Attachment::Meta::duration() const
{
const double sec = get_double("original.duration");
return std::chrono::duration<double>(sec);
}
double Attachment::Meta::frame_rate() const
{
string strframes = get_string("original.frame_rate");
if (!strframes.empty())
{
std::size_t pos = strframes.find('/');
if (pos != std::string::npos)
{
std::uint16_t frames = std::stoul(strframes.substr(0, pos));
std::uint16_t divider = std::stoul(strframes.substr(pos + 1));
return frames / divider;
}
}
return 0.0;
}
uint64_t Attachment::Meta::height() const
{
return get_uint64("original.height");
}
uint64_t Attachment::Meta::height_small() const
{
return get_uint64("small.height");
}
const string Attachment::Meta::size() const
{
return get_string("original.size");
}
const string Attachment::Meta::size_small() const
{
return get_string("small.size");
}
uint64_t Attachment::Meta::width() const
{
return get_uint64("original.width");
}
uint64_t Attachment::Meta::width_small() const
{
return get_uint64("small.width");
} }

View File

@ -2,15 +2,15 @@
* Copyright © 2018, 2019 tastytea <tastytea@tastytea.de> * Copyright © 2018, 2019 tastytea <tastytea@tastytea.de>
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, version 3. * the Free Software Foundation, version 3.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU Affero General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
@ -22,14 +22,8 @@
#include <chrono> #include <chrono>
#include <array> #include <array>
// If we are compiling mastodon-cpp, use another include path #include "../../mastodon-cpp.hpp"
#ifdef MASTODON_CPP #include "../entity.hpp"
#include "mastodon-cpp.hpp"
#include "easy/entity.hpp"
#else
#include <mastodon-cpp/mastodon-cpp.hpp>
#include <mastodon-cpp/easy/entity.hpp>
#endif
using std::string; using std::string;
using std::uint64_t; using std::uint64_t;
@ -48,29 +42,98 @@ namespace Easy
public: public:
using Entity::Entity; using Entity::Entity;
/*!
* @brief Metadata for attachments.
*
* @since 0.106.0
*/
class Meta : public Entity
{
public:
using Entity::Entity;
virtual bool valid() const override;
/*!
* @brief Aspect of original image.
*
* @since 0.106.0
*/
double aspect() const;
/*!
* @brief Aspect of preview image.
*
* @since 0.106.0
*/
double aspect_small() const;
/*!
* @brief Returns the bitrate of a video.
*
* @since 0.106.0
*/
uint64_t bitrate() const;
/*!
* @brief Returns the duration of a video in seconds.
*
* @since 0.106.0
*/
const std::chrono::duration<double> duration() const;
/*!
* @brief Returns the framerate of a video in frames per second.
*
* @since 0.106.0
*/
double frame_rate() const;
/*!
* @brief Returns the height of the original image.
*
* @since 0.106.0
*/
uint64_t height() const;
/*!
* @brief Returns the height of the preview image.
*
* @since 0.106.0
*/
uint64_t height_small() const;
/*!
* @brief Returns the size of the original image.
*
* @since 0.106.0
*/
const string size() const;
/*!
* @brief Returns the size of the preview image.
*
* @since 0.106.0
*/
const string size_small() const;
/*!
* @brief Returns the width of the original image.
*
* @since 0.106.0
*/
uint64_t width() const;
/*!
* @brief Returns the width of the preview image
*
* @since 0.106.0
*/
uint64_t width_small() const;
};
virtual bool valid() const override; virtual bool valid() const override;
/*!
* @brief Aspect of original image
*
* @since before 0.11.0
*/
double aspect() const;
/*!
* @brief Aspect of preview image
*
* @since before 0.11.0
*/
double aspect_small() const;
/*!
* @brief Returns the bitrate of a video
*
* @since before 0.11.0
*/
uint64_t bitrate() const;
/*! /*!
* @brief Returns the image description * @brief Returns the image description
* *
@ -85,13 +148,6 @@ namespace Easy
*/ */
Attachment description(const string &description); Attachment description(const string &description);
/*!
* @brief Returns the duration of a video in seconds
*
* @since before 0.11.0
*/
const std::chrono::duration<double> duration() const;
/*! /*!
* @brief Gets file to upload * @brief Gets file to upload
* *
@ -126,27 +182,6 @@ namespace Easy
*/ */
Attachment focus(const std::array<double, 2> &focus); Attachment focus(const std::array<double, 2> &focus);
/*!
* @brief Returns the framerate of a video in frames per second
*
* @since before 0.11.0
*/
double framerate() const;
/*!
* @brief Returns the height of the original image
*
* @since before 0.11.0
*/
uint64_t height() const;
/*!
* @brief Returns the height of the preview image
*
* @since before 0.11.0
*/
uint64_t height_small() const;
/*! /*!
* @brief Returns the ID of the attachment * @brief Returns the ID of the attachment
* *
@ -154,6 +189,13 @@ namespace Easy
*/ */
const string id() const; const string id() const;
/*!
* @brief Returns metadata about the attachment.
*
* @since 0.106.0
*/
const Meta meta() const;
/*! /*!
* @brief Returns the URL of the preview image * @brief Returns the URL of the preview image
* *
@ -168,20 +210,6 @@ namespace Easy
*/ */
const string remote_url() const; const string remote_url() const;
/*!
* @brief Returns the size of the original image
*
* @since before 0.11.0
*/
const string size() const;
/*!
* @brief Returns the size of the preview image
*
* @since before 0.11.0
*/
const string size_small() const;
/*! /*!
* @brief Returns shorter URL for the image * @brief Returns shorter URL for the image
* *
@ -202,22 +230,6 @@ namespace Easy
* @since before 0.11.0 * @since before 0.11.0
*/ */
const string url() const; const string url() const;
/*!
* @brief Returns the width of the original image
*
* @since before 0.11.0
*/
uint64_t width() const;
/*!
* @brief Returns the width of the preview image
*
* @since before 0.11.0
*/
uint64_t width_small() const;
}; };
} }
} }

View File

@ -2,15 +2,15 @@
* Copyright © 2018, 2019 tastytea <tastytea@tastytea.de> * Copyright © 2018, 2019 tastytea <tastytea@tastytea.de>
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, version 3. * the Free Software Foundation, version 3.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU Affero General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
@ -22,15 +22,13 @@ using Card = Easy::Card;
bool Card::valid() const bool Card::valid() const
{ {
const std::vector<string> attributes = return Entity::check_valid(
{{ {
"url", "url",
"title", "title",
"description", "description",
"type" "type"
}}; });
return Entity::check_valid(attributes);
} }
const string Card::author_name() const const string Card::author_name() const
@ -48,6 +46,11 @@ const string Card::description() const
return get_string("description"); return get_string("description");
} }
const string Card::embed_url() const
{
return get_string("embed_url");
}
uint64_t Card::height() const uint64_t Card::height() const
{ {
return get_uint64("height"); return get_uint64("height");
@ -81,17 +84,16 @@ const string Card::title() const
Easy::card_type Card::type() const Easy::card_type Card::type() const
{ {
const string strtype = get_string("type"); const string strtype = get_string("type");
if (strtype.compare("link") == 0) if (strtype == "link")
return card_type::Link; return card_type::Link;
else if (strtype.compare("photo") == 0) else if (strtype == "photo")
return card_type::Photo; return card_type::Photo;
else if (strtype.compare("video") == 0) else if (strtype == "video")
return card_type::Video; return card_type::Video;
else if (strtype.compare("rich") == 0) else if (strtype == "rich")
return card_type::Rich; return card_type::Rich;
else
ttdebug << "Could not get data: type\n"; return card_type::Undefined;
return card_type::Undefined;
} }
const string Card::url() const const string Card::url() const

View File

@ -2,15 +2,15 @@
* Copyright © 2018, 2019 tastytea <tastytea@tastytea.de> * Copyright © 2018, 2019 tastytea <tastytea@tastytea.de>
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, version 3. * the Free Software Foundation, version 3.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU Affero General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
@ -20,14 +20,8 @@
#include <string> #include <string>
#include <cstdint> #include <cstdint>
// If we are compiling mastodon-cpp, use another include path #include "../../mastodon-cpp.hpp"
#ifdef MASTODON_CPP #include "../entity.hpp"
#include "mastodon-cpp.hpp"
#include "easy/entity.hpp"
#else
#include <mastodon-cpp/mastodon-cpp.hpp>
#include <mastodon-cpp/easy/entity.hpp>
#endif
using std::string; using std::string;
using std::uint64_t; using std::uint64_t;
@ -69,6 +63,15 @@ namespace Easy
*/ */
const string description() const; const string description() const;
/*!
* @brief Returns the embed URL.
*
* This is an undocumented attribute and may vanish at any time.
*
* @since 0.106.0
*/
const string embed_url() const;
/*! /*!
* @brief Returns the height of the card * @brief Returns the height of the card
* *

View File

@ -2,15 +2,15 @@
* Copyright © 2018, 2019 tastytea <tastytea@tastytea.de> * Copyright © 2018, 2019 tastytea <tastytea@tastytea.de>
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, version 3. * the Free Software Foundation, version 3.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU Affero General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
@ -23,13 +23,11 @@ using Context = Easy::Context;
bool Context::valid() const bool Context::valid() const
{ {
const std::vector<string> attributes = return Entity::check_valid(
{{ {
"ancestors", "ancestors",
"descendants" "descendants"
}}; });
return Entity::check_valid(attributes);
} }
const std::vector<Easy::Status> Context::ancestors() const const std::vector<Easy::Status> Context::ancestors() const
@ -40,11 +38,10 @@ const std::vector<Easy::Status> Context::ancestors() const
std::vector<Easy::Status> vec; std::vector<Easy::Status> vec;
std::transform(node.begin(), node.end(), std::back_inserter(vec), std::transform(node.begin(), node.end(), std::back_inserter(vec),
[](const Json::Value &value) [](const Json::Value &value)
{ return Easy::Status(value); }); { return Easy::Status(value); });
return vec; return vec;
} }
ttdebug << "Could not get data: ancestors\n";
return {}; return {};
} }
@ -56,10 +53,9 @@ const std::vector<Easy::Status> Context::descendants() const
std::vector<Easy::Status> vec; std::vector<Easy::Status> vec;
std::transform(node.begin(), node.end(), std::back_inserter(vec), std::transform(node.begin(), node.end(), std::back_inserter(vec),
[](const Json::Value &value) [](const Json::Value &value)
{ return Easy::Status(value); }); { return Easy::Status(value); });
return vec; return vec;
} }
ttdebug << "Could not get data: descendants\n";
return {}; return {};
} }

View File

@ -2,15 +2,15 @@
* Copyright © 2018, 2019 tastytea <tastytea@tastytea.de> * Copyright © 2018, 2019 tastytea <tastytea@tastytea.de>
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, version 3. * the Free Software Foundation, version 3.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU Affero General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
@ -20,16 +20,9 @@
#include <string> #include <string>
#include <vector> #include <vector>
// If we are compiling mastodon-cpp, use another include path #include "../../mastodon-cpp.hpp"
#ifdef MASTODON_CPP #include "../entity.hpp"
#include "mastodon-cpp.hpp" #include "status.hpp"
#include "easy/entity.hpp"
#include "easy/entities/status.hpp"
#else
#include <mastodon-cpp/mastodon-cpp.hpp>
#include <mastodon-cpp/easy/entity.hpp>
#include <mastodon-cpp/easy/entities/status.hpp>
#endif
using std::string; using std::string;

View File

@ -0,0 +1,68 @@
/* This file is part of mastodon-cpp.
* Copyright © 2018, 2019 tastytea <tastytea@tastytea.de>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, version 3.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <algorithm>
#include "conversation.hpp"
#include "debug.hpp"
using namespace Mastodon;
using Conversation = Easy::Conversation;
bool Conversation::valid() const
{
return Entity::check_valid(
{
"id",
"accounts",
"unread"
});
}
const string Conversation::id() const
{
return get_string("id");
}
const std::vector<Easy::Account> Conversation::accounts() const
{
const Json::Value node = get("accounts");
if (node.isArray())
{
std::vector<Easy::Account> vec;
std::transform(node.begin(), node.end(), std::back_inserter(vec),
[](const Json::Value &value)
{ return Easy::Account(value); });
return vec;
}
return {};
}
const Easy::Status Conversation::last_status() const
{
const Json::Value &node = get("last_status");
if (!node.isNull())
{
return Easy::Status(node);
}
return {};
}
bool Conversation::unread() const
{
return get_bool("unread");
}

View File

@ -0,0 +1,77 @@
/* This file is part of mastodon-cpp.
* Copyright © 2018, 2019 tastytea <tastytea@tastytea.de>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, version 3.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef MASTODON_CPP_EASY_CONVERSATION_HPP
#define MASTODON_CPP_EASY_CONVERSATION_HPP
#include <string>
#include <vector>
#include "../../mastodon-cpp.hpp"
#include "../entity.hpp"
#include "account.hpp"
#include "status.hpp"
using std::string;
namespace Mastodon
{
namespace Easy
{
/*!
* @brief Class to hold conversations.
*
* @since 0.110.0
*/
class Conversation : public Entity
{
public:
using Entity::Entity;
virtual bool valid() const override;
/*!
* @brief Returns the id of the conversation.
*
* @since 0.110.0
*/
const string id() const;
/*!
* @brief Returns the participating accounts.
*
* @since 0.110.0
*/
const std::vector<Account> accounts() const;
/*!
* @brief Returns the last status.
*
* @since 0.110.0
*/
const Status last_status() const;
/*!
* @brief Returns true if unread.
*
* @since 0.110.0
*/
bool unread() const;
};
}
}
#endif // MASTODON_CPP_EASY_CONVERSATION_HPP

View File

@ -2,15 +2,15 @@
* Copyright © 2018, 2019 tastytea <tastytea@tastytea.de> * Copyright © 2018, 2019 tastytea <tastytea@tastytea.de>
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, version 3. * the Free Software Foundation, version 3.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU Affero General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
@ -22,15 +22,13 @@ using Emoji = Easy::Emoji;
bool Emoji::valid() const bool Emoji::valid() const
{ {
const std::vector<string> attributes = return Entity::check_valid(
{{ {
"shortcode", "shortcode",
"static_url", "static_url",
"url", "url",
"visible_in_picker" "visible_in_picker"
}}; });
return Entity::check_valid(attributes);
} }
const string Emoji::shortcode() const const string Emoji::shortcode() const
@ -47,3 +45,8 @@ const string Emoji::url() const
{ {
return get_string("url"); return get_string("url");
} }
bool Emoji::visible_in_picker() const
{
return get_bool("visible_in_picker");
}

View File

@ -2,15 +2,15 @@
* Copyright © 2018, 2019 tastytea <tastytea@tastytea.de> * Copyright © 2018, 2019 tastytea <tastytea@tastytea.de>
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, version 3. * the Free Software Foundation, version 3.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU Affero General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
@ -19,14 +19,8 @@
#include <string> #include <string>
// If we are compiling mastodon-cpp, use another include path #include "../../mastodon-cpp.hpp"
#ifdef MASTODON_CPP #include "../entity.hpp"
#include "mastodon-cpp.hpp"
#include "easy/entity.hpp"
#else
#include <mastodon-cpp/mastodon-cpp.hpp>
#include <mastodon-cpp/easy/entity.hpp>
#endif
using std::string; using std::string;
@ -35,9 +29,9 @@ namespace Mastodon
namespace Easy namespace Easy
{ {
/*! /*!
* @brief Class to hold emojis * @brief Class to hold emojis.
* *
* @since before 0.11.0 * @since before 0.11.0
*/ */
class Emoji : public Entity class Emoji : public Entity
{ {
@ -47,25 +41,32 @@ namespace Easy
virtual bool valid() const override; virtual bool valid() const override;
/*! /*!
* @brief Returns the shortcode of the emoji * @brief Returns the shortcode of the emoji.
* *
* @since before 0.11.0 * @since before 0.11.0
*/ */
const string shortcode() const; const string shortcode() const;
/*! /*!
* @brief Returns the URL to the emoji static image * @brief Returns the URL to the emoji static image.
* *
* @since before 0.11.0 * @since before 0.11.0
*/ */
const string static_url() const; const string static_url() const;
/*! /*!
* @brief Returns the URL to the emoji image * @brief Returns the URL to the emoji image.
* *
* @since before 0.11.0 * @since before 0.11.0
*/ */
const string url() const; const string url() const;
/*!
* @brief Returns if the emoji is visible in the picker.
*
* @since 0.106.0
*/
bool visible_in_picker() const;
}; };
} }
} }

View File

@ -2,15 +2,15 @@
* Copyright © 2019 tastytea <tastytea@tastytea.de> * Copyright © 2019 tastytea <tastytea@tastytea.de>
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, version 3. * the Free Software Foundation, version 3.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU Affero General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
@ -24,11 +24,14 @@ using Filter = Easy::Filter;
bool Filter::valid() const bool Filter::valid() const
{ {
return Entity::check_valid({ "id", return Entity::check_valid(
"phrase", {
"context", "id",
"irreversible", "phrase",
"whole_word" }); "context",
"irreversible",
"whole_word"
});
} }
const string Filter::id() const const string Filter::id() const
@ -49,26 +52,26 @@ const vector<Easy::context_type> Filter::context() const
vector<Easy::context_type> vec; vector<Easy::context_type> vec;
std::transform(node.begin(), node.end(), std::back_inserter(vec), std::transform(node.begin(), node.end(), std::back_inserter(vec),
[](const Json::Value &value) [](const Json::Value &value)
{ {
const string strtype = value.asString(); const string strtype = value.asString();
if (strtype == "home") if (strtype == "home")
return Easy::context_type::Home; return Easy::context_type::Home;
else if (strtype == "notifications") else if (strtype == "notifications")
return Easy::context_type::Notifications; return Easy::context_type::Notifications;
else if (strtype == "public") else if (strtype == "public")
return Easy::context_type::Public; return Easy::context_type::Public;
else if (strtype == "thread") else if (strtype == "thread")
return Easy::context_type::Thread; return Easy::context_type::Thread;
else else
return context_type::Undefined; return context_type::Undefined;
}); });
return vec; return vec;
} }
return {}; return {};
} }
const Easy::time Filter::expires_at() const const Easy::time_type Filter::expires_at() const
{ {
return get_time("expires_at"); return get_time("expires_at");
} }

View File

@ -2,15 +2,15 @@
* Copyright © 2019 tastytea <tastytea@tastytea.de> * Copyright © 2019 tastytea <tastytea@tastytea.de>
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, version 3. * the Free Software Foundation, version 3.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU Affero General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
@ -19,14 +19,8 @@
#include <string> #include <string>
// If we are compiling mastodon-cpp, use another include path #include "../../mastodon-cpp.hpp"
#ifdef MASTODON_CPP #include "../entity.hpp"
#include "mastodon-cpp.hpp"
#include "easy/entity.hpp"
#else
#include <mastodon-cpp/mastodon-cpp.hpp>
#include <mastodon-cpp/easy/entity.hpp>
#endif
using std::string; using std::string;
@ -72,7 +66,7 @@ namespace Easy
* *
* @since 0.104.0 * @since 0.104.0
*/ */
const Easy::time expires_at() const; const Easy::time_type expires_at() const;
/*! /*!
* @brief Returns if the phrase should disappear irreversibly. * @brief Returns if the phrase should disappear irreversibly.

View File

@ -2,15 +2,15 @@
* Copyright © 2018, 2019 tastytea <tastytea@tastytea.de> * Copyright © 2018, 2019 tastytea <tastytea@tastytea.de>
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, version 3. * the Free Software Foundation, version 3.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU Affero General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
@ -24,18 +24,17 @@ using Instance = Easy::Instance;
bool Instance::valid() const bool Instance::valid() const
{ {
const std::vector<string> attributes = return Entity::check_valid(
{{ {
"uri", "uri",
"title", "title",
"description", "description",
"email", "email",
"version", "version",
"urls", "urls",
"languages" "stats",
}}; "languages"
});
return Entity::check_valid(attributes);
} }
const Easy::Account Instance::contact_account() const const Easy::Account Instance::contact_account() const
@ -43,10 +42,9 @@ const Easy::Account Instance::contact_account() const
const Json::Value node = get("contact_account"); const Json::Value node = get("contact_account");
if (node.isObject()) if (node.isObject())
{ {
return Easy::Account(node.toStyledString()); return Easy::Account(node);
} }
ttdebug << "Could not get data: contact_account\n";
return Easy::Account(); return Easy::Account();
} }
@ -65,6 +63,15 @@ const std::vector<string> Instance::languages() const
return get_vector("languages"); return get_vector("languages");
} }
const Easy::stats_type Instance::stats() const
{
Easy::stats_type s;
s.user_count = get_uint64("stats.user_count");
s.status_count = get_uint64("stats.status_count");
s.domain_count = get_uint64("stats.domain_count");
return s;
}
const string Instance::title() const const string Instance::title() const
{ {
return get_string("title"); return get_string("title");
@ -75,14 +82,19 @@ const string Instance::uri() const
return get_string("uri"); return get_string("uri");
} }
const Easy::urls_type Instance::urls() const
{
return { get_string("urls.streaming_api") };
}
const string Instance::version() const const string Instance::version() const
{ {
return get_string("version"); return get_string("version");
} }
const string Instance::streaming_api() const const string Instance::thumbnail() const
{ {
return get_string("urls.streaming_api"); return get_string("thumbnail");
} }
uint64_t Instance::max_toot_chars() const uint64_t Instance::max_toot_chars() const

View File

@ -2,15 +2,15 @@
* Copyright © 2018, 2019 tastytea <tastytea@tastytea.de> * Copyright © 2018, 2019 tastytea <tastytea@tastytea.de>
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, version 3. * the Free Software Foundation, version 3.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU Affero General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
@ -22,16 +22,9 @@
using std::uint64_t; using std::uint64_t;
// If we are compiling mastodon-cpp, use another include path #include "../../mastodon-cpp.hpp"
#ifdef MASTODON_CPP #include "../entity.hpp"
#include "mastodon-cpp.hpp" #include "account.hpp"
#include "easy/entities/account.hpp"
#include "easy/entity.hpp"
#else
#include <mastodon-cpp/mastodon-cpp.hpp>
#include <mastodon-cpp/easy/entities/account.hpp>
#include <mastodon-cpp/easy/entity.hpp>
#endif
using std::string; using std::string;
@ -40,9 +33,9 @@ namespace Mastodon
namespace Easy namespace Easy
{ {
/*! /*!
* @brief Class to hold instances * @brief Class to hold instances.
* *
* @since before 0.11.0 * @since before 0.11.0
*/ */
class Instance : public Entity class Instance : public Entity
{ {
@ -52,62 +45,76 @@ namespace Easy
virtual bool valid() const override; virtual bool valid() const override;
/*! /*!
* @brief Returns the Account of the admin or another contact person * @brief Returns the Account of the admin or another contact person.
* *
* @since before 0.11.0 * @since before 0.11.0
*/ */
const Account contact_account() const; const Account contact_account() const;
/*! /*!
* @brief Returns the description of the instance * @brief Returns the description of the instance.
* *
* @since before 0.11.0 * @since before 0.11.0
*/ */
const string description() const; const string description() const;
/*! /*!
* @brief Returns the email address which can be used to contact the * @brief Returns the email address which can be used to contact the
* instance administrator * instance administrator.
* *
* @since before 0.11.0 * @since before 0.11.0
*/ */
const string email() const; const string email() const;
/*! /*!
* @brief Returns a vector of ISO 6391 language codes the instance has * @brief Returns a vector of ISO 6391 language codes the instance has
* chosen to advertise * chosen to advertise.
* *
* @since before 0.11.0 * @since before 0.11.0
*/ */
const std::vector<string> languages() const; const vector<string> languages() const;
/*! /*!
* @brief Returns the title of the instance * @brief Returns the thumbnail of the instance.
* *
* @since before 0.11.0 * @since 0.106.0
*/
const string thumbnail() const;
/*!
* @brief Returns the title of the instance.
*
* @since before 0.11.0
*/ */
const string title() const; const string title() const;
/*! /*!
* @brief Returns the URI of the instance * @brief Returns the URI of the instance.
* *
* @since before 0.11.0 * @since before 0.11.0
*/ */
const string uri() const; const string uri() const;
/*! /*!
* @brief Returns the version used by the instance * @brief Returns the URL for the streaming API and possibly others.
* *
* @since before 0.11.0 * @since 0.106.0
*/ */
const string version() const; const Easy::urls_type urls() const;
/*! /*!
* @brief Returns the URL for the streaming API * @brief Returns statistics about the instance.
* *
* @since before 0.11.0 * @since 0.106.0
*/ */
const string streaming_api() const; const Easy::stats_type stats() const;
/*!
* @brief Returns the version used by the instance.
*
* @since before 0.11.0
*/
const string version() const;
/*! /*!
* @brief Returns the maximum chars a post can have * @brief Returns the maximum chars a post can have

View File

@ -2,15 +2,15 @@
* Copyright © 2018, 2019 tastytea <tastytea@tastytea.de> * Copyright © 2018, 2019 tastytea <tastytea@tastytea.de>
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, version 3. * the Free Software Foundation, version 3.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU Affero General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
@ -23,13 +23,11 @@ using std::uint64_t;
bool List::valid() const bool List::valid() const
{ {
const std::vector<string> attributes = return Entity::check_valid(
{{ {
"id", "id",
"title" "title"
}}; });
return Entity::check_valid(attributes);
} }
const string List::id() const const string List::id() const

View File

@ -2,15 +2,15 @@
* Copyright © 2018, 2019 tastytea <tastytea@tastytea.de> * Copyright © 2018, 2019 tastytea <tastytea@tastytea.de>
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, version 3. * the Free Software Foundation, version 3.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU Affero General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
@ -21,14 +21,8 @@
#include <vector> #include <vector>
#include <cstdint> #include <cstdint>
// If we are compiling mastodon-cpp, use another include path #include "../../mastodon-cpp.hpp"
#ifdef MASTODON_CPP #include "../entity.hpp"
#include "mastodon-cpp.hpp"
#include "easy/entity.hpp"
#else
#include <mastodon-cpp/mastodon-cpp.hpp>
#include <mastodon-cpp/easy/entity.hpp>
#endif
using std::string; using std::string;
using std::uint64_t; using std::uint64_t;

View File

@ -2,15 +2,15 @@
* Copyright © 2018, 2019 tastytea <tastytea@tastytea.de> * Copyright © 2018, 2019 tastytea <tastytea@tastytea.de>
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, version 3. * the Free Software Foundation, version 3.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU Affero General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
@ -21,15 +21,13 @@ using Mention = Easy::Mention;
bool Mention::valid() const bool Mention::valid() const
{ {
const std::vector<string> attributes = return Entity::check_valid(
{{ {
"url", "url",
"username", "username",
"acct", "acct",
"id" "id"
}}; });
return Entity::check_valid(attributes);
} }
const string Mention::acct() const const string Mention::acct() const

View File

@ -2,15 +2,15 @@
* Copyright © 2018, 2019 tastytea <tastytea@tastytea.de> * Copyright © 2018, 2019 tastytea <tastytea@tastytea.de>
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, version 3. * the Free Software Foundation, version 3.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU Affero General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
@ -20,14 +20,8 @@
#include <string> #include <string>
#include <cstdint> #include <cstdint>
// If we are compiling mastodon-cpp, use another include path #include "../../mastodon-cpp.hpp"
#ifdef MASTODON_CPP #include "../entity.hpp"
#include "mastodon-cpp.hpp"
#include "easy/entity.hpp"
#else
#include <mastodon-cpp/mastodon-cpp.hpp>
#include <mastodon-cpp/easy/entity.hpp>
#endif
using std::string; using std::string;
using std::uint64_t; using std::uint64_t;

View File

@ -2,15 +2,15 @@
* Copyright © 2018, 2019 tastytea <tastytea@tastytea.de> * Copyright © 2018, 2019 tastytea <tastytea@tastytea.de>
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, version 3. * the Free Software Foundation, version 3.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU Affero General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
@ -22,15 +22,13 @@ using Notification = Easy::Notification;
bool Notification::valid() const bool Notification::valid() const
{ {
const std::vector<string> attributes = return Entity::check_valid(
{{ {
"id", "id",
"type", "type",
"created_at", "created_at",
"account" "account"
}}; });
return Entity::check_valid(attributes);
} }
const Easy::Account Notification::account() const const Easy::Account Notification::account() const
@ -45,7 +43,7 @@ const Easy::Account Notification::account() const
return Easy::Account(); return Easy::Account();
} }
const Easy::time Notification::created_at() const const Easy::time_type Notification::created_at() const
{ {
return get_time("created_at"); return get_time("created_at");
} }

View File

@ -2,15 +2,15 @@
* Copyright © 2018, 2019 tastytea <tastytea@tastytea.de> * Copyright © 2018, 2019 tastytea <tastytea@tastytea.de>
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, version 3. * the Free Software Foundation, version 3.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU Affero General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
@ -20,18 +20,10 @@
#include <string> #include <string>
#include <cstdint> #include <cstdint>
// If we are compiling mastodon-cpp, use another include path #include "../../mastodon-cpp.hpp"
#ifdef MASTODON_CPP #include "../entity.hpp"
#include "mastodon-cpp.hpp" #include "account.hpp"
#include "easy/entities/account.hpp" #include "status.hpp"
#include "easy/entities/status.hpp"
#include "easy/entity.hpp"
#else
#include <mastodon-cpp/mastodon-cpp.hpp>
#include <mastodon-cpp/easy/entities/account.hpp>
#include <mastodon-cpp/easy/entities/status.hpp>
#include <mastodon-cpp/easy/entity.hpp>
#endif
using std::string; using std::string;
using std::uint64_t; using std::uint64_t;
@ -64,7 +56,7 @@ namespace Easy
* *
* @since before 0.11.0 * @since before 0.11.0
*/ */
const Easy::time created_at() const; const Easy::time_type created_at() const;
/*! /*!
* @brief Returns notification ID * @brief Returns notification ID

View File

@ -0,0 +1,86 @@
/* This file is part of mastodon-cpp.
* Copyright © 2019 tastytea <tastytea@tastytea.de>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, version 3.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "poll.hpp"
#include "debug.hpp"
using namespace Mastodon;
using Poll = Easy::Poll;
bool Poll::valid() const
{
return Entity::check_valid(
{
"id",
"expired",
"expired",
"multiple",
"votes_count",
"options"
});
}
const string Poll::id() const
{
return get_string("id");
}
const Easy::time_type Poll::expires_at() const
{
return get_time("expires_at");
}
bool Poll::expired() const
{
return get_bool("expired");
}
bool Poll::multiple() const
{
return get_bool("multiple");
}
uint64_t Poll::votes_count() const
{
return get_uint64("votes_count");
}
const vector<Easy::poll_options_type> Poll::options() const
{
const Json::Value &node = get("options");
if (node.isArray())
{
vector<Easy::poll_options_type> vec_options;
std::transform(node.begin(), node.end(), std::back_inserter(vec_options),
[](const Json::Value &value)
{
return Easy::poll_options_type(
{
value["title"].asString(),
value["votes_count"].asUInt64()
});
});
return vec_options;
}
return {};
}
bool Poll::voted() const
{
return get_bool("voted");
}

View File

@ -0,0 +1,98 @@
/* This file is part of mastodon-cpp.
* Copyright © 2019 tastytea <tastytea@tastytea.de>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, version 3.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef MASTODON_CPP_EASY_POLL_HPP
#define MASTODON_CPP_EASY_POLL_HPP
#include <string>
#include <cstdint>
#include <vector>
#include "../../mastodon-cpp.hpp"
#include "../entity.hpp"
using std::string;
using std::uint64_t;
namespace Mastodon
{
namespace Easy
{
/*!
* @brief Class to hold polls.
*
* @since 0.110.0
*/
class Poll : public Entity
{
public:
using Entity::Entity;
virtual bool valid() const override;
/*!
* @brief Returns poll ID.
*
* @since 0.110.0
*/
const string id() const;
/*!
* @brief Returns time when the poll expires.
*
* @since 0.110.0
*/
const Easy::time_type expires_at() const;
/*!
* @brief Returns true if poll has expired.
*
* @since 0.110.0
*/
bool expired() const;
/*!
* @brief Returns true or false.
*
* @since 0.110.0
*/
bool multiple() const;
/*!
* @brief Returns the number of votes.
*
* @since 0.110.0
*/
uint64_t votes_count() const;
/*!
* @brief Returns poll options and their votes count.
*
* @since 0.110.0
*/
const vector<poll_options_type> options() const;
/*!
* @brief Returns whether you voted or not.
*
* @since 0.110.0
*/
bool voted() const;
};
}
}
#endif // MASTODON_CPP_EASY_POLL_HPP

View File

@ -2,15 +2,15 @@
* Copyright © 2018, 2019 tastytea <tastytea@tastytea.de> * Copyright © 2018, 2019 tastytea <tastytea@tastytea.de>
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, version 3. * the Free Software Foundation, version 3.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU Affero General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
@ -26,14 +26,13 @@ const string PushSubscription::id() const
bool PushSubscription::valid() const bool PushSubscription::valid() const
{ {
const std::vector<string> attributes = return Entity::check_valid(
{{ {
"id", "id",
"endpoint", "endpoint",
"server_key" "server_key",
}}; "alerts"
});
return Entity::check_valid(attributes);
} }
const string PushSubscription::endpoint() const const string PushSubscription::endpoint() const
@ -46,9 +45,9 @@ const string PushSubscription::server_key() const
return get_string("server_key"); return get_string("server_key");
} }
const Easy::alerts PushSubscription::alerts() const const vector<Easy::alert_type> PushSubscription::alerts() const
{ {
Easy::alerts alerts; vector<Easy::alert_type> alerts;
const Json::Value node = get("alerts"); const Json::Value node = get("alerts");
for (auto it = node.begin(); it != node.end(); ++it) for (auto it = node.begin(); it != node.end(); ++it)
{ {

View File

@ -2,15 +2,15 @@
* Copyright © 2018, 2019 tastytea <tastytea@tastytea.de> * Copyright © 2018, 2019 tastytea <tastytea@tastytea.de>
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, version 3. * the Free Software Foundation, version 3.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU Affero General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
@ -18,19 +18,15 @@
#define MASTODON_CPP_EASY_PUSHSUBSCRIPTION_HPP #define MASTODON_CPP_EASY_PUSHSUBSCRIPTION_HPP
#include <string> #include <string>
#include <vector>
#include <cstdint> #include <cstdint>
#include <map> #include <map>
// If we are compiling mastodon-cpp, use another include path #include "../../mastodon-cpp.hpp"
#ifdef MASTODON_CPP #include "../entity.hpp"
#include "mastodon-cpp.hpp"
#include "easy/entity.hpp"
#else
#include <mastodon-cpp/mastodon-cpp.hpp>
#include <mastodon-cpp/easy/entity.hpp>
#endif
using std::string; using std::string;
using std::vector;
namespace Mastodon namespace Mastodon
{ {
@ -69,13 +65,12 @@ namespace Easy
*/ */
const string server_key() const; const string server_key() const;
// TODO: Look up what the data looks like
/*! /*!
* @brief Returns a vector of Easy::alert_type. * @brief Returns a vector of Easy::alert_type.
* *
* @since 0.100.0 * @since 0.100.0
*/ */
const Easy::alerts alerts() const; const vector<Easy::alert_type> alerts() const;
protected: protected:
/*! /*!

View File

@ -2,15 +2,15 @@
* Copyright © 2018, 2019 tastytea <tastytea@tastytea.de> * Copyright © 2018, 2019 tastytea <tastytea@tastytea.de>
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, version 3. * the Free Software Foundation, version 3.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU Affero General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
@ -21,19 +21,19 @@ using Relationship = Easy::Relationship;
bool Relationship::valid() const bool Relationship::valid() const
{ {
const std::vector<string> attributes = return Entity::check_valid(
{{ {
"id", "id",
"following", "following",
"followed_by", "followed_by",
"blocking", "blocking",
"muting", "muting",
"muting_notifications", "muting_notifications",
"requested", "requested",
"domain_blocking" "domain_blocking",
}}; "showing_reblogs",
"endorsed"
return Entity::check_valid(attributes); });
} }
bool Relationship::blocking() const bool Relationship::blocking() const
@ -85,3 +85,8 @@ bool Relationship::showing_notifications() const
{ {
return get_bool("showing_notifications"); return get_bool("showing_notifications");
} }
bool Relationship::showing_reblogs() const
{
return get_bool("showing_reblogs");
}

View File

@ -2,15 +2,15 @@
* Copyright © 2018, 2019 tastytea <tastytea@tastytea.de> * Copyright © 2018, 2019 tastytea <tastytea@tastytea.de>
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, version 3. * the Free Software Foundation, version 3.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU Affero General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
@ -20,14 +20,8 @@
#include <string> #include <string>
#include <cstdint> #include <cstdint>
// If we are compiling mastodon-cpp, use another include path #include "../../mastodon-cpp.hpp"
#ifdef MASTODON_CPP #include "../entity.hpp"
#include "mastodon-cpp.hpp"
#include "easy/entity.hpp"
#else
#include <mastodon-cpp/mastodon-cpp.hpp>
#include <mastodon-cpp/easy/entity.hpp>
#endif
using std::string; using std::string;
using std::uint64_t; using std::uint64_t;
@ -49,74 +43,81 @@ namespace Easy
virtual bool valid() const override; virtual bool valid() const override;
/*! /*!
* @brief Returns true if the user is blocking the account * @brief Returns true if the user is blocking the account.
* *
* @since before 0.11.0 * @since before 0.11.0
*/ */
bool blocking() const; bool blocking() const;
/*! /*!
* @brief Returns true if the user is blocking the account's domain * @brief Returns true if the user is blocking the account's domain.
* *
* @since before 0.11.0 * @since before 0.11.0
*/ */
bool domain_blocking() const; bool domain_blocking() const;
/*! /*!
* @brief Returns true if the account is endorsed by the user * @brief Returns true if the account is endorsed by the user.
* *
* @since 0.19.0 * @since 0.19.0
*/ */
bool endorsed() const; bool endorsed() const;
/*! /*!
* @brief Returns true if the user is being followed by the account * @brief Returns true if the user is being followed by the account.
* *
* @since before 0.11.0 * @since before 0.11.0
*/ */
bool followed_by() const; bool followed_by() const;
/*! /*!
* @brief Returns true if the user is being following the account * @brief Returns true if the user is being following the account.
* *
* @since before 0.11.0 * @since before 0.11.0
*/ */
bool following() const; bool following() const;
/*! /*!
* @brief Returns the target account ID * @brief Returns the target account ID.
* *
* @since before 0.11.0 * @since before 0.11.0
*/ */
const string id() const; const string id() const;
/*! /*!
* @brief Returns true if the user is muting the account * @brief Returns true if the user is muting the account.
* *
* @since before 0.11.0 * @since before 0.11.0
*/ */
bool muting() const; bool muting() const;
/*! /*!
* @brief Returns true if the user is also muting notifications * @brief Returns true if the user is also muting notifications.
* *
* @since before 0.11.0 * @since before 0.11.0
*/ */
bool muting_notifications() const; bool muting_notifications() const;
/*! /*!
* @brief Returns true if the user has requested to follow the account * @brief Returns true if the user has requested to follow the account.
* *
* @since before 0.11.0 * @since before 0.11.0
*/ */
bool requested() const; bool requested() const;
/*! /*!
* @brief Returns true if the user is showing notifications * @brief Returns true if the user is showing notifications.
* *
* @since 0.19.0 * @since 0.19.0
*/ */
bool showing_notifications() const; bool showing_notifications() const;
/*!
* @brief Returns true if the user is showing reblogs.
*
* @since 0.106.0
*/
bool showing_reblogs() const;
}; };
} }
} }

View File

@ -1,41 +0,0 @@
/* This file is part of mastodon-cpp.
* Copyright © 2018, 2019 tastytea <tastytea@tastytea.de>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "report.hpp"
using namespace Mastodon;
using Report = Easy::Report;
bool Report::valid() const
{
const std::vector<string> attributes =
{{
"id",
"action_taken"
}};
return Entity::check_valid(attributes);
}
bool Report::action_taken() const
{
return get_bool("action_taken");
}
const string Report::id() const
{
return get_string("id");
}

View File

@ -1,68 +0,0 @@
/* This file is part of mastodon-cpp.
* Copyright © 2018, 2019 tastytea <tastytea@tastytea.de>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef MASTODON_CPP_EASY_REPORT_HPP
#define MASTODON_CPP_EASY_REPORT_HPP
#include <string>
#include <cstdint>
// If we are compiling mastodon-cpp, use another include path
#ifdef MASTODON_CPP
#include "mastodon-cpp.hpp"
#include "easy/entity.hpp"
#else
#include <mastodon-cpp/mastodon-cpp.hpp>
#include <mastodon-cpp/easy/entity.hpp>
#endif
using std::string;
namespace Mastodon
{
namespace Easy
{
/*!
* @brief Class to hold reports
*
* before 0.11.0
*/
class Report : public Entity
{
public:
using Entity::Entity;
virtual bool valid() const override;
/*!
* @brief Returns true if an action was taken in response to the
* report
*
* @since before 0.11.0
*/
bool action_taken() const;
/*!
* @brief Returns the ID of the report
*
* @since before 0.11.0
*/
const string id() const;
};
}
}
#endif // MASTODON_CPP_EASY_REPORT_HPP

View File

@ -2,15 +2,15 @@
* Copyright © 2018, 2019 tastytea <tastytea@tastytea.de> * Copyright © 2018, 2019 tastytea <tastytea@tastytea.de>
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, version 3. * the Free Software Foundation, version 3.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU Affero General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
@ -23,14 +23,12 @@ using Results = Easy::Results;
bool Results::valid() const bool Results::valid() const
{ {
const std::vector<string> attributes = return Entity::check_valid(
{{ {
"accounts", "accounts",
"statuses", "statuses",
"hashtags" "hashtags"
}}; });
return Entity::check_valid(attributes);
} }
const std::vector<Easy::Account> Results::accounts() const const std::vector<Easy::Account> Results::accounts() const

View File

@ -2,15 +2,15 @@
* Copyright © 2018, 2019 tastytea <tastytea@tastytea.de> * Copyright © 2018, 2019 tastytea <tastytea@tastytea.de>
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, version 3. * the Free Software Foundation, version 3.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU Affero General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
@ -20,20 +20,11 @@
#include <string> #include <string>
#include <vector> #include <vector>
// If we are compiling mastodon-cpp, use another include path #include "../../mastodon-cpp.hpp"
#ifdef MASTODON_CPP #include "../entity.hpp"
#include "mastodon-cpp.hpp" #include "account.hpp"
#include "easy/entity.hpp" #include "status.hpp"
#include "easy/entities/account.hpp" #include "tag.hpp"
#include "easy/entities/status.hpp"
#include "easy/entities/tag.hpp"
#else
#include <mastodon-cpp/mastodon-cpp.hpp>
#include <mastodon-cpp/easy/entity.hpp>
#include <mastodon-cpp/easy/entities/account.hpp>
#include <mastodon-cpp/easy/entities/status.hpp>
#include <mastodon-cpp/easy/entities/tag.hpp>
#endif
using std::string; using std::string;

View File

@ -2,15 +2,15 @@
* Copyright © 2018, 2019 tastytea <tastytea@tastytea.de> * Copyright © 2018, 2019 tastytea <tastytea@tastytea.de>
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, version 3. * the Free Software Foundation, version 3.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU Affero General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
@ -24,27 +24,25 @@ using Status = Easy::Status;
bool Status::valid() const bool Status::valid() const
{ {
const std::vector<string> attributes = return Entity::check_valid(
{{ {
"id", "id",
"uri", "uri",
"account", "account",
"content", "content",
"created_at", "created_at",
"emojis", "emojis",
"replies_count", "replies_count",
"reblogs_count", "reblogs_count",
"favourites_count", "favourites_count",
"sensitive", "sensitive",
"spoiler_text", "spoiler_text",
"visibility", "visibility",
"media_attachments", "media_attachments",
"mentions", "mentions",
"tags", "tags",
"application" "application"
}}; });
return Entity::check_valid(attributes);
} }
const Easy::Account Status::account() const const Easy::Account Status::account() const
@ -80,7 +78,7 @@ const Easy::Card Status::card() const
return Easy::Card(); return Easy::Card();
} }
const Easy::time Status::created_at() const const Easy::time_type Status::created_at() const
{ {
return get_time("created_at"); return get_time("created_at");
} }
@ -171,7 +169,6 @@ const std::vector<Easy::Attachment> Status::media_attachments() const
Status Status::media_attachments Status Status::media_attachments
(const std::vector<Attachment> &media_attachments) (const std::vector<Attachment> &media_attachments)
{ {
// FIXME: Needs writable Easy::Attachment()
Json::Value jsonarray(Json::arrayValue); Json::Value jsonarray(Json::arrayValue);
for (const Attachment &att : media_attachments) for (const Attachment &att : media_attachments)

View File

@ -2,15 +2,15 @@
* Copyright © 2018, 2019 tastytea <tastytea@tastytea.de> * Copyright © 2018, 2019 tastytea <tastytea@tastytea.de>
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, version 3. * the Free Software Foundation, version 3.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU Affero General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
@ -21,28 +21,15 @@
#include <cstdint> #include <cstdint>
#include <vector> #include <vector>
// If we are compiling mastodon-cpp, use another include path #include "../../mastodon-cpp.hpp"
#ifdef MASTODON_CPP #include "../entity.hpp"
#include "mastodon-cpp.hpp" #include "account.hpp"
#include "easy/entity.hpp" #include "emoji.hpp"
#include "easy/entities/account.hpp" #include "attachment.hpp"
#include "easy/entities/emoji.hpp" #include "mention.hpp"
#include "easy/entities/attachment.hpp" #include "tag.hpp"
#include "easy/entities/mention.hpp" #include "application.hpp"
#include "easy/entities/tag.hpp" #include "card.hpp"
#include "easy/entities/application.hpp"
#include "easy/entities/card.hpp"
#else
#include <mastodon-cpp/mastodon-cpp.hpp>
#include <mastodon-cpp/easy/entity.hpp>
#include <mastodon-cpp/easy/entities/account.hpp>
#include <mastodon-cpp/easy/entities/emoji.hpp>
#include <mastodon-cpp/easy/entities/attachment.hpp>
#include <mastodon-cpp/easy/entities/mention.hpp>
#include <mastodon-cpp/easy/entities/tag.hpp>
#include <mastodon-cpp/easy/entities/application.hpp>
#include <mastodon-cpp/easy/entities/card.hpp>
#endif
using std::string; using std::string;
using std::uint64_t; using std::uint64_t;
@ -89,7 +76,7 @@ namespace Easy
* *
* @since before 0.11.0 * @since before 0.11.0
*/ */
const Easy::time created_at() const; const Easy::time_type created_at() const;
/*! /*!
* @brief Returns content of status * @brief Returns content of status

View File

@ -2,15 +2,15 @@
* Copyright © 2018, 2019 tastytea <tastytea@tastytea.de> * Copyright © 2018, 2019 tastytea <tastytea@tastytea.de>
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, version 3. * the Free Software Foundation, version 3.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU Affero General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
@ -25,13 +25,11 @@ using Tag = Easy::Tag;
bool Tag::valid() const bool Tag::valid() const
{ {
const std::vector<string> attributes = return Entity::check_valid(
{{ {
"name", "name",
"url" "url"
}}; });
return Entity::check_valid(attributes);
} }
const string Tag::name() const const string Tag::name() const
@ -52,7 +50,7 @@ const std::vector<Tag::History> Tag::history() const
std::vector<Easy::Tag::History> vec; std::vector<Easy::Tag::History> vec;
std::transform(node.begin(), node.end(), std::back_inserter(vec), std::transform(node.begin(), node.end(), std::back_inserter(vec),
[](const Json::Value &value) [](const Json::Value &value)
{ return Easy::Tag::History(value); }); { return Easy::Tag::History(value); });
return vec; return vec;
} }
@ -72,12 +70,12 @@ bool Tag::History::valid() const
return Entity::check_valid(attributes); return Entity::check_valid(attributes);
} }
uint64_t Tag::History::accounts() uint64_t Tag::History::accounts() const
{ {
return stouint64(get_string("accounts")); return get_uint64("accounts");
} }
const Easy::time Tag::History::day() const Easy::time_type Tag::History::day() const
{ {
const Json::Value node = get("day"); const Json::Value node = get("day");
@ -88,10 +86,10 @@ const Easy::time Tag::History::day()
} }
ttdebug << "Could not get data: day\n"; ttdebug << "Could not get data: day\n";
return Easy::time(); return Easy::time_type();
} }
uint64_t Tag::History::uses() uint64_t Tag::History::uses() const
{ {
return stouint64(get_string("uses")); return get_uint64("uses");
} }

View File

@ -2,15 +2,15 @@
* Copyright © 2018, 2019 tastytea <tastytea@tastytea.de> * Copyright © 2018, 2019 tastytea <tastytea@tastytea.de>
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, version 3. * the Free Software Foundation, version 3.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU Affero General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
@ -20,14 +20,8 @@
#include <string> #include <string>
#include <cstdint> #include <cstdint>
// If we are compiling mastodon-cpp, use another include path #include "../../mastodon-cpp.hpp"
#ifdef MASTODON_CPP #include "../entity.hpp"
#include "mastodon-cpp.hpp"
#include "easy/entity.hpp"
#else
#include <mastodon-cpp/mastodon-cpp.hpp>
#include <mastodon-cpp/easy/entity.hpp>
#endif
using std::string; using std::string;
using std::uint64_t; using std::uint64_t;
@ -61,21 +55,21 @@ namespace Easy
* *
* @since 0.16.0 * @since 0.16.0
*/ */
uint64_t accounts(); uint64_t accounts() const;
/*! /*!
* @brief Returns the day. * @brief Returns the day.
* *
* @since 0.16.0 * @since 0.16.0
*/ */
const Easy::time day(); const Easy::time_type day() const;
/*! /*!
* @brief Returns the number of accounts using that hashtag. * @brief Returns the number of statuses with that hashtag.
* *
* @since 0.16.0 * @since 0.16.0
*/ */
uint64_t uses(); uint64_t uses() const;
}; };
using Entity::Entity; using Entity::Entity;

View File

@ -2,15 +2,15 @@
* Copyright © 2019 tastytea <tastytea@tastytea.de> * Copyright © 2019 tastytea <tastytea@tastytea.de>
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, version 3. * the Free Software Foundation, version 3.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU Affero General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
@ -21,10 +21,13 @@ using Token = Easy::Token;
bool Token::valid() const bool Token::valid() const
{ {
return Entity::check_valid({"access_token", return Entity::check_valid(
"token_type", {
"scope", "access_token",
"created_at"}); "token_type",
"scope",
"created_at"
});
} }
const string Token::access_token() const const string Token::access_token() const
@ -42,7 +45,7 @@ const string Token::scope() const
return get_string("scope"); return get_string("scope");
} }
const Easy::time Token::created_at() const const Easy::time_type Token::created_at() const
{ {
return get_time("created_at"); return get_time("created_at");
} }

View File

@ -2,15 +2,15 @@
* Copyright © 2019 tastytea <tastytea@tastytea.de> * Copyright © 2019 tastytea <tastytea@tastytea.de>
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, version 3. * the Free Software Foundation, version 3.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU Affero General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
@ -19,14 +19,8 @@
#include <string> #include <string>
// If we are compiling mastodon-cpp, use another include path #include "../../mastodon-cpp.hpp"
#ifdef MASTODON_CPP #include "../entity.hpp"
#include "mastodon-cpp.hpp"
#include "easy/entity.hpp"
#else
#include <mastodon-cpp/mastodon-cpp.hpp>
#include <mastodon-cpp/easy/entity.hpp>
#endif
using std::string; using std::string;
@ -72,7 +66,7 @@ namespace Easy
* *
* @since 0.103.0 * @since 0.103.0
*/ */
const Easy::time created_at() const; const Easy::time_type created_at() const;
}; };
} }
} }

View File

@ -2,15 +2,15 @@
* Copyright © 2018, 2019 tastytea <tastytea@tastytea.de> * Copyright © 2018, 2019 tastytea <tastytea@tastytea.de>
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, version 3. * the Free Software Foundation, version 3.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU Affero General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
@ -21,6 +21,7 @@
#include <regex> #include <regex>
#include <algorithm> #include <algorithm>
#include "easy/entity.hpp" #include "easy/entity.hpp"
#include "easy/easy.hpp"
#include "debug.hpp" #include "debug.hpp"
using namespace Mastodon; using namespace Mastodon;
@ -100,7 +101,7 @@ const Json::Value Easy::Entity::to_object() const
bool Easy::Entity::check_valid(const std::vector<string> &attributes) const bool Easy::Entity::check_valid(const std::vector<string> &attributes) const
{ {
for (const string &attribute: attributes) for (const string &attribute : attributes)
{ {
get(attribute); get(attribute);
if (!was_set()) if (!was_set())
@ -226,19 +227,14 @@ bool Easy::Entity::get_bool(const string &key) const
return false; return false;
} }
const Easy::time Easy::Entity::get_time(const string &key) const const Easy::time_type Easy::Entity::get_time(const string &key) const
{ {
const Json::Value node = get(key); const Json::Value node = get(key);
if (node.isString()) if (node.isString())
{ {
std::stringstream sstime(node.asString());
struct std::tm tm = {};
tm.tm_isdst = -1; // Detect daylight saving time.
sstime >> std::get_time(&tm, "%Y-%m-%dT%T");
std::time_t time = timegm(&tm); // Assume time is UTC.
_was_set = true; _was_set = true;
return { system_clock::from_time_t(time) }; return Easy::string_to_time(node.asString());
} }
_was_set = false; _was_set = false;
@ -313,29 +309,3 @@ std::uint64_t Easy::Entity::stouint64(const string &str) const
return stoull(str); return stoull(str);
} }
} }
// Easy::GenericEntity::GenericEntity(const string &json)
// : Entity(json)
// {}
// Easy::GenericEntity::GenericEntity()
// : Entity()
// {}
// bool Easy::GenericEntity::valid() const
// {
// return true;
// }
// template<typename T> GenericEntity<T>::GenericEntity(const string &json)
// : Entity(json)
// {}
// template<typename T> GenericEntity<T>::GenericEntity()
// : Entity()
// {}
// template<typename T> bool GenericEntity<T>::valid() const
// {
// return true;
// }

View File

@ -2,15 +2,15 @@
* Copyright © 2019 tastytea <tastytea@tastytea.de> * Copyright © 2019 tastytea <tastytea@tastytea.de>
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, version 3. * the Free Software Foundation, version 3.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU Affero General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
@ -20,12 +20,7 @@
#include <string> #include <string>
#include <jsoncpp/json/json.h> #include <jsoncpp/json/json.h>
// If we are compiling mastodon-cpp, use another include path #include "types_easy.hpp"
#ifdef MASTODON_CPP
#include "easy/types_easy.hpp"
#else
#include <mastodon-cpp/easy/types_easy.hpp>
#endif
using std::string; using std::string;
@ -90,7 +85,7 @@ namespace Easy
void from_string(const string &json); void from_string(const string &json);
/*! /*!
* @brief Returns the JSON of the Entity as string. * @brief Returns the JSON of the Entity as formatted string.
* *
* @return JSON string * @return JSON string
* *
@ -190,7 +185,6 @@ namespace Easy
*/ */
double get_double(const string &key) const; double get_double(const string &key) const;
// TODO: Maybe an enum would be better?
/*! /*!
* @brief Returns the value of key as bool * @brief Returns the value of key as bool
* *
@ -203,7 +197,7 @@ namespace Easy
* *
* Returns clocks epoch if the value does not exist or is null. * Returns clocks epoch if the value does not exist or is null.
*/ */
const Easy::time get_time(const string &key) const; const Easy::time_type get_time(const string &key) const;
/*! /*!
* @brief Returns the value of key as vector * @brief Returns the value of key as vector

View File

@ -2,15 +2,15 @@
* Copyright © 2019 tastytea <tastytea@tastytea.de> * Copyright © 2019 tastytea <tastytea@tastytea.de>
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, version 3. * the Free Software Foundation, version 3.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU Affero General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
@ -26,13 +26,14 @@
#include "easy/entities/mention.hpp" #include "easy/entities/mention.hpp"
#include "easy/entities/notification.hpp" #include "easy/entities/notification.hpp"
#include "easy/entities/relationship.hpp" #include "easy/entities/relationship.hpp"
#include "easy/entities/report.hpp"
#include "easy/entities/results.hpp" #include "easy/entities/results.hpp"
#include "easy/entities/status.hpp" #include "easy/entities/status.hpp"
#include "easy/entities/tag.hpp" #include "easy/entities/tag.hpp"
#include "easy/entities/token.hpp" #include "easy/entities/token.hpp"
#include "easy/entities/pushsubscription.hpp" #include "easy/entities/pushsubscription.hpp"
#include "easy/entities/filter.hpp" #include "easy/entities/filter.hpp"
#include "easy/entities/poll.hpp"
#include "easy/entities/conversation.hpp"
using namespace Mastodon; using namespace Mastodon;
@ -51,6 +52,16 @@ Easy::return_entity<T>::return_entity(const uint8_t ec, const string &em,
http_error_code = hec; http_error_code = hec;
} }
template<typename T>
Easy::return_entity<T>::return_entity(const error ec, const string &em,
const uint16_t hec, const T &ent)
: entity(ent)
{
error_code = static_cast<uint8_t>(ec);
error_message = em;
http_error_code = hec;
}
template<typename T> template<typename T>
Easy::return_entity<T>::return_entity::operator const T() const Easy::return_entity<T>::return_entity::operator const T() const
{ {
@ -63,14 +74,6 @@ Easy::return_entity<T>::return_entity::operator const string() const
return entity.to_string(); return entity.to_string();
} }
template<typename T>
std::ostream &Easy::operator <<(std::ostream &out,
const Easy::return_entity<T> &ret)
{
out << ret.entity.to_string();
return out;
}
// Explicit instantiations, so it can be used from outside. // Explicit instantiations, so it can be used from outside.
template struct Easy::return_entity<Easy::Account>; template struct Easy::return_entity<Easy::Account>;
template struct Easy::return_entity<Easy::Application>; template struct Easy::return_entity<Easy::Application>;
@ -83,13 +86,14 @@ template struct Easy::return_entity<Easy::List>;
template struct Easy::return_entity<Easy::Mention>; template struct Easy::return_entity<Easy::Mention>;
template struct Easy::return_entity<Easy::Notification>; template struct Easy::return_entity<Easy::Notification>;
template struct Easy::return_entity<Easy::Relationship>; template struct Easy::return_entity<Easy::Relationship>;
template struct Easy::return_entity<Easy::Report>;
template struct Easy::return_entity<Easy::Results>; template struct Easy::return_entity<Easy::Results>;
template struct Easy::return_entity<Easy::Status>; template struct Easy::return_entity<Easy::Status>;
template struct Easy::return_entity<Easy::Tag>; template struct Easy::return_entity<Easy::Tag>;
template struct Easy::return_entity<Easy::Token>; template struct Easy::return_entity<Easy::Token>;
template struct Easy::return_entity<Easy::PushSubscription>; template struct Easy::return_entity<Easy::PushSubscription>;
template struct Easy::return_entity<Easy::Filter>; template struct Easy::return_entity<Easy::Filter>;
template struct Easy::return_entity<Easy::Poll>;
template struct Easy::return_entity<Easy::Conversation>;
template<typename T> template<typename T>
@ -128,10 +132,11 @@ template struct Easy::return_entity_vector<Easy::List>;
template struct Easy::return_entity_vector<Easy::Mention>; template struct Easy::return_entity_vector<Easy::Mention>;
template struct Easy::return_entity_vector<Easy::Notification>; template struct Easy::return_entity_vector<Easy::Notification>;
template struct Easy::return_entity_vector<Easy::Relationship>; template struct Easy::return_entity_vector<Easy::Relationship>;
template struct Easy::return_entity_vector<Easy::Report>;
template struct Easy::return_entity_vector<Easy::Results>; template struct Easy::return_entity_vector<Easy::Results>;
template struct Easy::return_entity_vector<Easy::Status>; template struct Easy::return_entity_vector<Easy::Status>;
template struct Easy::return_entity_vector<Easy::Tag>; template struct Easy::return_entity_vector<Easy::Tag>;
template struct Easy::return_entity_vector<Easy::Token>; template struct Easy::return_entity_vector<Easy::Token>;
template struct Easy::return_entity_vector<Easy::PushSubscription>; template struct Easy::return_entity_vector<Easy::PushSubscription>;
template struct Easy::return_entity_vector<Easy::Filter>; template struct Easy::return_entity_vector<Easy::Filter>;
template struct Easy::return_entity_vector<Easy::Poll>;
template struct Easy::return_entity_vector<Easy::Conversation>;

View File

@ -2,15 +2,15 @@
* Copyright © 2019 tastytea <tastytea@tastytea.de> * Copyright © 2019 tastytea <tastytea@tastytea.de>
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, version 3. * the Free Software Foundation, version 3.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU Affero General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
@ -21,12 +21,7 @@
#include <vector> #include <vector>
#include <ostream> #include <ostream>
#include <cstdint> #include <cstdint>
// If we are compiling mastodon-cpp, use another include path #include "../mastodon-cpp.hpp"
#ifdef MASTODON_CPP
#include "mastodon-cpp.hpp"
#else
#include <mastodon-cpp/mastodon-cpp.hpp>
#endif
using std::string; using std::string;
using std::vector; using std::vector;
@ -36,18 +31,14 @@ namespace Mastodon
{ {
namespace Easy namespace Easy
{ {
template <typename T>
struct return_entity;
template <typename T> // https://stackoverflow.com/a/4661372/5965450
std::ostream &operator <<(std::ostream&, const return_entity<T>&);
/*! /*!
* @brief Return types for calls that return a single `Easy::Entity`. * @brief Return types for calls that return a single `Easy::Entity`.
* *
* @since 0.100.0 * @since 0.100.0
*/ */
template <typename T> template <typename T> struct
struct return_entity : return_base [[deprecated("Will go away in 1.0.0 with no replacement.")]]
return_entity : return_base
{ {
/*! /*!
* @brief Mastodon::Easy::Entity * @brief Mastodon::Easy::Entity
@ -71,6 +62,19 @@ namespace Easy
return_entity(const uint8_t ec, const string &em, return_entity(const uint8_t ec, const string &em,
const uint16_t hec, const T &ent); const uint16_t hec, const T &ent);
/*!
* @brief Return type for easy Mastodon::Easy::API.
*
* @param ec Error code
* @param em Error message
* @param hec HTTP error code
* @param ent Answer
*
* @since 0.110.0
*/
return_entity(const error ec, const string &em,
const uint16_t hec, const T &ent);
/*! /*!
* @brief Same as return_entity::entity. * @brief Same as return_entity::entity.
* *
@ -79,20 +83,24 @@ namespace Easy
operator const T() const; operator const T() const;
/*! /*!
* @brief Mastodon::Easy::Entity as string. * @brief Mastodon::Easy::Entity as formatted string.
* *
* @since 0.100.0 * @since 0.100.0
*/ */
operator const string() const; operator const string() const;
// FIXME: Can't get it to work, don't know why.
/*! /*!
* @brief Mastodon::Easy::Entity as string. * @brief Mastodon::Easy::Entity as formatted string.
* *
* @since 0.100.0 * @since 0.100.0
*/ */
friend std::ostream &operator <<<T>(std::ostream &out, friend std::ostream &operator <<(std::ostream &out,
const return_entity<T> &ret); const return_entity<T> &ret)
{
// Could only get it to work by implementing it here.
out << ret.entity.to_string();
return out;
}
}; };
/*! /*!
@ -100,8 +108,9 @@ namespace Easy
* *
* @since 0.100.0 * @since 0.100.0
*/ */
template <typename T> template <typename T> struct
struct return_entity_vector : return_base [[deprecated("Will go away in 1.0.0 with no replacement.")]]
return_entity_vector : return_base
{ {
/*! /*!
* @brief std::vector of Mastodon::Easy::Entity. * @brief std::vector of Mastodon::Easy::Entity.

View File

@ -2,15 +2,15 @@
* Copyright © 2018, 2019 tastytea <tastytea@tastytea.de> * Copyright © 2018, 2019 tastytea <tastytea@tastytea.de>
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, version 3. * the Free Software Foundation, version 3.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU Affero General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
@ -39,7 +39,8 @@ const return_entity<Status> API::send_post(const Status &status)
else else
{ {
ttdebug << "ERROR: Easy::Status::content can not be empty.\n"; ttdebug << "ERROR: Easy::Status::content can not be empty.\n";
return { 22, "Easy::Status::content can not be empty", 0, Status() }; return { error::INVALID_ARGUMENT,
"Easy::Status::content can not be empty", 0, Status() };
} }
if (!status.in_reply_to_id().empty()) if (!status.in_reply_to_id().empty())
@ -94,8 +95,9 @@ const return_entity<Status> API::send_post(const Status &status)
else else
{ {
ttdebug << "ERROR: Easy::Attachment::file can not be empty.\n"; ttdebug << "ERROR: Easy::Attachment::file can not be empty.\n";
return { 22, "Easy::Attachment::file can not be empty", return { error::INVALID_ARGUMENT,
0, Status() }; "Easy::Attachment::file can not be empty", 0,
Status() };
} }
if (!att.description().empty()) if (!att.description().empty())
{ {

View File

@ -2,56 +2,60 @@
* Copyright © 2019 tastytea <tastytea@tastytea.de> * Copyright © 2019 tastytea <tastytea@tastytea.de>
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, version 3. * the Free Software Foundation, version 3.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU Affero General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
#include "types_easy.hpp" #include "types_easy.hpp"
using namespace Mastodon; namespace Mastodon
Easy::time::operator const system_clock::time_point() const
{ {
return timepoint; namespace Easy
}
Easy::time::operator const string() const
{ {
return strtime("%FT%T%z", true); time_type::operator const system_clock::time_point() const
}
const string Easy::time::strtime(const string &format, const bool &local) const
{
constexpr std::uint16_t bufsize = 1024;
std::time_t time = system_clock::to_time_t(timepoint);
std::tm *tm;
if (local)
{ {
tm = std::localtime(&time); return timepoint;
}
else
{
tm = std::gmtime(&time);
} }
char buffer[bufsize]; time_type::operator const string() const
std::strftime(buffer, bufsize, format.c_str(), tm); {
return strtime("%FT%T%z", true);
}
return static_cast<const string>(buffer); const string time_type::strtime(const string &format, const bool &local) const
} {
constexpr std::uint16_t bufsize = 1024;
std::time_t time = system_clock::to_time_t(timepoint);
std::tm *tm;
if (local)
{
tm = std::localtime(&time);
}
else
{
tm = std::gmtime(&time);
}
std::ostream &Mastodon::Easy::operator <<(std::ostream &out, char buffer[bufsize];
const Easy::time &t) std::strftime(buffer, bufsize, format.c_str(), tm);
{
const string s = t; // Converts using operator const string(). return static_cast<const string>(buffer);
out << s; }
return out;
std::ostream &operator <<(std::ostream &out,
const time_type &t)
{
const string s = t; // Converts using operator const string().
out << s;
return out;
}
}
} }

View File

@ -2,15 +2,15 @@
* Copyright © 2019 tastytea <tastytea@tastytea.de> * Copyright © 2019 tastytea <tastytea@tastytea.de>
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, version 3. * the Free Software Foundation, version 3.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU Affero General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
@ -20,11 +20,11 @@
#include <string> #include <string>
#include <utility> #include <utility>
#include <chrono> #include <chrono>
#include <vector> #include <cstdint>
using std::string; using std::string;
using std::chrono::system_clock; using std::chrono::system_clock;
using std::vector; using std::uint64_t;
namespace Mastodon namespace Mastodon
{ {
@ -41,6 +41,7 @@ namespace Easy
Notification, Notification,
Delete, Delete,
Error, Error,
Filters_changed,
Undefined Undefined
}; };
@ -121,11 +122,14 @@ namespace Easy
* *
* @since 0.100.0 * @since 0.100.0
*/ */
typedef struct stream_event typedef struct stream_event_type
{ {
event_type type = event_type::Undefined; event_type type = event_type::Undefined;
string data; string data;
} stream_event; } stream_event_type;
[[deprecated("Replaced by Mastodon::Easy::stream_event_type")]]
typedef stream_event_type stream_event;
/*! /*!
* @brief Type of notification and 'push is requested or not'. * @brief Type of notification and 'push is requested or not'.
@ -138,21 +142,12 @@ namespace Easy
bool pushreq = false; bool pushreq = false;
} alert_type; } alert_type;
/*!
* @brief Vector of Easy::alert_type.
*
* Used in PushSubscription::alerts().
*
* @since 0.100.0
*/
typedef vector<alert_type> alerts;
/*! /*!
* @brief Type for time. Converts to time_point and string. * @brief Type for time. Converts to time_point and string.
* *
* @since 0.100.0 * @since 0.100.0
*/ */
struct time struct time_type
{ {
system_clock::time_point timepoint = system_clock::time_point(); system_clock::time_point timepoint = system_clock::time_point();
@ -171,7 +166,7 @@ namespace Easy
* @since 0.100.0 * @since 0.100.0
*/ */
friend std::ostream &operator <<(std::ostream &out, friend std::ostream &operator <<(std::ostream &out,
const Easy::time &t); const Easy::time_type &t);
/*! /*!
* @brief Converts time to a string. * @brief Converts time to a string.
@ -195,6 +190,50 @@ namespace Easy
const string strtime(const string &format, const string strtime(const string &format,
const bool &local = true) const; const bool &local = true) const;
}; };
[[deprecated("Replaced by Mastodon::Easy::time_type")]]
typedef time_type time;
/*!
* @brief Describes an account-field.
*
* @since 0.106.0
*/
typedef struct account_field_type
{
const string name;
const string value;
Easy::time_type verified_at;
} account_field_type;
/*!
* @brief URLs returned by Instance::urls().
*
* @since 0.106.0
*/
typedef struct urls_type
{
string streaming_api;
} urls_type;
/*!
* @brief Statistics returned by Instance::stats().
*/
typedef struct stats_type
{
uint64_t user_count = 0;
uint64_t status_count = 0;
uint64_t domain_count = 0;
} stats_type;
/*!
* @brief Poll options returned by Poll::options().
*/
typedef struct poll_options_type
{
string title;
uint64_t votes_count = 0;
} poll_options_type;
} }
} }
#endif // MASTODON_CPP_EASY_TYPES_EASY_HPP #endif // MASTODON_CPP_EASY_TYPES_EASY_HPP

View File

@ -2,33 +2,49 @@
* Copyright © 2018, 2019 tastytea <tastytea@tastytea.de> * Copyright © 2018, 2019 tastytea <tastytea@tastytea.de>
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, version 3. * the Free Software Foundation, version 3.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU Affero General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
#include <iostream> #include <iostream>
#include <functional> // std::bind #include <functional> // std::bind
#include <list>
#include <cstring> // std::strncmp
#include <exception> #include <exception>
#include <thread> #include <thread>
#include <curlpp/Options.hpp> #include <regex>
#include <curlpp/Exception.hpp> #include <Poco/Net/HTTPSClientSession.h>
#include <curlpp/Infos.hpp> #include <Poco/Net/HTTPRequest.h>
#include <Poco/Net/HTTPResponse.h>
#include <Poco/StreamCopier.h>
#include <Poco/URI.h>
#include <Poco/Environment.h>
#include <Poco/Exception.h>
#include <Poco/Net/NetException.h>
#include <Poco/Net/SSLException.h>
#include "debug.hpp" #include "debug.hpp"
#include "mastodon-cpp.hpp" #include "mastodon-cpp.hpp"
using namespace Mastodon; using namespace Mastodon;
namespace curlopts = curlpp::options;
using std::cerr; using std::cerr;
using std::istream;
using std::make_unique;
using std::move;
using std::regex;
using std::regex_search;
using std::smatch;
using Poco::Net::HTTPSClientSession;
using Poco::Net::HTTPRequest;
using Poco::Net::HTTPResponse;
using Poco::Net::HTTPMessage;
using Poco::StreamCopier;
using Poco::Environment;
API::http::http(const API &api, const string &instance, API::http::http(const API &api, const string &instance,
const string &access_token) const string &access_token)
@ -37,21 +53,95 @@ API::http::http(const API &api, const string &instance,
, _access_token(access_token) , _access_token(access_token)
, _cancel_stream(false) , _cancel_stream(false)
{ {
curlpp::initialize(); Poco::Net::initializeSSL();
try
{
string env_proxy = Environment::get("http_proxy");
size_t pos;
// Only keep text between // and /.
if ((pos = env_proxy.find("//")) != string::npos)
{
env_proxy = env_proxy.substr(pos + 2);
}
if ((pos = env_proxy.find('/')) != string::npos)
{
env_proxy = env_proxy.substr(0, pos);
}
if ((pos = env_proxy.find('@')) != string::npos)
{
string hostport = env_proxy.substr(pos + 1);
string userpw = env_proxy.substr(0, pos);
set_proxy(hostport, userpw);
}
else
{
set_proxy(env_proxy);
}
}
catch (const std::exception &)
{
// No proxy found, no problem.
}
} }
API::http::~http() API::http::~http()
{ {
curlpp::terminate(); Poco::Net::uninitializeSSL();
}
void API::http::set_proxy(const string &hostport, const string &userpw)
{
try
{
HTTPSClientSession::ProxyConfig proxyconfig;
size_t pos = hostport.find(':');
proxyconfig.host = hostport.substr(0, pos);
if (pos != string::npos)
{
proxyconfig.port = std::stoi(hostport.substr(pos + 1));
}
if (!userpw.empty())
{
string username;
pos = userpw.find(':');
Poco::URI::decode(userpw.substr(0, pos), username);
proxyconfig.username = username;
if (pos != string::npos)
{
string password;
Poco::URI::decode(userpw.substr(pos + 1), password);
proxyconfig.password = password;
}
}
HTTPSClientSession::setGlobalProxyConfig(proxyconfig);
ttdebug << "Set proxy to " << hostport << ".\n";
}
catch (const std::exception &e)
{
if (parent.exceptions())
{
std::rethrow_exception(std::current_exception());
}
}
} }
return_call API::http::request(const http_method &meth, const string &path) return_call API::http::request(const http_method &meth, const string &path)
{ {
return request(meth, path, curlpp::Forms()); HTMLForm form;
return request(meth, path, form);
} }
return_call API::http::request(const http_method &meth, const string &path, return_call API::http::request(const http_method &meth, const string &path,
const curlpp::Forms &formdata) HTMLForm &formdata)
{ {
string answer; string answer;
return request_common(meth, path, formdata, answer); return request_common(meth, path, formdata, answer);
@ -63,8 +153,9 @@ void API::http::request_stream(const string &path, string &stream)
_streamthread = std::thread( _streamthread = std::thread(
[&, path] // path is captured by value because it may be [&, path] // path is captured by value because it may be
{ // deleted before we access it. { // deleted before we access it.
HTMLForm form;
ret = request_common(http_method::GET_STREAM, path, ret = request_common(http_method::GET_STREAM, path,
curlpp::Forms(), stream); form, stream);
ttdebug << "Remaining content of the stream: " << stream << '\n'; ttdebug << "Remaining content of the stream: " << stream << '\n';
if (!ret) if (!ret)
{ {
@ -78,149 +169,181 @@ void API::http::request_stream(const string &path, string &stream)
return_call API::http::request_common(const http_method &meth, return_call API::http::request_common(const http_method &meth,
const string &path, const string &path,
const curlpp::Forms &formdata, HTMLForm &formdata,
string &answer) string &answer)
{ {
using namespace std::placeholders; // _1, _2, _3
ttdebug << "Path is: " << path << '\n'; ttdebug << "Path is: " << path << '\n';
try try
{ {
curlpp::Easy request; string method;
std::list<string> headers;
request.setOpt<curlopts::Url>("https://" + _instance + path);
ttdebug << "User-Agent: " << parent.get_useragent() << "\n";
request.setOpt<curlopts::UserAgent>(parent.get_useragent());
{
string proxy;
string userpw;
parent.get_proxy(proxy, userpw);
if (!proxy.empty())
{
request.setOpt<curlopts::Proxy>(proxy);
if (!userpw.empty())
{
request.setOpt<curlopts::ProxyUserPwd>(userpw);
}
}
}
if (!_access_token.empty())
{
headers.push_back("Authorization: Bearer " + _access_token);
}
if (meth != http_method::GET_STREAM)
{
headers.push_back("Connection: close");
// Get headers from server
request.setOpt<curlpp::options::Header>(true);
}
request.setOpt<curlopts::HttpHeader>(headers);
request.setOpt<curlopts::FollowLocation>(true);
request.setOpt<curlopts::WriteFunction>
(std::bind(&http::callback_write, this, _1, _2, _3, &answer));
request.setOpt<curlopts::ProgressFunction>
(std::bind(&http::callback_progress, this, _1, _2, _3, _4));
request.setOpt<curlopts::NoProgress>(0);
if (!formdata.empty())
{
request.setOpt<curlopts::HttpPost>(formdata);
}
switch (meth) switch (meth)
{ {
case http_method::GET: case http_method::GET:
case http_method::GET_STREAM: case http_method::GET_STREAM:
break; {
case http_method::PATCH: method = HTTPRequest::HTTP_GET;
request.setOpt<curlopts::CustomRequest>("PATCH");
break;
case http_method::POST:
request.setOpt<curlopts::CustomRequest>("POST");
break;
case http_method::PUT:
request.setOpt<curlopts::CustomRequest>("PUT");
break;
case http_method::DELETE:
request.setOpt<curlopts::CustomRequest>("DELETE");
break; break;
} }
case http_method::PUT:
{
method = HTTPRequest::HTTP_PUT;
break;
}
case http_method::POST:
{
method = HTTPRequest::HTTP_POST;
break;
}
case http_method::PATCH:
{
// POCO in CentOS 7 (1.6.1) doesn't have HTTPRequest::HTTP_PATCH.
method = "PATCH";
break;
}
case http_method::DELETE:
{
method = HTTPRequest::HTTP_DELETE;
break;
}
default:
{
break;
}
}
//request.setOpt<curlopts::Verbose>(true); HTTPSClientSession session(_instance);
HTTPRequest request(method, path, HTTPMessage::HTTP_1_1);
request.set("User-Agent", parent.get_useragent());
if (!_access_token.empty())
{
request.set("Authorization", " Bearer " + _access_token);
}
if (!formdata.empty())
{
ttdebug << "Size of HTMLForm is " << formdata.size() << '\n';
formdata.prepareSubmit(request);
formdata.write(session.sendRequest(request));
}
else
{
session.sendRequest(request);
}
HTTPResponse response;
istream &body_stream = session.receiveResponse(response);
const uint16_t http_code = response.getStatus();
ttdebug << "Response code: " << http_code << '\n';
answer.clear(); answer.clear();
request.perform(); StreamCopier::copyToString(body_stream, answer);
uint16_t http_code = curlpp::infos::ResponseCode::get(request);
ttdebug << "Response code: " << http_code << '\n';
// Work around "HTTP/1.1 100 Continue\r\n\r\nHTTP/1.1 200 OK"
size_t pos = answer.find("\r\n\r\n", 25);
_headers = answer.substr(0, pos);
// Only return body
answer = answer.substr(pos + 4);
if (http_code == 200 || http_code == 302 || http_code == 307) std::ostringstream headers_stream;
{ // OK or Found or Temporary Redirect response.write(headers_stream);
return { 0, "", http_code, answer }; _headers = headers_stream.str();
}
else if (http_code == 301 || http_code == 308) switch (http_code)
{ // Moved Permanently or Permanent Redirect
// return new URL
answer = curlpp::infos::EffectiveUrl::get(request);
return { 78, "Remote address changed", http_code, answer };
}
else if (http_code == 0)
{ {
return { 255, "Unknown error", http_code, answer }; case HTTPResponse::HTTP_OK:
}
else
{ {
return { 111, "Connection refused", http_code, answer }; return { error::OK, "", http_code, answer };
}
// Not using the constants because some are too new for Debian stretch.
case 301: // HTTPResponse::HTTP_MOVED_PERMANENTLY
case 308: // HTTPResponse::HTTP_PERMANENT_REDIRECT
case 302: // HTTPResponse::HTTP_FOUND
case 303: // HTTPResponse::HTTP_SEE_OTHER
case 307: // HTTPResponse::HTTP_TEMPORARY_REDIRECT
{
ttdebug << "HTTP redirect.\n";
string location = response.get("Location");
if (location.substr(0, 4) == "http")
{ // Remove protocol and instance from path.
size_t pos1 = location.find("//") + 2;
size_t pos2 = location.find('/', pos1);
if (location.substr(pos1, pos2 - pos1) != _instance)
{ // Return new location if the domain changed.
ttdebug << "New location is on another domain.\n";
return { error::URL_CHANGED, "Remote address changed",
http_code, location };
}
location = location.substr(pos2);
}
if (http_code == 301 || http_code == 308)
{ // Return new location for permanent redirects.
return { error::URL_CHANGED, "Remote address changed",
http_code, location };
}
else
{
ttdebug << "Following temporary redirect: " << location << '\n';
return request_common(meth, location, formdata, answer);
}
}
default:
{
return { error::CONNECTION_REFUSED, "Connection refused",
http_code, answer };
}
} }
} }
catch (curlpp::RuntimeError &e) catch (const Poco::Net::DNSException &e)
{ {
const string what = e.what();
// This error is thrown if http.cancel_stream() is used.
if ((what.compare(0, 16, "Callback aborted") == 0) ||
(what.compare(0, 19, "Failed writing body") == 0))
{
ttdebug << "Request was cancelled by user\n";
return { 0, "Request was cancelled by user", 0, "" };
}
else if (what.compare(what.size() - 20, 20, "Connection timed out") == 0)
{
ttdebug << what << "\n";
return { 110, "Connection timed out", 0, "" };
}
else if (what.compare(0, 23, "Could not resolve host:") == 0)
{
ttdebug << what << "\n";
return { 113, "Could not resolve host", 0, "" };
}
if (parent.exceptions()) if (parent.exceptions())
{ {
std::rethrow_exception(std::current_exception()); e.rethrow();
}
else
{
ttdebug << "curlpp::RuntimeError: " << e.what() << std::endl;
return { 192, e.what(), 0, "" };
} }
ttdebug << e.displayText() << "\n";
return { error::DNS, e.displayText(), 0, "" };
} }
catch (curlpp::LogicError &e) catch (const Poco::Net::ConnectionRefusedException &e)
{
if (parent.exceptions())
{
e.rethrow();
}
ttdebug << e.displayText() << "\n";
return { error::CONNECTION_REFUSED, e.displayText(), 0, "" };
}
catch (const Poco::Net::SSLException &e)
{
if (parent.exceptions())
{
e.rethrow();
}
ttdebug << e.displayText() << "\n";
return { error::ENCRYPTION, e.displayText(), 0, "" };
}
catch (const Poco::Net::NetException &e)
{
if (parent.exceptions())
{
e.rethrow();
}
ttdebug << "Unknown network error: " << e.displayText() << std::endl;
return { error::UNKNOWN, e.displayText(), 0, "" };
}
catch (const std::exception &e)
{ {
if (parent.exceptions()) if (parent.exceptions())
{ {
std::rethrow_exception(std::current_exception()); std::rethrow_exception(std::current_exception());
} }
ttdebug << "curlpp::LogicError: " << e.what() << std::endl; ttdebug << "Unknown error: " << e.what() << std::endl;
return { 193, e.what(), 0, "" }; return { error::UNKNOWN, e.what(), 0, "" };
} }
} }
@ -229,26 +352,6 @@ void API::http::get_headers(string &headers) const
headers = _headers; headers = _headers;
} }
size_t API::http::callback_write(char* data, size_t size, size_t nmemb,
string *str)
{
std::lock_guard<std::mutex> lock(_mutex);
str->append(data, size * nmemb);
// ttdebug << "Received " << size * nmemb << " Bytes\n";
return size * nmemb;
}
double API::http::callback_progress(double /* dltotal */, double /* dlnow */,
double /* ultotal */, double /* ulnow */)
{
if (_cancel_stream)
{
// This throws the runtime error: Callback aborted
return 1;
}
return 0;
}
void API::http::cancel_stream() void API::http::cancel_stream()
{ {
_cancel_stream = true; _cancel_stream = true;

View File

@ -2,30 +2,34 @@
* Copyright © 2018, 2019 tastytea <tastytea@tastytea.de> * Copyright © 2018, 2019 tastytea <tastytea@tastytea.de>
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, version 3. * the Free Software Foundation, version 3.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU Affero General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
#include <sstream>
#include <regex> #include <regex>
#include <locale> #include <locale>
#include <codecvt> #include <codecvt>
#include <utility> #include <utility>
#include <iostream> #include <iostream>
#include <exception>
#include <algorithm> #include <algorithm>
#include <Poco/Net/FilePartSource.h>
#include <Poco/URI.h>
#include "version.hpp" #include "version.hpp"
#include "debug.hpp" #include "debug.hpp"
#include "mastodon-cpp.hpp" #include "mastodon-cpp.hpp"
using namespace Mastodon; using namespace Mastodon;
using std::make_unique;
using Poco::Net::FilePartSource;
API::API(const string &instance, const string &access_token) API::API(const string &instance, const string &access_token)
: _instance(instance) : _instance(instance)
@ -33,9 +37,25 @@ API::API(const string &instance, const string &access_token)
, _useragent(string("mastodon-cpp/") + global::version) , _useragent(string("mastodon-cpp/") + global::version)
, _http(*this, instance, access_token) , _http(*this, instance, access_token)
, _exceptions(false) , _exceptions(false)
, _proxy("") {
, _proxy_userpw("") bool fash = false;
{} const std::regex re_gab("(?:\\.|^)gab\\.[^\\.]+$");
const std::regex re_kiwifarms("(?:\\.|^)kiwifarms\\.[^\\.]+$");
for (const std::regex &re : { re_gab, re_kiwifarms })
{
if (std::regex_search(_instance, re))
{
fash = true;
break;
}
}
if (fash)
{
throw std::runtime_error("Fascist instance detected: " + _instance);
}
}
API::~API() API::~API()
{} {}
@ -91,9 +111,12 @@ const string API::maptostr(const parameters &map, const bool &firstparam)
return result; return result;
} }
const curlpp::Forms API::maptoformdata(const parameters &map) unique_ptr<HTMLForm> API::maptoformdata(const parameters &map)
{ {
curlpp::Forms formdata; ttdebug << "Transforming Mastodon::parameters to Poco::Net::HTMLForm.\n";
unique_ptr<HTMLForm> formdata =
make_unique<HTMLForm>(HTMLForm::ENCODING_MULTIPART);
if (map.size() == 0) if (map.size() == 0)
{ {
@ -102,41 +125,58 @@ const curlpp::Forms API::maptoformdata(const parameters &map)
for (const auto &it : map) for (const auto &it : map)
{ {
string key = it.key;
ttdebug << "Processing \"" + key + "\".\n";
// TODO: Test nested parameters.
if (const size_t pos = key.find('.') != string::npos)
{ // Nested parameters.
key.replace(pos, 1, "[");
key += ']';
}
if (it.values.size() == 1) if (it.values.size() == 1)
{ // If the file is not base64-encoded, treat as filename { // If the file is not base64-encoded, treat as filename.
if ((it.key == "avatar" || if ((key == "avatar" ||
it.key == "header" || key == "header" ||
it.key == "file") && key == "file") &&
it.values.front().substr(0, 4).compare("data") != 0) it.values.front().substr(0, 5) != "data:")
{ {
ttdebug << it.key << ": Filename detected.\n"; ttdebug << key << ": Filename detected.\n";
formdata.push_back(
new curlpp::FormParts::File(it.key, it.values.front())); try
} {
else formdata->addPart(key,
{ new FilePartSource(it.values.front()));
// Append [] to array keys. }
string key = it.key; catch (const std::exception &e)
if (key == "account_ids" {
if (exceptions())
{
std::rethrow_exception(std::current_exception());
}
// TODO: Proper error handling without exceptions.
std::cerr << "Error: Could not open file: "
<< it.values.front() << std::endl;
}
}
else if (key == "account_ids"
|| key == "exclude_types" || key == "exclude_types"
|| key == "media_ids" || key == "media_ids"
|| key == "context") || key == "context")
{ {
key += "[]"; key += "[]";
}
formdata.push_back(
new curlpp::FormParts::Content(key, it.values.front()));
} }
formdata->add(key, it.values.front());
} }
else else
{ {
std::transform(it.values.begin(), it.values.end(), for (const string &value : it.values)
std::back_inserter(formdata), {
[&it](const string &s) formdata->add(key + "[]", value);
{ }
return new curlpp::FormParts::Content
(it.key + "[]", s);
});
} }
} }
@ -226,11 +266,18 @@ return_call API::register_app2(const string &client_id,
return ret; return ret;
} }
const string API::get_header(const std::string &header) const const string API::get_header(std::string header) const
{ {
string headers; string headers;
string headers_lower;
_http.get_headers(headers); _http.get_headers(headers);
size_t startpos = headers.find(header + ':'); headers_lower.resize(headers.size());
std::transform(headers.begin(), headers.end(),
headers_lower.begin(), ::tolower);
std::transform(header.begin(), header.end(), header.begin(), ::tolower);
size_t startpos = headers_lower.find(header + ':');
if (startpos != std::string::npos) if (startpos != std::string::npos)
{ {
startpos = headers.find(':', startpos) + 2; startpos = headers.find(':', startpos) + 2;
@ -252,22 +299,9 @@ bool API::exceptions() const
return _exceptions; return _exceptions;
} }
void API::set_proxy(const string &proxy, const string &userpw) void API::set_proxy(const string &hostport, const string &userpw)
{ {
_proxy = proxy; _http.set_proxy(hostport, userpw);
_proxy_userpw = userpw;
}
void API::get_proxy(string &proxy, string &userpw) const
{
if (!_proxy.empty())
{
proxy = _proxy;
if (!_proxy_userpw.empty())
{
userpw = _proxy_userpw;
}
}
} }
const parameters API::delete_params(const parameters &params, const parameters API::delete_params(const parameters &params,
@ -281,7 +315,7 @@ const parameters API::delete_params(const parameters &params,
std::copy_if(params.begin(), params.end(), newparams.begin(), std::copy_if(params.begin(), params.end(), newparams.begin(),
[&keys](const param &p) [&keys](const param &p)
{ {
return std::any_of(keys.begin(), keys.end(), return std::all_of(keys.begin(), keys.end(),
[&p](const string &k) [&p](const string &k)
{ {
return (k != p.key); return (k != p.key);
@ -293,11 +327,16 @@ const parameters API::delete_params(const parameters &params,
const string Mastodon::urlencode(const std::string &str) const string Mastodon::urlencode(const std::string &str)
{ {
return curlpp::escape(str); string out;
Poco::URI::encode(str, "", out);
return out;
} }
const string Mastodon::urldecode(const std::string &str) const string Mastodon::urldecode(const std::string &str)
{ {
return curlpp::unescape(str); string out;
Poco::URI::decode(str, out);
return out;
} }
const string Mastodon::unescape_html(const string &html) const string Mastodon::unescape_html(const string &html)
@ -308,7 +347,7 @@ const string Mastodon::unescape_html(const string &html)
// Used to convert int to utf-8 char // Used to convert int to utf-8 char
std::wstring_convert<std::codecvt_utf8<char32_t>, char32_t> u8c; std::wstring_convert<std::codecvt_utf8<char32_t>, char32_t> u8c;
// Matches numbered entities between 1 and 8 digits, decimal or hexadecimal // Matches numbered entities between 1 and 8 digits, decimal or hexadecimal
std::regex re_entity("&#(x)?(\\d{1,8});"); std::regex re_entity("&#(x)?([[:alnum:]]{1,8});");
std::smatch match; std::smatch match;
while (std::regex_search(buffer, match, re_entity)) while (std::regex_search(buffer, match, re_entity))

View File

@ -2,15 +2,15 @@
* Copyright © 2018, 2019 tastytea <tastytea@tastytea.de> * Copyright © 2018, 2019 tastytea <tastytea@tastytea.de>
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, version 3. * the Free Software Foundation, version 3.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU Affero General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
@ -25,20 +25,15 @@
#include <ostream> #include <ostream>
#include <thread> #include <thread>
#include <cstdint> #include <cstdint>
#include <curlpp/cURLpp.hpp> #include <Poco/Net/HTMLForm.h>
#include <curlpp/Easy.hpp>
// If we are compiling mastodon-cpp, use another include path #include "return_types.hpp"
#ifdef MASTODON_CPP #include "types.hpp"
#include "return_types.hpp"
#include "types.hpp"
#else
#include <mastodon-cpp/return_types.hpp>
#include <mastodon-cpp/types.hpp>
#endif
using std::string; using std::string;
using std::uint8_t; using std::uint8_t;
using std::unique_ptr;
using Poco::Net::HTMLForm;
/*! /*!
* @example example01_get_public_timeline.cpp * @example example01_get_public_timeline.cpp
@ -54,22 +49,20 @@ namespace Mastodon
/*! /*!
* @brief Interface to the Mastodon API. * @brief Interface to the Mastodon API.
* *
* All input is expected to be UTF-8. Binary data must be * All input is expected to be UTF-8. Binary data must be a
* base64-encoded or a filename. * filename.
* It appears that media attachements can not be base64 encoded.
* *
* @section error Error codes * @section error Error codes
* | Code | Explanation | * | Code | Explanation |
* | --------: |:-------------------------------------------| * | --------: |:-------------------------------------------|
* | 0 | No error | * | 0 | No error |
* | 22 | Invalid argument | * | 1 | Invalid argument |
* | 78 | URL changed (HTTP 301 or 308) | * | 10 | URL changed (HTTP 301 or 308) |
* | 110 | Connection timed out | * | 11 | Connection timed out |
* | 111 | Connection refused (check http_error_code) | * | 12 | Connection refused (check http_error_code) |
* | 113 | No route to host / Could not resolve host | * | 13 | No route to host / Could not resolve host |
* | 192 | curlpp runtime error | * | 14 | Encryption error |
* | 193 | curlpp logic error | * | 127 | Unknown error |
* | 255 | Unknown error |
* *
* @since before 0.11.0 * @since before 0.11.0
*/ */
@ -109,7 +102,7 @@ namespace Mastodon
*/ */
return_call request(const http_method &meth, return_call request(const http_method &meth,
const string &path, const string &path,
const curlpp::Forms &formdata); HTMLForm &formdata);
/*! /*!
* @brief HTTP Request for streams. * @brief HTTP Request for streams.
@ -149,6 +142,16 @@ namespace Mastodon
*/ */
std::mutex &get_mutex(); std::mutex &get_mutex();
/*!
* @brief Set proxy. Do not call this directly.
*
* @param hostport host[:port]
* @param userpw user[:password] (optional)
*
* @since 0.110.0
*/
void set_proxy(const string &hostport, const string &userpw = "");
private: private:
const API &parent; const API &parent;
const string _instance; const string _instance;
@ -160,7 +163,7 @@ namespace Mastodon
return_call request_common(const http_method &meth, return_call request_common(const http_method &meth,
const string &path, const string &path,
const curlpp::Forms &formdata, HTMLForm &formdata,
string &answer); string &answer);
size_t callback_write(char* data, size_t size, size_t nmemb, size_t callback_write(char* data, size_t size, size_t nmemb,
string *oss); string *oss);
@ -223,8 +226,8 @@ namespace Mastodon
lists, lists,
accounts_id_lists, accounts_id_lists,
lists_id,
lists_id_accounts, lists_id_accounts,
lists_id,
media, media,
media_id, media_id,
@ -241,37 +244,39 @@ namespace Mastodon
notifications_dismiss, notifications_dismiss,
push_subscription, push_subscription,
polls_id,
polls_id_votes,
reports, reports,
// scheduled_statuses, // scheduled_statuses,
// scheduled_statuses_id, // scheduled_statuses_id,
search,
statuses,
statuses_id, statuses_id,
statuses_id_context, statuses_id_context,
statuses_id_card, statuses_id_card,
statuses_id_reblogged_by, statuses_id_reblogged_by,
statuses_id_favourited_by, statuses_id_favourited_by,
statuses,
statuses_id_reblog, statuses_id_reblog,
statuses_id_unreblog, statuses_id_unreblog,
statuses_id_pin, statuses_id_pin,
statuses_id_unpin, statuses_id_unpin,
timelines_home, timelines_home,
// timelines_conversations, conversations,
timelines_public, timelines_public,
timelines_tag_hashtag, timelines_tag_hashtag,
timelines_list_list_id, timelines_list_list_id,
streaming_health,
streaming_user, streaming_user,
streaming_public, streaming_public,
streaming_public_local, streaming_public_local,
streaming_hashtag, streaming_hashtag,
// streaming_hashtag_local, streaming_hashtag_local,
streaming_list, streaming_list,
// streaming_direct, streaming_direct,
// Glitch-Soc // Glitch-Soc
bookmarks, bookmarks,
@ -406,7 +411,7 @@ namespace Mastodon
string &access_token); string &access_token);
/*! /*!
* @brief Gets the header from the last answer. * @brief Gets the header from the last answer. Case insensitive.
* *
* @param header The header to get * @param header The header to get
* *
@ -414,13 +419,12 @@ namespace Mastodon
* *
* @since before 0.11.0 * @since before 0.11.0
*/ */
const string get_header(const string &header) const; const string get_header(string header) const;
/*! /*!
* @brief Turn exceptions on or off. Defaults to off. * @brief Turn exceptions on or off. Defaults to off.
* *
* This applies to exceptions from curlpp. curlpp::RuntimeError * Most exceptions will be thrown at you to handle if on.
* and curlpp::LogicError.
* *
* @param value true for on, false for off * @param value true for on, false for off
* *
@ -446,28 +450,18 @@ namespace Mastodon
/*! /*!
* @brief Sets the proxy. * @brief Sets the proxy.
* *
* Since mastodon-cpp is built on libcurl, it respects the same * Both the username and the password will be URL decoded
* proxy environment variables. See `man curl`. * before use.
* *
* @param proxy See `man 3 CURLOPT_PROXY` * @param hostport host[:port]
* @param userpw See `man 3 CURLOPT_PROXYUSERPWD` (optional) * @param userpw username[:password] (optional)
* *
* @since 0.15.0 * @since 0.15.0
*/ */
void set_proxy(const string &proxy, const string &userpw = ""); void set_proxy(const string &hostport, const string &userpw = "");
/*! /*!
* @brief For internal use * @brief Make a GET request that doesn't require parameters.
*
* @param proxy URL
* @param userpw username:password
*
* @since 0.15.1
*/
void get_proxy(string &proxy, string &userpw) const;
/*!
* @brief Make a GET request which doesn't require parameters.
* *
* @param call A call defined in Mastodon::API::v1 * @param call A call defined in Mastodon::API::v1
* *
@ -476,7 +470,7 @@ namespace Mastodon
const return_call get(const Mastodon::API::v1 &call); const return_call get(const Mastodon::API::v1 &call);
/*! /*!
* @brief Make a GET request which requires parameters. * @brief Make a GET request that requires parameters.
* *
* @param call A call defined in Mastodon::API::v1 * @param call A call defined in Mastodon::API::v1
* @param parameters A Mastodon::parametermap containing * @param parameters A Mastodon::parametermap containing
@ -488,7 +482,7 @@ namespace Mastodon
const parameters &parameters); const parameters &parameters);
/*! /*!
* @brief Make a GET request which requires parameters. * @brief Make a GET request that requires parameters.
* *
* @param call A call defined in Mastodon::API::v2 * @param call A call defined in Mastodon::API::v2
* @param parameters A Mastodon::parametermap containing * @param parameters A Mastodon::parametermap containing
@ -521,7 +515,7 @@ namespace Mastodon
*/ */
void get_stream(const Mastodon::API::v1 &call, void get_stream(const Mastodon::API::v1 &call,
const parameters &parameters, const parameters &parameters,
std::unique_ptr<Mastodon::API::http> &ptr, unique_ptr<Mastodon::API::http> &ptr,
string &stream); string &stream);
/*! /*!
@ -534,7 +528,7 @@ namespace Mastodon
* @since 0.100.0 * @since 0.100.0
*/ */
void get_stream(const Mastodon::API::v1 &call, void get_stream(const Mastodon::API::v1 &call,
std::unique_ptr<Mastodon::API::http> &ptr, unique_ptr<Mastodon::API::http> &ptr,
string &stream); string &stream);
/*! /*!
@ -547,13 +541,13 @@ namespace Mastodon
* @since 0.100.0 * @since 0.100.0
*/ */
void get_stream(const string &call, void get_stream(const string &call,
std::unique_ptr<Mastodon::API::http> &ptr, unique_ptr<Mastodon::API::http> &ptr,
string &stream); string &stream);
/*! /*!
* @brief Make a PATCH request. * @brief Make a PATCH request.
* *
* Binary data must be base64-encoded or a filename. * Binary data must be a filename.
* *
* @param call A call defined in Mastodon::API::v1 * @param call A call defined in Mastodon::API::v1
* @param parameters A Mastodon::parametermap containing * @param parameters A Mastodon::parametermap containing
@ -565,7 +559,7 @@ namespace Mastodon
const parameters &parameters); const parameters &parameters);
/*! /*!
* @brief Make a POST request which doesn't require parameters. * @brief Make a POST request that doesn't require parameters.
* *
* @param call A call defined in Mastodon::API::v1 * @param call A call defined in Mastodon::API::v1
* *
@ -574,9 +568,9 @@ namespace Mastodon
return_call post(const Mastodon::API::v1 &call); return_call post(const Mastodon::API::v1 &call);
/*! /*!
* @brief Make a POST request which requires parameters. * @brief Make a POST request that requires parameters.
* *
* Binary data must be base64-encoded or a filename. * Binary data must be a filename.
* *
* @param call A call defined in Mastodon::API::v1 * @param call A call defined in Mastodon::API::v1
* @param parameters A Mastodon::parametermap containing * @param parameters A Mastodon::parametermap containing
@ -590,7 +584,7 @@ namespace Mastodon
/*! /*!
* @brief Make a custom POST request. * @brief Make a custom POST request.
* *
* Binary data must be base64-encoded or a filename. * Binary data must be a filename.
* *
* @param call String in the form `/api/v1/example` * @param call String in the form `/api/v1/example`
* @param parameters A Mastodon::parametermap containing * @param parameters A Mastodon::parametermap containing
@ -602,7 +596,7 @@ namespace Mastodon
const parameters &parameters); const parameters &parameters);
/*! /*!
* @brief Make a PUT request which requires a parameters. * @brief Make a PUT request that requires parameters.
* *
* @param call A call defined in Mastodon::API::v1 * @param call A call defined in Mastodon::API::v1
* @param parameters A Mastodon::parametermap containing * @param parameters A Mastodon::parametermap containing
@ -625,7 +619,7 @@ namespace Mastodon
return_call put(const string &call, const parameters &parameters); return_call put(const string &call, const parameters &parameters);
/*! /*!
* @brief Make a DELETE request which requires parameters. * @brief Make a DELETE request that requires parameters.
* *
* @param call A call defined in Mastodon::API::v1 * @param call A call defined in Mastodon::API::v1
* @param parameters A Mastodon::parametermap containing * @param parameters A Mastodon::parametermap containing
@ -653,8 +647,6 @@ namespace Mastodon
string _useragent; string _useragent;
http _http; http _http;
bool _exceptions; bool _exceptions;
string _proxy;
string _proxy_userpw;
/*! /*!
* @brief Converts map of parameters into a string. * @brief Converts map of parameters into a string.
@ -672,9 +664,9 @@ namespace Mastodon
* *
* @param map Map of parameters * @param map Map of parameters
* *
* @return Form data as curlpp::Forms * @return Form data as Poco::Net::HTMLForm.
*/ */
const curlpp::Forms maptoformdata(const parameters &map); unique_ptr<HTMLForm> maptoformdata(const parameters &map);
/*! /*!
* @brief Delete Mastodon::param from Mastodon::parameters. * @brief Delete Mastodon::param from Mastodon::parameters.
@ -691,13 +683,12 @@ namespace Mastodon
}; };
/*! /*!
* @brief Percent-encodes a string. This is done automatically, unless * @brief Percent-encodes a string.
* you make a custom request.
* *
* Calls curlpp::escape(str).
* *
* The only time you should use this, is if you use * This is done automatically where necessary. The only time you
* get(const string &call, string &answer). * should use this, is if you use get(const string &call, string
* &answer).
* *
* See RFC 3986 section 2.1 for more info. * See RFC 3986 section 2.1 for more info.
* *
@ -712,8 +703,6 @@ namespace Mastodon
/*! /*!
* @brief Decodes a percent-encoded string. * @brief Decodes a percent-encoded string.
* *
* Calls curlpp::unescape(str).
*
* See RFC 3986 section 2.1 for more info. * See RFC 3986 section 2.1 for more info.
* *
* @param str The string to decode. * @param str The string to decode.

View File

@ -2,58 +2,68 @@
* Copyright © 2019 tastytea <tastytea@tastytea.de> * Copyright © 2019 tastytea <tastytea@tastytea.de>
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, version 3. * the Free Software Foundation, version 3.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU Affero General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
#include "return_types.hpp" #include "return_types.hpp"
using namespace Mastodon; namespace Mastodon
return_base::operator bool()
{ {
if (error_code == 0) return_base::operator bool() const
{ {
return true; if (error_code == 0)
{
return true;
}
else
{
return false;
}
} }
else
return_base::operator uint8_t() const
{ {
return false; return error_code;
}
return_call::operator const string() const
{
return answer;
}
std::ostream &operator <<(std::ostream &out, const return_call &ret)
{
out << ret.answer;
return out;
}
return_call::return_call()
{}
return_call::return_call(const uint8_t ec, const string &em,
const uint16_t hec, const string &a)
: answer(a)
{
error_code = ec;
error_message = em;
http_error_code = hec;
}
return_call::return_call(const error ec, const string &em,
const uint16_t hec, const string &a)
: answer(a)
{
error_code = static_cast<uint8_t>(ec);
error_message = em;
http_error_code = hec;
} }
} }
return_base::operator uint8_t()
{
return error_code;
}
return_call::operator const string() const
{
return answer;
}
std::ostream &Mastodon::operator <<(std::ostream &out, const return_call &ret)
{
out << ret.answer;
return out;
}
return_call::return_call()
{}
return_call::return_call(const uint8_t ec, const string &em,
const uint16_t hec, const string &a)
: answer(a)
{
error_code = ec;
error_message = em;
http_error_code = hec;
}

View File

@ -2,15 +2,15 @@
* Copyright © 2019 tastytea <tastytea@tastytea.de> * Copyright © 2019 tastytea <tastytea@tastytea.de>
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, version 3. * the Free Software Foundation, version 3.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU Affero General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
@ -19,6 +19,7 @@
#include <cstdint> #include <cstdint>
#include <string> #include <string>
#include "types.hpp"
using std::uint8_t; using std::uint8_t;
using std::uint16_t; using std::uint16_t;
@ -59,14 +60,14 @@ namespace Mastodon
* *
* @since 0.100.0 * @since 0.100.0
*/ */
operator bool(); operator bool() const;
/*! /*!
* @brief Same as return_base::error_code. * @brief Same as return_base::error_code.
* *
* @since 0.100.0 * @since 0.100.0
*/ */
operator uint8_t(); operator uint8_t() const;
} return_base; } return_base;
/*! /*!
@ -113,6 +114,19 @@ namespace Mastodon
return_call(const uint8_t ec, const string &em, return_call(const uint8_t ec, const string &em,
const uint16_t hec, const string &a); const uint16_t hec, const string &a);
/*!
* @brief Return type for Mastodon::API.
*
* @param ec Error code
* @param em Error message
* @param hec HTTP error code
* @param a Answer
*
* @since 0.110.0
*/
return_call(const error ec, const string &em,
const uint16_t hec, const string &a);
/*! /*!
* @brief Same es return_call::answer. * @brief Same es return_call::answer.
* *

View File

@ -2,15 +2,15 @@
* Copyright © 2019 tastytea <tastytea@tastytea.de> * Copyright © 2019 tastytea <tastytea@tastytea.de>
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, version 3. * the Free Software Foundation, version 3.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU Affero General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */

View File

@ -2,15 +2,15 @@
* Copyright © 2019 tastytea <tastytea@tastytea.de> * Copyright © 2019 tastytea <tastytea@tastytea.de>
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, version 3. * the Free Software Foundation, version 3.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU Affero General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
@ -93,6 +93,18 @@ namespace Mastodon
DELETE, DELETE,
GET_STREAM GET_STREAM
}; };
enum class error
{
OK = 0,
INVALID_ARGUMENT = 1,
URL_CHANGED = 10,
CONNECTION_TIMEOUT = 11,
CONNECTION_REFUSED = 12,
DNS = 13,
ENCRYPTION = 14,
UNKNOWN = 127
};
} }
#endif // MASTODON_CPP_TYPES_HPP #endif // MASTODON_CPP_TYPES_HPP

View File

@ -1,20 +1,23 @@
include(CTest) include(CTest)
file(GLOB sources_tests tests/test_*.cpp)
file(GLOB_RECURSE sources_tests test_*.cpp)
configure_file("test.gif" "${CMAKE_CURRENT_BINARY_DIR}" COPYONLY)
find_package(Catch2) find_package(Catch2)
if(Catch2_FOUND) # Catch 2.x if(Catch2_FOUND) # Catch 2.x
include(Catch) include(Catch)
add_executable(all_tests tests/main.cpp ${sources_tests}) add_executable(all_tests main.cpp ${sources_tests})
target_link_libraries(all_tests ${PROJECT_NAME} Catch2::Catch2) target_link_libraries(all_tests PRIVATE ${PROJECT_NAME} Catch2::Catch2)
target_include_directories(all_tests PRIVATE "/usr/include/catch2") target_include_directories(all_tests PRIVATE "/usr/include/catch2")
catch_discover_tests(all_tests EXTRA_ARGS "${EXTRA_TEST_ARGS}") catch_discover_tests(all_tests EXTRA_ARGS "${EXTRA_TEST_ARGS}")
else() # Catch 1.x else() # Catch 1.x
if(EXISTS "/usr/include/catch.hpp") if(EXISTS "/usr/include/catch.hpp")
message(STATUS "Catch 1.x found.") message(STATUS "Catch 1.x found.")
foreach(src ${sources_tests}) foreach(src ${sources_tests})
get_filename_component(bin ${src} NAME_WE) get_filename_component(bin ${src} NAME_WE)
add_executable(${bin} tests/main.cpp ${src}) add_executable(${bin} main.cpp ${src})
target_link_libraries(${bin} ${PROJECT_NAME}) target_link_libraries(${bin} PRIVATE ${PROJECT_NAME})
add_test(${bin} ${bin} "${EXTRA_TEST_ARGS}") add_test(${bin} ${bin} "${EXTRA_TEST_ARGS}")
endforeach() endforeach()
else() else()

View File

@ -2,15 +2,15 @@
* Copyright © 2019 tastytea <tastytea@tastytea.de> * Copyright © 2019 tastytea <tastytea@tastytea.de>
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, version 3. * the Free Software Foundation, version 3.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU Affero General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
@ -20,7 +20,7 @@
#include "mastodon-cpp.hpp" #include "mastodon-cpp.hpp"
#include "easy/easy.hpp" #include "easy/easy.hpp"
#include "easy/entities/token.hpp" #include "easy/entities/token.hpp"
#include "environment_variables.hpp" #include "../environment_variables.hpp"
using namespace Mastodon; using namespace Mastodon;

View File

@ -2,15 +2,15 @@
* Copyright © 2019 tastytea <tastytea@tastytea.de> * Copyright © 2019 tastytea <tastytea@tastytea.de>
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, version 3. * the Free Software Foundation, version 3.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU Affero General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
@ -20,7 +20,7 @@
#include "mastodon-cpp.hpp" #include "mastodon-cpp.hpp"
#include "easy/easy.hpp" #include "easy/easy.hpp"
#include "easy/entities/account.hpp" #include "easy/entities/account.hpp"
#include "environment_variables.hpp" #include "../environment_variables.hpp"
using namespace Mastodon; using namespace Mastodon;

View File

@ -2,15 +2,15 @@
* Copyright © 2019 tastytea <tastytea@tastytea.de> * Copyright © 2019 tastytea <tastytea@tastytea.de>
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, version 3. * the Free Software Foundation, version 3.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU Affero General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
@ -19,12 +19,12 @@
#include "mastodon-cpp.hpp" #include "mastodon-cpp.hpp"
#include "easy/easy.hpp" #include "easy/easy.hpp"
#include "easy/entities/relationship.hpp" #include "easy/entities/relationship.hpp"
#include "environment_variables.hpp" #include "../environment_variables.hpp"
using namespace Mastodon; using namespace Mastodon;
SCENARIO ("/api/v1/accounts/:id/block can be called successfully", SCENARIO ("/api/v1/accounts/:id/block can be called successfully",
"[api][mastodon][pleroma][glitch-soc]") "[api][auth][mastodon][pleroma][glitch-soc]")
{ {
REQUIRE (access_token != nullptr); REQUIRE (access_token != nullptr);

View File

@ -2,15 +2,15 @@
* Copyright © 2019 tastytea <tastytea@tastytea.de> * Copyright © 2019 tastytea <tastytea@tastytea.de>
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, version 3. * the Free Software Foundation, version 3.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU Affero General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
@ -20,12 +20,12 @@
#include "mastodon-cpp.hpp" #include "mastodon-cpp.hpp"
#include "easy/easy.hpp" #include "easy/easy.hpp"
#include "easy/entities/relationship.hpp" #include "easy/entities/relationship.hpp"
#include "environment_variables.hpp" #include "../environment_variables.hpp"
using namespace Mastodon; using namespace Mastodon;
SCENARIO ("/api/v1/accounts/:id/follow can be called successfully", SCENARIO ("/api/v1/accounts/:id/follow can be called successfully",
"[api][mastodon][pleroma][glitch-soc]") "[api][auth][mastodon][pleroma][glitch-soc]")
{ {
REQUIRE (access_token != nullptr); REQUIRE (access_token != nullptr);

View File

@ -2,15 +2,15 @@
* Copyright © 2019 tastytea <tastytea@tastytea.de> * Copyright © 2019 tastytea <tastytea@tastytea.de>
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, version 3. * the Free Software Foundation, version 3.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU Affero General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
@ -20,12 +20,12 @@
#include "mastodon-cpp.hpp" #include "mastodon-cpp.hpp"
#include "easy/easy.hpp" #include "easy/easy.hpp"
#include "easy/entities/account.hpp" #include "easy/entities/account.hpp"
#include "environment_variables.hpp" #include "../environment_variables.hpp"
using namespace Mastodon; using namespace Mastodon;
SCENARIO ("/api/v1/accounts/:id/followers can be called successfully", SCENARIO ("/api/v1/accounts/:id/followers can be called successfully",
"[api][mastodon][pleroma][glitch-soc]") "[api][auth][mastodon][pleroma][glitch-soc]")
{ {
REQUIRE (access_token != nullptr); REQUIRE (access_token != nullptr);

View File

@ -2,15 +2,15 @@
* Copyright © 2019 tastytea <tastytea@tastytea.de> * Copyright © 2019 tastytea <tastytea@tastytea.de>
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, version 3. * the Free Software Foundation, version 3.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU Affero General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
@ -20,12 +20,12 @@
#include "mastodon-cpp.hpp" #include "mastodon-cpp.hpp"
#include "easy/easy.hpp" #include "easy/easy.hpp"
#include "easy/entities/account.hpp" #include "easy/entities/account.hpp"
#include "environment_variables.hpp" #include "../environment_variables.hpp"
using namespace Mastodon; using namespace Mastodon;
SCENARIO ("/api/v1/accounts/:id/following can be called successfully", SCENARIO ("/api/v1/accounts/:id/following can be called successfully",
"[api][mastodon][pleroma][glitch-soc]") "[api][auth][mastodon][pleroma][glitch-soc]")
{ {
REQUIRE (access_token != nullptr); REQUIRE (access_token != nullptr);

View File

@ -0,0 +1,64 @@
/* This file is part of mastodon-cpp.
* Copyright © 2019 tastytea <tastytea@tastytea.de>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, version 3.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <exception>
#include <string>
#include <catch.hpp>
#include "mastodon-cpp.hpp"
#include "easy/easy.hpp"
#include "../environment_variables.hpp"
using namespace Mastodon;
SCENARIO ("/api/v1/accounts/:id/lists can be called successfully",
"[api][auth][mastodon][pleroma][glitch-soc]")
{
REQUIRE (access_token != nullptr);
GIVEN ("instance = " + instance + ", user ID = " + user_id)
{
Mastodon::Easy::API masto(instance, access_token);
return_call ret;
bool exception = false;
WHEN ("GET /api/v1/accounts/" + user_id + "/lists is called")
{
try
{
ret = masto.get(API::v1::accounts_id_lists,
{{ "id", { user_id }}});
}
catch (const std::exception &e)
{
exception = true;
WARN(e.what());
}
THEN("No exception is thrown")
AND_THEN ("No unexpected errors are returned")
AND_THEN ("The answer makes sense")
{
REQUIRE_FALSE(exception);
REQUIRE(ret.error_code == 0);
REQUIRE(ret.http_error_code == 200);
REQUIRE(ret.answer == "[]");
}
}
}
}

View File

@ -0,0 +1,72 @@
/* This file is part of mastodon-cpp.
* Copyright © 2019 tastytea <tastytea@tastytea.de>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, version 3.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <exception>
#include <string>
#include <catch.hpp>
#include "mastodon-cpp.hpp"
#include "easy/easy.hpp"
#include "easy/entities/relationship.hpp"
#include "../environment_variables.hpp"
using namespace Mastodon;
SCENARIO ("/api/v1/accounts/:id/mute can be called successfully",
"[api][auth][mastodon][pleroma][glitch-soc]")
{
REQUIRE (access_token != nullptr);
GIVEN ("instance = " + instance)
{
Mastodon::Easy::API masto(instance, access_token);
return_call ret;
Easy::Relationship relationship;
bool exception = false;
WHEN ("POST /api/v1/accounts/" + user_id + "/mute is called")
{
try
{
ret = masto.post(API::v1::accounts_id_mute,
{
{ "id", { user_id } }
});
relationship.from_string(ret);
}
catch (const std::exception &e)
{
exception = true;
WARN(e.what());
}
THEN("No exception is thrown")
AND_THEN ("No unexpected errors are returned")
AND_THEN ("Answer is valid")
AND_THEN ("The answer makes sense")
{
REQUIRE_FALSE(exception);
REQUIRE(ret.error_code == 0);
REQUIRE(ret.http_error_code == 200);
REQUIRE(relationship.valid());
REQUIRE(relationship.muting());
}
}
}
}

View File

@ -2,15 +2,15 @@
* Copyright © 2019 tastytea <tastytea@tastytea.de> * Copyright © 2019 tastytea <tastytea@tastytea.de>
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, version 3. * the Free Software Foundation, version 3.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU Affero General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
@ -20,12 +20,12 @@
#include "mastodon-cpp.hpp" #include "mastodon-cpp.hpp"
#include "easy/easy.hpp" #include "easy/easy.hpp"
#include "easy/entities/relationship.hpp" #include "easy/entities/relationship.hpp"
#include "environment_variables.hpp" #include "../environment_variables.hpp"
using namespace Mastodon; using namespace Mastodon;
SCENARIO ("/api/v1/accounts/:id/pin can be called successfully", SCENARIO ("/api/v1/accounts/:id/pin can be called successfully",
"[api][mastodon][glitch-soc]") "[api][auth][mastodon][glitch-soc]")
{ {
REQUIRE (access_token != nullptr); REQUIRE (access_token != nullptr);

View File

@ -2,15 +2,15 @@
* Copyright © 2019 tastytea <tastytea@tastytea.de> * Copyright © 2019 tastytea <tastytea@tastytea.de>
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, version 3. * the Free Software Foundation, version 3.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU Affero General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
@ -20,12 +20,12 @@
#include "mastodon-cpp.hpp" #include "mastodon-cpp.hpp"
#include "easy/easy.hpp" #include "easy/easy.hpp"
#include "easy/entities/status.hpp" #include "easy/entities/status.hpp"
#include "environment_variables.hpp" #include "../environment_variables.hpp"
using namespace Mastodon; using namespace Mastodon;
SCENARIO ("/api/v1/accounts/:id/statuses can be called successfully", SCENARIO ("/api/v1/accounts/:id/statuses can be called successfully",
"[api][mastodon][pleroma][glitch-soc]") "[api][auth][mastodon][pleroma][glitch-soc]")
{ {
REQUIRE (access_token != nullptr); REQUIRE (access_token != nullptr);

View File

@ -2,15 +2,15 @@
* Copyright © 2019 tastytea <tastytea@tastytea.de> * Copyright © 2019 tastytea <tastytea@tastytea.de>
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, version 3. * the Free Software Foundation, version 3.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU Affero General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
@ -19,12 +19,12 @@
#include "mastodon-cpp.hpp" #include "mastodon-cpp.hpp"
#include "easy/easy.hpp" #include "easy/easy.hpp"
#include "easy/entities/relationship.hpp" #include "easy/entities/relationship.hpp"
#include "environment_variables.hpp" #include "../environment_variables.hpp"
using namespace Mastodon; using namespace Mastodon;
SCENARIO ("/api/v1/accounts/:id/unblock can be called successfully", SCENARIO ("/api/v1/accounts/:id/unblock can be called successfully",
"[api][mastodon][pleroma][glitch-soc]") "[api][auth][mastodon][pleroma][glitch-soc]")
{ {
REQUIRE (access_token != nullptr); REQUIRE (access_token != nullptr);

View File

@ -2,15 +2,15 @@
* Copyright © 2019 tastytea <tastytea@tastytea.de> * Copyright © 2019 tastytea <tastytea@tastytea.de>
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, version 3. * the Free Software Foundation, version 3.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU Affero General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
@ -20,12 +20,12 @@
#include "mastodon-cpp.hpp" #include "mastodon-cpp.hpp"
#include "easy/easy.hpp" #include "easy/easy.hpp"
#include "easy/entities/relationship.hpp" #include "easy/entities/relationship.hpp"
#include "environment_variables.hpp" #include "../environment_variables.hpp"
using namespace Mastodon; using namespace Mastodon;
SCENARIO ("/api/v1/accounts/:id/unfollow can be called successfully", SCENARIO ("/api/v1/accounts/:id/unfollow can be called successfully",
"[api][mastodon][pleroma][glitch-soc]") "[api][auth][mastodon][pleroma][glitch-soc]")
{ {
REQUIRE (access_token != nullptr); REQUIRE (access_token != nullptr);

View File

@ -0,0 +1,72 @@
/* This file is part of mastodon-cpp.
* Copyright © 2019 tastytea <tastytea@tastytea.de>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, version 3.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <exception>
#include <string>
#include <catch.hpp>
#include "mastodon-cpp.hpp"
#include "easy/easy.hpp"
#include "easy/entities/relationship.hpp"
#include "../environment_variables.hpp"
using namespace Mastodon;
SCENARIO ("/api/v1/accounts/:id/unmute can be called successfully",
"[api][auth][mastodon][pleroma][glitch-soc]")
{
REQUIRE (access_token != nullptr);
GIVEN ("instance = " + instance)
{
Mastodon::Easy::API masto(instance, access_token);
return_call ret;
Easy::Relationship relationship;
bool exception = false;
WHEN ("POST /api/v1/accounts/" + user_id + "/unmute is called")
{
try
{
ret = masto.post(API::v1::accounts_id_unmute,
{
{ "id", { user_id } }
});
relationship.from_string(ret);
}
catch (const std::exception &e)
{
exception = true;
WARN(e.what());
}
THEN("No exception is thrown")
AND_THEN ("No unexpected errors are returned")
AND_THEN ("Answer is valid")
AND_THEN ("The answer makes sense")
{
REQUIRE_FALSE(exception);
REQUIRE(ret.error_code == 0);
REQUIRE(ret.http_error_code == 200);
REQUIRE(relationship.valid());
REQUIRE(!relationship.muting());
}
}
}
}

Some files were not shown because too many files have changed in this diff Show More