Bot-WootOff

 view release on metacpan or  search on metacpan

WootOff.pm  view on Meta::CPAN

###########################################
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 )