coyote/client.h

71 lines
1.8 KiB
C
Raw Normal View History

2023-11-22 08:39:24 +00:00
#pragma once
#include <mutex>
#include <optional>
#include <exception>
#include <pthread.h>
#include <curl/curl.h>
2023-11-23 08:49:27 +00:00
#include "models.h"
2023-11-22 08:39:24 +00:00
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<Account> get_account_by_username(const std::string& host, const std::string& username);
2023-11-23 13:43:55 +00:00
std::vector<Post> get_pinned_posts(const std::string& host, const std::string& account_id);
2023-11-23 08:49:27 +00:00
std::vector<Post> get_posts(const std::string& host, const std::string& account_id, PostSortingMethod sorting_method, std::optional<std::string> max_id);
2023-11-22 08:39:24 +00:00
2023-11-23 23:46:47 +00:00
std::optional<Post> get_post(const std::string& host, const std::string& id);
PostContext get_post_context(const std::string& host, const std::string& id);
2023-11-22 08:39:24 +00:00
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;