Mercurial > minori
comparison src/services/anilist.cpp @ 75:d3e9310598b1
*: refactor some stuff
text: "TextParagraph"s are now called sections, because that's the
actual word for it :P
text: new classes: Line and OneLineSection, solves many problems with
paragraphs that are only one line long (ex. going out of bounds)
http: reworked http stuff to allow threaded get requests, also moved it
to its own file to (hopefully) remove clutter
eventually I'll make a threaded post request method and use that in
the "basic" function
| author | Paper <mrpapersonic@gmail.com> |
|---|---|
| date | Wed, 04 Oct 2023 01:42:30 -0400 |
| parents | 5ccb99bfa605 |
| children | 3364fadc8a36 |
comparison
equal
deleted
inserted
replaced
| 74:5ccb99bfa605 | 75:d3e9310598b1 |
|---|---|
| 1 #include "services/anilist.h" | 1 #include "services/anilist.h" |
| 2 #include "core/anime.h" | 2 #include "core/anime.h" |
| 3 #include "core/anime_db.h" | 3 #include "core/anime_db.h" |
| 4 #include "core/config.h" | 4 #include "core/config.h" |
| 5 #include "core/json.h" | 5 #include "core/json.h" |
| 6 #include "core/http.h" | |
| 6 #include "core/session.h" | 7 #include "core/session.h" |
| 7 #include "core/strings.h" | 8 #include "core/strings.h" |
| 8 #include "gui/translate/anilist.h" | 9 #include "gui/translate/anilist.h" |
| 9 #include <QDesktopServices> | 10 #include <QDesktopServices> |
| 10 #include <QInputDialog> | 11 #include <QInputDialog> |
| 11 #include <QLineEdit> | 12 #include <QLineEdit> |
| 12 #include <QMessageBox> | 13 #include <QMessageBox> |
| 13 #include <QUrl> | 14 #include <QUrl> |
| 14 #include <chrono> | 15 #include <chrono> |
| 15 #include <curl/curl.h> | |
| 16 #include <exception> | 16 #include <exception> |
| 17 #define CLIENT_ID "13706" | 17 #define CLIENT_ID "13706" |
| 18 | 18 |
| 19 using namespace nlohmann::literals::json_literals; | 19 using namespace nlohmann::literals::json_literals; |
| 20 | 20 |
| 35 bool Authenticated() const { return !AuthToken().empty(); } | 35 bool Authenticated() const { return !AuthToken().empty(); } |
| 36 }; | 36 }; |
| 37 | 37 |
| 38 static Account account; | 38 static Account account; |
| 39 | 39 |
| 40 static size_t CurlWriteCallback(void* contents, size_t size, size_t nmemb, void* userdata) { | |
| 41 reinterpret_cast<std::string*>(userdata)->append(reinterpret_cast<char*>(contents), size * nmemb); | |
| 42 return size * nmemb; | |
| 43 } | |
| 44 | |
| 45 /* A wrapper around cURL to send requests to AniList */ | |
| 46 std::string SendRequest(std::string data) { | 40 std::string SendRequest(std::string data) { |
| 47 struct curl_slist* list = NULL; | 41 std::vector<std::string> headers = { |
| 48 std::string userdata; | 42 "Authorization: Bearer " + account.AuthToken(), |
| 49 CURL* curl = curl_easy_init(); | 43 "Accept: application/json", |
| 50 if (curl) { | 44 "Content-Type: application/json" |
| 51 std::string bearer = "Authorization: Bearer " + account.AuthToken(); | 45 }; |
| 52 list = curl_slist_append(list, "Accept: application/json"); | 46 return HTTP::PerformBasicPostRequest("https://graphql.anilist.co", data, headers); |
| 53 list = curl_slist_append(list, "Content-Type: application/json"); | |
| 54 list = curl_slist_append(list, bearer.c_str()); | |
| 55 curl_easy_setopt(curl, CURLOPT_URL, "https://graphql.anilist.co"); | |
| 56 curl_easy_setopt(curl, CURLOPT_POSTFIELDS, data.c_str()); | |
| 57 curl_easy_setopt(curl, CURLOPT_HTTPHEADER, list); | |
| 58 curl_easy_setopt(curl, CURLOPT_WRITEDATA, &userdata); | |
| 59 curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, &CurlWriteCallback); | |
| 60 /* Use system certs... useful on Windows. */ | |
| 61 curl_easy_setopt(curl, CURLOPT_SSL_OPTIONS, CURLSSLOPT_NATIVE_CA); | |
| 62 CURLcode res = curl_easy_perform(curl); | |
| 63 session.IncrementRequests(); | |
| 64 curl_slist_free_all(list); | |
| 65 curl_easy_cleanup(curl); | |
| 66 if (res != CURLE_OK) { | |
| 67 QMessageBox box(QMessageBox::Icon::Critical, "", | |
| 68 QString("curl_easy_perform(curl) failed!: ") + QString(curl_easy_strerror(res))); | |
| 69 box.exec(); | |
| 70 return ""; | |
| 71 } | |
| 72 return userdata; | |
| 73 } | |
| 74 return ""; | |
| 75 } | 47 } |
| 76 | 48 |
| 77 void ParseListStatus(std::string status, Anime::Anime& anime) { | 49 void ParseListStatus(std::string status, Anime::Anime& anime) { |
| 78 std::unordered_map<std::string, Anime::ListStatus> map = { | 50 std::unordered_map<std::string, Anime::ListStatus> map = { |
| 79 {"CURRENT", Anime::ListStatus::CURRENT }, | 51 {"CURRENT", Anime::ListStatus::CURRENT }, |
