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-24 07:11:05 +00:00
|
|
|
#include <nlohmann/json.hpp>
|
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;
|
|
|
|
};
|
|
|
|
|
2023-11-24 07:11:05 +00:00
|
|
|
class MastodonException : public std::exception {
|
|
|
|
public:
|
|
|
|
MastodonException(long response_code_, std::string error) : response_code(response_code_), _error(std::move(error)) {}
|
|
|
|
|
|
|
|
const char* what() const noexcept {
|
|
|
|
return this->_error.c_str();
|
|
|
|
}
|
|
|
|
|
|
|
|
long response_code;
|
|
|
|
|
|
|
|
private:
|
|
|
|
std::string _error;
|
|
|
|
};
|
|
|
|
|
2023-11-22 08:39:24 +00:00
|
|
|
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();
|
2023-11-24 07:11:05 +00:00
|
|
|
nlohmann::json _send_request(const std::string& url);
|
2023-11-22 08:39:24 +00:00
|
|
|
long _response_status_code();
|
|
|
|
|
|
|
|
std::mutex _share_locks[CURL_LOCK_DATA_LAST];
|
|
|
|
|
|
|
|
CURLSH* _share = nullptr;
|
|
|
|
pthread_key_t _easy_key;
|
|
|
|
};
|
|
|
|
|
|
|
|
extern MastodonClient mastodon_client;
|