// Takes the passage in $text, and explodes it into book, chapter, verse. // The book is the numerical identifier, not the string, e.g., // it would not return "Genesis", but identifier 1. Passage filter_passage_explode_passage (string text) { text = filter_passage_clean_passage (text); // Cut the text in its parts. vector <string> bits = filter_string_explode (text, ' '); // Defaults to empty passage. Passage passage; // Take the bits. if (!bits.empty ()) { string verse = bits.back (); if (!verse.empty ()) passage.verse = verse; bits.pop_back (); } if (!bits.empty ()) { string chapter = bits.back (); if (!chapter.empty()) passage.chapter = convert_to_int (chapter); bits.pop_back (); } string book = filter_string_implode (bits, " "); if (!book.empty()) { int bk = filter_passage_interpret_book (book); passage.book = bk; } // Return the result. return passage; }
// handleEmailNew - handles an email received from $from with subject $subject and body $body. // Returns true if the mail was processed, else false. // The email is considered to have been processed if it created a new Consultation Note. bool Notes_Logic::handleEmailNew (string from, string subject, string body) { // Webserver request. Webserver_Request * request = (Webserver_Request *) webserver_request; // Store the original subject. string originalSubject = subject; // Check that the subject indicates that a new consultation note is to be created. size_t pos = unicode_string_casefold (subject).find ("new note"); if (pos == string::npos) return false; // There is a new note. Remove that bit from the subject. if (pos > 0) subject.erase (0, pos + 8); // Clean the subject line. subject = filter_string_trim (subject); subject = filter_string_str_replace (".", " ", subject); subject = filter_string_str_replace (":", " ", subject); subject = filter_string_str_replace (" ", " ", subject); subject = filter_string_str_replace (" ", " ", subject); // Check that the from address of the email belongs to an existing user. from = filter_string_extract_email (from); if (!request->database_users()->emailExists (from)) return false; string username = request->database_users()->getEmailToUser (from); // Extract book, chapter, verse, and note summary from the subject int book = -1; int chapter = -1; int verse = -1; string summary; vector <string> subjectlines = filter_string_explode (subject, ' '); if (!subjectlines.empty()) { book = filter_passage_interpret_book (subjectlines[0]); subjectlines.erase (subjectlines.begin()); } if (!subjectlines.empty()) { chapter = convert_to_int (subjectlines[0]); subjectlines.erase (subjectlines.begin()); } if (!subjectlines.empty()) { verse = convert_to_int (subjectlines[0]); subjectlines.erase (subjectlines.begin()); } summary = filter_string_implode (subjectlines, " "); // Check book, chapter, verse, and summary. Give feedback if there's anything wrong. string noteCheck; if (book <= 0) noteCheck.append (translate("Unknown book")); if (chapter < 0) { noteCheck.append (" "); noteCheck.append (translate("Unknown chapter")); } if (verse < 0) { noteCheck.append (" "); noteCheck.append (translate("Unknown verse")); } if (summary.empty ()) { noteCheck.append (" "); noteCheck.append (translate("Unknown summary")); } // Mail user if the note could not be posted. Database_Mail database_mail = Database_Mail (webserver_request); if (noteCheck != "") { subject = translate("Your new note could not be posted"); database_mail.send (username, subject + ": " + originalSubject, noteCheck); return false; } // Clean the email's body. body = filter_string_extract_body (body); // Post the note. string sessionuser = request->session_logic()->currentUser (); request->session_logic()->setUsername (username); Database_Notes database_notes = Database_Notes(webserver_request); string bible = request->database_config_user()->getBible (); int identifier = database_notes.storeNewNote (bible, book, chapter, verse, summary, body, false); handlerNewNote (identifier); request->session_logic()->setUsername (sessionuser); // Mail confirmation to the username. if (request->database_config_user()->getUserNotifyMeOfMyPosts (username)) { subject = translate("Your new note was posted"); database_mail.send (username, subject + ": " + originalSubject, body); } // Log operation. Database_Logs::log ("New note posted : " + body); // Job done. return true; }
string resource_img (void * webserver_request) { Webserver_Request * request = (Webserver_Request *) webserver_request; Database_ImageResources database_imageresources; string page; Assets_Header header = Assets_Header (translate("Image resources"), request); page = header.run (); Assets_View view; string error, success; int book1, chapter1, verse1, book2, chapter2, verse2; string name = request->query ["name"]; view.set_variable ("name", name); string image = request->query ["image"]; view.set_variable ("image", image); int userid = filter_string_user_identifier (webserver_request); if (request->post.count ("submit")) { vector <string> errors; string book = request->post ["book1"]; book1 = filter_passage_interpret_book (book); if (book1 == 0) errors.push_back (translate ("Unknown starting book.")); chapter1 = convert_to_int (request->post ["chapter1"]); if (chapter1 < 0) errors.push_back (translate ("Negative starting chapter.")); if (chapter1 > 200) errors.push_back (translate ("High starting chapter.")); verse1 = convert_to_int (request->post ["verse1"]); if (chapter1 < 0) errors.push_back (translate ("Negative starting verse.")); if (chapter1 > 200) errors.push_back (translate ("High starting verse.")); book = request->post ["book2"]; book2 = filter_passage_interpret_book (book); if (book2 == 0) errors.push_back (translate ("Unknown ending book.")); chapter2 = convert_to_int (request->post ["chapter2"]); if (chapter2 < 0) errors.push_back (translate ("Negative ending chapter.")); if (chapter2 > 200) errors.push_back (translate ("High ending chapter.")); verse2 = convert_to_int (request->post ["verse2"]); if (chapter2 < 0) errors.push_back (translate ("Negative ending verse.")); if (chapter2 > 200) errors.push_back (translate ("High ending verse.")); int start = filter_passage_to_integer (Passage ("", book1, chapter1, convert_to_string (verse1))); int end = filter_passage_to_integer (Passage ("", book2, chapter2, convert_to_string (verse2))); if (start > end) { errors.push_back (translate ("The starting passage is beyond the ending passage.")); } database_imageresources.assign (name, image, book1, chapter1, verse1, book2, chapter2, verse2); Database_Volatile::setValue (userid, "imageresources", convert_to_string (end)); error = filter_string_implode (errors, " "); if (errors.empty ()) { redirect_browser (request, filter_url_build_http_query (resource_image_url (), "name", name)); return ""; } } // Retrieve passage range for this image. database_imageresources.get (name, image, book1, chapter1, verse1, book2, chapter2, verse2); if ((book1 == 0) || (book2 == 0)) { string end = Database_Volatile::getValue (userid, "imageresources"); Passage passage = filter_integer_to_passage (convert_to_int (end)); book1 = book2 = passage.book; chapter1 = chapter2 = passage.chapter; verse1 = verse2 = convert_to_int (passage.verse); if (book1 == 0) book1 = 1; if (book2 == 0) book2 = 1; } view.set_variable ("book1", Database_Books::getEnglishFromId (book1)); view.set_variable ("chapter1", convert_to_string (chapter1)); view.set_variable ("verse1", convert_to_string (verse1)); view.set_variable ("book2", Database_Books::getEnglishFromId (book2)); view.set_variable ("chapter2", convert_to_string (chapter2)); view.set_variable ("verse2", convert_to_string (verse2)); view.set_variable ("success", success); view.set_variable ("error", error); page += view.render ("resource", "img"); page += Assets_Page::footer (); return page; }