Mercurial > hg > pnewss
diff fetchnews.php @ 0:d7ab68b71c74
Initial commit
author | Ivo Smits <Ivo@UCIS.nl> |
---|---|
date | Mon, 11 Apr 2011 22:44:47 +0200 |
parents | |
children | 61fac319ca3e |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/fetchnews.php Mon Apr 11 22:44:47 2011 +0200 @@ -0,0 +1,88 @@ +<?php +require_once './pdo.php'; +require_once './config.php'; + +foreach ($db->evalAllAssoc('SELECT * FROM `peers`') as $peer) { + $socket = stream_socket_client($peer['address']); + if ($socket === FALSE) die("Could not connect to peer $peer[address]\n"); + $line = nntp_readline($socket); + $code = strtok($line, " \t"); + if ($code != 200) die("Error code $code from $peer[address]\n"); + foreach ($db->evalAllAssoc('SELECT * FROM `peergroups` WHERE `peer` = ?', $peer['id']) as $peergroup) { + $group = $db->evalRowAssoc('SELECT * FROM `groups` WHERE `id` = ?', $peergroup['group']); + nntp_writeline($socket, 'GROUP '.$group['name']); + $line = nntp_readline($socket); + $code = strtok($line, " \t"); + if ($code != 211) die("Error code $code from $peer[address]\n"); + strtok(" \t"); //number of articles + $low = strtok(" \t"); + $high = strtok(" \t"); + strtok(" \t"); //group name + if ($low != $peergroup['low'] || $high != $peergroup['high'] || $peergroup['low'] === NULL || $peergroup['high'] === NULL) { + for ($i = $low; $i <= $high; $i++) { + if ($i >= $peergroup['low'] && $i <= $peergroup['high'] && $peergroup['low'] !== NULL && $peergroup['high'] !== NULL) continue; + nntp_writeline($socket, 'STAT '.$i); + $line = nntp_readline($socket); + $code = strtok($line, " \t"); + if ($code == 423) { + print("Gap in article numbering at $i\n"); + continue; + } + if ($code != 223) die("Error code $code from $peer[address]\n"); + strtok(" \t"); //article number + $messageid = strtok(" \t"); + if ($messageid[0] != '<' || $messageid[strlen($messageid)-1] != '>') die("Malformed message ID $messageid\n"); + $messageid = substr($messageid, 1, -1); + $message = $db->evalRowAssoc('SELECT * FROM `messages` WHERE `messageid` = ?', $messageid); + if ($message) { + $groupmessage = $db->evalRowAssoc('SELECT * FROM `groupmessages` WHERE `group` = ? AND `message` = ?', array($group['id'], $message['id'])); + if (!$groupmessage) { + $db->insert('INSERT INTO `groupmessages` (`group`, `message`) VALUES (?, ?)', array($group['id'], $message['id'])); + } + } else { + nntp_writeline($socket, 'HEAD '.$i); + $line = nntp_readline($socket); + $code = strtok($line, " \t"); + if ($code != 221) die("Error code $code from $peer[address]\n"); + strtok(" \t"); //article number + $lines = nntp_readlines($socket); + $header = implode("\r\n", $lines); + + nntp_writeline($socket, 'BODY '.$i); + $line = nntp_readline($socket); + $code = strtok($line, " \t"); + if ($code != 222) die("Error code $code from $peer[address]\n"); + strtok(" \t"); //article number + $lines = nntp_readlines($socket); + $body = implode("\r\n", $lines); + + $id = $db->insert('INSERT INTO `messages` (`messageid`, `header`, `body`) VALUES (?, ?, ?)', array($messageid, $header, $body)); + $db->insert('INSERT INTO `groupmessages` (`group`, `message`) VALUES (?, ?)', array($group['id'], $id)); + } + } + $db->update('UPDATE `peergroups` SET `low` = ?, `high` = ? WHERE `peer` = ? AND `group` = ?', array($low, $high, $peergroup['peer'], $peergroup['group'])); + } + } + nntp_writeline($socket, 'QUIT'); + fclose($socket); +} + +function nntp_readline($socket) { + $line = rtrim(fgets($socket, 512), "\r\n"); + print('R: '.$line."\n"); + return $line; +} +function nntp_writeline($socket, $line) { + print('W: '.$line."\n"); + fwrite($socket, $line."\r\n"); +} +function nntp_readlines($socket) { + $line = nntp_readline($socket); + $lines = array(); + while ($line != '.' && $line !== FALSE && $line !== FALSE) { + $lines[] = $line; + $line = nntp_readline($socket); + } + if ($line != '.') die("Unexpected end of message header\n"); + return $lines; +}