diff --git a/Sam.pl b/Sam.pl index d24205e23074abc5f14d83ff0326be042722abc4..a1c8612b86be69c3e42f94742371297c7f447a8a 100755 --- a/Sam.pl +++ b/Sam.pl @@ -2,10 +2,165 @@ use strict; use warnings; +use POE; +use POE::Component::IRC; +use DBI; +use JSON; use Module::Reload; use FindBin; + use lib "$FindBin::Bin/lib/"; -use Sam; +use Logging; +use commands::parser; + +my $log = Logging->new('STDOUT', 1); + +# config +my $serveur = 'IRC.iiens.net'; +my $nick = 'Sam'; +my $port = 6667; +my $ircname = 'nightiies'; +my $username = 'nightiies'; +my @channels = qw(#nightiies #bigphatsubwoofer); +my $admin = 'moise'; +my $baseurl = 'http://nightiies.iiens.net/sam/'; +my %lastID; +my %commandes_admin = ("cycle" => \&cycle); + +my $debug = 0; + +# mode debug +if ($#ARGV + 1) { + @channels = qw(#hormone); + $nick = 'glloq'; + $debug = 1; +} + + +local $/; +open CONF, '<', 'sam.conf'; +my $json = <CONF>; +my $conf = decode_json($json); + + +my ($irc) = POE::Component::IRC->spawn(); +my $dbh = DBI->connect('DBI:mysql:'.$conf->{'bdd'}.';host='.$conf->{'host'}, $conf->{'user'}, $conf->{'passwd'}, { + PrintError => 0, + AutoCommit => 1, + mysql_auto_reconnect => 1 + }) + or die("Couldn't connect to database: ".DBI->errstr); + +# Evenements que le bot va gérer +POE::Session->create( + inline_states => { + _start => \&bot_start, + irc_001 => \&on_connect, + irc_public => \&on_speak, + irc_msg => \&on_query, + irc_invite => \&on_invite + }, +); + + +sub cycle +{ + my ($arg) = @_; + + $log->info("refresh modules"); + + Module::Reload->check; + + setConf(); +} + + +sub setConf +{ + commands::parser::setConf($nick, $irc, $dbh, $log, \%lastID); +} + + +## GESTION EVENTS + +# Au démarrage +sub bot_start { + $irc->yield(register => "all"); + $irc->yield( + connect => { + Nick => $nick, + Username => $username, + Ircname => $ircname, + Server => $serveur, + Port => $port, + } + ); +} + + +# A la connection +sub on_connect +{ + my $kernel = $_[ KERNEL ]; + + setConf(); + $irc->yield(privmsg => "NickServ" => "identify ".$conf->{'nickserv_pwd'}) unless ($debug); + $log->info('connected'); + + foreach (@channels) { + $irc->yield(join => $_); + $log->info("join $_"); + } +} + +# Discussion privée +sub on_query +{ + my ($kernel, $user, $msg) = @_[KERNEL, ARG0, ARG2]; + my ($nick) = split (/!/,$user); + + my @fake_chan = ($nick); + my @args = ($kernel, $user, \@fake_chan, $msg); + + my $fake_chan = \@fake_chan; + return if (commands::parser::exec(@args)); + + if ($msg =~ m/^!/ && $nick eq $admin) { + my $commande = ( $msg =~ m/^!([^ ]*)/ )[0]; + my @params = grep {!/^\s*$/} split(/\s+/, substr($msg, length("!$commande"))); + + foreach (keys(%commandes_admin)) { + if ($commande eq $_) { + $commandes_admin{$_}->(@params); + last; + } + } + } +} + +# Quand on m'invite, je join +sub on_invite +{ + my ($kernel, $user, $chan) = @_[KERNEL, ARG0, ARG1]; + my ($nick,$mask) = split(/!/,$user); + + $log->info($nick . " m'invite sur ". $chan); + $irc->yield(join => $chan); + + push @channels, $chan; +} + +# Quand un user parle +sub on_speak +{ + my ($kernel, $user, $chan, $msg) = @_[KERNEL, ARG0, ARG1, ARG2]; + my @args = ($kernel, $user, $chan, $msg); + + my ($nick,$mask) = split(/!/,$user); + + commands::parser::exec(@args); +} -Sam::start(); +# Boucle des events +$poe_kernel->run(); exit 0; diff --git a/lib/Sam.pm b/lib/Sam.pm deleted file mode 100644 index 4653f4ed1710670872a49deb714c82fee70ef773..0000000000000000000000000000000000000000 --- a/lib/Sam.pm +++ /dev/null @@ -1,171 +0,0 @@ -package Sam; - -require Exporter; -our @ISA = qw(Exporter); -our @EXPORT_OK = qw(start); - -use strict; -use warnings; - -use POE; -use POE::Component::IRC; -use DBI; -use JSON; -use Logging; -use commands::parser; - -my $log = Logging->new('STDOUT', 1); - -# config -my $serveur = 'IRC.iiens.net'; -my $nick = 'Sam'; -my $port = 6667; -my $ircname = 'nightiies'; -my $username = 'nightiies'; -my @channels = qw(#nightiies #bigphatsubwoofer); -my $admin = 'moise'; -my $baseurl = 'http://nightiies.iiens.net/sam/'; -my %lastID; -my %commandes_admin = ("cycle" => \&cycle); - -my $debug = 0; - -# mode debug -if ($#ARGV + 1) { - @channels = qw(#hormone); - $nick = 'glloq'; - $debug = 1; -} - - -local $/; -open CONF, '<', 'sam.conf'; -my $json = <CONF>; -my $conf = decode_json($json); - - -my ($irc) = POE::Component::IRC->spawn(); -my $dbh = DBI->connect('DBI:mysql:'.$conf->{'bdd'}.';host='.$conf->{'host'}, $conf->{'user'}, $conf->{'passwd'}, { - PrintError => 0, - AutoCommit => 1, - mysql_auto_reconnect => 1 - }) - or die("Couldn't connect to database: ".DBI->errstr); - -# Evenements que le bot va gérer -POE::Session->create( - inline_states => { - _start => \&bot_start, - irc_001 => \&on_connect, - irc_public => \&on_speak, - irc_msg => \&on_query, - irc_invite => \&on_invite - }, -); - - -sub cycle -{ - my ($arg) = @_; - - $log->info("refresh modules"); - - Module::Reload->check; - - setConf(); -} - - -sub setConf -{ - commands::parser::setConf($nick, $irc, $dbh, $log, \%lastID); -} - - -## GESTION EVENTS - -# Au démarrage -sub bot_start { - $irc->yield(register => "all"); - $irc->yield( - connect => { - Nick => $nick, - Username => $username, - Ircname => $ircname, - Server => $serveur, - Port => $port, - } - ); -} - - -# A la connection -sub on_connect -{ - my $kernel = $_[ KERNEL ]; - - setConf(); - $irc->yield(privmsg => "NickServ" => "identify ".$conf->{'nickserv_pwd'}) unless ($debug); - $log->info('connected'); - - foreach (@channels) { - $irc->yield(join => $_); - $log->info("join $_"); - } -} - -# Discussion privée -sub on_query -{ - my ($kernel, $user, $msg) = @_[KERNEL, ARG0, ARG2]; - my ($nick) = split (/!/,$user); - - my @fake_chan = ($nick); - my @args = ($kernel, $user, \@fake_chan, $msg); - - my $fake_chan = \@fake_chan; - return if (commands::parser::exec(@args)); - - if ($msg =~ m/^!/ && $nick eq $admin) { - my $commande = ( $msg =~ m/^!([^ ]*)/ )[0]; - my @params = grep {!/^\s*$/} split(/\s+/, substr($msg, length("!$commande"))); - - foreach (keys(%commandes_admin)) { - if ($commande eq $_) { - $commandes_admin{$_}->(@params); - last; - } - } - } -} - -# Quand on m'invite, je join -sub on_invite -{ - my ($kernel, $user, $chan) = @_[KERNEL, ARG0, ARG1]; - my ($nick,$mask) = split(/!/,$user); - - $log->info($nick . " m'invite sur ". $chan); - $irc->yield(join => $chan); - - push @channels, $chan; -} - -# Quand un user parle -sub on_speak -{ - my ($kernel, $user, $chan, $msg) = @_[KERNEL, ARG0, ARG1, ARG2]; - my @args = ($kernel, $user, $chan, $msg); - - my ($nick,$mask) = split(/!/,$user); - - commands::parser::exec(@args); -} - -# Boucle des events -sub start -{ - $poe_kernel->run(); -} - -1; diff --git a/lib/commands/parser.pm b/lib/commands/parser.pm index ae0960a1dc5894b33589de7406ee863a19295607..7fac6c0894cb30e34c301130f5212e437f2b999a 100644 --- a/lib/commands/parser.pm +++ b/lib/commands/parser.pm @@ -6,7 +6,6 @@ our @EXPORT_OK = qw(exec); use strict; -use FindBin; use lib "$FindBin::Bin/lib/"; use commands::add; use commands::list;