/** * Process the page when its submitted * * @author kuma, salvipascual * @version 1.0 * */ public function processAction() { // get the values from the post $captcha = trim($this->request->getPost('captcha')); $name = trim($this->request->getPost('name')); $inviter = trim($this->request->getPost('email')); $guest = trim($this->request->getPost('guest')); if (!isset($_SESSION['phrase'])) { $_SESSION['phrase'] = uniqid(); } // throw a die() // check all values passed are valid if (strtoupper($captcha) != strtoupper($_SESSION['phrase']) || $name == "" || !filter_var($inviter, FILTER_VALIDATE_EMAIL) || !filter_var($guest, FILTER_VALIDATE_EMAIL)) { die("Error procesando, por favor valla atras y comience nuevamente."); } // params for the response $this->view->name = $name; $this->view->email = $inviter; // create classes needed $connection = new Connection(); $email = new Email(); $utils = new Utils(); $render = new Render(); // do not invite people who are already using Apretaste if ($utils->personExist($guest)) { $this->view->already = true; return $this->dispatcher->forward(array("controller" => "invitar", "action" => "index")); } // send notification to the inviter $response = new Response(); $response->setResponseSubject("Gracias por darle internet a un Cubano"); $response->setEmailLayout("email_simple.tpl"); $response->createFromTemplate("invitationThankYou.tpl", array('num_notifications' => 0)); $response->internal = true; $html = $render->renderHTML(new Service(), $response); $email->sendEmail($inviter, $response->subject, $html); // send invitations to the guest $response = new Response(); $response->setResponseSubject("{$name} le ha invitado a revisar internet desde su email"); $responseContent = array("host" => $name, "guest" => $guest, 'num_notifications' => 0); $response->createFromTemplate("invitation.tpl", $responseContent); $response->internal = true; $html = $render->renderHTML(new Service(), $response); $email->sendEmail($guest, $response->subject, $html); // save all the invitations into the database at the same time $connection->deepQuery("INSERT INTO invitations (email_inviter,email_invited,source) VALUES ('{$inviter}','{$guest}','abroad')"); // redirect to the invite page $this->view->message = true; return $this->dispatcher->forward(array("controller" => "invitar", "action" => "index")); }
public function mainAction() { // inicialize supporting classes $connection = new Connection(); $email = new Email(); $service = new Service(); $service->showAds = false; $render = new Render(); $response = new Response(); $utils = new Utils(); $wwwroot = $this->di->get('path')['root']; // get valid people $people = $connection->deepQuery("\n\t\t\tSELECT email, username, first_name, last_access\n\t\t\tFROM person\n\t\t\tWHERE active=1\n\t\t\tAND email not in (SELECT DISTINCT email FROM delivery_dropped)\n\t\t\tAND DATE(last_access) > DATE('2016-05-01')\n\t\t\tAND email like '%.cu'\n\t\t\tAND email not like '*****@*****.**'"); // send the remarketing $log = ""; foreach ($people as $person) { // get the email address $newEmail = "apretaste+{$person->username}@gmail.com"; // create the variabels to pass to the template $content = array("newemail" => $newEmail, "name" => $person->first_name); // create html response $response->setEmailLayout("email_simple.tpl"); $response->createFromTemplate('newEmail.tpl', $content); $response->internal = true; $html = $render->renderHTML($service, $response); // send the email $email->sendEmail($person->email, "Sorteando las dificultades, un email lleno de alegria", $html); $log .= $person->email . "\n"; } // saving the log $logger = new \Phalcon\Logger\Adapter\File("{$wwwroot}/logs/newemail.log"); $logger->log($log); $logger->close(); }
public function mainAction() { // inicialize supporting classes $timeStart = time(); $connection = new Connection(); $email = new Email(); $service = new Service(); $service->showAds = true; $render = new Render(); $response = new Response(); $utils = new Utils(); $wwwroot = $this->di->get('path')['root']; $log = ""; // people who were invited but never used Apretaste $invitedPeople = $connection->deepQuery("\n\t\t\tSELECT invitation_time, email_inviter, email_invited\n\t\t\tFROM invitations \n\t\t\tWHERE used=0 \n\t\t\tAND DATEDIFF(CURRENT_DATE, invitation_time) > 15 \n\t\t\tAND email_invited NOT IN (SELECT DISTINCT email from delivery_dropped)\n\t\t\tAND email_invited NOT IN (SELECT DISTINCT email from remarketing)\n\t\t\tORDER BY invitation_time DESC\n\t\t\tLIMIT 450"); // send the first remarketing $log .= "\nINVITATIONS (" . count($invitedPeople) . ")\n"; foreach ($invitedPeople as $person) { // check number of days since the invitation was sent $datediff = time() - strtotime($person->invitation_time); $daysSinceInvitation = floor($datediff / (60 * 60 * 24)); // validate old invitations to avoid bounces if ($daysSinceInvitation > 60) { // re-validate the email $res = $utils->deepValidateEmail($person->email_invited); // if response not ok or temporal, delete from invitations list if ($res[0] != "ok" && $res[0] != "temporal") { $connection->deepQuery("DELETE FROM invitations WHERE email_invited = '{$person->email_invited}'"); $log .= "\t --skiping {$person->email_invited}\n"; continue; } } // send data to the template $content = array("date" => $person->invitation_time, "inviter" => $person->email_inviter, "invited" => $person->email_invited, "expires" => strtotime('next month')); // create html response $response->createFromTemplate('pendinginvitation.tpl', $content); $response->internal = true; $html = $render->renderHTML($service, $response); // send the invitation email $subject = "Su amigo {$person->email_inviter} esta esperando por usted!"; $email->sendEmail($person->email_invited, $subject, $html); // insert into remarketing table $connection->deepQuery("INSERT INTO remarketing(email, type) VALUES ('{$person->email_invited}', 'INVITE')"); // display notifications $log .= "\t{$person->email_invited}\n"; } // get final delay $timeEnd = time(); $timeDiff = $timeEnd - $timeStart; // printing log $log .= "EXECUTION TIME: {$timeDiff} seconds\n\n"; echo $log; // saving the log $logger = new \Phalcon\Logger\Adapter\File("{$wwwroot}/logs/remarketing_invitation.log"); $logger->log($log); $logger->close(); // save the status in the database $connection->deepQuery("UPDATE task_status SET executed=CURRENT_TIMESTAMP, delay='{$timeDiff}' WHERE task='invitation'"); }
public function mainAction() { // inicialize supporting classes $timeStart = time(); $connection = new Connection(); $email = new Email(); $service = new Service(); $service->showAds = true; $render = new Render(); $response = new Response(); $utils = new Utils(); $wwwroot = $this->di->get('path')['root']; $log = ""; // people in the list to be automatically invited $people = $connection->deepQuery("\n\t\t\tSELECT * FROM autoinvitations\n\t\t\tWHERE email NOT IN (SELECT email FROM person)\n\t\t\tAND email NOT IN (SELECT DISTINCT email FROM delivery_dropped)\n\t\t\tAND email NOT IN (SELECT DISTINCT email from remarketing)\n\t\t\tAND error=0\n\t\t\tLIMIT 450"); // send the first remarketing $log .= "\nAUTOMATIC INVITATIONS (" . count($people) . ")\n"; foreach ($people as $person) { // if response not ok, check the email as error $res = $utils->deepValidateEmail($person->email); if ($res[0] != "ok") { $connection->deepQuery("UPDATE autoinvitations SET error=1, processed=CURRENT_TIMESTAMP WHERE email='{$person->email}'"); $log .= "\t --skiping {$person->email}\n"; continue; } // create html response $content = array("email" => $person->email); $response->createFromTemplate('autoinvitation.tpl', $content); $response->internal = true; $html = $render->renderHTML($service, $response); // send invitation email $subject = "Dos problemas, y una solucion"; $email->sendEmail($person->email, $subject, $html); // mark as sent $connection->deepQuery("\n\t\t\t\tSTART TRANSACTION;\n\t\t\t\tDELETE FROM autoinvitations WHERE email='{$person->email}';\n\t\t\t\tINSERT INTO remarketing(email, type) VALUES ('{$person->email}', 'AUTOINVITE');\n\t\t\t\tCOMMIT;"); // display notifications $log .= "\t{$person->email}\n"; } // get final delay $timeEnd = time(); $timeDiff = $timeEnd - $timeStart; // printing log $log .= "EXECUTION TIME: {$timeDiff} seconds\n\n"; echo $log; // saving the log $logger = new \Phalcon\Logger\Adapter\File("{$wwwroot}/logs/remarketing_autoinvitation.log"); $logger->log($log); $logger->close(); // save the status in the database $connection->deepQuery("UPDATE task_status SET executed=CURRENT_TIMESTAMP, delay='{$timeDiff}' WHERE task='autoinvitation'"); }
public function mainAction() { // inicialize supporting classes $timeStart = time(); $connection = new Connection(); $email = new Email(); $service = new Service(); $service->showAds = true; $render = new Render(); $response = new Response(); $wwwroot = $this->di->get('path')['root']; $log = ""; // get people who did not finish a survey for the last 3 days $surveys = $connection->deepQuery("\n\t\t\tSELECT A.*, B.title, B.deadline, B.value FROM \n\t\t\t(\n\t\t\t\tSELECT email, survey, \n\t\t\t\tDATEDIFF(CURRENT_DATE, MAX(date_choosen)) as days_since,\n\t\t\t\t(\n\t\t\t\t\tSELECT COUNT(*) \n\t\t\t\t\tFROM _survey_question \n\t\t\t\t\tWHERE _survey_question.survey = _survey_answer_choosen.survey\n\t\t\t\t) as total, \n\t\t\t\tCOUNT(question) as choosen from _survey_answer_choosen GROUP BY email, survey\n\t\t\t) A\n\t\t\tJOIN _survey B\n\t\t\tON A.survey = B.id\n\t\t\tWHERE A.total > A.choosen \n\t\t\tAND A.days_since >= 7\n\t\t\tAND B.active = 1\n\t\t\tAND DATEDIFF(B.deadline, B.date_created) > 0\n\t\t\tAND A.email NOT IN (SELECT DISTINCT email FROM remarketing WHERE type='SURVEY')"); // send emails to users $log .= "\nSURVEY REMARKETING (" . count($surveys) . ")\n"; foreach ($surveys as $survey) { $content = array("survey" => $survey->survey, "days" => $survey->days_since, "missing" => $survey->total - $survey->choosen, "title" => $survey->title, "deadline" => $survey->deadline, "value" => $survey->value); // create html response $response->setResponseSubject("No queremos que pierda \${$survey->value}"); $response->createFromTemplate('surveyReminder.tpl', $content); $response->internal = true; // send email to the person $html = $render->renderHTML($service, $response); $email->sendEmail($survey->email, $response->subject, $html); // add entry to remarketing $connection->deepQuery("INSERT INTO remarketing(email, type) VALUES ('{$survey->email}', 'SURVEY');"); // display notifications $log .= "\t{$survey->email} | surveyID: {$survey->survey} \n"; } // get final delay $timeEnd = time(); $timeDiff = $timeEnd - $timeStart; // printing log $log .= "EXECUTION TIME: {$timeDiff} seconds\n\n"; echo $log; // saving the log $logger = new \Phalcon\Logger\Adapter\File("{$wwwroot}/logs/surveyreminder.log"); $logger->log($log); $logger->close(); // save the status in the database $connection->deepQuery("UPDATE task_status SET executed=CURRENT_TIMESTAMP, delay='{$timeDiff}' WHERE task='survey'"); }
/** * Recovers a pin and create a pin for users with blank pins * * @author salvipascual * @param GET email * @return JSON * */ public function recoverAction() { $email = trim($this->request->get('email')); $utils = new Utils(); $connection = new Connection(); // check if the email exist if (!$utils->personExist($email)) { die('{"code":"error","message":"invalid user"}'); } // get pin from the user $pin = $connection->deepQuery("SELECT pin FROM person WHERE email='{$email}'"); $pin = $pin[0]->pin; // if pin is blank, create it if (empty($pin)) { $pin = mt_rand(1000, 9999); $connection->deepQuery("UPDATE person SET pin='{$pin}' WHERE email='{$email}'"); } // create response to email the new code $subject = "Su codigo de Apretaste"; $response = new Response(); $response->setEmailLayout("email_simple.tpl"); $response->setResponseSubject($subject); $response->createFromTemplate("pinrecover.tpl", array("pin" => $pin)); $response->internal = true; // render the template as html $render = new Render(); $body = $render->renderHTML(new Service(), $response); // email the code to the user $emailSender = new Email(); $emailSender->sendEmail($email, $subject, $body); // return ok response die('{"code":"ok"}'); }
/** * Respond to a request based on the parameters passed * * @author salvipascual * @param String, email * @param String * @param String, email * @param String * @param Array of Objects {type,content,path} * @param Enum: html,json,email * @param String, email * @param String $messageID * */ private function renderResponse($email, $fromEmail, $subject, $sender = "", $body = "", $attachments = array(), $format = "html", $messageID = NULL) { // get the time when the service started executing $execStartTime = date("Y-m-d H:i:s"); // remove double spaces and apostrophes from the subject // sorry apostrophes break the SQL code :-( $subject = trim(preg_replace('/\\s{2,}/', " ", preg_replace('/\'|`/', "", $subject))); // get the name of the service based on the subject line $subjectPieces = explode(" ", $subject); $serviceName = strtolower($subjectPieces[0]); unset($subjectPieces[0]); // check the service requested actually exists $utils = new Utils(); $connection = new Connection(); // select the default service if service does not exist $alias = $serviceName; if (!$utils->serviceExist($serviceName)) { $serviceName = $utils->getDefaultService($fromEmail); } else { if ($serviceName !== $alias) { // increase the counter for alias $connection->deepQuery("UPDATE service_alias SET used = used + 1 WHERE alias = '{$alias}';"); } } // update topics if you are contacting via the secure API if ($serviceName == "secured") { // disregard any footer message and decript new subject $message = trim(explode("--", $body)[0]); $subject = $utils->decript($email, $message); // get the name of the service based on the subject line $subjectPieces = explode(" ", $subject); $serviceName = strtolower($subjectPieces[0]); unset($subjectPieces[0]); // if the service don't exist, throw an error and exit if (!$utils->serviceExist($serviceName)) { error_log("Service {$serviceName} do not exist"); exit; } } // include the service code $wwwroot = $this->di->get('path')['root']; include "{$wwwroot}/services/{$serviceName}/service.php"; // check if a subservice is been invoked $subServiceName = ""; if (isset($subjectPieces[1]) && !preg_match('/\\?|\\(|\\)|\\\\|\\/|\\.|\\$|\\^|\\{|\\}|\\||\\!/', $subjectPieces[1])) { $serviceClassMethods = get_class_methods($serviceName); if (preg_grep("/^_{$subjectPieces[1]}\$/i", $serviceClassMethods)) { $subServiceName = strtolower($subjectPieces[1]); unset($subjectPieces[1]); } } // get the service query $query = implode(" ", $subjectPieces); // create a new Request object $request = new Request(); $request->email = $email; $request->name = $sender; $request->subject = $subject; $request->body = $body; $request->attachments = $attachments; $request->service = $serviceName; $request->subservice = trim($subServiceName); $request->query = trim($query); // get the path to the service $servicePath = $utils->getPathToService($serviceName); // get details of the service if ($this->di->get('environment') == "sandbox") { // get details of the service from the XML file $xml = simplexml_load_file("{$servicePath}/config.xml"); $serviceCreatorEmail = trim((string) $xml->creatorEmail); $serviceDescription = trim((string) $xml->serviceDescription); $serviceCategory = trim((string) $xml->serviceCategory); $serviceUsageText = trim((string) $xml->serviceUsage); $showAds = isset($xml->showAds) && $xml->showAds == 0 ? 0 : 1; $serviceInsertionDate = date("Y/m/d H:m:s"); } else { // get details of the service from the database $sql = "SELECT * FROM service WHERE name = '{$serviceName}'"; $result = $connection->deepQuery($sql); $serviceCreatorEmail = $result[0]->creator_email; $serviceDescription = $result[0]->description; $serviceCategory = $result[0]->category; $serviceUsageText = $result[0]->usage_text; $serviceInsertionDate = $result[0]->insertion_date; $showAds = $result[0]->ads == 1; } // create a new service Object of the user type $userService = new $serviceName(); $userService->serviceName = $serviceName; $userService->serviceDescription = $serviceDescription; $userService->creatorEmail = $serviceCreatorEmail; $userService->serviceCategory = $serviceCategory; $userService->serviceUsage = $serviceUsageText; $userService->insertionDate = $serviceInsertionDate; $userService->pathToService = $servicePath; $userService->showAds = $showAds; $userService->utils = $utils; // run the service and get a response if (empty($subServiceName)) { $response = $userService->_main($request); } else { $subserviceFunction = "_{$subServiceName}"; $response = $userService->{$subserviceFunction}($request); } // a service can return an array of Response or only one. // we always treat the response as an array $responses = is_array($response) ? $response : array($response); // adding extra responses from Utils $extraResponses = Utils::getExtraResponses(); $responses = array_merge($responses, $extraResponses); Utils::clearExtraResponses(); // clean the empty fields in the response foreach ($responses as $rs) { $rs->email = empty($rs->email) ? $email : $rs->email; // check if is first request of the day $requestsToday = $utils->getTotalRequestsTodayOf($rs->email); $stars = 0; if ($requestsToday == 0) { // run the tickets's game // @note: este chequeo se hace despues de verificar si es el primer // correo del dia, para no preguntar chequear mas veces // innecesariamente en el resto del dia $stars = $utils->getRaffleStarsOf($rs->email, false); if ($stars === 4) { // insert 10 tickets for user $sqlValues = "('{$email}', 'GAME')"; $sql = "INSERT INTO ticket(email, origin) VALUES " . str_repeat($sqlValues . ",", 9) . "{$sqlValues};"; $connection->deepQuery($sql); // add notification to user $utils->addNotification($rs->email, "GAME", "Haz ganado 10 tickets para Rifa por utilizar Apretaste durante 5 días seguidos", "RIFA", "IMPORTANT"); } $stars++; } $rs->subject = empty($rs->subject) ? "Respuesta del servicio {$serviceName}" : $rs->subject; $rs->content['num_notifications'] = $utils->getNumberOfNotifications($rs->email); $rs->content['raffle_stars'] = $stars; $rs->content['requests_today'] = $requestsToday; } // create a new render $render = new Render(); // render the template and echo on the screen if ($format == "html") { $html = ""; for ($i = 0; $i < count($responses); $i++) { $html .= "<br/><center><small><b>To:</b> " . $responses[$i]->email . ". <b>Subject:</b> " . $responses[$i]->subject . "</small></center><br/>"; $html .= $render->renderHTML($userService, $responses[$i]); if ($i < count($responses) - 1) { $html .= "<br/><hr/><br/>"; } } $usage = nl2br(str_replace('{APRETASTE_EMAIL}', $utils->getValidEmailAddress(), $serviceUsageText)); $html .= "<br/><hr><center><p><b>XML DEBUG</b></p><small>"; $html .= "<p><b>Owner: </b>{$serviceCreatorEmail}</p>"; $html .= "<p><b>Category: </b>{$serviceCategory}</p>"; $html .= "<p><b>Description: </b>{$serviceDescription}</p>"; $html .= "<p><b>Usage: </b><br/>{$usage}</p></small></center>"; return $html; } // echo the json on the screen if ($format == "json") { return $render->renderJSON($response); } // render the template email it to the user // only save stadistics for email requests if ($format == "email") { // get the person, false if the person does not exist $person = $utils->getPerson($email); // if the person exist in Apretaste if ($person !== false) { // update last access time to current and make person active $connection->deepQuery("UPDATE person SET active=1, last_access=CURRENT_TIMESTAMP WHERE email='{$email}'"); } else { $inviteSource = 'alone'; // alone if the user came by himself, no invitation $sql = "START TRANSACTION;"; // start the long query // check if the person was invited to Apretaste $invites = $connection->deepQuery("SELECT * FROM invitations WHERE email_invited='{$email}' AND used=0 ORDER BY invitation_time DESC"); if (count($invites) > 0) { // check how this user came to know Apretaste, for stadistics $inviteSource = $invites[0]->source; // give prizes to the invitations via service invitar // if more than one person invites X, they all get prizes foreach ($invites as $invite) { switch ($invite->source) { case "internal": // assign tickets and credits $sql .= "INSERT INTO ticket (email, origin) VALUES ('{$invite->email_inviter}', 'RAFFLE');"; $sql .= "UPDATE person SET credit=credit+0.25 WHERE email='{$invite->email_inviter}';"; // email the invitor $newTicket = new Response(); $newTicket->setResponseEmail($invite->email_inviter); $newTicket->setEmailLayout("email_simple.tpl"); $newTicket->setResponseSubject("Ha ganado un ticket para nuestra Rifa"); $newTicket->createFromTemplate("invitationWonTicket.tpl", array("guest" => $email)); $newTicket->internal = true; $responses[] = $newTicket; break; case "abroad": $newGuest = new Response(); $newGuest->setResponseEmail($invite->email_inviter); $newGuest->setResponseSubject("Tu amigo ha atendido tu invitacion"); $inviter = $utils->usernameFromEmail($invite->email_inviter); $pInviter = $utils->getPerson($invite->email_inviter); if (!isset($pInviter->name)) { $pInviter->name = ''; } if ($pInviter !== false) { if (trim($pInviter->name) !== '') { $inviter = $pInviter->name; } } $pGuest = $utils->getPerson($email); $guest = $email; if ($pGuest !== false) { $guest = $pGuest->username; } $newGuest->createFromTemplate("invitationNewGuest.tpl", array("inviter" => $inviter, "guest" => $guest, "guest_email" => $email)); $newGuest->internal = true; $responses[] = $newGuest; break; } } // mark all opened invitations to that email as used $sql .= "UPDATE invitations SET used=1, used_time=CURRENT_TIMESTAMP WHERE email_invited='{$email}' AND used=0;"; } // create a unique username and save the new person $username = $utils->usernameFromEmail($email); $sql .= "INSERT INTO person (email, username, last_access, source) VALUES ('{$email}', '{$username}', CURRENT_TIMESTAMP, '{$inviteSource}');"; // save details of first visit $sql .= "INSERT INTO first_timers (email, source) VALUES ('{$email}', '{$fromEmail}');"; // check list of promotor's emails $promoters = $connection->deepQuery("SELECT email FROM promoters WHERE email='{$fromEmail}' AND active=1;"); $prize = count($promoters) > 0; if ($prize) { // update the promotor $sql .= "UPDATE promoters SET `usage`=`usage`+1, last_usage=CURRENT_TIMESTAMP WHERE email='{$fromEmail}';"; // add credit and tickets $sql .= "UPDATE person SET credit=credit+5, source='promoter' WHERE email='{$email}';"; $sqlValues = "('{$email}', 'PROMOTER')"; $sql .= "INSERT INTO ticket(email, origin) VALUES " . str_repeat($sqlValues . ",", 9) . "{$sqlValues};"; } // run the long query all at the same time $connection->deepQuery($sql . "COMMIT;"); // send the welcome email $welcome = new Response(); $welcome->setResponseEmail($email); $welcome->setEmailLayout("email_simple.tpl"); $welcome->setResponseSubject("Bienvenido a Apretaste!"); $welcome->createFromTemplate("welcome.tpl", array("email" => $email, "prize" => $prize, "source" => $fromEmail)); $welcome->internal = true; $responses[] = $welcome; } // create and configure to send email $emailSender = new Email(); $emailSender->setRespondEmailID($messageID); $emailSender->setEmailGroup($fromEmail); // get params for the email and send the response emails foreach ($responses as $rs) { if ($rs->render) { // save impressions in the database $ads = $rs->getAds(); if ($userService->showAds && !empty($ads)) { $sql = ""; if (!empty($ads[0])) { $sql .= "UPDATE ads SET impresions=impresions+1 WHERE id='{$ads[0]->id}';"; } if (!empty($ads[1])) { $sql .= "UPDATE ads SET impresions=impresions+1 WHERE id='{$ads[1]->id}';"; } $connection->deepQuery($sql); } // prepare the email variable $emailTo = $rs->email; $subject = $rs->subject; $images = $rs->images; $attachments = $rs->attachments; $body = $render->renderHTML($userService, $rs); // remove dangerous characters that may break the SQL code $subject = trim(preg_replace('/\'|`/', "", $subject)); // send the response email $emailSender->sendEmail($emailTo, $subject, $body, $images, $attachments); } } // saves the openning date if the person comes from remarketing $connection->deepQuery("UPDATE remarketing SET opened=CURRENT_TIMESTAMP WHERE opened IS NULL AND email='{$email}'"); // calculate execution time when the service stopped executing $currentTime = new DateTime(); $startedTime = new DateTime($execStartTime); $executionTime = $currentTime->diff($startedTime)->format('%H:%I:%S'); // get the user email domainEmail $emailPieces = explode("@", $email); $domain = $emailPieces[1]; // get the top and bottom Ads $ads = isset($responses[0]->ads) ? $responses[0]->ads : array(); $adTop = isset($ads[0]) ? $ads[0]->id : "NULL"; $adBottom = isset($ads[1]) ? $ads[1]->id : "NULL"; // save the logs on the utilization table $safeQuery = $connection->escape($query); $sql = "INSERT INTO utilization\t(service, subservice, query, requestor, request_time, response_time, domain, ad_top, ad_bottom) VALUES ('{$serviceName}','{$subServiceName}','{$safeQuery}','{$email}','{$execStartTime}','{$executionTime}','{$domain}',{$adTop},{$adBottom})"; $connection->deepQuery($sql); // return positive answer to prove the email was quequed return true; } // false if no action could be taken return false; }
/** * Respond to a request based on the parameters passed * @author salvipascual * */ private function renderResponse($email, $subject, $sender = "", $body = "", $attachments = array(), $format = "html") { // get the name of the service based on the subject line $subjectPieces = explode(" ", $subject); $serviceName = strtolower($subjectPieces[0]); unset($subjectPieces[0]); // get path to the service $utils = new Utils(); $servicePath = $utils->getPathToService($serviceName); // check the service requested exists in the services folder if (!$servicePath) { return "<p>No service \"{$serviceName}\" was found</p>"; } // include the service code include_once "{$servicePath}/service.php"; // check if a subservice is been invoked $subServiceName = ""; if (isset($subjectPieces[1])) { $serviceClassMethods = get_class_methods($serviceName); if (@preg_grep("/^_{$subjectPieces[1]}\$/i", $serviceClassMethods)) { $subServiceName = strtolower($subjectPieces[1]); unset($subjectPieces[1]); } } // get the service query $query = implode(" ", $subjectPieces); // create a new Request object $request = new Request(); $request->email = $email; $request->name = $sender; $request->subject = $subject; $request->body = $body; $request->attachments = $attachments; $request->service = $serviceName; $request->subservice = trim($subServiceName); $request->query = trim($query); // get details of the service from the XML file $xml = simplexml_load_file("{$servicePath}/config.xml"); $serviceCreatorEmail = trim((string) $xml->creatorEmail); $serviceDescription = trim((string) $xml->serviceDescription); $serviceCategory = trim((string) $xml->serviceCategory); $serviceUsageText = trim((string) $xml->serviceUsage); $serviceInsertionDate = date("Y/m/d H:m:s"); // check if the email is valid if (!filter_var($serviceCreatorEmail, FILTER_VALIDATE_EMAIL)) { die("Invalid email {$serviceCreatorEmail}"); } // check if the category is valid $categories = array('negocios', 'ocio', 'academico', 'social', 'comunicaciones', 'informativo', 'adulto', 'otros'); if (!in_array($serviceCategory, $categories)) { die("Invalid category {$serviceCategory}"); } // create a new service Object of the user type $userService = new $serviceName(); $userService->serviceName = $serviceName; $userService->serviceDescription = $serviceDescription; $userService->creatorEmail = $serviceCreatorEmail; $userService->serviceCategory = $serviceCategory; $userService->serviceUsage = $serviceUsageText; $userService->insertionDate = $serviceInsertionDate; $userService->pathToService = $servicePath; $userService->utils = $utils; // run the service and get a response if (empty($subServiceName)) { $response = $userService->_main($request); } else { $subserviceFunction = "_{$subServiceName}"; $response = $userService->{$subserviceFunction}($request); } // a service can return an array of Response or only one. // we always treat the response as an array $responses = is_array($response) ? $response : array($response); // clean the empty fields in the response foreach ($responses as $rs) { $rs->email = empty($rs->email) ? $email : $rs->email; $rs->subject = empty($rs->subject) ? "Respuesta del servicio {$serviceName}" : $rs->subject; } // create a new render $render = new Render(); // render the template and echo on the screen if ($format == "html") { $html = ""; for ($i = 0; $i < count($responses); $i++) { $html .= "<br/><center><small><b>Subject:</b> " . $responses[$i]->subject . "</small></center><br/>"; $html .= $render->renderHTML($userService, $responses[$i]); if ($i < count($responses) - 1) { $html .= "<br/><hr/><br/>"; } } $usage = nl2br(str_replace('{APRETASTE_EMAIL}', $utils->getValidEmailAddress(), $serviceUsageText)); $html .= "<br/><hr><center><p><b>XML DEBUG</b></p><small>"; $html .= "<p><b>Owner: </b>{$serviceCreatorEmail}</p>"; $html .= "<p><b>Category: </b>{$serviceCategory}</p>"; $html .= "<p><b>Description: </b>{$serviceDescription}</p>"; $html .= "<p><b>Usage: </b><br/>{$usage}</p></small></center>"; return $html; } // echo the json on the screen if ($format == "json") { return $render->renderJSON($response); } // false if no action could be taken return false; }
/** * Respond to a request based on the parameters passed * @author salvipascual * */ private function renderResponse($email, $subject, $sender = "", $body = "", $attachments = array(), $format = "html") { // get the time when the service started executing $execStartTime = date("Y-m-d H:i:s"); // get the name of the service based on the subject line $subjectPieces = explode(" ", $subject); $serviceName = strtolower($subjectPieces[0]); unset($subjectPieces[0]); // check the service requested actually exists $utils = new Utils(); if (!$utils->serviceExist($serviceName)) { $serviceName = "ayuda"; } // include the service code $wwwroot = $this->di->get('path')['root']; include "{$wwwroot}/services/{$serviceName}/service.php"; // check if a subservice is been invoked $subServiceName = ""; if (isset($subjectPieces[1])) { $serviceClassMethods = get_class_methods($serviceName); if (preg_grep("/^_{$subjectPieces[1]}\$/i", $serviceClassMethods)) { $subServiceName = strtolower($subjectPieces[1]); unset($subjectPieces[1]); } } // get the service query $query = implode(" ", $subjectPieces); // create a new Request object $request = new Request(); $request->email = $email; $request->name = $sender; $request->subject = $subject; $request->body = $body; $request->attachments = $attachments; $request->service = $serviceName; $request->subservice = trim($subServiceName); $request->query = trim($query); // get details of the service from the database $connection = new Connection(); $sql = "SELECT * FROM service WHERE name = '{$serviceName}'"; $result = $connection->deepQuery($sql); // create a new service Object of the user type $userService = new $serviceName(); $userService->serviceName = $serviceName; $userService->serviceDescription = $result[0]->description; $userService->creatorEmail = $result[0]->creator_email; $userService->serviceCategory = $result[0]->category; $userService->serviceUsage = $result[0]->usage_text; $userService->insertionDate = $result[0]->insertion_date; $userService->pathToService = $utils->getPathToService($serviceName); $userService->utils = $utils; // run the service and get a response if (empty($subServiceName)) { $response = $userService->_main($request); } else { $subserviceFunction = "_{$subServiceName}"; $response = $userService->{$subserviceFunction}($request); } // a service can return an array of Response or only one. // we always treat the response as an array $responses = is_array($response) ? $response : array($response); // clean the empty fields in the response foreach ($responses as $rs) { $rs->email = empty($rs->email) ? $email : $rs->email; $rs->subject = empty($rs->subject) ? "Respuesta del servicio {$serviceName}" : $rs->subject; } // create a new render $render = new Render(); // render the template and echo on the screen if ($format == "html") { $html = ""; for ($i = 0; $i < count($responses); $i++) { $html .= "<br/><center><small><b>To:</b> " . $responses[$i]->email . ". <b>Subject:</b> " . $responses[$i]->subject . "</small></center><br/>"; $html .= $render->renderHTML($userService, $responses[$i]); if ($i < count($responses) - 1) { $html .= "<br/><hr/><br/>"; } } return $html; } // echo the json on the screen if ($format == "json") { return $render->renderJSON($response); } // render the template email it to the user // only save stadistics for email requests if ($format == "email") { $emailSender = new Email(); // get params for the email and send the response emails foreach ($responses as $rs) { if ($rs->render) { $emailTo = $rs->email; $subject = $rs->subject; $images = array_merge($rs->images, $rs->getAds()); $attachments = $rs->attachments; $body = $render->renderHTML($userService, $rs); $emailSender->sendEmail($emailTo, $subject, $body, $images, $attachments); } } // get the person, false if the person does not exist $person = $utils->getPerson($email); // if the person exist in Apretate if ($person) { // if the person is inactive and he/she is not trying to opt-out if (!$person->active && $serviceName != "excluyeme") { // make the person active again $sql = "UPDATE person SET active=1 WHERE email='{$email}'"; $connection->deepQuery($sql); // add to the email list in Mail Lite $utils->subscribeToEmailList($email); } } else { // save the new Person $sql = "INSERT INTO person (email) VALUES ('{$email}')"; $connection->deepQuery($sql); // check if the person was invited to use Apretaste $sql = "SELECT * FROM invitations WHERE email_invited = '{$email}' AND used='0'"; $invitations = $connection->deepQuery($sql); if (count($invitations) > 0) { // create tickets for all the invitors. When a person // is invited by more than one person, they all get tickets $sql = "START TRANSACTION;"; foreach ($invitations as $invite) { // create the query $sql .= "INSERT INTO ticket (email, paid) VALUES ('{$invite->email_inviter}', 0);"; $sql .= "UPDATE person SET credit=credit+0.25 WHERE email='{$invite->email_inviter}';"; $sql .= "UPDATE invitations SET used='1' WHERE invitation_id = '{$invite->invitation_id}';"; // email the invitor $body = "<h1>Nuevo ticket para nuestra Rifa</h1><p>Su contacto {$invite->email_invited} ha usado Apretaste por primera vez gracias a su invitación, por lo cual hemos agregado a su perfil un ticket para nuestra rifa y 25¢ en crédito de Apretaste.</p><p>Muchas gracias por invitar a sus amigos, y gracias por usar Apretaste</p>"; $emailSender->sendEmail($invite->email_inviter, "Ha ganado un ticket para nuestra Rifa", $body); } $sql .= "COMMIT;"; $connection->deepQuery($sql); } // add to the email list in Mail Lite $utils->subscribeToEmailList($email); } // calculate execution time when the service stopped executing $currentTime = new DateTime(); $startedTime = new DateTime($execStartTime); $executionTime = $currentTime->diff($startedTime)->format('%H:%I:%S'); // get the user email domainEmail $emailPieces = explode("@", $email); $domain = $emailPieces[1]; // save the logs on the utilization table $sql = "INSERT INTO utilization\t(service, subservice, query, requestor, request_time, response_time, domain, ad_top, ad_botton) VALUES ('{$serviceName}','{$subServiceName}','{$query}','{$email}','{$execStartTime}','{$executionTime}','{$domain}','','')"; $connection->deepQuery($sql); // return positive answer to prove the email was quequed return true; } // false if no action could be taken return false; }
public function mainAction() { // inicialize supporting classes $timeStart = time(); $connection = new Connection(); $email = new Email(); $service = new Service(); $service->showAds = true; $render = new Render(); $response = new Response(); $utils = new Utils(); $wwwroot = $this->di->get('path')['root']; $log = ""; // list and total of services $services = $connection->deepQuery("SELECT name, description FROM service WHERE name <> 'ayuda' AND name <> 'terminos' AND name <> 'excluyeme' AND listed = 1;"); $arr = array(); foreach ($services as $servicex) { $arr[$servicex->name] = $servicex; } $services = $arr; $total_services = count($services); // users by service $sql_users_by_service = "SELECT requestor, service FROM utilization WHERE service <> 'rememberme' GROUP BY requestor, service"; // usage of services $sql_usage = "SELECT requestor, count(service) as part, {$total_services} as total FROM ({$sql_users_by_service}) subq1 GROUP BY requestor, total"; // filtering by less usage $sql_less_usage = "SELECT requestor as email, (SELECT sent FROM remarketing WHERE remarketing.email = subq2.requestor ORDER BY sent DESC LIMIT 1) as last_remarketing FROM ({$sql_usage}) subq2 WHERE part/total <= 0.2 "; // filtering by last remarketing (one by month) $sql = "SELECT email FROM ({$sql_less_usage}) subq3 WHERE datediff(CURRENT_DATE, last_remarketing) > 30 or datediff(CURRENT_DATE, last_remarketing) is null group by email"; $users = $connection->deepQuery("{$sql};"); // send the remarketing $log .= "\nLESS USAGE REMARKETING (" . count($users) . ")\n"; foreach ($users as $person) { // all services $his_services = $services; // getting services used by user $services_of_user = $connection->deepQuery("SELECT service as name FROM ({$sql_users_by_service}) subq1 WHERE requestor = '{$person->email}';"); // remove services used by user from the list foreach ($services_of_user as $servicex) { if (isset($his_services[$servicex->name])) { unset($his_services[$servicex->name]); } } // create the variabels to pass to the template $content = array("services" => $his_services); // create html response $response->createFromTemplate('lessusage.tpl', $content); $response->internal = true; $html = $render->renderHTML($service, $response); // move remarketing to the next state and add $1 to his/her account $email->sendEmail($person->email, "Lo que te estas perdiendo en Apretaste", $html); // move remarketing to the next state and add +1 credits $connection->deepQuery("INSERT INTO remarketing(email, type) VALUES ('{$person->email}', 'LESSUSAGE');"); // display notifications $log .= "\t{$person->email}\n"; } // get final delay $timeEnd = time(); $timeDiff = $timeEnd - $timeStart; // printing log $log .= "EXECUTION TIME: {$timeDiff} seconds\n\n"; echo $log; // saving the log $logger = new \Phalcon\Logger\Adapter\File("{$wwwroot}/logs/lessusage.log"); $logger->log($log); $logger->close(); // save the status in the database $connection->deepQuery("UPDATE task_status SET executed=CURRENT_TIMESTAMP, delay='{$timeDiff}' WHERE task='lessusage'"); }
public function mainAction() { // inicialize supporting classes $timeStart = time(); $connection = new Connection(); $email = new Email(); $service = new Service(); $service->showAds = true; $render = new Render(); $response = new Response(); $utils = new Utils(); $wwwroot = $this->di->get('path')['root']; $log = ""; /* * FIRST REMINDER * */ // people missed for the last 30 days and with no remarketing emails unopened $firstReminderPeople = $connection->deepQuery("\n\t\t\tSELECT email, last_access \n\t\t\tFROM person \n\t\t\tWHERE active=1 \n\t\t\tAND IFNULL(DATEDIFF(CURRENT_DATE, last_access),99) > 30 \n\t\t\tAND email not in (SELECT DISTINCT email FROM remarketing WHERE opened IS NULL)\n\t\t\tORDER BY insertion_date ASC\n\t\t\tLIMIT 200"); // send the remarketing $log .= "\nFIRST REMINDER (" . count($firstReminderPeople) . ")\n"; foreach ($firstReminderPeople as $person) { // check number of days since the email was last checked $datediff = time() - strtotime($person->last_access); $daysSinceLastChecked = floor($datediff / (60 * 60 * 24)); // validate old emails to avoid bounces if ($daysSinceLastChecked > 60) { // re-validate the email $res = $utils->deepValidateEmail($person->email); // keep it for later if it was temporal if ($res[0] == "temporal") { $log .= "\t --skiping {$person->email}\n"; continue; } // for other than ok, unsubscribe and do not email if ($res[0] != "ok") { $utils->unsubscribeFromEmailList($person->email); $connection->deepQuery("UPDATE person SET active=0 WHERE email='{$person->email}'"); $log .= "\t --skiping {$person->email}\n"; continue; } } // get services that changed since last time $sql = "SELECT * FROM service WHERE insertion_date BETWEEN '{$person->last_access}' AND CURRENT_TIMESTAMP AND listed=1"; $services = $connection->deepQuery($sql); // create the variabels to pass to the template $content = array("services" => $services); $images = array("{$wwwroot}/public/images/missyou.jpg"); // create html response $response->createFromTemplate('remindme1.tpl', $content, $images); $response->internal = true; $html = $render->renderHTML($service, $response); // move remarketing to the next state and add $1 to his/her account $email->sendEmail($person->email, "Se le extranna por Apretaste", $html, $images); // move remarketing to the next state and add +1 credits $connection->deepQuery("\n\t\t\t\tSTART TRANSACTION;\n\t\t\t\tUPDATE person SET credit=credit+1 WHERE email='{$person->email}';\r\n\t\t\t\tINSERT INTO remarketing(email, type) VALUES ('{$person->email}', 'REMINDER1');\n\t\t\t\tCOMMIT;"); // display notifications $log .= "\t{$person->email}\n"; } /* * SECOND REMINDER * */ // people with REMINDER1 unaswered for the last 30 days, and without REMINDER2 created $secondReminderPeople = $connection->deepQuery("\n\t\t\tSELECT email\n\t\t\tFROM remarketing A\n\t\t\tWHERE type='REMINDER1'\n\t\t\tAND opened IS NULL\n\t\t\tAND DATEDIFF(CURRENT_DATE, sent) > 30\n\t\t\tAND (SELECT COUNT(email) FROM remarketing WHERE type='REMINDER2' AND opened IS NULL AND email=A.email)=0"); // send the remarketing $log .= "SECOND REMINDER (" . count($secondReminderPeople) . ")\n"; foreach ($secondReminderPeople as $person) { // create html response $response->createFromTemplate('remindme2.tpl', array()); $response->internal = true; $html = $render->renderHTML($service, $response); // send email to the $person->email $email->sendEmail($person->email, "Hace rato no le veo", $html); // move remarketing to the next state and add +1 credits $connection->deepQuery("\r\n\t\t\t\tSTART TRANSACTION;\r\n\t\t\t\tUPDATE person SET credit=credit+1 WHERE email='{$person->email}';\n\t\t\t\tINSERT INTO remarketing(email, type) VALUES ('{$person->email}', 'REMINDER2');\r\n\t\t\t\tCOMMIT;"); // display notifications $log .= "\t{$person->email}\n"; } /* * EXCLUDE * */ // people with REMINDER2 unaswered, sent 30 days ago and not EXCLUDED $thirdReminderPeople = $connection->deepQuery("\n\t\t\tSELECT email\n\t\t\tFROM remarketing A\n\t\t\tWHERE type='REMINDER2'\n\t\t\tAND opened IS NULL\n\t\t\tAND DATEDIFF(CURRENT_DATE, sent) > 30\n\t\t\tAND (SELECT COUNT(email) from remarketing WHERE type='EXCLUDED' AND opened IS NULL AND email=A.email)=0"); // unsubcribe people $log .= "UNSUSCRIBING (" . count($thirdReminderPeople) . ")\n"; foreach ($thirdReminderPeople as $person) { // unsubscribe person $utils->unsubscribeFromEmailList($person->email); // move remarketing to the next state and unsubscribe $connection->deepQuery("\r\n\t\t\t\tSTART TRANSACTION;\r\n\t\t\t\tUPDATE person SET active=0 WHERE email='{$person->email}';\n\t\t\t\tINSERT INTO remarketing(email, type) VALUES ('{$person->email}', 'EXCLUDED');\r\n\t\t\t\tCOMMIT;"); // display notifications $log .= "\t{$person->email}\n"; } // get final delay $timeEnd = time(); $timeDiff = $timeEnd - $timeStart; // printing log $log .= "EXECUTION TIME: {$timeDiff} seconds\n\n"; echo $log; // saving the log $logger = new \Phalcon\Logger\Adapter\File("{$wwwroot}/logs/remarketing.log"); $logger->log($log); $logger->close(); // save the status in the database $connection->deepQuery("UPDATE task_status SET executed=CURRENT_TIMESTAMP, delay='{$timeDiff}' WHERE task='remarketing'"); }