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;
+}