//
// Created by max on 18.12.18.
//
#include "GetEssen.hpp"
using namespace boost::posix_time;
using namespace std;
#define SQLITEPATH "../../main.sqlite"
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';"), 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(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();
return true;
}
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 = to_string(mensaDatum.date().year()) + "-" + mensaDatum.date().month().as_short_string() + "-" + to_string(mensaDatum.date().day().as_number());
try {
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);
string Message = s.GetField(1);
string Datum = s.GetField(2);
string LastModified = s.GetField(3);
ptime LMDate(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() << "\n";
}
out.ID = -2;
return out;
}
string Handler::MensaHandler::getEssen(const int mensa_ID, const int offset) {
Handler::MensaHandler::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 = 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\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 = "<b>Mensa Adlershof</b> 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 = "<b>Mensa Nord</b> 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 = "<b>Mensa Sued</b> 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 + 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 " + 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 = "<b>Mensa Nord</b> 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 = "<b>Mensa Sued</b> 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";
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";
}
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::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) {
(void) payload;
Handler::MensaHandler::mensa Mensa_ID;
//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");
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), session, true);
}