The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.
=head1 NAME

Bot::BasicBot::Pluggable::Module::PasteBin - Check at Pastebin.com if some nick from selected channel paste something, and tell into channel the nick and url

=head1 IRC USAGE

None. When the module is loaded, it checks Pastebin.com and tell if someone paste on it using a nick that is on the channel

=head1 VARS

=over 4

=item channel

Defaults to #sao-paulo.pm,  Choose one channel to be the source of nicks

=item pastebin_url

Defaults to http://perl.pastebin.com, choose the url from pastebin.com or pastebin.com like

=item tick

Defaults to 5, the tick time to check the pastebin. 

=back

=head1 REQUIREMENTS

L<HTML::LinkExtractor>

L<LWP::Simple>

L<Time::Local>

=head1 AUTHOR

Frederico Recsky <frederico@gmail.com>

This program is free software; you can redistribute it
and/or modify it under the same terms as Perl itself.

=cut



package Bot::BasicBot::Pluggable::Module::PasteBin;
use base qw(Bot::BasicBot::Pluggable::Module);

use warnings;
use strict;

use LWP::UserAgent;
use HTML::LinkExtractor;
use Time::Local;
use File::Temp qw/ tempfile tempdir /;

our $VERSION = '0.01';

my $tick_counter = 6;

sub help {
    return "Returns when someone post in Pastebin using the same nick that uses is this channel";
}

sub init {
    
    my $self = shift;
    
    $self->set('user_tick', "5") unless defined ($self->get('user_tick'));
    $self->set("user_pastebin_url", "http://perl.pastebin.com") unless defined ($self->get("user_pastebin_url"));
    
    if (defined $self->get("pastebin_file")){	
	$self->{tmpfile} = $self->get("pastebin_file");
	print "file: $self->{tmpfile}\n";
    }else{
	my ($fh, $filename) = tempfile();
        $self->{tmpfile} = $filename;
	$self->set("pastebin_file", $filename);
	print "new file: $self->{tmpfile}\n";
    }    
        
}

sub tick {
	
    my $self = shift;
    
    my $period = $self->get("user_tick");

    $tick_counter++;
    return if ( $tick_counter < $period); 
    $tick_counter = 0;
    my $time = timelocal (localtime());

    $self->_check_pastebin();

}

sub _check_nick{

    my $self = shift;
    my $nick = shift;
    my $channel = shift;
    
    return undef unless $nick;
    
    my @nicks =  keys %{ $self->{Bot}->{channel_data}->{$channel}};

    for (@nicks){
	next unless $_;	
	return 1 if /$nick/ ; 
    }
    
    return undef;

}

sub _filter_link {
    
    my $self = shift;
    
    my $link = shift;
    
    if ($link =~ /\w{1,9}\"/){    
	$link =~ />([\w|\s]*)</; 
	    my $nick = $1;
        $link =~ /"(.*)"/;
	    my $url = $1;
	$url =~ m#com/(\w*)#;
	    my $id = $1;
        return ($nick, $url, $id);
    }else{
	return undef;
    }
    
}


sub _check_pastebin {

    my $self = shift;
    
    my $url = $self->get("user_pastebin_url");
    
    my $ua = LWP::UserAgent->new;
    $ua->agent("Bot/0.1");
    my $req = HTTP::Request->new(POST => $url);
    $req->content_type('application/x-www-form-urlencoded');
    $req->content('query=libwww-perl&mode=dist');
    my $res = $ua->request($req);
    
    my $html = $res->content if $res->is_success;
      
    my $LX = new HTML::LinkExtractor();
    $LX->parse(\$html);
    
    for my $link ( @{ $LX->links }){
        next unless $link->{_TEXT};
        
	my ($nick, $url, $id) = $self->_filter_link($link->{_TEXT});
            
	for my $channel (keys %{ $self->{Bot}->{channel_data}} ){
		next unless ($channel =~ /^\#/);
		if ($self->_check_nick($nick,$channel)){
		    open my $fh , "<",  "$self->{tmpfile}";
		    while(<$fh>){
			chomp;
			return 0 if ($_ =~ /$id/);
		    }
		    close $fh;
		    open $fh, ">>", "$self->{tmpfile}";
			print $fh "$id\n";
		    close $fh;
		    $self->tell($channel, "$nick just paste in pastebin: $url\n");
		}
        }
    }
    
}

1;