time()) || ($user_time < $oldest)) { unset($user_time); } } else { unset($user_time); } } if (isset($_GET['thisgroup'])) { $grouplist = array(); $grouplist[0] = _rawurldecode(_rawurldecode($_GET['thisgroup'])); $cachefile=$spooldir."/".$grouplist[0]."-overboard.dat"; if($userdata) { $userdata[$grouplist[0]] = time(); file_put_contents($userfile, serialize($userdata)); } } else { $grouplist = file($groupconfig, FILE_IGNORE_NEW_LINES); } show_overboard_header($grouplist); $results=0; if(is_file($cachefile)) { $stats = stat($cachefile); $this_overboard = unserialize(file_get_contents($cachefile)); $cachedate = ($this_overboard['lastmessage'] - 86400); $oldest = $cachedate; } else { $cachedate = ($oldest - 86400); } if($this_overboard['version'] !== $version) { unset($this_overboard); unlink($cachefile); $this_overboard['version'] = $version; $cachedate = ($oldest - 86400); } # Iterate through groups $database = $spooldir.'/articles-overview.db3'; $table = 'overview'; $dbh = rslight_db_open($database, $table); $query = $dbh->prepare('SELECT * FROM '.$table.' WHERE newsgroup=:findgroup AND date >= '.$cachedate.' ORDER BY date DESC LIMIT '.$maxdisplay); $articles = array(); $db_articles = array(); foreach($grouplist as $findgroup) { $groups = preg_split("/(\ |\t)/", $findgroup, 2); $findgroup = $groups[0]; $overboard_noshow = explode(' ', $CONFIG['overboard_noshow']); foreach($overboard_noshow as $noshow) { if ((strpos($findgroup, $noshow) !== false) && !isset($_GET['thisgroup'])) { continue 2; } } $thisgroup = preg_replace('/\./', '/', $findgroup); if($dbh) { $query->execute(['findgroup' => $findgroup]); $i=0; while (($overviewline = $query->fetch()) !== false) { $articles[] = $spoolpath.$thisgroup.'/'.$overviewline['number']; $db_articles[] = $findgroup.':'.$overviewline['number'].':'.$overviewline['date'].':'.$overviewline['name']; $i++; if($i > $maxdisplay) { break; } } } } $dbh = null; $files = array(); if($CONFIG['article_database'] == '1') { foreach($db_articles as $article) { $order=explode(':', $article); $files[$order[2]] = $article; } } else { foreach($articles as $article) { if(is_dir($article)) { continue; } $files[filemtime($article)] = $article; } } krsort($files); foreach($files as $article) { if($CONFIG['article_database'] == '1') { $data = explode(':', $article); $articledata = np_get_db_article($data[1], $data[0], 0); } else { $articledata = file_get_contents($article); } $bodystart = strpos($articledata, $localeol); $header = substr($articledata, 0, $bodystart); # Find group name and article number if($CONFIG['article_database'] == '1') { $group = $data[0]; $articlenumber = $data[1]; $groupname = $group; } else { $group = preg_replace($spoolpath_regexp, '', $article); $group = preg_replace('/\//', '.', $group); $findme = strrpos($group, '.'); $groupname = substr($group, 0, $findme); $articlenumber = substr($group, $findme+1); } preg_match('/Message-ID:.*/i', $header, $articleid); $getid = explode(": ", $articleid[0]); $thismsgid = $getid[1]; if(isset($this_overboard['msgids'][$thismsgid])) { continue; } preg_match('/References:.*/i', $header, $ref); $getrefs = explode(': ', $ref[0]); $ref = preg_split("/[\s]+/", $getrefs[1]); if($getrefs[1] && $refid = get_data_from_msgid($ref[0])) { // Check that article to link is new enough for newsportal to display $groupinfo = file($spooldir.'/'.$refid["newsgroup"].'-info.txt'); $range = explode(' ', $groupinfo[1]); if($refid['number'] > (intval($range[0]) - 1)) { $threadref = $ref[0]; } else { $threadref = false; } } else { $threadref = false; } $target = get_data_from_msgid($thismsgid); if($target['date'] > time()) { continue; } if($target['date'] > $this_overboard['lastmessage']) { $this_overboard['lastmessage'] = $target['date']; } if(!isset($this_overboard['threads'][$target['date']])) { $this_overboard['threads'][$target['date']] = $thismsgid; $this_overboard['msgids'][$thismsgid] = $target; if($threadref) { $this_overboard['threadlink'][$thismsgid] = $threadref; } if($results++ > ($maxdisplay - 2)) { break; } } } file_put_contents($cachefile, serialize($this_overboard)); if(isset($user_time)) { $oldest = ($user_time - 900); } else { $oldest = (time() - (86400 * $article_age)); } $results = display_threads($this_overboard['threads'], $oldest); show_overboard_footer(null, $results, null); echo ''; expire_overboard($cachefile); function expire_overboard($cachefile) { global $article_age, $logfile, $config_name, $prune, $this_overboard; if($this_overboard['expire'] < (time() - 86400)) { $prune = true; foreach($this_overboard['msgids'] as $key => $value) { $target = $this_overboard['msgids'][$key]; if($target['date'] < (time() - (86400 * $article_age))) { file_put_contents($logfile, "\n".format_log_date()." ".$config_name." Expiring: ".$target['newsgroup'].":".$target['number'], FILE_APPEND); unset($this_overboard['threads'][$target['date']]); unset($this_overboard['msgids'][$key]); unset($this_overboard['threadlink'][$key]); } } $this_overboard['expire'] = time(); } if($prune) { file_put_contents($cachefile, serialize($this_overboard)); } } function display_threads($threads, $oldest) { global $thissite, $logfile, $config_name, $snippetlength, $maxdisplay, $prune, $this_overboard; echo ''; if(!isset($threads)) { $threads = (object)[]; } else { krsort($threads); } $results = 0; foreach($threads as $key => $value) { $target = $this_overboard['msgids'][$value]; if(!isset($target['msgid'])) { $target = get_data_from_msgid($value); } if($target['date'] < $oldest) { continue; } if($results > $maxdisplay) { $prune = true; unset($this_overboard['threads'][$target['date']]); unset($this_overboard['threadlink'][$value]); file_put_contents($logfile, "\n".format_log_date()." ".$config_name." Pruning: ".$target['newsgroup'].":".$target['number'], FILE_APPEND); } $article = get_db_data_from_msgid($target['msgid'], $target['newsgroup'], 1); $poster = get_poster_name(mb_decode_mimeheader($target['name'])); $groupurl = $thissite."/thread.php?group="._rawurlencode($target['newsgroup']); if(($results % 2) == 0){ echo '
'; } else { echo '
'; } $url = $thissite."/article-flat.php?id=".$target['number']."&group="._rawurlencode($target['newsgroup'])."#".$target['number']; echo '

