<?xml version="1.0" encoding="windows-1252"?>
<node id="15025" title="Get chatbox lines" created="2000-05-26 16:29:38" updated="2005-08-13 14:52:12">
<type id="1748">
sourcecode</type>
<author id="5999">
ZZamboni</author>
<data>
<field name="doctext">
&lt;code&gt;
# 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-&gt;{url}=$url;
  $self-&gt;{ua}=new LWP::UserAgent;
  $self-&gt;{req}=new HTTP::Request('GET', $url);
  $self-&gt;{cache}=[];
  bless $self, $class;
  return $self;
}

sub getalllines {
  my $self=shift;
  $ua=$self-&gt;{ua};
  $req=$self-&gt;{req};
#  print "(* grabbing *)\n";
  my $response=$ua-&gt;request($req);

  if ($response-&gt;is_success) {
    my $c=$response-&gt;content;
    #  print $c;
    if ($c =~ /&lt;td.*?Chatterbox.*?&lt;input[^&gt;]*?&gt;(.*?)&lt;input/msi) {
      my $chatline=$1;
      $chatline=~s/[\n\r]//g;
      # Split in lines and remove html tags
      my @chatlines=grep { $_ }
        map { s/&lt;[^&gt;]+?&gt;//g; decode_entities($_); $_ }
          split(/\s*&lt;br&gt;\s*/, $chatline);
      return @chatlines;
    }
  }
  else {
    return ("error");
  }
}

sub getnewlines {
  my $self=shift;
  my $cache=$self-&gt;{cache};
  my @allines=$self-&gt;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-&gt;[0] &amp;&amp; $_ eq $cache-&gt;[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;
&lt;/code&gt;</field>
<field name="codedescription">

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:
&lt;code&gt;
#!/usr/local/perl/bin/perl

use PerlMonksChat;

$p=PerlMonksChat-&gt;new();

  while (1) {
    print map { "$_\n" } $p-&gt;getnewlines();
    sleep 10;
  }
&lt;/code&gt;
It is very rough, but it works :-)
&lt;hr&gt;
&lt;b&gt;Update&lt;/b&gt;: The code posted here was only the first version,
and is now grossly outdated. Please see the web page where
I keep the &lt;a href="http://www.cerias.purdue.edu/homes/zamboni/perlmonks.html"&gt;
latest version&lt;/a&gt; of the script. It has grown a lot with
the contributions and encouragement of fellow monks.
to it&lt;/a&gt;.
</field>
<field name="codecategory">
Utilities</field>
<field name="codeauthor">
[Diego Zamboni|ZZamboni]</field>
</data>
</node>
