Beefy Boxes and Bandwidth Generously Provided by pair Networks Cowboy Neal with Hat
Your skill will accomplish
what the force of many cannot

by defyance (Curate)
on May 07, 2003 at 17:19 UTC ( #256311=sourcecode: print w/ replies, xml ) Need Help??

Category: Miscellaneous/IRC Related
Author/Contact Info Ben Smith defyance
Description: A module to use with perl IRC bots to provide drop in "Seen" functionality. Basically it allows the bot to tell you the last seen action from a particular IRC user. At this point, you have to tell it which events to log, I consider this a feature. MySQL logging functionality is being considered. For now it uses a simple log file and a hash to do the logging. Some may find it pointless, some may find it interesting. I'm mainly looking for input on how to improve my code.
package Seen;

use strict;
use warnings;
use Carp;

require Exporter;

@ISA     = qw(Exporter AutoLoader);
@EXPORT  = qw();
$VERSION = '0.01';

# Set us up the bomb
sub new {

    my $class = shift;
    my %args  = @_;
    return bless \%args, $class;


# Start things up
# Check for existing seen log
# Load seen info from file if possible
sub _load {

    my $self = shift;
    my %seen = ();

    # Load seen info from previous session.
    if ( -e $self->{'file'} ) {
        open( FILE, $self->{'file'} ) || croak "Cannot Open $self->{'f
        %seen = map { chomp; split /\|/; } <FILE>;
        close(FILE) || croak "Cannot Close $self->{'file'}!";
    return %seen;

# Dump seen info into file
sub logSeen {

    my ( $self, $who, $message ) = @_;
    my %seen = $self->_load();
    $who     =~ s/\|/<pipe>/g;    # So we don't confuse things :)
    $message =~ s/\|/<pipe>/g;    # Ditto
    $seen{$who} = $message . " on " . scalar(localtime);
    open( FILE, ">>$self->{'file'}" ) || croak "Cannot Open $self->{'f
    print FILE "$who|$seen{$who}\n";
    close(FILE) || croak "Cannot Close $self->{'file'}!";


# Recieves list of names from your script
# to load current channel users.
# Look at the pod for more info.
sub loadCurrent {

    my $self  = shift;
    my %seen  = $self->_load();
    my $names = shift;
    my @names = split ( / /, $names );
    open( FILE, ">>$self->{'file'}" ) || croak "Cannot Open $self->{'f
    foreach my $name (@names) {
        $name =~ s/@//;
        $name =~ s/\|/<pipe>/g;
        $seen{$name} = "On channel as of " . scalar(localtime);
        print FILE "$name|$seen{$name}\n";
    close(FILE) || croak "Cannot Close $self->{'file'}!";


# Got a seen request, handle it.
sub getSeen {

    my $self = shift;
    my $nick = shift;
    my %seen = $self->_load();
    $nick =~ s/\|/<pipe>/g;

    my $nick1 = $nick;
    if ( defined $seen{$nick} ) {
        $nick         =~ s/<pipe>/\|/g;
        $seen{$nick1} =~ s/<pipe>/\|/g;
        return "Saw $nick $seen{$nick1}";
    else {
        $nick =~ s/<pipe>/\|/g;
        return "Haven't Seen $nick";

# Clear logfile of unwanted seen data
sub clearLog {

    my $self = shift;
    unlink( $self->{'file'} ) || croak "Cannot Unlink $self->{'file'}!


sub DESTROY { }


=head1 NAME - A module for handling seen requests on IRC.


  use Seen;
  my $seen = Seen->new( file => '/path/to/seen.log' );

  # later on...

  # Log join event, assuming Poe::Component::IRC use..
  sub on_join {
    my ( $kernel, $who, $where ) = @_[ KERNEL, ARG0, ARG1 ];
    my $nick = ( split /!/, $who )[0];

    # Do Stuff...

    $seen->logSeen( $nick, "Joining $where" );



Provides seen functionality for an IRC bot.

=head1 METHODS

=over 4

=item 1

B<logSeen()> takes two arguments, stores info into a hash, and logs to
file specified when creating the new object.  Returns nothing.

Use like so:

 $seen->logSeen( $nick, $msg );

=item 2

B<getSeen()> takes a nickname as an argument.  Checks to see if it is
defined in the hash and returns the results.

Use like so:

 $seen->getSeen( $nick );

=item 3

B<loadCurrent()> takes list from irc_353 (names command) as an argumen
+t and
loads it into the hash, and logfile, so current users on the channel a
+re seen.

Use like so:

 $seen->loadCurrent( $names );

=item 4

B<clearLog()> clears the currently loaded log file, takes no args.


=head1 AUTHOR

Benjamin Smith (DeFyance)

=head1 SEE ALSO



Comment on
Download Code
by merlyn (Sage) on May 07, 2003 at 17:28 UTC
      The namespace hasn't been set in stone. If I decided to release it on CPAN, it will more than likely be re-named appropriately. I have to figure out where it would fit best, however. Bot::BasicBot has a Seen module, and Bot::Pluggable has what appears to be a namespace for UberBot::Seen but no code for it. I wanted to get a review/advice before I did anything first.

      -- Can't never could do anything, so give me and inch, I'll make it a mile.

Back to Code Catacombs

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: sourcecode [id://256311]
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others examining the Monastery: (11)
As of 2014-04-21 15:15 GMT
Find Nodes?
    Voting Booth?

    April first is:

    Results (495 votes), past polls