diff --git a/Core/Chans.pm b/Core/Chans.pm index 84c42ae60fdec0c90c17806f1ff6480867d4b52c..cd31c9bd9117fdd0dc5d209d42115cf12949f2e3 100644 --- a/Core/Chans.pm +++ b/Core/Chans.pm @@ -21,9 +21,6 @@ our %chans = (); # `---> chan2 --> ... -# On veut pouvoir chopper les changements de pseudos -$ChangeNickController::change_nick->register(\&change_nick); - # ### @@ -494,7 +491,10 @@ sub is_on_chan # ### sub change_nick { - my ($old_nick, $new_nick) = @_; + my (undef, $event) = @_; + + my $old_nick = $event->{'nick'}; + my $new_nick = $event->{'args'}[0]; return unless($old_nick, $new_nick); @@ -585,6 +585,12 @@ sub chans_save close CHANS; + if($reloading) + { + # On se désenregistre, sinon on risque d'avoir deux fois le handler d'appelé + EventHandler::remove_event("nick", "before", \&change_nick); + } + return 1; } # Fin chans_save @@ -597,7 +603,11 @@ sub chans_load { my ($conn, $folder, $reloading) = @_; - # Si on est en train de démarrer le bot + # On ajoute un event handler sur le changement de pseudo (= l'évènement 'nick') + EventHandler::add_event("nick", "before", \&change_nick); + + + # Si on est en train de démarrer le bot, on s'arrête là return 1 if(!defined($reloading) || !$reloading); # Si on est en train de recharger le module diff --git a/Core/CommandProcess.pm b/Core/CommandProcess.pm index f7c53b641e3437f609c955a44edb9c9b7b059312..a1714fa7e58fa8d9668d4120b81e114ec58f4744 100644 --- a/Core/CommandProcess.pm +++ b/Core/CommandProcess.pm @@ -198,7 +198,7 @@ sub reload_command my $command = undef; my $package = undef; - $::logger->debug("(Re)loading $file...") if(defined($::logger)); + $::logger->debug("(Re)loading $file..."); open FILE, "<", $self->{'_modules_dir'}.$file or return 0; my $line = <FILE>; chomp $line; @@ -223,7 +223,7 @@ sub reload_command @commands = ($command); } - $::logger->debug("$file: package=$package; perms=$perm") if(defined($::logger)); + $::logger->debug("$file: package=$package; perms=$perm"); # $package = defined($package) ? $package : ucfirst substr $file, 0, -3; my $main = ""; diff --git a/Core/EventHandler.pm b/Core/EventHandler.pm index 47ceb39ce93f83b5091bfd1ab5cd7e04da7995ca..e434c4e771e2781b614d4116e8b39f24529a2f05 100644 --- a/Core/EventHandler.pm +++ b/Core/EventHandler.pm @@ -5,30 +5,6 @@ package EventHandler; my %changed_events = (); -# ### -# init_add_event -# Ajoute un handler (à utiliser au chargement du module) -# ... en vrai, ça l'enregistre pour l'ajout, utiliser flush_init_events pour que -# ça l'ajoute vraiment -# ### -sub init_add_event -{ - return _register_event(@_); -} # Fin init_add_event - - -# ### -# flush_init_events -# Ajoute les handlers enregistrés par init_add_event -# ### -sub flush_init_events -{ - foreach my $e (keys %changed_events) - { - _do_change_event($e); - } -} # Fin flush_init_events - # ### # add_event @@ -61,8 +37,9 @@ sub _register_event unless(defined($changed_events{$event})) { $changed_events{$event} = { - 'before' => [], - 'after' => [], + 'before' => [], + 'after' => [], + 'default' => undef }; } @@ -85,6 +62,17 @@ sub _do_change_event # Changement (ou rien du tout si on est déjà passé par là pour cet event) # de la fonction pour cet évènement + if(defined($Hook::conn->{_handler}->{$event})) + { + my $may_default = $Hook::conn->{_handler}->{$event}->[0]; + if($may_default ne \&dispatch_event) + { + $changed_events{$event}{'default'} = $may_default; + $::logger->debug("Registering default action for event $event"); + } + } + + $::logger->info("Catching event $event from now on"); $Hook::conn->{_handler}->{$event} = [\&dispatch_event, 0]; return 1; @@ -115,6 +103,7 @@ sub remove_event } $changed_events{$event}{lc $when} = \@new_list; + $::logger->info("One handler for $event event removed"); } else { @@ -176,17 +165,14 @@ sub dispatch_event # autorisé if(not prevent_default($event)) { - my $type = $event->{'type'}; - my $fn = ''; - - no strict 'refs'; - my $symtab = "Hook::"; - for my $symbol (keys %$symtab) + if(defined($changed_events{$event->{'type'}}{'default'})) { - $fn = $symbol if($symbol =~ /^on_$type$/); + no strict 'refs'; + + &{$changed_events{$event->{'type'}}{'default'}}($conn, $event); + + use strict; } - &{"Hook::$fn"}($conn, $event) if($fn); - use strict; } # Events enregistrés dans la partie 'after' @@ -217,6 +203,7 @@ sub do_events return; } + foreach my $hdls (@{$changed_events{$event->{'type'}}{lc $when}}) { # TODO find $hdls way diff --git a/Core/Hook.pm b/Core/Hook.pm index fa6091b56f3ea9ff16f11732f61fd682d604b77f..0a6c840d1a941baf0156c12697a401ecb8d1d230 100644 --- a/Core/Hook.pm +++ b/Core/Hook.pm @@ -3,7 +3,6 @@ package Hook; use strict; use warnings; -use Core::ChangeNickController; use Core::Chans; use Core::CommandProcess; use Core::Display; @@ -25,10 +24,11 @@ our $done = sprintf "[%c[32m Done%c[0m ]\n", 0x1B, 0x1B; our $error = sprintf "[%c[31m Error%c[0m ]\n", 0x1B, 0x1B; our $stars = sprintf "%c[31m****%c[0m", 0x1B, 0x1B; our $handlers_routines = sprintf "%s Installing handler routines...", $stars; +our $handlers_routines_done = sprintf "%s Handler routines installed...", $stars; our $starting = sprintf "%s Starting...", $stars; our $connection_auto_channel = sprintf "%s Connection to $Config::channel...", $stars; our $identification_server = sprintf "%s Identification...", $stars; -our $reload_vars = sprintf "%s Reloading variables...", $stars; +our $reload_func = sprintf "%s Calling load functions...", $stars; our $init_saver = sprintf "%s Initializing the variables saver...", $stars; our $save_vars = sprintf "%s Saving variables...", $stars; our $program_reinit = sprintf "%s Program reinitialisation...", $stars; @@ -52,9 +52,7 @@ our $fifo = new Fifo($Config::fifo, $conn); # On initialise les commandes # C'est ici qu'on va charger les modules et les commandes -our $commandtool = new CommandProcess( - $Config::modules_dir, - $conn); +our $commandtool = new CommandProcess($Config::modules_dir, $conn); @@ -118,11 +116,12 @@ sub on_connect $conn->{"vars"} = []; # On recharge les variables qu'on avait sauvegardées en s'éteignant la dernière fois - $::logger->info($reload_vars); + $::logger->info($reload_func); $VarLoader::loader->load($conn); $::logger->info($init_saver); $Save::saver->init($conn); + $::logger->info(sprintf "\t\t%c[4mYou can talk to me now%c[0m\n", 0x1B,0x1B); } # Fin on_connect @@ -238,7 +237,7 @@ sub on_private my ($conn, $event) = @_; $event->{'to'}[0] = $event->{'nick'}; - if($Config::debug && $event->{"nick"} ne $Config::owner) + if($Config::debug && $event->{'nick'} ne $Config::owner) { $conn->privmsg($Config::owner, "There's ".$event->{'nick'}." who is telling me: ".$event->{'args'}[0]); } @@ -280,7 +279,7 @@ sub on_nick my $old_nick = $event->{'nick'}; my $new_nick = $event->{'args'}[0]; - $ChangeNickController::change_nick->change($old_nick, $new_nick); + $::logger->debug("$old_nick -> $new_nick"); } # Fin on_nick # Pas de nick diff --git a/Core/Logging.pm b/Core/Logging.pm index 455a65c428812de984839fcd234b984f9d1aeac3..02e15b5b144b30447d32058bc2a0c4b1cc7bf1e1 100644 --- a/Core/Logging.pm +++ b/Core/Logging.pm @@ -513,13 +513,14 @@ sub end_pending } else { - $done = sprintf " Error \n"; + $done = sprintf " Error "; } $done .= "☒" if($self->utf8); } - $done .= "\e[0m\n" if($self->colored); + $done .= "\e[0m" if($self->colored); + $done .= "\n"; # À partir d'ici, $done peut vouloir dire que c'est bon, ou pas diff --git a/Modules/BugReport.pm b/Modules/BugReport.pm index 4d90b82fc69ad292dd3d7b9f607c81aafd249693..139531d78430131c7fac1fea2da5085e572f4606 100644 --- a/Modules/BugReport.pm +++ b/Modules/BugReport.pm @@ -4,9 +4,6 @@ use strict; use warnings; -# Ajout d'un handler pour pouvoir répondre aux demandes publiques -EventHandler::add_event("public", "after", \&bugreport_on_public); - # On matche là-dessus our %reports = ( @@ -98,6 +95,9 @@ sub bugreport_save # ### sub bugreport_load { + # Ajout d'un handler pour pouvoir répondre aux demandes publiques + EventHandler::add_event("public", "after", \&bugreport_on_public); + return 1; } # Fin bugreport_load diff --git a/Modules/Ignore.pm b/Modules/Ignore.pm index f786f631071b072c3be46ab90ee98967b563d925..fcbdda5c9afeed928b0a49ed17e1e40a2ba9be5b 100644 --- a/Modules/Ignore.pm +++ b/Modules/Ignore.pm @@ -216,7 +216,7 @@ sub ignore_load %ignore__list = %{$stateref}; # Ajout d'un handler pour ignorer les gens lorsqu'ils disent quelque chose - EventHandler::init_add_event("public", "before", \&ignore_on_public); + EventHandler::add_event("public", "before", \&ignore_on_public); return 1; } # Fin ignore_load diff --git a/Modules/Invite.pm b/Modules/Invite.pm index 9d625d1616841c45fddec708cf7247c0f15135c1..490b7d7c8424d45d127ad35b6a68b24f92917364 100644 --- a/Modules/Invite.pm +++ b/Modules/Invite.pm @@ -17,9 +17,6 @@ my %auto_invite = (); # $chan -> 1|0 -EventHandler::init_add_event("join", "before", \&on_join_on_chan); - - # ### # invite_main @@ -562,6 +559,9 @@ sub invite_load close INVITE_LISTS; + + EventHandler::add_event("join", "before", \&on_join_on_chan); + return 1; } # Fin invite_load diff --git a/Modules/Join.pm b/Modules/Join.pm index d5f0568644f627b73ef8f7fee8e2d41aacdcfe07..6dbbdf2b648d7bfe38d59df9f510b6d408fa6ff2 100644 --- a/Modules/Join.pm +++ b/Modules/Join.pm @@ -9,13 +9,6 @@ my %joining_chans = (); # `---> ... -# On ajoute les handlers -EventHandler::add_event("namreply", "before", \&namreply_handle); -EventHandler::add_event("toomanychannels", "before", \&toomanychannels_handle); -EventHandler::add_event("inviteonlychan", "before", \&inviteonlychan_handle); -EventHandler::add_event("channelisfull", "before", \&channelisfull_handle); -EventHandler::add_event("bannedfromchannel", "before", \&bannedfromchannel_handle); - # ### @@ -178,7 +171,7 @@ sub bannedfromchannel_handle # ### sub join_save { - my ($conn, $folder, $reloading) = @_; + my (undef, undef, $reloading) = @_; if($reloading) @@ -201,6 +194,14 @@ sub join_save # ### sub join_load { + # On ajoute les handlers + EventHandler::add_event("namreply", "before", \&namreply_handle); + EventHandler::add_event("toomanychannels", "before", \&toomanychannels_handle); + EventHandler::add_event("inviteonlychan", "before", \&inviteonlychan_handle); + EventHandler::add_event("channelisfull", "before", \&channelisfull_handle); + EventHandler::add_event("bannedfromchannel", "before", \&bannedfromchannel_handle); + + return 1; } # Fin join_load diff --git a/Modules/Postit.pm b/Modules/Postit.pm index e03b3342853eb43290a3a9c9db5e0ee528b13408..cbc946cfa8f88db686efc5056ba37bcfbf8b6508 100644 --- a/Modules/Postit.pm +++ b/Modules/Postit.pm @@ -13,8 +13,6 @@ use warnings; # ... our %postits = (); -# On veut pouvoir chopper les changements de pseudos -$ChangeNickController::change_nick->register(\&change_owner); # Hash de correspondance des mois @@ -249,7 +247,11 @@ sub write_postit # ### sub change_owner { - my ($old_nick, $new_nick) = @_; + my (undef, $event) = @_; + + my $old_nick = $event->{'nick'}; + my $new_nick = $event->{'args'}[0]; + my $ref_postits = \%postits; @@ -305,8 +307,7 @@ sub postit_help # ### sub postit_save { - shift; - my $folder = shift; + my (undef, $folder, $reloading) = @_; my $file_postit = "/postits".$Config::suffixe.".sav"; open POSTITS, ">", $folder.$file_postit or die "Unable to create $folder$file_postit"; @@ -324,6 +325,13 @@ sub postit_save close POSTITS; + if($reloading) + { + # On veut pouvoir chopper les changements de pseudos, mais on se + # désenregistre, sinon on risque d'avoir deux fois le handler d'appelé + EventHandler::remove_event("nick", "before", \&change_owner); + } + return 1; } # Fin postit_save @@ -369,6 +377,11 @@ sub postit_load close POSTITS; + # On veut pouvoir chopper les changements de pseudos, donc on ajoute un + # event handler sur le changement de pseudo (= l'évènement 'nick') + EventHandler::add_event("nick", "before", \&change_owner); + + return 1; } # Fin postit_load diff --git a/bot.pl b/bot.pl index 774c7caa1a07d1009614cf8cfad3c492cc1dc6a0..5c7d1a60906b610cc72ee6d1c59a31ccdbec33f8 100755 --- a/bot.pl +++ b/bot.pl @@ -20,6 +20,7 @@ BEGIN { use Core::Getpass; use Core::Logging; + # Ça c'est pour utiliser nos librairies avant celles installées sur le système # Ça sert notamment pour Net::IRC, vu que je l'ai patchée (http://coltel.iiens.net/patch_Net_IRC) my $incpath = pop @INC; @@ -48,6 +49,13 @@ BEGIN { Command_line_args::process_args(\@ARGV); } + # On initialise le module en charge des logs + our $logger = new Logging( + $Config::debug > 1 ? "STDOUT": $Config::logfile, + 1 + ); + $logger->utf8(1); + if($Config::want_nick_register) { # Récupérons notre mdp Nickserv de celui qui lance le bignouf @@ -63,13 +71,6 @@ use Core::Refresh; use Net::Domain qw(hostfqdn); -# On initialise le module en charge des logs -our $logger = new Logging( - $Config::debug > 1 ? "STDOUT": $Config::logfile, - 1 - ); -$logger->utf8(1); - # On initialise le module pour l'affichage ici our $displayer = new Display($Hook::conn); @@ -80,7 +81,7 @@ our $refresher = new Refresh(); # On installe les fonctions de Hook (un grand homme celui-là...) : -$logger->pending_info($Hook::handlers_routines); +$logger->info($Hook::handlers_routines); $Hook::conn->add_handler('376', \&Hook::on_connect); # Fin du MOTD => on est connecté $Hook::conn->add_handler('public', \&Hook::on_public); # Sur un chan => quelqu'un parle $Hook::conn->add_handler('msg', \&Hook::on_private); # En privé => quelqu'un parle @@ -107,9 +108,7 @@ $Hook::conn->add_handler('433', \&Hook::on_nicknameinuse); # Le nick est en c $Hook::conn->add_handler('471', \&Hook::on_channelisfull); # Trop de monde sur le chan $Hook::conn->add_handler('473', \&Hook::on_inviteonlychan); # Chan en mode invite only $Hook::conn->add_handler('474', \&Hook::on_bannedfromchannel); # On a été banni du chan -# On flush les handlers pour les évènements enregistrés par les modules -EventHandler::flush_init_events; -$logger->end_pending(1, $logger->INFO); +$logger->info($Hook::handlers_routines_done);