Skip to content
Extraits de code Groupes Projets
Valider c07488ae rédigé par Alexandre Morignot's avatar Alexandre Morignot
Parcourir les fichiers

Revert "Nouveau module « Sam »."

En fait c'était débile. Le but était de pouvoir reload plus facilement,
mais le reload ne marche de toute façon pas bien. Le mieux à faire est
de séparer le front-end (qui communique avec le serveur IRC) du back-end
qui traite tout ça. Comme ça on peut changer le back-end sans impacter
le front-end.

This reverts commit fdbbd83e.
parent fdbbd83e
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
...@@ -2,10 +2,165 @@ ...@@ -2,10 +2,165 @@
use strict; use strict;
use warnings; use warnings;
use POE;
use POE::Component::IRC;
use DBI;
use JSON;
use Module::Reload; use Module::Reload;
use FindBin; use FindBin;
use lib "$FindBin::Bin/lib/"; 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; exit 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;
...@@ -6,7 +6,6 @@ our @EXPORT_OK = qw(exec); ...@@ -6,7 +6,6 @@ our @EXPORT_OK = qw(exec);
use strict; use strict;
use FindBin;
use lib "$FindBin::Bin/lib/"; use lib "$FindBin::Bin/lib/";
use commands::add; use commands::add;
use commands::list; use commands::list;
......
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Veuillez vous inscrire ou vous pour commenter