Your IP : 216.73.216.41


Current Path : /home/purehotels/public_html/administrator/components/com_acymailing/helpers/
Upload File :
Current File : /home/purehotels/public_html/administrator/components/com_acymailing/helpers/cron.php

<?php
/**
 * @package	AcyMailing for Joomla!
 * @version	5.2.0
 * @author	acyba.com
 * @copyright	(C) 2009-2016 ACYBA S.A.R.L. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */
defined('_JEXEC') or die('Restricted access');
?><?php

class acycronHelper{

	var $report = false;
	var $messages = array();
	var $detailMessages = array();
	var $processed = false;
	var $executed = false;
	var $mainmessage = '';
	var $errorDetected = false;
	var $skip = array();
	var $emailtypes = array();

	function cron(){


		$time = time();
		$config = acymailing_config();

		$firstMessage = JText::sprintf('ACY_CRON_TRIGGERED', acymailing_getDate(time()));
		$this->messages[] = $firstMessage;
		if($this->report){
			acymailing_display($firstMessage, 'info');
		}

		if($config->get('cron_next') > $time){

			if($config->get('cron_next') > ($time + $config->get('cron_frequency'))){
				$newConfig = new stdClass();
				$newConfig->cron_next = $time + $config->get('cron_frequency');
				$config->save($newConfig);
			}

			$nottime = JText::sprintf('CRON_NEXT', acymailing_getDate($config->get('cron_next')));
			$this->messages[] = $nottime;
			if($this->report){
				acymailing_display($nottime, 'info');
			}
			return false;
		}

		JPluginHelper::importPlugin('acymailing');
		$dispatcher = JDispatcher::getInstance();

		$queueHelper = acymailing_get('helper.queue');

		$this->executed = true;

		$newConfig = new stdClass();
		$newConfig->cron_next = $config->get('cron_next') + $config->get('cron_frequency');
		if($newConfig->cron_next <= $time OR $newConfig->cron_next > $time + $config->get('cron_frequency')) $newConfig->cron_next = $time + $config->get('cron_frequency');

		$newConfig->cron_last = $time;
		$userHelper = acymailing_get('helper.user');
		$newConfig->cron_fromip = $userHelper->getIP();

		$config->save($newConfig);

		if($config->get('queue_type') != 'manual' && !in_array('send', $this->skip)){
			$queueHelper->send_limit = (int)$config->get('queue_nbmail_auto');
			$queueHelper->report = false;
			$queueHelper->emailtypes = $this->emailtypes;
			$queueHelper->process();
			if(!empty($queueHelper->messages)){
				$this->detailMessages = array_merge($this->detailMessages, $queueHelper->messages);
			}
			if(!empty($queueHelper->nbprocess)) $this->processed = true;
			$this->mainmessage = JText::sprintf('ACY_CRON_PROCESS', $queueHelper->nbprocess, $queueHelper->successSend, $queueHelper->errorSend);
			$this->messages[] = $this->mainmessage;

			if(!empty($queueHelper->errorSend)) $this->errorDetected = true;
			if(!empty($queueHelper->stoptime) AND time() > $queueHelper->stoptime) return true;
		}

		if(acymailing_level(2) && !in_array('autonews', $this->skip)){
			$autonewsHelper = acymailing_get('helper.autonews');
			$resultAutonews = $autonewsHelper->generate();
			if(!empty($autonewsHelper->messages)){
				$this->messages = array_merge($this->messages, $autonewsHelper->messages);
				$this->processed = true;
			}

			if(!empty($queueHelper->stoptime) AND time() > $queueHelper->stoptime) return true;
		}

		if(!in_array('schedule', $this->skip)){
			$schedHelper = acymailing_get('helper.schedule');
			$resultSchedule = $schedHelper->queueScheduled();
			if($resultSchedule){
				if(!empty($schedHelper->nbNewsletterScheduled)) $this->messages[] = JText::sprintf('NB_SCHED_NEWS', $schedHelper->nbNewsletterScheduled);
				$this->detailMessages = array_merge($this->detailMessages, $schedHelper->messages);
				$this->processed = true;
			}
		}

		if(!empty($queueHelper->stoptime) AND time() > $queueHelper->stoptime) return true;

		$startQueue = JRequest::getInt('startqueue', 0); // Add security to avoid multiple trigger of the final send
		if(!in_array('abtesting', $this->skip) && acymailing_level(3) && $startQueue == 0){
			$currentAbTests = $config->get('currentABTests', '');
			$currentData = unserialize($currentAbTests);
			if(!empty($currentData)){
				$valueToDelete = '';
				foreach($currentData as $key => $oneTest){
					if($oneTest->sendDate < time()){
						$mailClass = acymailing_get('class.mail');
						$newMailid = $mailClass->updateAbTest_auto($oneTest->ids);
						if(!empty($newMailid)){
							$valueToDelete = $key;
							break;
						}
					}
				}
				if(is_numeric($valueToDelete) && !empty($currentData[$valueToDelete])){
					unset($currentData[$valueToDelete]);
					$newconfig = new stdClass();
					$newconfig->currentABTests = serialize($currentData);
					$config->save($newconfig);
					$this->messages[] = JText::_('ABTESTING').': '.JText::sprintf('ABTESTING_FINALSEND', $newMailid);
					$this->processed = true;
				}
			}
		}

		if(!in_array('plugins', $this->skip) && $config->get('cron_plugins_next') < $time){
			$newConfig = new stdClass();
			$newConfig->cron_plugins_next = $config->get('cron_plugins_next', 0) + 86400;
			if($newConfig->cron_plugins_next <= $time) $newConfig->cron_plugins_next = $time + 86400;
			$config->save($newConfig);

			$resultsTrigger = $dispatcher->trigger('onAcyCronTrigger');
			if(!empty($resultsTrigger)){
				$this->processed = true;
				$this->messages = array_merge($this->messages, $resultsTrigger);
			}

			if(acymailing_level(3) && !in_array('filters', $this->skip)){
				$filterClass = acymailing_get('class.filter');
				$filterClass->trigger('daycron');
				if(!empty($filterClass->report)){
					$this->processed = true;
					$this->messages = array_merge($this->messages, $filterClass->report);
				}
			}

			if(date('w') == 0){
				$this->cleanStats();
			}

			if(!empty($queueHelper->stoptime) AND time() > $queueHelper->stoptime) return true;
		}

		if(!in_array('bounce', $this->skip) && acymailing_level(3) && $config->get('auto_bounce', 0) && $time > (int)$config->get('auto_bounce_next', 0) && (empty($queueHelper->stoptime) || time() < $queueHelper->stoptime - 5)){
			$newConfig = new stdClass();
			$newConfig->auto_bounce_next = $time + (int)$config->get('auto_bounce_frequency', 0);
			$newConfig->auto_bounce_last = $time;
			$config->save($newConfig);
			$bounceClass = acymailing_get('helper.bounce');
			$bounceClass->report = false;
			$bounceClass->stoptime = $queueHelper->stoptime;
			$newConfig = new stdClass();
			if($bounceClass->init() && $bounceClass->connect()){
				$nbMessages = $bounceClass->getNBMessages();
				$this->messages[] = JText::sprintf('NB_MAIL_MAILBOX', $nbMessages);
				$newConfig->auto_bounce_report = JText::sprintf('NB_MAIL_MAILBOX', $nbMessages);
				$this->detailMessages[] = JText::sprintf('NB_MAIL_MAILBOX', $nbMessages);
				if(!empty($nbMessages)){
					$bounceClass->handleMessages();
					$bounceClass->close();
					$this->processed = true;
				}
				$this->detailMessages = array_merge($this->detailMessages, $bounceClass->messages);
			}else{
				$bounceErrors = $bounceClass->getErrors();
				$newConfig->auto_bounce_report = implode('<br />', $bounceErrors);
				if(!empty($bounceErrors[0])) $bounceErrors[0] = JText::_('BOUNCE_HANDLING').' : '.$bounceErrors[0];
				$this->messages = array_merge($this->messages, $bounceErrors);
				$this->processed = true;
				$this->errorDetected = true;
			}
			$config->save($newConfig);
			if(!empty($queueHelper->stoptime) AND time() > $queueHelper->stoptime) return true;
		}

		if(!in_array('filters', $this->skip) && acymailing_level(3)){

			$resultsTrigger = $dispatcher->trigger('onAcyEveryCronTrigger');
			if(!empty($resultsTrigger)){
				$this->processed = true;
				$this->messages = array_merge($this->messages, $resultsTrigger);
			}


			$filterClass = acymailing_get('class.filter');
			$filterClass->trigger('allcron');
			if(!empty($filterClass->report)){
				if($filterClass->didAnAction) $this->processed = true;
				$this->messages = array_merge($this->messages, $filterClass->report);
			}
		}

		if(!in_array('actions', $this->skip) && acymailing_level(3) && (empty($queueHelper->stoptime) || time() < $queueHelper->stoptime - 5)){
			$db = JFactory::getDBO();
			$db->setQuery('SELECT action_id FROM #__acymailing_action WHERE published = 1 AND actions != '.$db->quote('[{"type":"none"}]').' AND nextdate < '.time().' ORDER BY ordering ASC');
			$actions = acymailing_loadResultArray($db);
			if(!empty($actions)){
				$actionClass = acymailing_get('class.action');
				$bounceHelper = acymailing_get('helper.bounce');
				$bounceHelper->report = false;
				$bounceHelper->stoptime = $queueHelper->stoptime;

				foreach($actions as $oneActionId){
					$bounceHelper->messages = array();
					$currentAction = $actionClass->get($oneActionId);
					$bounceHelper->action = $currentAction;
					if($bounceHelper->init() && $bounceHelper->connect()){
						$nbMessages = $bounceHelper->getNBMessages();
						$this->messages[] = JText::sprintf('NB_MAIL_MAILBOX', $nbMessages);
						$newConfig->auto_bounce_report = JText::sprintf('NB_MAIL_MAILBOX', $nbMessages);
						$this->detailMessages[] = JText::sprintf('NB_MAIL_MAILBOX', $nbMessages);
						if(!empty($nbMessages)){
							$bounceHelper->handleAction();
							$bounceHelper->close();
							$this->processed = true;
						}
						$this->detailMessages = array_merge($this->detailMessages, $bounceHelper->messages);
						$currentReport = implode("\n", $bounceHelper->messages);
					}else{
						$connectErrors = $bounceHelper->getErrors();
						$currentReport = implode("\n", $connectErrors);

						if(!empty($connectErrors[0])) $connectErrors[0] = JText::_('ACY_DISTRIBUTION').' : '.$connectErrors[0];
						$this->messages = array_merge($this->messages, $connectErrors);
						$this->processed = true;
						$this->errorDetected = true;
					}

					$currentAction->report = $currentReport;
					$currentAction->nextdate = time() + intval($currentAction->frequency);
					unset($currentAction->creatorname, $currentAction->email, $currentAction->creatorusername);
					$actionClass->save($currentAction);
				}
			}

			if(!empty($queueHelper->stoptime) AND time() > $queueHelper->stoptime) return true;
		}

		return true;
	}

