summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/instance.hpp16
-rw-r--r--src/instance.cpp31
2 files changed, 47 insertions, 0 deletions
diff --git a/include/instance.hpp b/include/instance.hpp
index 543ec88..7b90c84 100644
--- a/include/instance.hpp
+++ b/include/instance.hpp
@@ -18,6 +18,7 @@
#define MASTODONPP_INSTANCE_HPP
#include "curl_wrapper.hpp"
+#include "answer.hpp"
#include <cstdint>
#include <string>
@@ -106,6 +107,9 @@ public:
* Queries `/api/v1/instance` for `max_toot_chars'. If the instance doesn't
* support it, the limit is assumed to be 500.
*
+ * After the first call, the value is saved internally. Subsequent calls
+ * return the saved value.
+ *
* @since 0.1.0
*/
[[nodiscard]]
@@ -135,6 +139,18 @@ public:
return _proxy;
}
+ /*!
+ * @brief Returns the NodeInfo of the instance.
+ *
+ * Attempts to download the [NodeInfo]
+ * (https://nodeinfo.diaspora.software/protocol.html) of the instance and
+ * returns it. Not every instance has it.
+ *
+ * @since 0.3.0
+ */
+ [[nodiscard]]
+ answer_type get_nodeinfo();
+
private:
const string _hostname;
const string _baseuri;
diff --git a/src/instance.cpp b/src/instance.cpp
index b7f88cd..1c7491c 100644
--- a/src/instance.cpp
+++ b/src/instance.cpp
@@ -18,13 +18,17 @@
#include "instance.hpp"
#include "log.hpp"
+#include <algorithm>
#include <exception>
+#include <vector>
namespace mastodonpp
{
+using std::sort;
using std::stoull;
using std::exception;
+using std::vector;
Instance::Instance(const string_view hostname, const string_view access_token)
: _hostname{hostname}
@@ -77,4 +81,31 @@ uint64_t Instance::get_max_chars()
return _max_chars;
}
+answer_type Instance::get_nodeinfo()
+{
+ debuglog << "Finding location of NodeInfo on " << _hostname << "…\n";
+ auto answer{make_request(http_method::GET,
+ _baseuri + "/.well-known/nodeinfo", {})};
+ if (!answer)
+ {
+ debuglog << "NodeInfo not found.\n";
+ return answer;
+ }
+
+ size_t pos{0};
+ vector<string> hrefs;
+ constexpr string_view searchstring{R"("href":")"};
+ while ((pos = answer.body.find(searchstring, pos)) != string::npos)
+ {
+ pos += searchstring.size();
+ auto endpos{answer.body.find('"', pos)};
+ hrefs.push_back(answer.body.substr(pos, endpos - pos));
+ debuglog << "Found href: " << hrefs.back() << '\n';
+ }
+ sort(hrefs.begin(), hrefs.end()); // We assume they are sortable strings.
+ debuglog << "Selecting href: " << hrefs.back() << '\n';
+
+ return make_request(http_method::GET, hrefs.back(), {});
+}
+
} // namespace mastodonpp