From 0024ebf7b0a2f422350d420377534679c244f5c0 Mon Sep 17 00:00:00 2001 From: Elijah Perrault Date: Fri, 21 Jan 2011 13:54:53 -0700 Subject: [PATCH] Added event_add|del|run() and hook_add|del() to API::Std for managing and running events/hooks. --- bin/auto | 10 +++++++ doc/CHANGELOG | 2 ++ src/API/Std.pm | 80 +++++++++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 91 insertions(+), 1 deletion(-) diff --git a/bin/auto b/bin/auto index 099ca6b..3b8ed20 100755 --- a/bin/auto +++ b/bin/auto @@ -69,6 +69,9 @@ undef @BFVER; $SIG{TERM} = \&signal_TERM; $SIG{INT} = \&signal_INT; $SIG{HUP} = \&signal_HUP; +API::Std::event_add("on_sigterm"); +API::Std::event_add("on_sigint"); +API::Std::event_add("on_sighup"); # Print startup message. @@ -212,6 +215,10 @@ while (1) { sleep 1; } # Subroutines # ############### +sub on_sigint { + println "Goodbye world!"; +} + # Send data to socket. sub socksnd { @@ -245,6 +252,7 @@ sub mod_load { # SIGTERM sub signal_TERM { + API::Std::event_run("on_sigterm"); API::IRC::quit($_, "Caught SIGTERM") foreach (keys %SOCKET); dbug "!!! Caught SIGTERM; terminating..."; alog "!!! Caught SIGTERM; terminating..."; @@ -258,6 +266,7 @@ sub signal_TERM # SIGINT sub signal_INT { + API::Std::event_run("on_sigint"); API::IRC::quit($_, "Caught SIGINT") foreach (keys %SOCKET); dbug "!!! Caught SIGINT; terminating..."; alog "!!! Caught SIGINT; terminating..."; @@ -271,6 +280,7 @@ sub signal_INT # SIGHUP sub signal_HUP { + API::Std::event_run("on_sighup"); dbug "!!! Caught SIGHUP but rehash is unavailable; ignoring"; alog "!!! Caught SIGHUP but rehash is unavailable; ignoring"; } diff --git a/doc/CHANGELOG b/doc/CHANGELOG index c242e4f..ace9564 100644 --- a/doc/CHANGELOG +++ b/doc/CHANGELOG @@ -3,6 +3,8 @@ Auto IRC Bot 3.0: Change Log 3.0 Indev ================================================================== + * Added event_add|del|run() and hook_add|del() to API::Std for + managing and running events/hooks. * server:nspass removed. server:idstr added. * Changed the way we parse strings to support multi-word strings in config values. diff --git a/src/API/Std.pm b/src/API/Std.pm index 7af335d..3f95a4b 100644 --- a/src/API/Std.pm +++ b/src/API/Std.pm @@ -11,7 +11,7 @@ use Exporter; our @ISA = qw(Exporter); our @EXPORT_OK = qw(conf_get trans err awarn); -my (%LANGE, %MODULE); +my (%LANGE, %MODULE, %EVENTS, %HOOKS); # Initialize a module. @@ -101,6 +101,84 @@ sub cmd_del } +# Add an event to Auto. +sub event_add +{ + my ($name) = @_; + + unless (defined $EVENTS{lc($name)}) { + $EVENTS{lc($name)} = 1; + return 1; + } + else { + API::Log::dbug("DEBUG: Attempt to add a pre-existing event[".lc($name)."]! Ignoring..."); + return 0; + } +} + +# Delete an event from Auto. +sub event_del +{ + my ($name) = @_; + + if (defined $EVENTS{lc($name)}) { + delete $EVENTS{lc($name)}; + delete $HOOKS{lc($name)}; + return 1; + } + else { + API::Log::dbug("DEBUG: Attempt to delete a non-existing event[".lc($name)."! Ignoring..."); + return 0; + } +} + +# Trigger an event. +sub event_run +{ + my ($event) = @_; + + if (defined $EVENTS{lc($event)} and defined $HOOKS{lc($event)}) { + foreach my $hk (keys %{ $HOOKS{lc($event)} }) { + &{ $HOOKS{lc($event)}{$hk} }(); + } + } + + return 1; +} + +# Add a hook to Auto. +sub hook_add +{ + my ($event, $name, $sub) = @_; + + unless (defined $HOOKS{lc($name)}) { + if (defined $EVENTS{lc($event)}) { + $HOOKS{lc($event)}{lc($name)} = $sub; + return 1; + } + else { + return 0; + } + } + else { + return 0; + } +} + +# Delete a hook from Auto. +sub hook_del +{ + my ($event, $name) = @_; + + if (defined $HOOKS{lc($event)}{lc($name)}) { + delete $HOOKS{lc($event)}{lc($name)}; + return 1; + } + else { + return 0; + } +} + # Configuration value getter. sub conf_get {