	function report(){

		$config = acymailing_config();

		$sendreport = $config->get('cron_sendreport');
		$mailer = acymailing_get('helper.mailer');

		if(($sendreport == 2 && $this->processed) || $sendreport == 1 || ($sendreport == 3 && $this->errorDetected)){
			$mailer->report = false;
			$mailer->autoAddUser = true;
			$mailer->checkConfirmField = false;
			$mailer->addParam('report', implode('<br />', $this->messages));
			$mailer->addParam('mainreport', $this->mainmessage);
			$mailer->addParam('detailreport', implode('<br />', $this->detailMessages));
			$receiverString = $config->get('cron_sendto');
			$receivers = array();
			if(substr_count($receiverString, '@') > 1){
				$receivers = explode(' ', trim(preg_replace('# +#', ' ', str_replace(array(';', ','), ' ', $receiverString))));
			}else{
				$receivers[] = trim($receiverString);
			}
			if(!empty($receivers)){
				foreach($receivers as $oneReceiver){
					$mailer->sendOne('report', $oneReceiver);
				}
			}
		}

		if(!$this->executed) return;

		if($this->processed) $this->saveReport();

		$newConfig = new stdClass();
		$newConfig->cron_report = implode("\n", $this->messages);
		if(strlen($newConfig->cron_report) > 800) $newConfig->cron_report = substr($newConfig->cron_report, 0, 795).'...';
		$config->save($newConfig);
	}

