#pragma once #include #include #include #include #include #include "models.h" class CurlException : public std::exception { public: CurlException(CURLcode code_) : code(code_) {} const char* what() const noexcept { return curl_easy_strerror(this->code); } CURLcode code; }; class CurlShareException : public std::exception { public: CurlShareException(CURLSHcode code_) : code(code_) {} const char* what() const noexcept { return curl_share_strerror(this->code); } CURLSHcode code; }; class MastodonClient { public: MastodonClient(const MastodonClient&&) = delete; MastodonClient& operator=(const MastodonClient&&) = delete; MastodonClient(); ~MastodonClient(); static void init() { CURLcode code = curl_global_init(CURL_GLOBAL_ALL); if (code) { throw CurlException(code); } } static void cleanup() { curl_global_cleanup(); } std::optional get_account_by_username(const std::string& host, const std::string& username); std::vector get_pinned_posts(const std::string& host, const std::string& account_id); std::vector get_posts(const std::string& host, const std::string& account_id, PostSortingMethod sorting_method, std::optional max_id); std::optional get_post(const std::string& host, const std::string& id); PostContext get_post_context(const std::string& host, const std::string& id); private: CURL* _get_easy(); std::string _send_request(const std::string& url); long _response_status_code(); std::mutex _share_locks[CURL_LOCK_DATA_LAST]; CURLSH* _share = nullptr; pthread_key_t _easy_key; }; extern MastodonClient mastodon_client;