Files
phpbb_football_tlw/cron/task/football_remember.php
2016-06-12 16:40:06 +02:00

334 lines
12 KiB
PHP

<?php
/**
*
* @package phpBB Extension - Football Football
* @copyright (c) 2016 football (http://football.bplaced.net)
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
namespace football\football\cron\task;
class football_remember extends \phpbb\cron\task\base
{
/* @var string phpBB root path */
protected $root_path;
/* @var string phpEx */
protected $php_ext;
/* @var \phpbb\extension\manager */
protected $phpbb_extension_manager;
/* @var \phpbb\path_helper */
protected $phpbb_path_helper;
/* @var \phpbb\db\driver\driver_interface */
protected $db;
/* @var \phpbb\config\config */
protected $config;
/* @var \phpbb\log\log_interface */
protected $log;
/* @var \phpbb\user */
protected $user;
/**
* Constructor
*
* @param string $root_path
* @param string $php_ext
* @param \phpbb\extension\manager $phpbb_extension_manager
* @param \phpbb\path_helper $phpbb_path_helper
* @param \phpbb\db\driver\driver_interfacer $db
* @param \phpbb\config\config $config
* @param \phpbb\log\log_interface $log
* @param \phpbb\user $user
*/
public function __construct($root_path, $php_ext, \phpbb\extension\manager $phpbb_extension_manager, \phpbb\path_helper $phpbb_path_helper, \phpbb\db\driver\driver_interface $db, \phpbb\config\config $config, \phpbb\log\log_interface $log, \phpbb\user $user)
{
$this->root_path = $root_path;
$this->php_ext = $php_ext;
$this->phpbb_extension_manager = $phpbb_extension_manager;
$this->phpbb_path_helper = $phpbb_path_helper;
$this->db = $db;
$this->config = $config;
$this->phpbb_log = $log;
$this->user = $user;
}
/**
* Runs this cron task.
*
* @return null
*/
public function run()
{
global $request;
$ext_path = $this->phpbb_path_helper->update_web_root_path($this->phpbb_extension_manager->get_extension_path('football/football', true));
include($ext_path . 'includes/functions.' . $this->php_ext);
include($ext_path . 'includes/constants.' . $this->php_ext);
// Load extension language file
$this->user->add_lang_ext('football/football', 'info_acp_football');
// mode=test ?
$mode = $request->variable('mode', '');
$days = $request->variable('days', 0);
//Mail Settings
$use_queue = false;
$used_method = NOTIFY_EMAIL;
$priority = MAIL_NORMAL_PRIORITY;
$season = curr_season();
//Matchdays to close in 24 hours and 24 hours later
// shift days to test
$local_board_time = time() + ($days * 86400);
if ($mode <> 'test')
{
// Update next run
$run_time = getdate($this->config['football_remember_next_run']);
$next_run = mktime($run_time['hours'], $run_time['minutes'], 0, date("n"), date("j") + 1, date("Y"));
$this->config->set('football_remember_next_run', $next_run, true);
}
else
{
$message = sprintf($this->user->lang['LOG_FOOTBALL_MSG_TEST' . (($days == 0) ? '' : '_TRAVEL')], date("d.m.Y H:i", $local_board_time));
$this->phpbb_log->add('admin', ANONYMOUS, '', 'LOG_FOOTBALL_REMEMBER_CRON_TEST', false, array($message));
}
$sql = 'SELECT
m.*,
l.*
FROM ' . FOOTB_MATCHDAYS . ' AS m
LEFT JOIN ' . FOOTB_LEAGUES . " AS l ON (l.season = m.season AND l.league = m.league)
WHERE m.season >= $season AND m.status = 0
AND (DATE_SUB(m.delivery_date, INTERVAL '1 23:59' DAY_MINUTE) < FROM_UNIXTIME('$local_board_time'))
AND (DATE_SUB(m.delivery_date, INTERVAL '1 00:00' DAY_MINUTE) > FROM_UNIXTIME('$local_board_time'))";
$result = $this->db->sql_query($sql);
$toclose = $this->db->sql_fetchrowset($result);
$this->db->sql_freeresult($result);
// If we found matchdays to close, search missing bets and mail them
foreach ($toclose as $close)
{
// prepare some variables
$first_mail = true;
$season = $close['season'];
$league = $close['league'];
$league_name = $close['league_name'];
$league_short = $close['league_name_short'];
$delivery = $close['delivery_date'];
$matchday = $close['matchday'];
$subject = sprintf($this->user->lang['FOOTBALL_REMEMBER_SUBJECT'], $league_short, $matchday);
$usernames = '';
// find missing users
$sql = 'SELECT
u.user_email AS user_email,
u.username AS username,
u.user_id AS userid,
u.user_lang
FROM ' . FOOTB_MATCHES . ' AS m
LEFT JOIN ' . FOOTB_LEAGUES . ' AS l ON (l.season = m.season AND l.league = m.league)
LEFT JOIN ' . FOOTB_BETS . ' AS b ON (b.season = m.season AND b.league = m.league AND b.match_no = m.match_no)
LEFT JOIN ' . PROFILE_FIELDS_DATA_TABLE. ' AS p ON p.user_id = b.user_id
LEFT JOIN ' . USERS_TABLE. " AS u ON u.user_id = b.user_id
WHERE m.season = $season AND m.league = $league AND m.matchday = $matchday
AND ((b.goals_home = '') OR (b.goals_guest = ''))
AND m.status = 0 AND p.pf_footb_rem_f = 1
AND (l.bet_in_time = 0 OR
(l.bet_in_time = 1
AND (DATE_SUB(m.match_datetime, INTERVAL '1 23:59' DAY_MINUTE) < FROM_UNIXTIME('$local_board_time'))
AND (DATE_SUB(m.match_datetime, INTERVAL '1 00:00' DAY_MINUTE) > FROM_UNIXTIME('$local_board_time'))))
GROUP BY b.user_id
UNION
SELECT
p.pf_footb_email AS user_email,
u.username AS username,
u.user_id AS userid,
u.user_lang
FROM " . FOOTB_MATCHES . ' AS m
LEFT JOIN ' . FOOTB_LEAGUES . ' AS l ON (l.season = m.season AND l.league = m.league)
LEFT JOIN ' . FOOTB_BETS . ' AS b ON (b.season = m.season AND b.league = m.league AND b.match_no = m.match_no)
LEFT JOIN ' . PROFILE_FIELDS_DATA_TABLE. ' AS p ON p.user_id = b.user_id
LEFT JOIN ' . USERS_TABLE. " AS u ON u.user_id = b.user_id
WHERE m.season = $season AND m.league = $league AND m.matchday = $matchday
AND ((b.goals_home = '') OR (b.goals_guest = ''))
AND m.status = 0 AND p.pf_footb_rem_s = 1
AND (l.bet_in_time = 0 OR
(l.bet_in_time = 1
AND (DATE_SUB(m.match_datetime, INTERVAL '1 23:59' DAY_MINUTE) < FROM_UNIXTIME('$local_board_time'))
AND (DATE_SUB(m.match_datetime, INTERVAL '1 00:00' DAY_MINUTE) > FROM_UNIXTIME('$local_board_time'))))
GROUP BY b.user_id
";
$result = $this->db->sql_query($sql);
$row = $this->db->sql_fetchrow($result);
if (!$row)
{
$this->db->sql_freeresult($result);
}
else
{
// Send the messages
include_once($this->root_path . 'includes/functions_messenger.' . $this->php_ext);
$messenger = new \messenger($use_queue);
include_once($this->root_path . 'includes/functions_user.' . $this->php_ext);
$errored = false;
$messenger->headers('X-AntiAbuse: Board servername - ' . $this->config['server_name']);
$messenger->headers('X-AntiAbuse: User_id - ' . ANONYMOUS);
$messenger->headers('X-AntiAbuse: Username - CRON TASK Football remember');
$messenger->headers('X-AntiAbuse: User IP - ' . $this->user->ip);
$messenger->subject(htmlspecialchars_decode($subject));
$messenger->set_mail_priority($priority);
do
{
// Send the messages
$used_lang = $row['user_lang'];
$mail_template_path = $ext_path . 'language/' . $used_lang . '/email/';
if ($mode <> 'test')
{
$messenger->to($row['user_email'], $row['username']);
}
else
{
// test send to board email
$messenger->to($this->config['board_email'], $this->config['sitename']);
}
$messenger->template('footb_send_remember', $used_lang, $mail_template_path);
$messenger->assign_vars(array(
'USERNAME' => $row['username'],
'LEAGUE' => $league_name,
'MATCHDAY' => $matchday,
'DELIVERY' => $delivery,
'CONTACT_EMAIL' => $this->config['board_contact'])
);
if ($mode <> 'test')
{
if (!($messenger->send($used_method)))
{
$message = '<strong>' . sprintf($this->user->lang['FOOTBALL_REMEMBER_ERROR_EMAIL'], $league_short, $row['user_email']) . '</strong>';
$this->phpbb_log->add('critical', ANONYMOUS, '', 'LOG_ERROR_EMAIL', false, array($message));
$usernames .= (($usernames != '') ? ', ' : '') . $row['username']. '!';
}
else
{
$usernames .= (($usernames != '') ? ', ' : '') . $row['username'];
}
}
else
{
// Test mode
if ($first_mail)
{
// only send one mail
if (!($messenger->send($used_method)))
{
$message = '<strong>' . sprintf($this->user->lang['FOOTBALL_REMEMBER_ERROR_EMAIL'], $league_short, $row['user_email']) . '</strong>';
$this->phpbb_log->add('critical', ANONYMOUS, '', 'LOG_ERROR_EMAIL', false, array($message));
$usernames .= (($usernames != '') ? ', ' : '') . $row['username']. '!';
}
else
{
$usernames .= (($usernames != '') ? ', ' : '') . $row['username'];
}
$first_mail = false;
}
else
{
$usernames .= (($usernames != '') ? ', ' : '') . $row['username'];
}
}
}
while ($row = $this->db->sql_fetchrow($result));
$this->db->sql_freeresult($result);
// Only if mails have already been sent previously
if ($usernames <> '')
{
// send mail to board administration
$used_lang = $this->config['default_lang'];
$mail_template_path = $ext_path . 'language/' . $used_lang . '/email/';
$subject = sprintf($this->user->lang['FOOTBALL_REMEMBER_SUBJECT_BOARD'], $league_short, $matchday);
$messenger->to($this->config['board_email'], $this->config['sitename']);
$messenger->subject(htmlspecialchars_decode($subject));
$messenger->template('footb_board_remember', $used_lang, $mail_template_path);
$messenger->assign_vars(array(
'CONTACT_EMAIL' => $this->config['board_contact'],
'REMEMBER_LIST' => $usernames,
)
);
if (!($messenger->send($used_method)))
{
$message = '<strong>' . sprintf($this->user->lang['FOOTBALL_REMEMBER_ERROR_EMAIL_BOARD'], $league_short, $this->config['board_email']) . '</strong>';
$this->phpbb_log->add('critical', ANONYMOUS, '', 'LOG_ERROR_EMAIL', false, array($message));
}
else
{
$log_subject = sprintf($this->user->lang['FOOTBALL_REMEMBER_SEND'], $league_short, $usernames) ;
$this->phpbb_log->add('admin', ANONYMOUS, '', 'LOG_FOOTBALL_REMEMBER_CRON', false, array($log_subject));
}
}
else
{
// Log the cronjob run
$log_subject = sprintf($this->user->lang['FOOTBALL_REMEMBER_NOBODY']) ;
$this->phpbb_log->add('admin', ANONYMOUS, '', 'LOG_FOOTBALL_REMEMBER_CRON', false, array($log_subject));
}
}
}
if (sizeof($toclose) == 0)
{
// Log the cronjob run
$log_subject = sprintf($this->user->lang['FOOTBALL_REMEMBER_NO_DELIVERY']) ;
$this->phpbb_log->add('admin', ANONYMOUS, '', 'LOG_FOOTBALL_REMEMBER_CRON', false, array($log_subject));
}
return;
}
/**
* Returns whether this cron task can run, given current board configuration.
*
* @return bool
*/
public function is_runnable()
{
return (bool) $this->config['football_remember_enable'];
}
/**
* Returns whether this cron task should run now, because next run time
* has passed.
*
* @return bool
*/
public function should_run()
{
global $request;
$mode = $request->variable('mode', '');
if ($mode <> 'test')
{
return $this->config['football_remember_next_run'] < time();
}
else
{
return true;
}
}
}
?>