	function saveReport(){
		$config = acymailing_config();
		$saveReport = $config->get('cron_savereport');
		if(empty($saveReport)) return;

		$reportPath = JPath::clean(ACYMAILING_ROOT.trim(html_entity_decode($config->get('cron_savepath'))));
		acymailing_createDir(dirname($reportPath), true, true);

		ob_start();
		file_put_contents($reportPath, "\r\n"."\r\n".str_repeat('*', 150)."\r\n".str_repeat('*', 20).str_repeat(' ', 5).acymailing_getDate(time()).str_repeat(' ', 5).str_repeat('*', 20)."\r\n".implode("\r\n", $this->messages), FILE_APPEND);
		if($saveReport == 2 AND !empty($this->detailMessages)){
			@file_put_contents($reportPath, "\r\n"."---- Details ----"."\r\n".implode("\r\n", $this->detailMessages), FILE_APPEND);
		}
		$potentialWarnings = ob_get_clean();

		if(!empty($potentialWarnings)) $this->messages[] = $potentialWarnings;
	}

	function cleanStats(){
		$config = acymailing_config();

		if($config->get('lastclean') > (time() - 518400)) return;

		$newConfig = new stdClass();
		$newConfig->lastclean = time();
		$config->save($newConfig);

		$detailedStatsFrequ = intval($config->get('delete_stats'));
		$historyFrequ = intval($config->get('delete_history'));
		$db = JFactory::getDBO();
		if(!empty($detailedStatsFrequ)){
			$db->setQuery('DELETE FROM `#__acymailing_userstats` WHERE `senddate` <= '.(time() - $detailedStatsFrequ));
			$db->query();

			$db->setQuery('DELETE FROM `#__acymailing_urlclick` WHERE `date` <= '.(time() - $detailedStatsFrequ));
			$db->query();
		}

		if(!empty($historyFrequ)){
			$db->setQuery('DELETE FROM `#__acymailing_history` WHERE `date` <= '.(time() - $historyFrequ));
			$db->query();
		}



		if((int)date('j') > 23){
			$db->setQuery('OPTIMIZE TABLE `#__acymailing_history`');
			$db->query();
		}elseif((int)date('j') > 16){
			$db->setQuery('OPTIMIZE TABLE `#__acymailing_userstats`');
			$db->query();
		}elseif((int)date('j') > 9){
			$db->setQuery('OPTIMIZE TABLE `#__acymailing_urlclick`');
			$db->query();
		}elseif((int)date('j') < 8){
			$db->setQuery('OPTIMIZE TABLE `#__acymailing_queue`');
			$db->query();
		}

		$message = array(JText::_('ACY_CRON_CLEAN'));
		$this->detailMessages = array_merge($this->detailMessages, $message);
	}

}//endclass