All pastes #279129 Raw Edit

send_away_final

public text v1 · immutable
·published 2006-12-14 20:38 UTC
rendered paste body
use SOAP::Lite;    ############################################################
use Data::Dumper;  ############ Things commented like: #      ### <line> are ##
use strict;        ############ for debugging... DEAN STYLE! lol @ pc486     ##
                   ############################################################

###################################################################################################################################################################
## add: /alias send_away msg $* Sorry! $X is currently away: $A. It's $Z, this client (irssi v$J - running on $sysname $sysarch) has been idle for $E second(s). ##
###################################################################################################################################################################

BEGIN {
	unless (exists $::{"Irssi::"}) {
		require Pod::Usage;
		Pod::Usage::pod2usage(-verbose => 2);
	}
}

# Start of man page

=head1 DESCRIPTION

This script is for auto messaging those who send a pm whilst you are away. I personally use it mainly for Bitlbee.

=head2 Methods

=over 5

Just load it up, set it's cycle time... And you're good. It's on by defauly, obviously, but you can turn it off if wanted. Default cycle time is 15 minutes, it's set in seconds.

=back

=head1 AUTHOR

Dean <kool.name@gmail.com> - L<http://dean.dnsalias.com/>

=cut

# Start of script

use Text::ParseWords;
use vars qw!$VERSION %IRSSI!;

use Irssi qw !
	command_bind settings_get_bool
	settings_add_bool settings_get_str
	settings_add_str signal_add
!;

$VERSION = '0.01';
%IRSSI = (
	authors		=> 'Justin Lee',
	contact		=> 'kool.name@gmail.com',
	name		=> 'auto-msgr',
	description	=> 'Scipt for automessaging when set to away.',
	license		=> 'GPL',
);

settings_add_bool($IRSSI{'name'}, 'autoreply_setting', 1);
settings_add_str($IRSSI{'name'}, 'autoreply_cycle', '900');
signal_add('event privmsg', 'irc_privmsg');
signal_add('setup changed', 'load_globals');

my (%SA_DATA, $SA_SETTING, $SA_CYCLE) = 
	((), settings_get_bool('autoreply_setting'), settings_get_str('autoreply_cycle'));

sub load_globals {
	($SA_SETTING, $SA_CYCLE) = 
		(settings_get_bool('autoreply_setting'), settings_get_str('autoreply_cycle'));
}

sub compareTime {
	my $diff;
	my @old = split(/\s+/, $_[0], 2);
	my @new = split(/\s+/, $_[1], 2);
	my $server = $_[2];

#	###$server->command("echo -current Here's #2... Pretrim Old: @old Pretrim New: @new");

	if (@old[0] ne @new[0]) { return 1 }; # exits if the day's not the same, returning 1
	
	my $old = convertTime($old[1], $server);	# day is the same,
	my $new = convertTime($new[1], $server);	# discard useless info (y-m-d)

	if ($new > $old) {
		$diff = $new - $old;
	} else {
		return 1;
	}

#	###$server->command("echo -current Here's #3... Posttrim Old: ${old}s. Posttrim New: ${new}s. Difference: ${diff}s.");

	if ($diff > $SA_CYCLE) { return 1 };
	return 0;
	
}

sub checkTime {
	my ($data, $date, $server) = @_;
	unless ($SA_DATA{$data}) { return 1 };
	if (compareTime($SA_DATA{$data}, $date, $server)) { return 1 };
	return 0;
}

sub irc_privmsg {
	if ($SA_SETTING) {
		my ($server, $data, $from, $address) = @_;
		my ($to, $message) = split(/\s+:/, $data, 2);
	
		chomp(my $date = `date --rfc-3339=seconds`);
		$date =~ s/(\S+)(-\S+:\S+)/$1/;	# $date == yyyy-mm-dd hh:mm:ss
	
		my $target = find_target($to, $from);
	
#	###$server->command("echo -current Here's #1... Date: $date Precheck: $target => $SA_DATA{$target}");
	
		if($server->{'usermode_away'}) {	# check for away
			if($target){			# check for pm
	
				if(checkTime($target, $date, $server)) {

				# splits up $date to get y-m-d and h:m:s
					$SA_DATA{$target} = $date;

#				###$server->command("echo -current Here's #4... Date: $date Postcheck: $target => $SA_DATA{$target} Status: Sent\n");
					$server->command("SEND_AWAY $target");
					return 1;
				}
			}
#		###$server->command("echo -current Here's #4... Date: $date Postcheck: $target => $SA_DATA{$target} Status: Unsent\n");
		}
	}
}

sub convertTime {
	my ($time, $server) = @_;
	
#	###$server->command("echo -current Here's time #1... Presplit: $time");
	
	my @times = split(/:/, $time, 3);
	
#	###$server->command("echo -current Here's time #2... Postsplit: @times");
	
	$times[2] += (($times[0] * 3600) + ($times[1] * 60));
	
#	###$server->command("echo -current Here's time #3... Return value: $times[2]");
	
	return $times[2];
}

sub find_target {
	my ($to, $from) = @_;

	if($to =~ /^#/){
		return 0; # from a channel do not SEND_AWAY
	}
	return $from; # from a private message
}