http://qs321.pair.com?node_id=15025
Category: Utilities
Author/Contact Info ZZamboni
Description: It gets lines from the Perlmonks chatbox. It can return all the lines that are currently there, or only the new lines since the last time the getnewlines subroutine is called. This piece of code prints the chat to the terminal:
#!/usr/local/perl/bin/perl use PerlMonksChat; $p=PerlMonksChat->new(); while (1) { print map { "$_\n" } $p->getnewlines(); sleep 10; }
It is very rough, but it works :-)
Update: The code posted here was only the first version, and is now grossly outdated. Please see the web page where I keep the latest version of the script. It has grown a lot with the contributions and encouragement of fellow monks. to it.
# Note - don't use this code. See link above.
package PerlMonksChat;

use LWP::UserAgent;
use HTTP::Request;
use HTML::Entities;

sub new {
  my $class=shift;
  my $url=shift||'http://www.perlmonks.org/index.pl?node_id=2518';
  my $self={};
  $self->{url}=$url;
  $self->{ua}=new LWP::UserAgent;
  $self->{req}=new HTTP::Request('GET', $url);
  $self->{cache}=[];
  bless $self, $class;
  return $self;
}

sub getalllines {
  my $self=shift;
  $ua=$self->{ua};
  $req=$self->{req};
#  print "(* grabbing *)\n";
  my $response=$ua->request($req);

  if ($response->is_success) {
    my $c=$response->content;
    #  print $c;
    if ($c =~ /<td.*?Chatterbox.*?<input[^>]*?>(.*?)<input/msi) {
      my $chatline=$1;
      $chatline=~s/[\n\r]//g;
      # Split in lines and remove html tags
      my @chatlines=grep { $_ }
        map { s/<[^>]+?>//g; decode_entities($_); $_ }
          split(/\s*<br>\s*/, $chatline);
      return @chatlines;
    }
  }
  else {
    return ("error");
  }
}

sub getnewlines {
  my $self=shift;
  my $cache=$self->{cache};
  my @allines=$self->getalllines();
  my @newcache;
  # Don't use a regular cache, instead go back through them until we
  # find the first one that is in the cache.
  foreach (reverse @allines) {
    last if ($cache->[0] && $_ eq $cache->[0]);
    push @newcache, $_;
  }
  # Add the new lines to the cache
  unshift @$cache, @newcache;
  # Trim the cache to the last 50 lines
  splice(@$cache,50);
  return reverse @newcache;
}

1;