Bot.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

163 lines
6.3 KiB

#! /usr/bin/perl -w
use strict;
use warnings;
use POE qw(Component::IRC);
use List::MoreUtils qw(any);
use DBI;
use Config::Simple;
# CONFIGURATION FILE
my $alexandrieConf = new Config::Simple("/etc/alexandrie/alexandrie.conf") or die "Missing configuration file.";
print "Configuration file loaded.\n";
# PARSER
my $parser = $alexandrieConf->param("parser.path");
# DATABASE
my $dsn = $alexandrieConf->param("database.dsn");
my $db_user_name = $alexandrieConf->param("database.username");
my $db_password = $alexandrieConf->param("database.password");
my $dbh = $alexandrieConf->param("database.dbh");
# IRC
my $nickname = $alexandrieConf->param("irc.nickname");
my $ircname = $alexandrieConf->param("irc.name");
my $server = $alexandrieConf->param("irc.server");
my $username = $alexandrieConf->param("irc.username");
my @channels = ('#april', '#april-alexandrie');
#my @channels = ('#april-alexandrie');
# We create a new PoCo-IRC object
my $irc = POE::Component::IRC->spawn(
nick => $nickname,
ircname => $ircname,
username => $username,
server => $server,
) or die "Oh noooo! $!";
POE::Session->create(
package_states => [
main => [ qw(_default _start irc_001 irc_public) ],
],
heap => { irc => $irc },
);
$poe_kernel->run();
sub _start {
my $heap = $_[HEAP];
# retrieve our component's object from the heap where we stashed it
my $irc = $heap->{irc};
$irc->yield( register => 'all' );
$irc->yield( connect => { } );
return;
}
sub irc_001 {
my $sender = $_[SENDER];
# Since this is an irc_* event, we can get the component's object by
# accessing the heap of the sender. Then we register and connect to the
# specified server.
my $irc = $sender->get_heap();
print "Connected to ", $irc->server_name(), "\n";
# we join our channels
$irc->yield( join => $_ ) for @channels;
$irc->yield( privmsg => $_ => "Join us now and share the softwaaaare ♩ ♪ ♫ ♬ ♭" ) for @channels;
return;
}
sub irc_public {
my ($sender, $who, $where, $what) = @_[SENDER, ARG0 .. ARG2];
my $nick = ( split /!/, $who )[0];
my $channel = $where->[0];
#RP
if (my ($cite, $url, undef, $base_url, $comment) = $what =~ /!rp(c?).*?((https?:\/\/)?(\S+))\s*(.*)/) {
my $dbh = DBI->connect($dsn, $db_user_name, $db_password);
my $exists = $dbh->prepare ('SELECT id FROM presse WHERE url LIKE ?');
unless ($exists->execute ("%$base_url")) {
$irc->yield( privmsg => $channel => 'Opération impossible. #Fail ! Je préfère partir plutôt que d\'entrendre ça plutôt que d\'être sourd(e)');
die "Fatal: cannot RECONNECT ! : $!";
}
my @found = $exists->fetchrow_array();
$exists->finish;
if (@found) {
my $rp_inc= $dbh->prepare ('UPDATE presse SET note=note+1 WHERE id = ?');
$rp_inc->execute ($found['id']);
my $add_comment = $dbh->prepare ('INSERT INTO presse_comments SET commentaire=?, presse_id=?, auteur=?');
$add_comment->execute ($comment, $found['id'], "IRC($nick)")
unless ($comment eq "");
$irc->yield( privmsg => $channel => ($nick =~ /alxc/)?'Mais enfin roooo, je l\'ai déjà depuis super longtemps cette url. M\'enfin merci quand même Alix :*':'Merci, j\'avais déjà cet article en stock. Je plusse');
} else {
my $rp_insert = $dbh->prepare ('INSERT INTO presse SET url=?, provenance=?, cite=?, note=?, datec=NOW()');
my $note = (any {$nick =~ $_ } qr/echarp/, qr/gibus/, qr/oumph/, qr/theocrite/, qr/madix/, qr/liot/, qr/lonugem/)?3:0;
$rp_insert->execute ($url, "IRC($nick)", ($cite eq 'c'?1:0), $note);
my $last_insert_id = $dbh->last_insert_id (undef, undef, undef, 'presse');
my $add_comment = $dbh->prepare ('INSERT INTO presse_comments SET commentaire=?, presse_id=?, auteur=?');
$add_comment->execute ($comment, $last_insert_id, "IRC($nick)")
unless ($comment eq "");
$irc->yield( privmsg => $channel => ($nick =~ /alxc/)?'Merci Alix ! Je conserve ça précieusement !':"Merci bien $nick, cet article a été ajouté :)");
`$parser $last_insert_id`;
}
$dbh->disconnect();
}
# Help
$irc->yield( privmsg => $channel => 'Toute l\'aide est disponible ici : http://wiki.april.org/w/RP:alexandrie')
if ($what =~ /!help/ or $what =~ /!aide/);
# Easter eggs :
$irc->yield( privmsg => $channel => "<3")
if ($nick =~ /theo/ and $what =~ /alex.ndri.*aime/);
if ($what =~ /alex.ndri.*alex.ndra/) {
my @lyrics = (
'Voile sur les filles... barques sur le Nil.',
'Je suis dans ta vie... je suis dans tes bras.',
'Alexandrie où l\'amour danse avec la nuit.',
'J\'ai plus d\'appétit... qu\'un Barracuda.',
'Je boirais tout le nil si tu ne me reviens pas.',
'Ce soir j\'ai de la fièvre et toi tu meurs de froid.',
'Les sirènes du port d\'Alexandrie... chantent encore la même mélodie. Wooo woooo oooo',
'La lumière du phare d\'Alexandrie... fait naufrager... les papillons... de ma jeunesseuuuu... Ah!');
$irc->yield( privmsg => $channel => $lyrics[int rand $#lyrics]);
}
# Administration
my ($chan, $text);
if ($nick eq 'theocrite' and $what eq '!quit') {
$irc->yield( shutdown => 'Je préfère partir plutôt que d\'entrendre ça plutôt que d\'être sourd(e)' );
exit;
}
$irc->yield( part => $chan, ' '.$text )
if ($nick eq 'theocrite' and ($chan, $text) = $what =~ /^!part\s+(#\S+)\s*(.*)$/);
$irc->yield( join => $chan )
if ($nick eq 'theocrite' and ($chan) = $what =~ /^!join\s+(#\S+)$/);
$irc->yield( privmsg => $chan => $text)
if ($nick eq 'theocrite' and ($chan, $text) = $what =~ /^!msg (#\S+)\s+(.*)$/);
return;
}
# We registered for all events, this will produce some debug info.
sub _default {
my ($event, $args) = @_[ARG0 .. $#_];
my @output = ( "$event: " );
for my $arg (@$args) {
if ( ref $arg eq 'ARRAY' ) {
push( @output, '[' . join(', ', @$arg ) . ']' );
}
else {
push ( @output, "'$arg'" );
}
}
print join ' ', @output, "\n";
return 0;
}