'; echo ''.mb_decode_mimeheader($target['subject']).''; if(isset($this_overboard['threadlink'][$value])) { $thread = get_data_from_msgid($this_overboard['threadlink'][$value]); echo ' (thread)'; } echo '

'; echo '

'; echo ''.$target['newsgroup'].''; echo '

'; echo '

Posted: '.get_date_interval(date("D, j M Y H:i T",$target['date'])).' by: '.create_name_link($poster['name'], $poster['from']).'

'; echo htmlentities(substr($article['search_snippet'], 0, $snippetlength)); $results++; } echo "
"; return($results); } function show_overboard_header($grouplist) { global $text_thread, $text_article, $file_index, $file_thread, $user_time; if (isset($_GET['thisgroup'])) { echo '

'; echo ''.basename(getcwd()).' / '; echo ''.htmlspecialchars(group_displaY_name($grouplist[0])).' / '; if (isset($user_time)) { echo ' new messages

'; } else { echo ' latest'; } echo ''; // Refresh button echo ''; // Article List button echo ''; // Newsgroups button (hidden) if(isset($frames_on) && $frames_on === true) { echo ''; } echo '
'; echo '
'; echo ''; if (isset($user_time)) { echo ''; } else { echo ''; } echo '
'; echo '
'; echo '
'; echo ''; echo ''; echo '
'; echo '
'; echo '
'; echo ''; echo '
'; echo '
'; } else { echo '

'; echo ''.basename(getcwd()).' / '; echo 'latest messages

'; echo ''; // Refresh button echo ''; // Newsgroups button (hidden) if(isset($frames_on) && $frames_on === true) { echo ''; } echo '
'; echo '
'; echo ''; echo '
'; echo '
'; echo '
'; echo ''; echo '
'; echo '
'; } } function show_overboard_footer($stats, $results, $iscached) { global $user_time,$rslight_version; if(isset($user_time)) { $recent = 'new'; } else { $recent = 'recent'; } if($results == '1') { $arts = 'article'; } else { $arts = 'articles'; } echo ''; echo "

".$results." ".$recent." ".$arts." found.

\r\n"; #echo "
Rocksolid Overboard version ".$version; include "tail.inc"; if($iscached) { echo "

cached copy: ".date("D M j G:i:s T Y", $stats[9])."

\r\n"; } } ?>