# Away Manager # # This script allows you to have different automated # actions on away # # - sets your nick, using a base and a keyword # - in example: Crazy_Away # - insert an away reason # - say on all channels that your away # # This is my first IRSSI script, but I'll try to make it # better soon. # If you have ideas to improve it, or make it more efficient, # contact me at crazycat@c-p-f.org use Irssi; use Irssi::Irc; use strict; use vars qw($VERSION %IRSSI); $VERSION = '1.0'; %IRSSI = ( authors => 'CrazyCat', contact => 'crazycat@c-p-f.org', name => 'ExtAway', description => 'Extended Away & Back programm', license => 'GNU GPLv2 or later', changed => '$Date: 2005/01/12 03:04:01$' ); my $xa_confile = Irssi::get_irssi_dir()."/xa.config"; my %infos = (); my ($oldnick, $t_away); sub init { # verifying if settings file exists if (!(open xa_settings, "<$xa_confile")) { putlog("No config file: /xahelp for help"); return 0; }; # reading the config file while (my $line = ) { $line =~ s/\n//; my ($xa_key,$xa_val) = split(/:/, $line); $xa_key =~ tr/[A-Z]/[a-z]/; if ($xa_val ne "") { $infos{$xa_key} = $xa_val; } } close xa_settings; } sub xa_go { # Main procedure to go away my($data,$server,$channel) = @_; my $xa_nick = ""; my $xa_reason = ""; if ($server->{usermode_away}) { # oooops! already marged as away &putlog("You're allready marqued as away ($server->{away_reason})"); return 0; } $oldnick = $server->{nick}; $t_away = time(); my $t_data = split(/ /, $data); if ($t_data < 2) { # away called with just a keyword $xa_nick = $data; $xa_nick =~ tr/[A-Z]/[a-z]/; $xa_reason = $infos{$xa_nick}; } else { # this is a new reason ($xa_nick, $xa_reason) = $data =~ /^(\S+) (.*)/; &xa_add($xa_nick, $xa_reason); } if ($xa_reason eq "") { putlog("Sorry, <$xa_nick> is not defined"); } else { my $nick = "$infos{'bnick'}$xa_nick"; foreach my $server (Irssi::servers) { $server->command("AWAY $xa_reason"); $server->command("NICK $nick"); foreach my $chan ($server->channels) { $server->command("DESCRIBE $chan->{name} is away [Reason: $xa_reason]"); } } } } sub xa_back { # the way to be back my($data,$server,$channel) = @_; if (!$server->{usermode_away}) { &putlog("You're not marqued as away"); return 0; } my $delay = time() - $t_away; my $f_delay = f_delay($delay); foreach my $server (Irssi::servers) { foreach my $chan ($server->channels) { $server->command("DESCRIBE $chan->{name} is back from [$server->{away_reason}] - $f_delay away"); } $server->command("AWAY"); $server->command("NICK $oldnick"); } } sub putlog { # procedure to write in status window my ($window) = Irssi::active_win(); Irssi::print("[$IRSSI{'name'}] @_", MSGLEVEL_CLIENTNOTICE); } sub f_delay { # formatting the away time my $seconds = shift; my ($hours, $minutes, $formated); if ($seconds > 3600) { $hours = int($seconds / 3600); $formated .= $hours."h:"; $seconds = $seconds - ($hours * 3600); } if ($seconds > 60) { $minutes = int($seconds / 60); $formated .= $minutes."m:"; $seconds = $seconds - ($minutes * 60); } $formated .= $seconds."s"; return $formated; } sub xa_add { # Adding the keyword and the reason in the config file # may create double entries... my($kw, $reason) = @_; if(!(open xa_settings, ">>$xa_confile")) { &putlog("Unable to open file $xa_confile"); } print xa_settings "$kw:$reason\n"; close xa_settings; $infos{$kw} = $reason; } sub xa_save { # save the temp infos (might correct the double entries) my ($data,$server,$channel) = @_; if(!(open xa_settings, ">$xa_confile")) { &putlog("Unable to create file $xa_confile"); } print xa_settings "bnick:$infos{'bnick'}\n"; while (my ($kw, $line) = each %infos) { if ($kw ne "bnick") { print xa_settings "$kw:$infos{$kw}\n"; } } close xa_settings; } sub xa_nick { # The way to add the base nick my ($data,$server,$channel) = @_; if ($data eq "") { putlog("You must define your base_nick") } $infos{'bnick'} = $data; &xa_save; } sub xa_help { &putlog("Help for $IRSSI{name} : $IRSSI{description}"); &putlog(" Setting your base nick: /xanick "); &putlog(" Going away: /aw [reason]"); &putlog(" if keyword exists in the base, reason is automatically displayed"); &putlog(" if keyword is a new one, you MUST give a reason"); &putlog(" -- Nota: your away nick will be --"); &putlog(" Coming back from away: /back"); &putlog(" Saving all datas: /xasave (take care, setting your base_nick will save all your datas)"); } # # main # &init(); if ($infos{'bnick'} eq "") { &putlog("Please, give a base nick with /xanick "); &putlog("Use /xahelp to get some help"); } Irssi::command_bind("aw", "xa_go"); Irssi::command_bind("back", "xa_back"); Irssi::command_bind("xahelp", "xa_help"); Irssi::command_bind("xanick", "xa_nick"); Irssi::command_bind("xasave", "xa_save");