Bot-WootOff
view release on metacpan or search on metacpan
###########################################
sub new {
###########################################
my($class, %options) = @_;
my $self = {
irc_server => "irc.freenode.net",
irc_channel => "#wootoff" . sprintf("%04d", int(rand(1000))),
irc_nick => "wootbot",
http_alias => "wootoff-ua",
http_timeout => 60,
http_max_retries => 30,
poll_interval => 30,
Alias => "wootoff-bot",
spawn => 1,
last_msg => undef,
%options,
};
bless $self, $class;
$self->{http_agent} = $self->agent() unless defined $self->{http_agent};
$self->{http_url} = $self->woot_url() unless defined $self->{http_url};
# Start it up automatically.
$self->spawn() if $self->{spawn};
return $self;
}
###########################################
sub woot_url {
###########################################
my($self) = @_;
return "http://www.woot.com";
}
###########################################
sub agent {
###########################################
my($self) = @_;
return(__PACKAGE__ . "/" . $VERSION),
}
###########################################
sub spawn {
###########################################
my($self) = @_;
$self->{bot} = Bot::WootOff::Glue->new(
server => $self->{irc_server},
channels => [ $self->{irc_channel} ],
nick => $self->{irc_nick},
);
POE::Component::Client::HTTP->spawn(
Agent => $self->{http_agent},
Alias => $self->{http_alias},
Timeout => $self->{http_timeout},
);
my $request = GET( $self->{http_url} );
our $last_item = "";
POE::Session->create(
inline_states => {
_start => sub {
# wait at startup for things to settle down
$poe_kernel->delay('http_start', 10);
},
http_start => sub {
DEBUG "Requesting $self->{http_url}";
POE::Kernel->post( $self->{http_alias},
'request', 'http_ready', $request);
},
http_ready => sub {
my $retries = 0;
my $resp= $_[ARG1]->[0];
if($resp->is_success()) {
my $text = $resp->content();
my($item, $price) = $self->html_scrape($text);
if(! defined $item) {
my $save_file = "/tmp/woot.html";
if(open FILE, ">$save_file") {
print FILE $text;
close FILE;
} else {
LOGWARN "Can't open $save_file ($!)";
}
if($self->{http_retries_performed} ==
$self->{http_max_retries}) {
LOGDIE "Ouch, woot.com changed their HTML, and our ",
"scraper failed (saved in $save_file). " ,
"Let the module author know!";
} else {
ERROR "Scraper failed to parse HTML, but ",
"retrying (",
$self->{http_retries_performed} + 1,
"/",
$self->{http_max_retries},
")";
$self->{http_retries_performed}++;
}
}
$self->{http_retries_performed} = 0;
if($last_item ne $item) {
$last_item = $item;
my $body = "$item $price $self->{http_url}";
( run in 1.670 second using v1.01-cache-2.11-cpan-39bf76dae61 )