From 37724b791e4fe4966106d20f7f17b553573ec59c Mon Sep 17 00:00:00 2001 From: Niklas Halle Date: Mon, 7 Sep 2020 16:22:42 +0200 Subject: started work --- include/GetEssen.hpp | 11 +++- src/GetEssen.cpp | 183 +++++++++++++++++++++++++-------------------------- 2 files changed, 98 insertions(+), 96 deletions(-) diff --git a/include/GetEssen.hpp b/include/GetEssen.hpp index ff75029..b53c028 100644 --- a/include/GetEssen.hpp +++ b/include/GetEssen.hpp @@ -1,5 +1,6 @@ #pragma once +#include #include #include @@ -19,7 +20,7 @@ namespace Handler { struct MensaEssen { int ID{191}; - string Message{"nothing got back! There was an error!!"}; + std::queue Message; ptime Datum; ptime LastModified; }; @@ -35,9 +36,13 @@ namespace Handler { MensaEssen db_get_mensa_message(const int &mensaID, const ptime &mensaDatum); - string getEssen(const int mensa_ID, const int offset); + std::vector getEssenOnline(int mensa_ID, boost::posix_time::ptime datumEssen); - string read_mensa_message_from_file(const int &mensa_id_file); + std::vector getEssen(int mensa_ID, int offset); + + std::vector parseEssen(MensaEssen Essen); + + std::vector read_mensa_message_from_file(const int &mensa_id_file); } json mensaHandler(std::string const &arguments, std::string const &session, void *payload); diff --git a/src/GetEssen.cpp b/src/GetEssen.cpp index 3825c5c..69a8e5e 100644 --- a/src/GetEssen.cpp +++ b/src/GetEssen.cpp @@ -48,7 +48,8 @@ Handler::MensaHandler::db_get_mensa_message(const int &mensaID, const ptime &men try { if (s.Next()) { int ID = s.GetField(0); - string Message = s.GetField(1); + auto tmpData = crow::json::load(s.GetField(1).GetString()); + string Message = tmpData.; string Datum = s.GetField(2); string LastModified = s.GetField(3); @@ -67,107 +68,47 @@ Handler::MensaHandler::db_get_mensa_message(const int &mensaID, const ptime &men } out.ID = -2; return out; - } -string Handler::MensaHandler::getEssen(const int mensa_ID, const int offset) { - MensaEssen Essen; - if (offset >= 0) { +std::vector Handler::MensaHandler::getEssen(const int mensa_ID, const int offset) { + std::vector reply_vec; + if (offset >= 0) { if (offset > 28) { - return "Ich fühle mich geschmeichelt, dass du denkst, dass ich so weit in die Zukunft gucken kann (0 bis 28 Tage)"; + reply_vec.emplace_back(Response::create_text( + "Ich fühle mich geschmeichelt, dass du denkst, dass ich so weit in die Zukunft gucken kann (0 bis 28 Tage)")); + return reply_vec; } ptime datumNow = boost::posix_time::second_clock::local_time(); ptime datumEssen = datumNow + (boost::gregorian::days(offset)); - Essen = db_get_mensa_message(mensa_ID, datumEssen); + MensaEssen Essen = db_get_mensa_message(mensa_ID, datumEssen); if (Essen.ID == -2) { // SQL got nothing back :/ //log("sql got nothing back!"); - if (downloadMensaFile(mensa_ID, datumEssen) != CURLE_OK) { - std::cerr << "Error downloading file" << std::endl; - return "Error downloading file!"; - } - db_insert_mensa_message(mensa_ID, datumEssen, read_mensa_message_from_file(mensa_ID)); - Essen = db_get_mensa_message(mensa_ID, datumEssen); - - string out; - switch (Essen.ID) { - case mensa::Adlershof : - out = "Mensa Adlershof am " + std::to_string(Essen.Datum.date().day().as_number()) + "." + - std::to_string(Essen.Datum.date().month().as_number()) + "." + - std::to_string(Essen.Datum.date().year()) + ":"; - break; - case mensa::Nord: - out = "Mensa Nord am " + std::to_string(Essen.Datum.date().day().as_number()) + "." + - std::to_string(Essen.Datum.date().month().as_number()) + "." + - std::to_string(Essen.Datum.date().year()) + ":"; - break; - case mensa::Sued : - out = "Mensa Sued am " + std::to_string(Essen.Datum.date().day().as_number()) + "." + - std::to_string(Essen.Datum.date().month().as_number()) + "." + - std::to_string(Essen.Datum.date().year()) + ":"; - break; - default: - out = "Mensa Unbekannt am " + std::to_string(Essen.Datum.date().day().as_number()) + "." + - std::to_string(Essen.Datum.date().month().as_number()) + "." + - std::to_string(Essen.Datum.date().year()) + ":"; - break; - - } - out += Essen.Message; - out += "\n (Stand: " + to_simple_string(Essen.LastModified) + ")\n"; - - return out; + return getEssenOnline(mensa_ID, datumEssen); } - if (Essen.LastModified + boost::posix_time::hours(2) < datumNow) { //LastModified is more than 2 hours old + if (Essen.LastModified + boost::posix_time::hours(2) < datumNow) { // LastModified is more than 2 hours old if (downloadMensaFile(mensa_ID, datumEssen) != CURLE_OK) { - return "Error downloading file!"; + std::cerr << "Error downloading file" << std::endl; + reply_vec.emplace_back(Response::create_text("Error downloading file!")); + return reply_vec; } db_update_mensa_message(mensa_ID, datumEssen, read_mensa_message_from_file(mensa_ID)); - Essen = db_get_mensa_message(mensa_ID, datumEssen); } - string out; - switch (Essen.ID) { - case mensa::Adlershof : - out = "Mensa Adlershof am " + std::to_string(Essen.Datum.date().day().as_number()) + "." + - std::to_string(Essen.Datum.date().month().as_number()) + "." + - std::to_string(Essen.Datum.date().year()) + - ":"; - break; - case mensa::Nord : - out = "Mensa Nord am " + std::to_string(Essen.Datum.date().day().as_number()) + "." + - std::to_string(Essen.Datum.date().month().as_number()) + "." + - std::to_string(Essen.Datum.date().year()) + - ":"; - break; - case mensa::Sued : - out = "Mensa Sued am " + std::to_string(Essen.Datum.date().day().as_number()) + "." + - std::to_string(Essen.Datum.date().month().as_number()) + "." + - std::to_string(Essen.Datum.date().year()) + - ":"; - break; - default: - out = "Mensa Unbekannt am " + std::to_string(Essen.Datum.date().day().as_number()) + "." + - std::to_string(Essen.Datum.date().month().as_number()) + "." + - std::to_string(Essen.Datum.date().year()) + - ":"; - break; - - } - out += Essen.Message; - out += "\n (Stand: " + to_simple_string(Essen.LastModified) + ")\n"; - return out; + return parseEssen(db_get_mensa_message(mensa_ID, datumEssen)); } - return "Wer denkst du bin ich? Ein Zeitreisender?\nIch kann zwar in die Zukunft gucken, aber nur 28 Tage"; + reply_vec.emplace_back(Response::create_text( + "Wer denkst du bin ich? Ein Zeitreisender?\nIch kann zwar in die Zukunft gucken, aber nur 28 Tage")); + return reply_vec; } -string Handler::MensaHandler::read_mensa_message_from_file(const int &mensa_id_file) { +std::vector Handler::MensaHandler::read_mensa_message_from_file(const int &mensa_id_file) { + std::vector reply_vec; string s; - string out; bool serious = false; std::ifstream inFile(std::to_string(mensa_id_file)); @@ -181,7 +122,7 @@ string Handler::MensaHandler::read_mensa_message_from_file(const int &mensa_id_f vegan += (char) i; } - out += vegan; + reply_vec.emplace_back(Response::create_text(vegan)); } if (s.find("1.png") != string::npos && serious) { @@ -192,7 +133,7 @@ string Handler::MensaHandler::read_mensa_message_from_file(const int &mensa_id_f vegetarian += (char) i; } - out += vegetarian; + reply_vec.emplace_back(Response::create_text(vegetarian)); } if (s.find("splIcon") != string::npos && serious && s.find("1.png") == string::npos && s.find("15.png") == string::npos) { @@ -202,7 +143,7 @@ string Handler::MensaHandler::read_mensa_message_from_file(const int &mensa_id_f emptyEmoji += (char) i; } - out += emptyEmoji; + reply_vec.emplace_back(Response::create_text(emptyEmoji)); } if (s.find("splGroup\"") != string::npos) { //Getting the Category of the Meal @@ -218,9 +159,13 @@ string Handler::MensaHandler::read_mensa_message_from_file(const int &mensa_id_f } serious = (s == "Aktionen" || s == "Essen" || s == "Beilagen"); if (serious) { - out += "\n" + s + "\n"; + std::vector bold; + bold.emplace_back(Response::create_annotation(Response::AnnotationType::bold)); + reply_vec.emplace_back(Response::create_text("\n")); + reply_vec.emplace_back(Response::create_text(s, std::move(bold))); } } + if (s.find("class=\"bold\"") != string::npos && serious) { //Getting the Meal for (int i = 0, j = 0; (unsigned) i < s.length(); ++i) { if (s.at(i) == '>') { @@ -231,13 +176,11 @@ string Handler::MensaHandler::read_mensa_message_from_file(const int &mensa_id_f s = s.substr(j, i - j); j = 0; } - } - - out += "\t" + s; + reply_vec.emplace_back(Response::create_text("\t" + s)); } - if (s.find("euro;") != string::npos && serious) { //geting the price of each Meal + if (s.find("euro;") != string::npos && serious) { // getting the price of each Meal for (int i = 0, j = 0; (unsigned) i < s.length(); ++i) { if (s.at(i) == ';') { j = i + 1; @@ -247,23 +190,77 @@ string Handler::MensaHandler::read_mensa_message_from_file(const int &mensa_id_f j = 0; } } - out += "\t" + s + "€\n"; + std::vector bold; + bold.emplace_back(Response::create_annotation(Response::AnnotationType::bold)); + reply_vec.emplace_back(Response::create_text("\t")); + reply_vec.emplace_back(Response::create_text(s, std::move(bold))); + reply_vec.emplace_back(Response::create_text("€\n")); } } - if (out.empty()) { - return "Heute kein Essen"; + if (reply_vec.empty()) { + reply_vec.emplace_back(Response::create_text("Heute kein Essen")); } - return out; + return reply_vec; +} + +std::vector Handler::MensaHandler::parseEssen(MensaEssen Essen) { + std::vector reply_vec; + std::vector bold; + bold.emplace_back(Response::create_annotation(Response::AnnotationType::bold)); + + switch (Essen.ID) { + case mensa::Adlershof: + reply_vec.emplace_back(std::move(Response::create_text("Mensa Adlershof", std::move(bold)))); + break; + case mensa::Nord: + reply_vec.emplace_back(std::move(Response::create_text("Mensa Nord", std::move(bold)))); + break; + case mensa::Sued : + reply_vec.emplace_back(std::move(Response::create_text("Mensa Süd", std::move(bold)))); + break; + default: + reply_vec.emplace_back(std::move(Response::create_text("unbekannte Mensa", std::move(bold)))); + break; + } + + reply_vec.emplace_back(Response::create_text( + std::to_string(Essen.Datum.date().day().as_number()) + "." + + std::to_string(Essen.Datum.date().month().as_number()) + "." + + std::to_string(Essen.Datum.date().year()) + ":\n")); + + while (!Essen.Message.empty()) { + reply_vec.emplace_back(std::move(Essen.Message.front())); + Essen.Message.pop(); + } + + reply_vec.emplace_back(Response::create_text("\n(Stand: " + to_simple_string(Essen.LastModified) + ")\n")); + + return reply_vec; +} + +std::vector +Handler::MensaHandler::getEssenOnline(int mensa_ID, boost::posix_time::ptime datumEssen) { + if (downloadMensaFile(mensa_ID, datumEssen) != CURLE_OK) { + std::cerr << "Error downloading file" << std::endl; + std::vector reply_vec; + reply_vec.emplace_back(Response::create_text("Error downloading file!")); + return reply_vec; + } + + db_insert_mensa_message(mensa_ID, datumEssen, crow::json::dump(read_mensa_message_from_file(mensa_ID))); + + return parseEssen(db_get_mensa_message(mensa_ID, datumEssen)); } Handler::json Handler::mensaHandler(const std::string &arguments, const std::string &session, void *payload) { + (void) payload; Handler::MensaHandler::mensa Mensa_ID; auto args = tokenizeArguments(arguments); - std::string mensa_name = (args.size() > 0 ? args.at(0) : "adlershof"); + std::string mensa_name = (!args.empty() ? args.at(0) : "adlershof"); std::string offset_request = (args.size() > 1 ? args.at(1) : "0"); if (mensa_name == "adlershof") { @@ -278,5 +275,5 @@ Handler::json Handler::mensaHandler(const std::string &arguments, const std::str int offset = std::stoi(offset_request); - return Response::simple_response(getEssen(Mensa_ID, offset)); + return Response::create_response(getEssen(Mensa_ID, offset)); } -- cgit v1.2.3-54-g00ecf