#!/usr/local/bin/perl5
#
# $Id: thread.pl,v 1.15 2009/02/01 19:00:55 winter Exp $

use re 'eval';
use POSIX qw(strftime);
use HTTP::Cookies;
use HTML::TableExtract;
use HTML::TreeBuilder;
use HTML::Entities;
use WWW::Mechanize;
use Date::Parse;
use Data::Dumper;

sub
extract_message {
	$_ = shift;
	$_ =~ s/[\n\r]//g;
	if (/^<div class=\"forumTextBody\"[^>]*>(.+)<\/div>$/s) {
		return $1;
	}
	return undef;
}

sub
extract_date {
	$_ = shift;
	return 0 if !defined($_);
	if (/([[:digit:]]+\/[[:digit:]]+\/[[:digit:]]+ [[:digit:]]+:[[:digit:]]+:[[:digit:]]+ (AM|PM))/) {
		return str2time($1);
	}
	if (/Today ([[:digit:]]+:[[:digit:]]+:[[:digit:]]+ (AM|PM))/) {
		$today = strftime "%D", localtime;
		return str2time($today . " " . $1);
	}
	if (/Yesterday ([[:digit:]]+:[[:digit:]]+:[[:digit:]]+ (AM|PM))/) {
		$yesterday = strftime "%D", localtime(time - 86400);
		return str2time($yesterday . " " . $1);
	}
	return 0;
}

$cookie_jar = HTTP::Cookies->new(
		file => "$ENV{'HOME'}/lwp_cookies.dat",
		autosave => 1,
	);

for ($i = $ARGV[0]; $i < $ARGV[1]; $i++) {
	$agent = WWW::Mechanize->new(cookie_jar => $cookie_jar);
	$agent->get(decode_entities($ARGV[2]) . '&page=' . $i);

	print STDERR "Page $i\n";
	$te = HTML::TableExtract->new( attribs => { class }, keep_html => 1 );
	$te->parse($agent->{content});

	# Page 1 is special and contains the original post
	if ($i > 1) {
		$post = 1;
	} else {
		$post = 0;
	}

	foreach $ts ($te->tables) {
		# Author Box
		$ct = HTML::TreeBuilder->new_from_content($ts->cell(0,0));

		$poster = $ct->look_down('_tag' => 'div', 'class' => 'skinBarAuthorRight')->as_text;
		$div 	= $ct->look_down('_tag' => 'div', 'class' => 'postAuthorInfo');
		$member = ($div->look_down('_tag' => 'div', 'class' => 'floatLeft'))[1]->as_text;

		# Post Box
		$ct = HTML::TreeBuilder->new_from_content($ts->cell(0,1));
		$h	= $ct->look_down('_tag' => 'div', 'class' => 'forumTextBody')->as_HTML;
		$message = extract_message($h);

		$div	= $ct->look_down('_tag' => 'div', 'class' => 'postReplyBar');

		$t	= $div->look_down('_tag' => 'div', 'class' => 'floatLeft')->as_text;
		$post_date = extract_date($t);

		$t	= $div->look_down('_tag' => 'div', 'class' => 'floatRight')->as_text;
		$edit_date = extract_date($t);

		# Signature Box
		# $ct = HTML::TreeBuilder->new_from_content($ts->cell(1,0));

		print join("\t", $i, $post, $post_date, $edit_date, $poster, $member, $message) . "\n";
		$post++;
	}
}
