From c9a587f1b7867e9c8cf075ebe9897bb41f4d42c6 Mon Sep 17 00:00:00 2001 From: Kirill Kirilenko Date: Sun, 20 Nov 2022 01:39:47 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A0=D0=B5=D1=84=D0=B0=D0=BA=D1=82=D0=BE?= =?UTF-8?q?=D1=80=D0=B8=D0=BD=D0=B3=20Storage.=20=D0=94=D0=B8=D0=B0=D0=BB?= =?UTF-8?q?=D0=BE=D0=B3=20SubscribeCase=20=D0=B4=D0=BE=D0=B2=D0=B5=D0=B4?= =?UTF-8?q?=D0=B5=D0=BD=20=D0=B4=D0=BE=20=D1=80=D0=B0=D0=B1=D0=BE=D1=87?= =?UTF-8?q?=D0=B5=D0=B3=D0=BE=20=D1=81=D0=BE=D1=81=D1=82=D0=BE=D1=8F=D0=BD?= =?UTF-8?q?=D0=B8=D1=8F.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Bot.cpp | 2 +- src/Bot.h | 2 +- src/Storage.cpp | 58 ++++++++++++++++++------------------- src/Storage.h | 20 ++++++------- src/SubscribeCaseDialog.cpp | 16 ++++++---- src/main.cpp | 19 ++++++------ 6 files changed, 60 insertions(+), 57 deletions(-) diff --git a/src/Bot.cpp b/src/Bot.cpp index 41f0506..5945aae 100644 --- a/src/Bot.cpp +++ b/src/Bot.cpp @@ -40,7 +40,7 @@ void Bot::setupCommands() }); } -void Bot::notifyUser(int userId, +void Bot::notifyUser(UserId userId, const std::string& caseNumber, std::string caseUrl, const CaseHistoryItem& item) diff --git a/src/Bot.h b/src/Bot.h index 432eb5d..90de005 100644 --- a/src/Bot.h +++ b/src/Bot.h @@ -15,7 +15,7 @@ class Bot public: explicit Bot(boost::asio::io_context& asioContext, LocalStorage& storage, bool& terminationFlag); - void notifyUser(int userId, + void notifyUser(UserId userId, const std::string& caseNumber, std::string caseUrl, const CaseHistoryItem& item); diff --git a/src/Storage.cpp b/src/Storage.cpp index d7e3960..5e85711 100644 --- a/src/Storage.cpp +++ b/src/Storage.cpp @@ -5,7 +5,7 @@ #include -using json = nlohmann::json; +using json = nlohmann::ordered_json; std::uint32_t parseTime(const std::string& str) { @@ -30,23 +30,22 @@ void loadStorage(LocalStorage& storage) std::ifstream ifs("storage.json"); if (ifs.is_open()) { - auto data = json::parse(ifs); - storage.token = data.at("token").get(); - storage.checkTime = parseTime(data.at("check_time").get()); + auto jsonStorage = json::parse(ifs); + storage.token = jsonStorage.at("token").get(); + storage.checkTime = parseTime(jsonStorage.at("check_time").get()); - for (const auto& subscription : data.at("subscriptions")) + for (const auto& jsonUserData : jsonStorage.at("user_data")) { - Subscription s; - s.userId = subscription.at("user_id"); - for (const auto& counter : subscription.at("counters")) + UserData userData; + auto userId = jsonUserData.at("user_id").get(); + for (const auto& jsonCaseSubscription : jsonUserData.at("case_subscriptions")) { - Counter c; - c.courtId = counter.at("court").get(); - c.caseNumber = counter.at("case").get(); - c.value = counter.at("value").get(); - s.counters.push_back(std::move(c)); + UserData::CaseSubscription caseSubscription; + auto caseNumber = jsonCaseSubscription.at("case").get(); + caseSubscription.counter = jsonCaseSubscription.at("counter").get(); + userData.caseSubscriptions[caseNumber] = caseSubscription; } - storage.subscriptions.push_back(std::move(s)); + storage.userData[userId] = std::move(userData); } } else @@ -55,30 +54,29 @@ void loadStorage(LocalStorage& storage) void saveStorage(const LocalStorage& storage) { - json data; - data["token"] = storage.token; - data["check_time"] = timeToString(storage.checkTime); + json jsonStorage; + jsonStorage["token"] = storage.token; + jsonStorage["check_time"] = timeToString(storage.checkTime); - data["subscriptions"] = json::array(); - for (const auto& subscription : storage.subscriptions) + jsonStorage["user_data"] = json::array(); + for (const auto& subscription : storage.userData) { - json jsonSubscription; - jsonSubscription["user_id"] = subscription.userId; - jsonSubscription["counters"] = json::array(); - for (const auto& counter : subscription.counters) + json jsonUserData; + jsonUserData["user_id"] = subscription.first; + jsonUserData["case_subscriptions"] = json::array(); + for (const auto& caseSubscription : subscription.second.caseSubscriptions) { - json jsonCounter; - jsonCounter["court"] = counter.courtId; - jsonCounter["case"] = counter.caseNumber; - jsonCounter["value"] = counter.value; - jsonSubscription["counters"].push_back(std::move(jsonCounter)); + json jsonCaseSubscription; + jsonCaseSubscription["case"] = caseSubscription.first; + jsonCaseSubscription["counter"] = caseSubscription.second.counter; + jsonUserData["case_subscriptions"].push_back(std::move(jsonCaseSubscription)); } - data["subscriptions"].push_back(std::move(jsonSubscription)); + jsonStorage["user_data"].push_back(std::move(jsonUserData)); } std::ofstream ofs("storage.json"); if (ofs.is_open()) - ofs << std::setw(2) << data; + ofs << std::setw(2) << jsonStorage; else throw std::runtime_error("failed to save storage"); } diff --git a/src/Storage.h b/src/Storage.h index e7bb6da..8d50d95 100644 --- a/src/Storage.h +++ b/src/Storage.h @@ -2,26 +2,26 @@ #define COURT_MONITOR_STORAGE_H #include +#include #include #include -struct Counter -{ - int courtId = 0; - std::string caseNumber; - std::size_t value = 0; -}; +using UserId = std::int64_t; -struct Subscription +struct UserData { - int userId = 0; - std::vector counters; + struct CaseSubscription + { + std::size_t counter = 0; + }; + + std::map caseSubscriptions; }; struct LocalStorage { std::string token; - std::vector subscriptions; + std::map userData; std::uint32_t checkTime; // секунды с 00:00 }; diff --git a/src/SubscribeCaseDialog.cpp b/src/SubscribeCaseDialog.cpp index 2366ca9..a837ae1 100644 --- a/src/SubscribeCaseDialog.cpp +++ b/src/SubscribeCaseDialog.cpp @@ -38,6 +38,7 @@ struct SubscribeCaseStateMachine : StateMachine try { - auto details = getCaseDetails(ioContext, machine.caseNumber); + machine.caseDetails = getCaseDetails(ioContext, machine.caseNumber); std::string text; - fmt::format_to(std::back_inserter(text), "Проверьте информацию:\n{}\n", details.name); - for (const auto& participant : details.participants) + fmt::format_to(std::back_inserter(text), "Проверьте информацию:\n{}\n", + machine.caseDetails.name); + for (const auto& participant : machine.caseDetails.participants) fmt::format_to(std::back_inserter(text), "{}: {}\n", participant.title, participant.name); - fmt::format_to(std::back_inserter(text), "Судья: {}", details.judgeName); + fmt::format_to(std::back_inserter(text), "Судья: {}", machine.caseDetails.judgeName); banana::api::inline_keyboard_markup_t keyboard; keyboard.inline_keyboard.resize(1); @@ -148,8 +150,10 @@ struct WaitingForConfirmation : State(); } else if (*event.query.data == "no") diff --git a/src/main.cpp b/src/main.cpp index 4324d0c..2c8c6ad 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -19,19 +19,20 @@ boost::asio::io_context asioContext; void processAllSubscriptions(LocalStorage& storage, Bot& bot) { - for (auto& subscription : storage.subscriptions) + for (auto& userData : storage.userData) { try { - LOG(main, "* Processing subscriptions for user {}", subscription.userId); - for (auto& counter : subscription.counters) + const auto& userId = userData.first; + LOG(main, "* Processing subscriptions for user {}", userId); + for (auto& caseSubscription : userData.second.caseSubscriptions) { - LOG(main, "** Processing case {}", counter.caseNumber); - auto details = getCaseDetails(asioContext, counter.caseNumber); - for (std::size_t i = counter.value; i < details.history.size(); i++) - bot.notifyUser(subscription.userId, counter.caseNumber, details.url, - details.history[i]); - counter.value = details.history.size(); + const auto& caseNumber = caseSubscription.first; + LOG(main, "** Processing case {}", caseNumber); + auto details = getCaseDetails(asioContext, caseNumber); + for (std::size_t i = caseSubscription.second.counter; i < details.history.size(); i++) + bot.notifyUser(userId, caseNumber, details.url, details.history[i]); + caseSubscription.second.counter = details.history.size(); } } catch (const std::exception& e)