diff --git a/CMakeLists.txt b/CMakeLists.txt index 0d2573d..028fc6a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,6 +1,6 @@ cmake_minimum_required (VERSION 3.7) project (mastobotmon - VERSION 0.1.3 + VERSION 0.1.4 LANGUAGES CXX) include(GNUInstallDirs) @@ -19,5 +19,5 @@ configure_file ( file(GLOB sources src/*.cpp) add_executable(mastobotmon ${sources}) -target_link_libraries(mastobotmon mastodon-cpp) +target_link_libraries(mastobotmon mastodon-cpp jsoncpp) install(TARGETS mastobotmon DESTINATION ${CMAKE_INSTALL_BINDIR}) diff --git a/README.md b/README.md index c2d60d5..b414f90 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ * C++ compiler (tested: gcc 6.4, clang 5.0) * [cmake](https://cmake.org/) (tested: 3.9.6) * [mastodon-cpp](https://github.com/tastytea/mastodon-cpp) (at least: 0.4.4) - * [rapidjson](http://rapidjson.org/) (tested: 1.1.0) + * [jsoncpp](https://github.com/open-source-parsers/jsoncpp) (tested: 1.8.1) ## Get sourcecode diff --git a/src/config.cpp b/src/config.cpp index 5421593..de7cb3b 100644 --- a/src/config.cpp +++ b/src/config.cpp @@ -14,17 +14,13 @@ * along with this program. If not, see . */ -#define RAPIDJSON_HAS_STDSTRING 1 - #include #include #include // strlen() #include // getenv() #include #include -#include -#include -#include +#include #include "version.hpp" #include "mastobotmon.hpp" @@ -36,7 +32,7 @@ using std::uint16_t; const string filepath = string(std::getenv("HOME")) + "/.config/mastobotmon.json"; -const bool read_config(rapidjson::Document &document) +const bool read_config(Json::Value &document) { std::ifstream file(filepath); std::stringstream json; @@ -46,25 +42,27 @@ const bool read_config(rapidjson::Document &document) json << file.rdbuf(); file.close(); - if (document.Parse(json.str().c_str()).HasParseError()) + Json::Reader reader; + + if (!reader.parse(json, document)) { cerr << "ERROR: couldn't parse config file. Are you sure the JSON is well-formed?\n"; return false; } - if (!document["accounts"].IsObject()) + if (!document["accounts"].isObject()) { cerr << "ERROR: \"accounts\" not found\n"; return false; } - if (!document["mode"].IsString()) + if (!document["mode"].isString()) { cerr << "ERROR: \"mode\" not found\n"; return false; } - if (!document["daemon_check"].IsUint()) + if (!document["daemon_check"].isUInt()) { cerr << "ERROR: \"daemon_check\" not found\n"; return false; @@ -74,15 +72,10 @@ const bool read_config(rapidjson::Document &document) { cout << "No config file found. Creating new one.\n"; - rapidjson::Document::AllocatorType &allocator = document.GetAllocator(); - - document.SetObject(); - rapidjson::Value object(rapidjson::kObjectType); - document.AddMember("accounts", object.Move(), allocator); add_account(document); - document.AddMember("mode", "cron", allocator); - document.AddMember("daemon_check", 10, allocator); + document["mode"] = "cron"; + document["daemon_check"] = 10; return write_config(document); } @@ -121,12 +114,11 @@ const string get_access_token(const string &account) return ""; } -const bool add_account(rapidjson::Document &document) +const bool add_account(Json::Value &document) { string account; string minutes; string access_token; - rapidjson::Document::AllocatorType &allocator = document.GetAllocator(); cout << "Adding accounts (user@domain), blank line to stop.\n"; while (true) @@ -141,28 +133,22 @@ const bool add_account(rapidjson::Document &document) std::getline(cin, minutes); access_token = get_access_token(account); - rapidjson::Value vobject(rapidjson::kObjectType); - rapidjson::Value vaccount(account, allocator); - rapidjson::Value vaccess_token(access_token, allocator); - - vobject.AddMember("minutes", std::stoi(minutes), allocator); - vobject.AddMember("access_token", vaccess_token.Move(), allocator); - document["accounts"].AddMember(vaccount.Move(), vobject, allocator); + document["accounts"][account]["minutes"] = std::stoi(minutes); + document["accounts"][account]["access_token"] = access_token; } return write_config(document); } -const bool write_config(rapidjson::Document &document) +const bool write_config(Json::Value &document) { - rapidjson::StringBuffer buffer; - rapidjson::PrettyWriter writer(buffer); - document.Accept(writer); + Json::StyledWriter writer; + const string output = writer.write(document); std::ofstream outfile(filepath); if (outfile.is_open()) { - outfile.write(buffer.GetString(), std::strlen(buffer.GetString())); + outfile.write(output.c_str(), output.length()); outfile.close(); return true; diff --git a/src/mastobotmon.cpp b/src/mastobotmon.cpp index f9a37cf..58091d1 100644 --- a/src/mastobotmon.cpp +++ b/src/mastobotmon.cpp @@ -14,8 +14,6 @@ * along with this program. If not, see . */ -#define RAPIDJSON_HAS_STDSTRING 1 - #include #include #include @@ -25,7 +23,7 @@ #include #include #include // get_time -#include +#include #include "version.hpp" #include "mastobotmon.hpp" @@ -37,7 +35,7 @@ using std::uint16_t; int main(int argc, char *argv[]) { - rapidjson::Document document; + Json::Value document; if (!read_config(document)) { return 1; @@ -53,15 +51,15 @@ int main(int argc, char *argv[]) std::vector accounts; - for (const auto &member : document["accounts"].GetObject()) + for (auto it = document["accounts"].begin(); it != document["accounts"].end(); ++it) { // Construct an Account object for every account and store it in a vector - string instance = member.name.GetString(); + string instance = it.name(); instance = instance.substr(instance.find('@') + 1); - Account *acc = new Account(instance, member.value["access_token"].GetString()); + Account *acc = new Account(instance, (*it)["access_token"].asString()); acc->set_useragent("mastobotmon/" + string(global::version)); - acc->set_minutes(member.value["minutes"].GetUint()); + acc->set_minutes((*it)["minutes"].asUInt()); accounts.push_back(*acc); } @@ -73,9 +71,10 @@ int main(int argc, char *argv[]) uint16_t ret = acc.get(Mastodon::API::v1::accounts_verify_credentials, answer); if (ret == 0) { - rapidjson::Document json; - json.Parse(answer.c_str()); - const string id = json["id"].GetString(); + Json::Value json; + Json::Reader reader; + reader.parse(answer, json); + const string id = json["id"].asString(); Account::parametermap parameters( { @@ -84,10 +83,10 @@ int main(int argc, char *argv[]) ret = acc.get(Mastodon::API::v1::accounts_id_statuses, id, parameters, answer); if (ret == 0) { - json.Parse(answer.c_str()); - const string acct = json[0]["account"]["acct"].GetString(); + reader.parse(answer, json); + const string acct = json[0]["account"]["acct"].asString(); - std::istringstream isslast(json[0]["created_at"].GetString()); + std::istringstream isslast(json[0]["created_at"].asString()); struct std::tm tm = {0}; isslast >> std::get_time(&tm, "%Y-%m-%dT%T"); std::time_t time = timegm(&tm); diff --git a/src/mastobotmon.hpp b/src/mastobotmon.hpp index 14d9a0f..e95b9cd 100644 --- a/src/mastobotmon.hpp +++ b/src/mastobotmon.hpp @@ -17,20 +17,18 @@ #ifndef mastobotmon_HPP #define mastobotmon_HPP -#define RAPIDJSON_HAS_STDSTRING 1 - #include #include -#include +#include #include using std::uint16_t; using std::string; -const bool read_config(rapidjson::Document &document); +const bool read_config(Json::Value &document); const string get_access_token(const string &account); -const bool add_account(rapidjson::Document &document); -const bool write_config(rapidjson::Document &document); +const bool add_account(Json::Value &document); +const bool write_config(Json::Value &document); class Account : public Mastodon::API {