aboutsummaryrefslogtreecommitdiffstats
path: root/src/GetEssen.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/GetEssen.cpp')
-rw-r--r--src/GetEssen.cpp282
1 files changed, 282 insertions, 0 deletions
diff --git a/src/GetEssen.cpp b/src/GetEssen.cpp
new file mode 100644
index 0000000..3825c5c
--- /dev/null
+++ b/src/GetEssen.cpp
@@ -0,0 +1,282 @@
+#include "GetEssen.hpp"
+
+#include "sqdb.hpp"
+#include "Utilities.hpp"
+
+using std::string;
+
+bool
+Handler::MensaHandler::db_update_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());
+ sqdb::QueryStr str;
+ 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());
+ 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();
+ return true;
+}
+
+Handler::MensaHandler::MensaEssen
+Handler::MensaHandler::db_get_mensa_message(const int &mensaID, const ptime &mensaDatum) {
+ MensaEssen out;
+ sqdb::Db db("../main.sqlite");
+
+ 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));
+
+ try {
+ if (s.Next()) {
+ int ID = s.GetField(0);
+ string Message = s.GetField(1);
+ string Datum = s.GetField(2);
+ string LastModified = s.GetField(3);
+
+
+ ptime LMDate(boost::posix_time::time_from_string(LastModified));
+
+ out.ID = ID;
+ 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;
+ }
+ out.ID = -2;
+ return out;
+
+}
+
+string Handler::MensaHandler::getEssen(const int mensa_ID, const int offset) {
+ MensaEssen Essen;
+ 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)";
+ }
+
+ ptime datumNow = boost::posix_time::second_clock::local_time();
+ ptime datumEssen = datumNow + (boost::gregorian::days(offset));
+
+ 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 = "<b>Mensa Adlershof</b> 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 = "<b>Mensa Nord</b> 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 = "<b>Mensa Sued</b> 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;
+ }
+
+ 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!";
+ }
+
+ 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 = "<b>Mensa Adlershof</b> 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 = "<b>Mensa Nord</b> 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 = "<b>Mensa Sued</b> 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 "Wer denkst du bin ich? Ein Zeitreisender?\nIch kann zwar in die Zukunft gucken, aber nur 28 Tage";
+}
+
+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));
+ while (std::getline(inFile, s)) {
+ //out += mensa;
+ if (s.find("15.png") != string::npos && serious) {
+ string vegan;
+
+ int vegan_byte[4] = {0xF0, 0x9F, 0x8C, 0xB1};
+ for (int i : vegan_byte) {
+ vegan += (char) i;
+ }
+
+ out += vegan;
+ }
+
+ if (s.find("1.png") != string::npos && serious) {
+ string vegetarian;
+
+ int vegetarian_byte[4] = {0xF0, 0x9F, 0x8C, 0xBD};
+ for (int i : vegetarian_byte) {
+ vegetarian += (char) i;
+ }
+
+ out += vegetarian;
+ }
+ if (s.find("splIcon") != string::npos && serious && s.find("1.png") == string::npos &&
+ s.find("15.png") == string::npos) {
+ string emptyEmoji;
+ int emptyEmoji_byte[6] = {0xE2, 0x98, 0xA3, 0xEF, 0xB8, 0x8F};
+ for (int i : emptyEmoji_byte) {
+ emptyEmoji += (char) i;
+ }
+
+ out += emptyEmoji;
+ }
+
+ if (s.find("splGroup\"") != string::npos) { //Getting the Category of the Meal
+ for (int i = 0, j = 0; (unsigned) i < s.length(); ++i) {
+ if (s.at(i) == '>') {
+ j = i + 1;
+ }
+ if (s.at(i) == '<' && j != 0) {
+ s = s.substr(j, i - j);
+ j = 0;
+ }
+
+ }
+ serious = (s == "Aktionen" || s == "Essen" || s == "Beilagen");
+ if (serious) {
+ out += "\n<b>" + s + "</b>\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));
+ }
+ if (s.at(i) == '<' && j != 0) {
+ s = s.substr(j, i - j);
+ j = 0;
+ }
+
+ }
+
+ out += "\t" + s;
+ }
+
+ 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;
+ }
+ if (s.at(i) == '/') {
+ s = s.substr(j, i - j);
+ j = 0;
+ }
+ }
+ out += "\t<b>" + s + "</b>€\n";
+ }
+ }
+
+ if (out.empty()) {
+ return "Heute kein Essen";
+ }
+ return out;
+
+}
+
+Handler::json Handler::mensaHandler(const std::string &arguments, const std::string &session, void *payload) {
+ Handler::MensaHandler::mensa Mensa_ID;
+
+ auto args = tokenizeArguments(arguments);
+
+ std::string mensa_name = (args.size() > 0 ? args.at(0) : "adlershof");
+ std::string offset_request = (args.size() > 1 ? args.at(1) : "0");
+
+ if (mensa_name == "adlershof") {
+ Mensa_ID = Handler::MensaHandler::mensa::Adlershof;
+ } else if (mensa_name == "nord") {
+ Mensa_ID = Handler::MensaHandler::mensa::Nord;
+ } else if (mensa_name == "sued" || mensa_name == "süd") {
+ Mensa_ID = Handler::MensaHandler::mensa::Sued;
+ } else {
+ Mensa_ID = Handler::MensaHandler::mensa::Adlershof;
+ }
+
+ int offset = std::stoi(offset_request);
+
+ return Response::simple_response(getEssen(Mensa_ID, offset));
+}