summaryrefslogtreecommitdiffstats
path: root/scripts/timer.pl
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/timer.pl')
-rw-r--r--scripts/timer.pl177
1 files changed, 177 insertions, 0 deletions
diff --git a/scripts/timer.pl b/scripts/timer.pl
new file mode 100644
index 0000000..22c4f6f
--- /dev/null
+++ b/scripts/timer.pl
@@ -0,0 +1,177 @@
+# Fixes for multiple servers and window items by dg
+#
+# 2003-08-27 coekie:
+# - use item names and server tags, fixes irssi crash if window item or server is destroyed
+#
+# 2003-08-19
+# - changed timer stop code a bit.
+# should fix the random timer o.O never happened to me before.
+#
+# 2002-12-21 darix:
+# - nearly complete rewrite ;) the old version wasnt "use strict;" capable =)
+# - still some warnings with "use warnings;"
+# - use of command_runsub now :)
+#
+
+use strict;
+use Data::Dumper;
+use warnings;
+use vars qw ($VERSION %IRSSI);
+use Irssi 20020325 qw (command_bind command_runsub command timeout_add timeout_remove signal_add_first);
+
+$VERSION = '0.8';
+%IRSSI = (
+ authors => 'Kimmo Lehto, Marcus Rueckert',
+ contact => 'kimmo@a-men.org, darix@irssi.org' ,
+ name => 'Timer',
+ description => 'Provides /timer command for mIRC/BitchX type timer functionality.',
+ license => 'Public Domain',
+ changed => '2015-02-07'
+);
+
+Irssi::settings_add_bool('timer', 'timer_stop_msgs', 1);
+
+our %timers;
+# my %timer = { repeat => \d+, command => '' , windowitem => NULL , server=> NULL, timer = NULL};
+
+sub timer_command {
+ my ( $name ) = @_;
+ if ( exists ( $timers{$name} ) ) {
+ my ($server, $item);
+ if ($timers{$name}->{'server'}) {
+ $server = Irssi::server_find_tag( $timers{$name}->{'server'} );
+ }
+ if ( $server ) {
+ if ( $timers{$name}->{'windowitem'}) {
+ $item = $server->window_find_item( $timers{$name}->{'windowitem'} );
+ }
+ ($item ? $item : $server)->command( $timers{$name}->{'command'} );
+ } else {
+ command( $timers{$name}->{'command'} );
+ }
+
+ if ( $timers{$name}->{'repeat'} != -1 ) {
+ if ( --$timers{$name}->{'repeat'} == 0) {
+ cmd_timerstop( $name );
+ }
+ }
+ }
+}
+
+sub cmd_timerstop {
+ my ( $name ) = @_;
+
+ my $verbose = Irssi::settings_get_bool('timer_stop_msgs');
+ if ( exists ( $timers{$name} ) ) {
+ timeout_remove($timers{$name}->{'timer'});
+ $timers{$name} = ();
+ delete ( $timers{$name} );
+ print( CRAP "Timer \"$name\" stopped." ) if $verbose;
+ }
+ else {
+ print( CRAP "\cBTimer:\cB No such timer \"$name\"." ) if $verbose;
+ }
+}
+
+sub cmd_timer_help {
+ print ( <<EOF
+
+TIMER LIST
+TIMER ADD <name> <interval in seconds> [<repeat>] <command>
+TIMER STOP <name>
+
+repeat value of 0 means unlimited too
+
+EOF
+ );
+}
+
+command_bind 'timer add' => sub {
+ my ( $data, $server, $item ) = @_;
+ my ( $name, $interval, $times, $command );
+
+ if ( $data =~ /^\s*(\S+)\s+(\d+(?:\.\d+)?)\s+(-?\d+)\s+(.*)$/ ) {
+ ( $name, $interval, $times, $command ) = ( $1, $2, $3, $4 );
+ $times = -1 if ( $times == 0 );
+ }
+ elsif ( $data =~ /^\s*(\S+)\s+(\d+(?:\.\d+)?)\s+(.*)$/ )
+ {
+ ( $name, $interval, $times, $command ) = ( $1, $2, -1, $3 );
+ }
+ else {
+ print( CRAP "\cBTimer:\cB parameters not understood. commandline was: timer add $data");
+ return;
+ };
+
+ if ( $times < -1 ) {
+ print( CRAP "\cBTimer:\cB repeat should be greater or equal to -1" );
+ return;
+ };
+
+ if ( $command eq "" ) {
+ print( CRAP "\cBTimer:\cB command is empty commandline was: timer add $data" );
+ return;
+ };
+
+ if ( exists ( $timers{$name} ) ) {
+ print( CRAP "\cBTimer:\cB Timer \"$name\" already active." );
+ }
+ else {
+ #$timers{$name} = {};
+ $timers{$name}->{'repeat'} = $times;
+ $timers{$name}->{'interval'} = $interval;
+ $timers{$name}->{'command'} = $command;
+ if ($item) {
+ $timers{$name}->{'windowitem'} = $item->{'name'};
+ }
+ if ($server) {
+ $timers{$name}->{'server'} = $server->{'tag'};
+ }
+
+ if ( $times == -1 ) {
+ $times = 'until stopped.';
+ }
+ else {
+ $times .= " times.";
+ }
+
+ print( CRAP "Starting timer \"$name\" repeating \"$command\" every $interval seconds $times" );
+
+ $timers{$name}->{'timer'} = timeout_add( $interval * 1000, \&timer_command, $name );
+ }
+};
+
+command_bind 'timer list' => sub {
+ print( CRAP "Active timers:" );
+ foreach my $name ( keys %timers ) {
+ if ( $timers{$name}->{repeat} == -1 ) {
+ print( CRAP "$name = $timers{$name}->{'command'} (until stopped)");
+ }
+ else {
+ print( CRAP "$name = $timers{$name}->{'command'} ($timers{$name}->{'repeat'} repeats left)" );
+ }
+ }
+ print( CRAP "End of /timer list" );
+};
+
+command_bind 'timer stop' => sub {
+ my ( $data, $server, $item ) = @_;
+ cmd_timerstop ($data);
+};
+
+command_bind 'timer help' => sub { cmd_timer_help() };
+
+command_bind 'timer' => sub {
+ my ( $data, $server, $item ) = @_;
+ $data =~ s/\s+$//g;
+ command_runsub ( 'timer', $data, $server, $item ) ;
+};
+
+
+signal_add_first 'default command timer' => sub {
+#
+# gets triggered if called with unknown subcommand
+#
+ cmd_timer_help()
+}
+