From 3b0ce635b1a4d63ae97d5ae93254634ecbff6abf Mon Sep 17 00:00:00 2001 From: Max Kusatz Date: Tue, 27 Oct 2020 19:04:22 +0100 Subject: 'fixed' mensa function for real this time --- include/GetEssen.hpp | 14 +-- src/GetEssen.cpp | 253 +++++++++++++++++++++------------------------------ 2 files changed, 114 insertions(+), 153 deletions(-) diff --git a/include/GetEssen.hpp b/include/GetEssen.hpp index 06aafe2..adbd003 100644 --- a/include/GetEssen.hpp +++ b/include/GetEssen.hpp @@ -12,6 +12,8 @@ #include "Handler.hpp" #include "Response.hpp" +#include "sqdb.hpp" +#include "Utilities.hpp" namespace Handler { namespace MensaHandler { @@ -20,7 +22,7 @@ namespace Handler { struct MensaEssen { int ID{191}; - std::queue Message; + std::string Message; ptime Datum; ptime LastModified; }; @@ -30,19 +32,19 @@ namespace Handler { }; - bool db_update_mensa_message(const int &mensaID, const ptime &mensaDatum, const std::vector &message); + bool db_update_mensa_message(const int &mensaID, const ptime &mensaDatum, const std::string &message); bool db_insert_mensa_message(const int &mensaID, const ptime &mensaDatum, const string &message); MensaEssen db_get_mensa_message(const int &mensaID, const ptime &mensaDatum); - std::vector getEssenOnline(int mensa_ID, boost::posix_time::ptime datumEssen); + //std::vector getEssenOnline(int mensa_ID, boost::posix_time::ptime datumEssen); - std::vector getEssen(int mensa_ID, int offset); + std::string getEssen(int mensa_ID, int offset); - std::vector parseEssen(MensaEssen Essen); + //std::vector parseEssen(MensaEssen Essen); - std::vector read_mensa_message_from_file(const int &mensa_id_file); + std::string 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 e0208f6..0cda77c 100644 --- a/src/GetEssen.cpp +++ b/src/GetEssen.cpp @@ -1,125 +1,143 @@ -#include "GetEssen.hpp" - -#include "sqdb.hpp" -#include "Utilities.hpp" - -using std::string; +// +// Created by max on 18.12.18. +// -bool Handler::MensaHandler::db_update_mensa_message(const int &mensaID, const ptime &mensaDatum, const std::vector &message) { - sqdb::Db db("../main.sqlite"); +#include "GetEssen.hpp" - std::string messageFromJSON; - for (auto &mes : message){ - messageFromJSON.append(mes.keys().at(0)); - } +using namespace boost::posix_time; +using namespace std; +#define SQLITEPATH "../../main.sqlite" - string newTime = to_simple_string(ptime(boost::posix_time::second_clock::local_time())); - string mensaDatumString = - std::to_string(mensaDatum.date().year()) + "-" + mensaDatum.date().month().as_short_string() + "-" + - std::to_string(mensaDatum.date().day().as_number()); +bool Handler::MensaHandler::db_update_mensa_message(const int& mensaID, const ptime& mensaDatum, const string& message){ + sqdb::Db db(SQLITEPATH); + string newTime = to_simple_string(ptime(second_clock::local_time())); + string mensaDatumString = to_string(mensaDatum.date().year()) + "-" + mensaDatum.date().month().as_short_string() + "-" + to_string(mensaDatum.date().day().as_number()); sqdb::QueryStr str; - db.Query(str.Format( - SQDB_MAKE_TEXT("update mensa set Message = '%s', LastModified = '%s' where ID = %i and Datum = '%s';"), - messageFromJSON.c_str(), newTime.c_str(), mensaID, mensaDatumString.c_str())).Next(); + db.Query(str.Format(SQDB_MAKE_TEXT("update mensa set Message = '%s', LastModified = '%s' where ID = %i and Datum = '%s';"), message.c_str(), newTime.c_str(), mensaID, mensaDatumString.c_str())).Next(); return true; } -bool Handler::MensaHandler::db_insert_mensa_message(const int &mensaID, const ptime &mensaDatum, const string &message) { - sqdb::Db db("../main.sqlite"); - string newTime = to_simple_string(ptime(boost::posix_time::second_clock::local_time())); - string mensaDatumString = - std::to_string(mensaDatum.date().year()) + "-" + mensaDatum.date().month().as_short_string() + "-" + - std::to_string(mensaDatum.date().day().as_number()); +bool Handler::MensaHandler::db_insert_mensa_message(const int& mensaID, const ptime& mensaDatum, const string& message){ + sqdb::Db db(SQLITEPATH); + string newTime = to_simple_string(ptime(second_clock::local_time())); + string mensaDatumString = to_string(mensaDatum.date().year()) + "-" + mensaDatum.date().month().as_short_string() + "-" + to_string(mensaDatum.date().day().as_number()); sqdb::QueryStr str; - db.Query(str.Format(SQDB_MAKE_TEXT("insert into mensa values(%i, '%s', '%s', '%s');"), mensaID, message.c_str(), - mensaDatumString.c_str(), newTime.c_str())).Next(); + db.Query(str.Format(SQDB_MAKE_TEXT("insert into mensa values(%i, '%s', '%s', '%s');"), mensaID, message.c_str(), mensaDatumString.c_str(), newTime.c_str())).Next(); return true; } -Handler::MensaHandler::MensaEssen Handler::MensaHandler::db_get_mensa_message(const int &mensaID, const ptime &mensaDatum) { - MensaEssen out; - sqdb::Db db("../main.sqlite"); +Handler::MensaHandler::MensaEssen Handler::MensaHandler::db_get_mensa_message(const int& mensaID, const ptime& mensaDatum) { + Handler::MensaHandler::MensaEssen out; + sqdb::Db db(SQLITEPATH); sqdb::QueryStr str; - string mensaDatumString = - std::to_string(mensaDatum.date().year()) + "-" + mensaDatum.date().month().as_short_string() + "-" + - std::to_string(mensaDatum.date().day().as_number()); - sqdb::Statement s = db.Query( - str.Format(SQDB_MAKE_TEXT("SELECT * from mensa WHERE Datum = '%s' AND ID = %i;"), mensaDatumString.c_str(), - mensaID)); + string mensaDatumString = to_string(mensaDatum.date().year()) + "-" + mensaDatum.date().month().as_short_string() + "-" + to_string(mensaDatum.date().day().as_number()); try { - if (s.Next()) { + sqdb::Statement s = db.Query(str.Format(SQDB_MAKE_TEXT("SELECT * from mensa WHERE Datum = '%s' AND ID = %i;"), mensaDatumString.c_str(), mensaID )); + //sqdb::Statement s = db.Query(str.Format(SQDB_MAKE_TEXT("SELECT * from mensa"))); // WHERE Datum = '%s' AND ID = %i;"), mensaDatumString.c_str(), mensaID )); + if(s.Next()) { int ID = s.GetField(0); - auto tmpData = crow::json::load(s.GetField(1).GetString()); - auto Message = tmpData; + string Message = s.GetField(1); string Datum = s.GetField(2); string LastModified = s.GetField(3); - ptime LMDate(boost::posix_time::time_from_string(LastModified)); + ptime LMDate(time_from_string(LastModified)); out.ID = ID; - out.Message.push(Message); + out.Message = Message; out.Datum = mensaDatum; out.LastModified = LMDate; return out; } - } catch (sqdb::Exception &exception) { - std::cerr << "Error code: " << exception.GetErrorCode() << " Error Message: " << exception.GetErrorMsg() - << std::endl; + } catch (sqdb::Exception &exception){ + std::cerr << "Error code: " << exception.GetErrorCode() << " Error Message: " << exception.GetErrorMsg() << "\n"; } + out.ID = -2; return out; -} - -std::vector Handler::MensaHandler::getEssen(const int mensa_ID, const int offset) { - std::vector reply_vec; - std::string reply; +} +string Handler::MensaHandler::getEssen(const int mensa_ID, const int offset) { + Handler::MensaHandler::MensaEssen Essen; if (offset >= 0) { + if (offset > 28) { - 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; - //return "Ich fühle mich geschmeichelt, dass du denkst, dass ich so weit in die Zukunft gucken kann (0 bis 28 Tage)"; + return "Ich fühle mich geschmeichelt, dass du denkst, dass ich so weit in die Zukunft gucken kann (0 bis 28 Tage)"; } - ptime datumNow = boost::posix_time::second_clock::local_time(); + ptime datumNow = second_clock::local_time(); ptime datumEssen = datumNow + (boost::gregorian::days(offset)); - MensaEssen Essen = db_get_mensa_message(mensa_ID, datumEssen); - + Essen = db_get_mensa_message(mensa_ID, datumEssen); if (Essen.ID == -2) { // SQL got nothing back :/ //log("sql got nothing back!"); - return getEssenOnline(mensa_ID, datumEssen); - } + if (downloadMensaFile(mensa_ID, datumEssen) != CURLE_OK){ + std::cerr << "Error downloading file\n"; + 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 " + to_string(Essen.Datum.date().day().as_number()) + "." + to_string(Essen.Datum.date().month().as_number()) + "." + to_string(Essen.Datum.date().year()) + ":"; + break; + case mensa ::Nord: + out = "Mensa Nord am " + to_string(Essen.Datum.date().day().as_number()) + "." + to_string(Essen.Datum.date().month().as_number()) + "." + to_string(Essen.Datum.date().year()) + ":"; + break; + case mensa::Sued : + out = "Mensa Sued am " + to_string(Essen.Datum.date().day().as_number()) + "." + to_string(Essen.Datum.date().month().as_number()) + "." + to_string(Essen.Datum.date().year()) + ":"; + break; + default: + out = "Mensa Unbekannt am " + to_string(Essen.Datum.date().day().as_number()) + "." + to_string(Essen.Datum.date().month().as_number()) + "." + to_string(Essen.Datum.date().year()) + ":"; + break; + } + out += Essen.Message; + out += "\n (Stand: " + to_simple_string(Essen.LastModified) + ")\n"; + return out; + } - if (Essen.LastModified + boost::posix_time::hours(2) < datumNow) { // LastModified is more than 2 hours old + if (Essen.LastModified + hours(2) < datumNow) { //LastModified is more than 2 hours old if (downloadMensaFile(mensa_ID, datumEssen) != CURLE_OK) { - std::cerr << "Error downloading file" << std::endl; - reply_vec.emplace_back(Response::create_text("Error downloading file!")); - return reply_vec; + return "Error downloading file!"; } db_update_mensa_message(mensa_ID, datumEssen, read_mensa_message_from_file(mensa_ID)); + Essen = db_get_mensa_message(mensa_ID, datumEssen); } - return parseEssen(db_get_mensa_message(mensa_ID, datumEssen)); - } + string out; + switch (Essen.ID) { + case mensa::Adlershof : + out = "Mensa Adlershof am " + to_string(Essen.Datum.date().day().as_number()) + "." + to_string(Essen.Datum.date().month().as_number()) + "." + to_string(Essen.Datum.date().year()) + ":"; + break; + case mensa::Nord : + out = "Mensa Nord am " + to_string(Essen.Datum.date().day().as_number()) + "." + to_string(Essen.Datum.date().month().as_number()) + "." + to_string(Essen.Datum.date().year()) + ":"; + break; + case mensa::Sued : + out = "Mensa Sued am " + to_string(Essen.Datum.date().day().as_number()) + "." + to_string(Essen.Datum.date().month().as_number()) + "." + to_string(Essen.Datum.date().year()) + ":"; + break; + default: + out = "Mensa Unbekannt am " + to_string(Essen.Datum.date().day().as_number()) + "." + to_string(Essen.Datum.date().month().as_number()) + "." + to_string(Essen.Datum.date().year()) + ":"; + break; - 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; -} + } + out += Essen.Message; + out += "\n (Stand: " + to_simple_string(Essen.LastModified) + ")\n"; + std::cerr << out; + return out; + } else return "Wer denkst du bin ich? Ein Zeitreisender?\nIch kann zwar in die Zukunft gucken, aber nur 28 Tage"; -std::vector Handler::MensaHandler::read_mensa_message_from_file(const int &mensa_id_file) { - std::vector reply_vec; - crow::json::wvalue test; +} +string Handler::MensaHandler::read_mensa_message_from_file(const int& mensa_id_file) { string s; + string out; bool serious = false; std::ifstream inFile(std::to_string(mensa_id_file)); @@ -133,7 +151,7 @@ std::vector Handler::MensaHandler::read_mensa_message_from_f vegan += (char) i; } - reply_vec.emplace_back(Response::create_text(vegan)); + out += vegan; } if (s.find("1.png") != string::npos && serious) { @@ -144,7 +162,7 @@ std::vector Handler::MensaHandler::read_mensa_message_from_f vegetarian += (char) i; } - reply_vec.emplace_back(Response::create_text(vegetarian)); + out += vegetarian; } if (s.find("splIcon") != string::npos && serious && s.find("1.png") == string::npos && s.find("15.png") == string::npos) { @@ -154,7 +172,7 @@ std::vector Handler::MensaHandler::read_mensa_message_from_f emptyEmoji += (char) i; } - reply_vec.emplace_back(Response::create_text(emptyEmoji)); + out += emptyEmoji; } if (s.find("splGroup\"") != string::npos) { //Getting the Category of the Meal @@ -170,28 +188,26 @@ std::vector Handler::MensaHandler::read_mensa_message_from_f } serious = (s == "Aktionen" || s == "Essen" || s == "Beilagen"); if (serious) { - 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))); + out += "\n" + s + "\n"; } } - 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) == '>') { j = i + 1; - //logStatus("Zeichen > gefunden in Position" + std::std::to_string(i)); + //logStatus("Zeichen > gefunden in Position" + std::to_string(i)); } if (s.at(i) == '<' && j != 0) { s = s.substr(j, i - j); j = 0; } + } - reply_vec.emplace_back(Response::create_text("\t" + s)); + + out += "\t" + s; } - if (s.find("euro;") != string::npos && serious) { // getting the price of each Meal + if (s.find("euro;") != string::npos && serious) { //geting the price of each Meal for (int i = 0, j = 0; (unsigned) i < s.length(); ++i) { if (s.at(i) == ';') { j = i + 1; @@ -201,81 +217,24 @@ std::vector Handler::MensaHandler::read_mensa_message_from_f j = 0; } } - 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")); + out += "\t" + s + "€\n"; } } - if (reply_vec.empty()) { - reply_vec.emplace_back(Response::create_text("Heute kein Essen")); - } - - 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(); + if (out.empty()) { + return "Heute kein Essen"; } + return out; - 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; - } - - std::string jsonMessage; - for (auto &mes : read_mensa_message_from_file(mensa_ID)){ - jsonMessage.append(crow::json::dump(mes)); - } - - db_insert_mensa_message(mensa_ID, datumEssen, jsonMessage); - - 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; - return Response::simple_response("Mensafunktion gerade nicht verfügbar. Bitte versuchen Sie es Später erneut."); -/* + //return Response::simple_response("Mensafunktion gerade nicht verfügbar. Bitte versuchen Sie es Später erneut."); + auto args = tokenizeArguments(arguments); std::string mensa_name = (!args.empty() ? args.at(0) : "adlershof"); @@ -293,6 +252,6 @@ Handler::json Handler::mensaHandler(const std::string &arguments, const std::str int offset = std::stoi(offset_request); - return Response::create_response(getEssen(Mensa_ID, offset)); - */ + return Response::simple_response(getEssen(Mensa_ID, offset), session, true); + } -- cgit v1.2.3-54-g00ecf