436 lines
15 KiB
PHP
Executable File

#!/usr/bin/env php
<?php
/***************************************************************************
./util/watchlist/runwatch.php
-------------------
begin : Sat September 3 2005
For license information see doc/license.txt
****************************************************************************/
/***************************************************************************
Unicode Reminder メモ
Ggf. muss die Location des php-Binaries angepasst werden.
Dieses Script sucht nach neuen Logs und Caches, die von Usern beobachtet
werden und verschickt dann die Emails.
***************************************************************************/
require_once __DIR__ . '/../../lib/core.php';
use Html2Text\Html2Text;
require_once $GLOBALS['container']->get('ocde.config')->getBaseDir() . '/lib/clicompatbase.inc.php';
require_once 'settings.inc.php';
require_once $GLOBALS['container']->get('ocde.config')->getBaseDir() . '/lib/consts.inc.php';
// use posix pid-files to lock process
if (!CreatePidFile($watchpid))
{
CleanupAndExit($watchpid, "Another instance is running!");
exit;
}
/* begin with some constants */
$sDateformat = 'Y-m-d H:i:s';
/* end with some constants */
/* begin db connect */
db_connect();
if ($dblink === false)
{
echo 'Unable to connect to database';
exit;
}
/* end db connect */
/* begin owner notifies */
$rsNewLogs = sql("SELECT cache_logs.id log_id, caches.user_id user_id FROM cache_logs, caches WHERE cache_logs.cache_id=caches.cache_id AND cache_logs.owner_notified=0");
for ($i = 0; $i < mysql_num_rows($rsNewLogs); $i++)
{
$rNewLog = sql_fetch_array($rsNewLogs);
$rsNotified = sql("SELECT `id` FROM watches_notified WHERE user_id='&1' AND object_id='&2' AND object_type=1", $rNewLog['user_id'], $rNewLog['log_id']);
if (mysql_num_rows($rsNotified) == 0)
{
// Benachrichtigung speichern
sql("INSERT IGNORE INTO `watches_notified` (`user_id`, `object_id`, `object_type`, `date_created`) VALUES ('&1', '&2', 1, NOW())", $rNewLog['user_id'], $rNewLog['log_id']);
// Owner notifications are always sent, independent of user.email_problems counter.
process_owner_log($rNewLog['user_id'], $rNewLog['log_id']);
}
mysql_free_result($rsNotified);
sql("UPDATE cache_logs SET owner_notified=1 WHERE id='&1'", $rNewLog['log_id']);
}
mysql_free_result($rsNewLogs);
/* end owner notifies */
/* begin cache_watches */
$rscw = sql("SELECT `watches_logqueue`.`log_id`, `watches_logqueue`.`user_id`, `cache_logs`.`cache_id`
FROM `watches_logqueue`
INNER JOIN `cache_logs` ON `watches_logqueue`.`log_id`=`cache_logs`.`id`");
while($rcw = mysql_fetch_assoc($rscw))
{
// Benachrichtigung speichern
sql("INSERT IGNORE INTO `watches_notified` (`user_id`, `object_id`, `object_type`, `date_created`) VALUES ('&1', '&2', 1, NOW())", $rcw['user_id'], $rcw['log_id']);
// Throttle email sending after undeliverable mails. See also runwatch.php.
// See also stored procedure sp_notify_new_cache().
// See http://forum.opencaching-network.org/index.php?topic=3123.0 on AOL.
if (sqlValue("SELECT `email_problems` = 0 OR DATEDIFF(NOW(),`last_email_problem`) > 1+DATEDIFF(`last_email_problem`,`first_email_problem`)
FROM `user` WHERE `user_id`='" . sql_escape($rcw['user_id']) . "'", 1))
process_log_watch($rcw['user_id'], $rcw['log_id']);
sql("DELETE FROM `watches_logqueue` WHERE `log_id`='&1' AND `user_id`='&2'", $rcw['log_id'], $rcw['user_id']);
}
mysql_free_result($rscw);
/* end cache_watches */
/* begin send out everything that has to be sent */
$email_headers = 'From: "' . $mailfrom . '" <' . $mailfrom . '>';
$rsUsers = sql('SELECT `user`.`user_id`, `user`.`username`, `user`.`email`, `user`.`watchmail_mode`, `user`.`watchmail_hour`, `user`.`watchmail_day`, `user`.`watchmail_nextmail` FROM `user` INNER JOIN `watches_waiting` ON `user`.`user_id`=`watches_waiting`.`user_id` WHERE `user`.`watchmail_nextmail`<NOW()');
for ($i = 0; $i < mysql_num_rows($rsUsers); $i++)
{
$rUser = sql_fetch_array($rsUsers);
if ($rUser['watchmail_nextmail'] != '0000-00-00 00:00:00')
{
$rsWatches = sql("SELECT COUNT(*) count FROM watches_waiting WHERE user_id='&1'", $rUser['user_id']);
if (mysql_num_rows($rsWatches) > 0)
{
$r = sql_fetch_array($rsWatches);
if ($r['count'] > 0)
{
// ok, eine mail ist fäig
$mailbody = read_file($GLOBALS['container']->get('ocde.config')->getBaseDir() . '/util/watchlist/watchlist.email');
$mailbody = mb_ereg_replace('{username}', $rUser['username'], $mailbody);
$rsWatchesOwner = sql("SELECT id, watchtext FROM watches_waiting WHERE user_id='&1' AND watchtype=1 ORDER BY id DESC", $rUser['user_id']);
if (mysql_num_rows($rsWatchesOwner) > 0)
{
$logtexts = '';
for ($j = 0; $j < mysql_num_rows($rsWatchesOwner); $j++)
{
$rWatch = sql_fetch_array($rsWatchesOwner);
$logtexts .= $rWatch['watchtext'];
}
while ((mb_substr($logtexts, -1) == "\n") || (mb_substr($logtexts, -1) == "\r"))
$logtexts = mb_substr($logtexts, 0, mb_strlen($logtexts) - 1);
$mailbody = mb_ereg_replace('{ownerlogs}', $logtexts, $mailbody);
}
else
{
$mailbody = mb_ereg_replace('{ownerlogs}', $nologs, $mailbody);
}
mysql_free_result($rsWatchesOwner);
$rsWatchesLog = sql("SELECT id, watchtext FROM watches_waiting WHERE user_id='&1' AND watchtype=2 ORDER BY id DESC", $rUser['user_id']);
if (mysql_num_rows($rsWatchesLog) > 0)
{
$logtexts = '';
for ($j = 0; $j < mysql_num_rows($rsWatchesLog); $j++)
{
$rWatch = sql_fetch_array($rsWatchesLog);
$logtexts .= $rWatch['watchtext'];
}
while ((mb_substr($logtexts, -1) == "\n") || (mb_substr($logtexts, -1) == "\r"))
$logtexts = mb_substr($logtexts, 0, mb_strlen($logtexts) - 1);
$mailbody = mb_ereg_replace('{watchlogs}', $logtexts, $mailbody);
}
else
{
$mailbody = mb_ereg_replace('{watchlogs}', $nologs, $mailbody);
}
mysql_free_result($rsWatchesLog);
// mail versenden
if ($debug == true)
$mailadr = $debug_mailto;
else
$mailadr = $rUser['email'];
if ($mailadr != '')
{
if (is_existent_maildomain(getToMailDomain($mailadr)))
{
mb_send_mail($mailadr, $mailsubject, $mailbody, $email_headers);
// logentry($module, $eventid, $userid, $objectid1, $objectid2, $logtext, $details)
logentry('watchlist', 2, $rUser['user_id'], 0, 0, 'Sending mail to ' . $mailadr, array());
}
}
// entries entfernen
sql("DELETE FROM watches_waiting WHERE user_id='&1' AND watchtype IN (1, 2)", $rUser['user_id']);
}
}
}
// Zeitpunkt der nästen Mail berechnen
if ($rUser['watchmail_mode'] == 0)
$nextmail = date($sDateformat);
elseif ($rUser['watchmail_mode'] == 1)
$nextmail = date($sDateformat, mktime($rUser['watchmail_hour'], 0, 0, date('n'), date('j') + 1, date('Y')));
elseif ($rUser['watchmail_mode'] == 2)
{
$weekday = date('w');
if ($weekday == 0) $weekday = 7;
if ($weekday == $rUser['watchmail_day'])
$nextmail = date($sDateformat, mktime($rUser['watchmail_hour'], 0, 0, date('n'), date('j') + 7, date('Y')));
elseif ($weekday > $rUser['watchmail_day'])
$nextmail = date($sDateformat, mktime($rUser['watchmail_hour'], 0, 0, date('n'), date('j') - $weekday + $rUser['watchmail_day'] + 7, date('Y')));
else
$nextmail = date($sDateformat, mktime($rUser['watchmail_hour'], 0, 0, date('n'), date('j') + 6 - $rUser['watchmail_day'], date('Y')));
}
sql("UPDATE user SET watchmail_nextmail='&1' WHERE user_id='&2'", $nextmail, $rUser['user_id']);
}
mysql_free_result($rsUsers);
/* end send out everything that has to be sent */
CleanupAndExit($watchpid);
function process_owner_log($user_id, $log_id)
{
global $dblink, $logowner_text, $absolute_server_URI;
// echo "process_owner_log($user_id, $log_id)\n";
$rsLog = sql("SELECT cache_logs.cache_id cache_id, cache_logs.type, cache_logs.text text, cache_logs.text_html text_html, cache_logs.date logdate, user.username username, caches.name cachename, caches.wp_oc wp_oc FROM `cache_logs`, `user`, `caches` WHERE (cache_logs.user_id = user.user_id) AND (cache_logs.cache_id = caches.cache_id) AND (cache_logs.id ='&1')", $log_id);
$rLog = sql_fetch_array($rsLog);
mysql_free_result($rsLog);
$watchtext = $logowner_text;
$logtext = $rLog['text'];
if ($rLog['text_html'] != 0)
{
$logtext = html_entity_decode($logtext, ENT_COMPAT, 'UTF-8');
$h2t = new Html2Text($logtext);
$h2t->set_base_url($absolute_server_URI);
$logtext = $h2t->get_text();
/*
$logtext = html_entity_decode($logtext, ENT_COMPAT, 'UTF-8');
$logtext = mb_ereg_replace("\r", '', $logtext);
$logtext = mb_ereg_replace("\n", '', $logtext);
$logtext = mb_ereg_replace('</p>', "</p>\n", $logtext);
$logtext = mb_ereg_replace('<br/>', "<br/>\n", $logtext);
$logtext = mb_ereg_replace('<br />', "<br />\n", $logtext);
$logtext = strip_tags($logtext);
*/
}
if (strpos($rLog['logdate'],'00:00:00') > 0)
$dateformat = 'd.m.Y';
else
$dateformat = 'd.m.Y, H:i';
$watchtext = mb_ereg_replace('{date}', date($dateformat, strtotime($rLog['logdate'])), $watchtext);
$watchtext = mb_ereg_replace('{wp_oc}', $rLog['wp_oc'], $watchtext);
$watchtext = mb_ereg_replace('{text}', $logtext, $watchtext);
$watchtext = mb_ereg_replace('{user}', $rLog['username'], $watchtext);
$watchtext = mb_ereg_replace('{cachename}', $rLog['cachename'], $watchtext);
$watchtext = mb_ereg_replace('{action}', get_log_action($rLog['type']), $watchtext);
sql("INSERT IGNORE INTO watches_waiting (`user_id`, `object_id`, `object_type`, `date_created`, `watchtext`, `watchtype`) VALUES (
'&1', '&2', 1, NOW(), '&3', 1)", $user_id, $log_id, $watchtext);
// logentry($module, $eventid, $userid, $objectid1, $objectid2, $logtext, $details)
logentry('watchlist', 1, $user_id, $log_id, 0, $watchtext, array());
}
function process_log_watch($user_id, $log_id)
{
global $dblink, $logwatch_text, $absolute_server_URI;
// echo "process_log_watch($user_id, $log_id)\n";
$rsLog = sql("SELECT cache_logs.cache_id cache_id, cache_logs.type, cache_logs.text text, cache_logs.text_html text_html, cache_logs.date logdate, user.username username, caches.name cachename, caches.wp_oc wp_oc FROM `cache_logs`, `user`, `caches` WHERE (cache_logs.user_id = user.user_id) AND (cache_logs.cache_id = caches.cache_id) AND (cache_logs.id = '&1')", $log_id);
$rLog = sql_fetch_array($rsLog);
mysql_free_result($rsLog);
$watchtext = $logwatch_text;
$logtext = $rLog['text'];
if ($rLog['text_html'] != 0)
{
$logtext = html_entity_decode($logtext, ENT_COMPAT, 'UTF-8');
$h2t = new Html2Text($logtext);
$h2t->set_base_url($absolute_server_URI);
$logtext = $h2t->get_text();
/*
$logtext = html_entity_decode($logtext, ENT_COMPAT, 'UTF-8');
$logtext = mb_ereg_replace("\r", '', $logtext);
$logtext = mb_ereg_replace("\n", '', $logtext);
$logtext = mb_ereg_replace('</p>', "</p>\n", $logtext);
$logtext = mb_ereg_replace('<br/>', "<br/>\n", $logtext);
$logtext = mb_ereg_replace('<br />', "<br />\n", $logtext);
$logtext = strip_tags($logtext);
*/
}
if (strpos($rLog['logdate'],'00:00:00') > 0)
$dateformat = 'd.m.Y';
else
$dateformat = 'd.m.Y, H:i';
$watchtext = mb_ereg_replace('{date}', date($dateformat, strtotime($rLog['logdate'])), $watchtext);
$watchtext = mb_ereg_replace('{wp_oc}', $rLog['wp_oc'], $watchtext);
$watchtext = mb_ereg_replace('{text}', $logtext, $watchtext);
$watchtext = mb_ereg_replace('{user}', $rLog['username'], $watchtext);
$watchtext = mb_ereg_replace('{cachename}', $rLog['cachename'], $watchtext);
$watchtext = mb_ereg_replace('{action}', get_log_action($rLog['type']), $watchtext);
sql("INSERT IGNORE INTO watches_waiting (`user_id`, `object_id`, `object_type`, `date_created`, `watchtext`, `watchtype`) VALUES (
'&1', '&2', 1, NOW(), '&3', 2)", $user_id, $log_id, $watchtext);
}
function get_log_action($logtype)
{
switch ($logtype)
{
case 1: return "gefunden";
case 2: return "nicht gefunden";
case 3: return "Hinweis";
case 7: return "teilgenommen";
case 8: return "möchte teilnehmen";
case 9: return "archiviert";
case 10: return "kann gesucht werden";
case 11: return "momentan nicht verfügbar";
case 13: return "gesperrt";
case 14: return "gesperrt, versteckt";
default: return "";
}
}
function is_existent_maildomain($domain)
{
$smtp_serverlist = array();
$smtp_serverweight = array();
if (getmxrr($domain, $smtp_serverlist, $smtp_serverweight) != false)
if (count($smtp_serverlist)>0)
return true;
// check if A exists
$a = dns_get_record($domain, DNS_A);
if (count($a) > 0)
return true;
return false;
}
function getToMailDomain($mail)
{
if ($mail == '')
return '';
if (strrpos($mail, '@') === false)
$domain = 'localhost';
else
$domain = substr($mail, strrpos($mail, '@') + 1);
return $domain;
}
//
// checks if other instance is running, creates pid-file for locking
//
function CreatePidFile($PidFile)
{
if(!CheckDaemon($PidFile))
{
return false;
}
if(file_exists($PidFile))
{
echo "Error: Pidfile (".$PidFile.") already present at ".__FILE__.":".__LINE__."!\n";
return false;
}
else
{
if($pidfile = @fopen($PidFile, "w"))
{
fputs($pidfile, posix_getpid());
fclose($pidfile);
return true;
}
else
{
echo "can't create Pidfile $PidFile at ".__FILE__.":".__LINE__."!\n";
return false;
}
}
}
//
// checks if other instance of process is running..
//
function CheckDaemon($PidFile)
{
if($pidfile = @fopen($PidFile, "r"))
{
$pid_daemon = fgets($pidfile, 20);
fclose($pidfile);
$pid_daemon = (int)$pid_daemon;
// process running?
if(posix_kill($pid_daemon, 0))
{
// yes, good bye
echo "Error: process already running with pid=$pid_daemon!\n";
false;
}
else
{
// no, remove pid_file
echo "process not running, removing old pid_file (".$PidFile.")\n";
unlink($PidFile);
return true;
}
}
else
{
return true;
}
}
//
// deletes pid-file
//
function CleanupAndExit($PidFile, $message = false)
{
if($pidfile = @fopen($PidFile, "r"))
{
$pid = fgets($pidfile, 20);
fclose($pidfile);
if($pid == posix_getpid())
unlink($PidFile);
}
else
{
echo "Error: can't delete own pidfile (".$PidFile.") at ".__FILE__.":".__LINE__."!\n";
}
if($message)
{
echo $message . "\n";
}
}