#!/usr/bin/perl # # by Stefan "tommie" Tomanek # use strict; use vars qw($VERSION %IRSSI); $VERSION = "2003231101"; %IRSSI = ( authors => "Stefan 'tommie' Tomanek", contact => "stefan\@pico.ruhr.de", name => "IrssiQ", description => "integrates ICQ instant-messaging into irssi", license => "GPLv2", changed => "$VERSION", modules => "Net::vICQ Data::Dumper", sbitems => "irssiq", commands => "irssiq" ); use Irssi 20020324; use Irssi::TextUI; use Net::vICQ; use Data::Dumper; use vars qw($icq $timer $old_status %contacts @requested $want_connect); sub draw_box ($$$$) { my ($title, $text, $footer, $colour) = @_; my $box = ''; $box .= '%R,--[%n%9%U'.$title.'%U%9%R]%n'."\n"; foreach (split(/\n/, $text)) { $box .= '%R|%n '.$_."\n"; } $box .= '%R`--<%n'.$footer.'%R>->%n'; $box =~ s/%.//g unless $colour; return $box; } sub show_help() { my $help="IrssiQ $VERSION /irssiq List contact list /irssiq connect Connect to the ICQ network /irssiq disconnect Disconnect from ICQ network /irssiq add Add uin to contact list /irssiq del Delete uin from contact list /irssiq auth Authorize user to add your UIN to his contact list /irssiq info .... Retrieve information about the uins /irssiq invisible Add or remove the UIN from your invisible list /irssiq visible Add or remove the UIN from your visible list /irssiq hidden Hide (or show) a uin in the statusbar /irssiq msg Send a message to uin /irssiq query Create a new query window with uin /irssiq email Send an email to uin /irssiq status (away|online|na|occupied|dnd|invisible) Change to the selected status /irssiq save Save contact list to file /irssiq load (Re-)Load contact list (reconnect afterwards) "; my $text = ''; foreach (split(/\n/, $help)) { $_ =~ s/^\/(.*)$/%9\/$1%9/; $text .= $_."\n"; } print CLIENTCRAP draw_box($IRSSI{name}, $text, "help", 1); } sub call_openurl ($) { my ($url) = @_; no strict "refs"; # check for a loaded openurl if (defined %{ "Irssi::Script::openurl::" }) { &{ "Irssi::Script::openurl::launch_url" }($url); } else { print CLIENTCRAP "%R>>%n Please install openurl.pl"; } } sub store_openurl ($$$) { my ($uin, $text, $url) = @_; $url =~ s/\n/ /g; $text =~ s/\n/ /g; no strict "refs"; if (defined %{ "Irssi::Script::openurl::" }) { &{ "Irssi::Script::openurl::new_url" }(undef, "IrssiQ", $uin, $text, $url); } else { print CLIENTCRAP "%R>>%n Please install openurl.pl"; } } sub output ($) { print CLIENTCRAP $_ foreach split(/\n/, $_[0]); } sub icq_connect { my $uin = Irssi::settings_get_int('irssiq_uin'); my $password = Irssi::settings_get_str('irssiq_password'); $icq = Net::vICQ->new($uin, $password, 0); #$icq->{_Hide_IP} = 0; $icq->Add_Hook("Srv_Mes_Received", \&MessageHandler); $icq->Add_Hook("Srv_Srv_Message", \&MessageHandler); $icq->Add_Hook("Srv_BLM_Contact_Online", \&MessageHandler); $icq->Add_Hook("Srv_BLM_Contact_Offline", \&MessageHandler); $icq->{_Status} = 'Online'; my $err; output "%R>>%n Trying to connect to ICQ server..."; { $icq->{_Auto_Login} = 1; open FOO, '>>/dev/null'; my $oldfh = select(FOO); $icq->Connect(); if(!($err = $icq->GetError())) { while(!$icq->{_LoggedIn} && !($err = $icq->GetError())) { $icq->Execute_Once(); } } select($oldfh); } if(!$err) { output "%R<<%n ..connected!"; #my ($details); #$details->{Status} = 'Online'; #$icq->Send_Command("Cmd_GSC_Set_Status", $details); add_uin($uin) unless $contacts{$uin}; send_contacts(); $timer = Irssi::timeout_add(2000, 'icq_cycle', undef); return 1; } else { output "%R<<%n ..failed!"; $want_connect = 0; my $s = $err; chomp($s); print("%R>>%n ".$s); return 0; } } sub write_to_log ($$$$) { my ($who, $direction, $type, $text) = @_; my $dir = Irssi::get_irssi_dir(); mkdir $dir."/irssiq/" unless (-e $dir."/irssiq/"); my $data = $type." ".$direction." ".$who.":\n"; $data .= scalar(localtime())."\n"; $data .= $text."\n\n"; local *F; open(F, '>>'.$dir."/irssiq/".$who); print F $data; close(F); } sub MessageHandler ($$) { my ($icq, $details) = @_; if (Irssi::settings_get_bool('irssiq_debug')) { my $text; foreach (keys %$details) { my $content = $details->{$_}; no warnings; #$content =~ s/\c.//g; #$content =~ s/\pC//g; $content =~ s/(?:(\n)|\pC)/$1/g; $content =~ s/%/%%/g; $text .= $_." -> <".$content.">\n"; } #print CLIENTCRAP $_." -> <".$details->{$_}.">" foreach keys %$details; print CLIENTCRAP &draw_box('IrssiQ', $text, 'debug', 1); } my $type = $details->{MessageType}; if ($type eq 'text_message' || $type eq 'offline_text_message' ) { my $text = $details->{text}; # FIXME unicode stuff?! no warnings; #$text =~ s/\c.//g; #$text =~ s/\pC//g; $text =~ s/(?:(\n)|\pC)/$1/g; write_to_log($details->{Sender}, 'from', 'msg', $text); $text =~ s/%/%%/g; my $output = draw_box("IrssiQ", $text, "msg from ".get_nick($details->{Sender}), 1); # autocancels if there is already a window start_query($details->{Sender}) if Irssi::settings_get_bool('irssiq_auto_open_query'); my $win = Irssi::window_find_name('{Sender}.'>'); if (ref $win) { if (Irssi::settings_get_bool('irssiq_msg_border_in_query')) { $win->print($output, MSGLEVEL_MSGS); } else { $win->print("<".get_nick($details->{Sender})."> ".$text, MSGLEVEL_MSGS); } } else { print MSGS $_ foreach split(/\n/, $output); } } elsif ($type eq 'URL') { write_to_log($details->{Sender}, 'from', 'URL', $details->{URL}); my $output = draw_box("IrssiQ", "%U".$details->{URL}."%U", "URL from ".get_nick($details->{Sender}), 1); my $win = Irssi::window_find_name('{Sender}.'>'); unless (ref $win) { print MSGS $_ foreach split(/\n/, $output); } else { $win->print("<".get_nick($details->{Sender})."> ".$details->{URL}, MSGLEVEL_MSGS); } store_openurl($details->{Sender}, $details->{URL}, $details->{URL}); } elsif ($type eq 'status_change') { if ($details->{Sender} == Irssi::settings_get_int('irssiq_uin')) { unless ($contacts{$details->{Sender}}{status} eq $details->{Status}) { output "%R<<%n Changed own status to '".$details->{Status}."'."; } } $contacts{$details->{Sender}}{status} = $details->{Status}; Irssi::statusbar_items_redraw('irssiq'); } elsif ($type eq 'user_info_main') { my $uin = shift(@requested); if ($contacts{$uin}) { foreach (keys %$details) { next if (/Ref|Our_UIN|MessageType|SubMessageType/); $contacts{$uin}{user_info_main}{$_} = $details->{$_}; $contacts{$uin}{user_info_main}{$_} =~ s/ /_/g if $_ eq 'Nickname'; } } show_short_info($uin, $details); Irssi::statusbar_items_redraw('irssiq'); next_info(); } elsif ($type eq 'user_info_not_found') { my $uin = shift(@requested); output "%R>>%n Information about UIN ".$uin." not found"; next_info(); } elsif ($type eq 'add_message') { output draw_box("IrssiQ", $details->{Sender}." added you to his/her contact list", "added by ".$details->{Sender}, 1); } elsif ($type eq 'auth_request') { get_userinfo($details->{Sender}); output draw_box("IrssiQ", $details->{reason}, "auth-request from ".$details->{Sender}, 1); } elsif ($type eq 'Invalid tagged message') { # Webmessage my $string = $details->{TaggedDataString}; $string =~ s/\pC//g; $string =~ /\d+\.\d+\.\d+\.\d+(.*)/; write_to_log("Webmessage", 'from', 'msg', $1); print CLIENTCRAP &draw_box("IrssiQ", $1, "WebMessage", 1); } } sub next_info { return unless defined $requested[0]; my $uin = $requested[0]; output "%B>>%n Requesting user information for UIN #$uin"; my %details = ( MessageType => "Get_WP_Info", TargetUIN => $uin, ); $icq->Send_Command("Cmd_Srv_Message", \%details); } sub get_userinfo ($) { my ($uin) = @_; push @requested, $uin; next_info if (scalar(@requested) == 1); } sub icq_cycle { return unless ($icq); $icq->Send_Keep_Alive(); $icq->Execute_Once(); unless ($icq->{_Connected}) { Irssi::timeout_remove($timer); output "%R>>%n IrssiQ disconnected"; $contacts{$_}{status} = 'Offline' foreach keys %contacts; if (Irssi::settings_get_bool('irssiq_auto_reconnect') && $want_connect) { icq_connect(); } } } sub send_message ($$$) { my ($icq, $uin, $text) = @_; my $details = { uin => $uin, MessageType => 'text', text => $text }; write_to_log($uin, 'to', 'msg', $text); $icq->Send_Command("Cmd_Send_Message", $details); my $win = Irssi::window_find_name(''); my $output = draw_box("IrssiQ", $text, "msg to ".get_nick($uin), 1); unless (ref $win) { print CLIENTCRAP $_ foreach split(/\n/, $output); } else { my $my_uin = Irssi::settings_get_int('irssiq_uin'); $win->print("<".get_nick($my_uin)."> ".$text, MSGLEVEL_CLIENTCRAP); } } sub array2table { my (@array) = @_; my @width; foreach my $line (@array) { for (0..scalar(@$line)) { my $l = $line->[$_]; $l =~ s/%[^%]//g; $l =~ s/%%/%/g; $width[$_] = length($l) if $width[$_][$_]; $text .= $line->[$_]; $l =~ s/%[^%]//g; $l =~ s/%%/%/g; $text .= " "x($width[$_]-length($l)+1); } $text .= "\n"; } return $text; } sub list_contacts { my $text; my @array; my $my_uin = Irssi::settings_get_int('irssiq_uin'); foreach (sort {$contacts{$a}{status} cmp $contacts{$b}{status}} keys %contacts) { my @line; next if $_ eq $my_uin; my $status = $contacts{$_}{status}; next if ($status eq 'Offline' && not Irssi::settings_get_bool('irssiq_list_show_offline')); if ($status eq "Online") { push @line, "%go%n"; } else { push @line, "%ro%n"; } push @line, $status; if ($contacts{$_}{user_info_main} && $contacts{$_}{user_info_main}{Nickname}) { push @line, '['.$contacts{$_}{user_info_main}{Nickname}.']'; } else { push @line, ''; } push @line, $_; if ($contacts{$_}{invisible}) { push @line, '%B%n'; } else { push @line, ""; } if ($contacts{$_}{visible}) { push @line, '%G%n'; } else { push @line, ""; } if ($contacts{$_}{hide_in_sb}) { push @line, '%B%n'; } else { push @line, ""; } push @array, \@line; } my %table = (Online => '%G==Online==%n', Away => '%R===Away===%n', 'Do Not Disturb' => '%B===DnD====%n', Occupied => '%Y=Occupied=%n', Invisible => '%C===Inv====%n', 'N/A' => '%Y===N/A====%n', Offline => '%R=Offline==%n' ); $text = array2table(@array); $text .= $table{$contacts{$my_uin}{status}}."\n"; output draw_box('IrssiQ', $text, 'contacts', 1); } sub add_uin ($) { my ($uin) = @_; $contacts{$uin} = { status => 'Offline' } unless defined $contacts{$uin}; Irssi::statusbar_items_redraw('irssiq'); get_userinfo($uin) if ($icq && $icq->{_Connected}); } sub del_uin ($) { my ($uin) = @_; return unless defined $contacts{$uin}; delete $contacts{$uin}; } sub send_contacts { my ($details, $details2, $details3); my @uins; my @inv; my @vis; foreach (keys(%contacts)) { push @uins, $_; push @inv, $_ if $contacts{$_}{invisible}; push @vis, $_ if $contacts{$_}{visible}; } $details->{ContactList} = \@uins; $icq->Send_Command("Cmd_Add_ContactList", $details); $icq->Send_Command("Cmd_CTL_UploadList", $details); $details2->{InVisibleList} = \@inv; $details3->{VisibleList} = \@vis; $icq->Send_Command("Cmd_BOS_Add_InVisibleList", $details2) if @inv; $icq->Send_Command("Cmd_BOS_Add_VisibleList", $details3) if @vis; } sub save_contacts { my $dir = Irssi::get_irssi_dir(); my $dumper = Data::Dumper->new([\%contacts], ['contacts']); $dumper->Purity(1)->Deepcopy(1); my $data = $dumper->Dump; local *F; open(F, '>'.$dir.'/irssiq_contacts'); print F $data; close(F); output "%R>>%n IrssiQ contacts saved"; } sub load_contacts { my $text; my $dir = Irssi::get_irssi_dir(); return unless (-e $dir.'/irssiq_contacts'); local *F; open F, "<".$dir.'/irssiq_contacts'; $text .= $_ foreach (); close(F); if ($text) { no strict; my %friends = %{ eval "$text" }; foreach (keys %friends) { next if defined $contacts{$_}; $contacts{$_} = $friends{$_}; $contacts{$_}{status} = 'Offline'; } } } sub show_short_info ($$) { my ($uin, $details) = @_; my $text = "== ".$details->{Nickname}." ==\n"; $text .= "Name : ".$details->{Firstname}." ".$details->{Lastname}."\n"; $text .= "eMail: ".$details->{Email}."\n"; output draw_box('IrssiQ', $text, $uin, 1); } sub set_status ($) { my ($status) = @_; $status =~ s/ /_/g; my %table = (online => 'Online', away => 'Away', na => 'Not_Available', occupied => 'Occupied', dnd => 'Do_Not_Disturb', invisible => 'Invisible', ffc => 'Free_For_Chat' ); my %options = %table; $options{'N/A'} = 'Not_Available'; $options{ $table{$_} } = $table{$_} foreach keys %table; unless (defined $options{$status}) { output "%R>>%n '".$status."' is an invalid status"; output "%R>>%n Valid options are: ".join(" ", keys(%table)); return; } my ($details); $details->{Status} = $options{$status}; $icq->Send_Command("Cmd_GSC_Set_Status", $details); } sub sig_away ($) { my ($server) = @_; return unless ($icq && $icq->{_Connected}); my $away_status = Irssi::settings_get_str('irssiq_away_status'); if ($server->{usermode_away}) { my $uin = Irssi::settings_get_str('irssiq_uin'); $old_status = $contacts{$uin}{status}; set_status($away_status); } else { set_status($old_status); } } sub sb_show ($$) { my ($item, $get_size_only) = @_; my $line = ""; my %users; my $more = 0; foreach my $uin (sort {$contacts{$a}{status} cmp $contacts{$b}{status}} keys %contacts) { next if $uin eq Irssi::settings_get_str('irssiq_uin'); my $status = $contacts{$uin}{status}; next if $status eq ''; next if ($status eq 'Online' && not Irssi::settings_get_bool('irssiq_statusbar_show_online')); next if ($status eq 'Offline' && not Irssi::settings_get_bool('irssiq_statusbar_show_offline')); next if ($status eq 'Away' && not Irssi::settings_get_bool('irssiq_statusbar_show_away')); next if ($status eq 'Do Not Disturb' && not Irssi::settings_get_bool('irssiq_statusbar_show_dnd')); next if ($status eq 'Occupied' && not Irssi::settings_get_bool('irssiq_statusbar_show_occupied')); next if ($status eq 'Invisible' && not Irssi::settings_get_bool('irssiq_statusbar_show_invisible')); next if ($status eq 'N/A' && not Irssi::settings_get_bool('irssiq_statusbar_show_not_available')); if ($contacts{$uin}{hide_in_sb}) { $more = 1; next; } # FIXME Irssi bug?! my %table = (Online => '%gO%n', Away => '%rA%n', 'Do Not Disturb' => '%bD%n', Occupied => '%yOc%n', Invisible => '%cI%n', 'N/A' => '%yN%n', 'Offline' => '%RO%n' ); unless (Irssi::settings_get_bool('irssiq_statusbar_compact')) { $line .= '<'; if (defined $table{$status}) { $line .= $table{$status}; } else { $line .= substr($status, 0, 1); } $line .= '%bI%n' if $contacts{$uin}{invisible}; $line .= '%gV%n' if $contacts{$uin}{visible}; $line .= '>'; if ($contacts{$uin}{user_info_main} && $contacts{$uin}{user_info_main}{Nickname}) { $line .= $contacts{$uin}{user_info_main}{Nickname}." "; } else { $line .= $uin." "; } } else { push @{ $users{$table{$status}} }, $uin; } } if (Irssi::settings_get_bool('irssiq_statusbar_compact')) { foreach (keys %users) { $line .= '<'.$_; foreach my $uin (@{ $users{$_} }) { $line .= ' '.get_nick($uin); } $line .= '>'; } } my %table = (Online => '%G==Online==%n', Away => '%R===Away===%n', 'Do Not Disturb' => '%B===DnD====%n', Occupied => '%Y=Occupied=%n', Invisible => '%C===Inv====%n', 'N/A' => '%Y===N/A====%n', Offline => '%R=Offline==%n' ); if (Irssi::settings_get_bool('irssiq_statusbar_short_status')) { %table = (Online => '%G(On)%n', Away => '%R(Aw)%n', 'Do Not Disturb' => '%B(DnD)%n', Occupied => '%Y(Inv)%n', 'N/A' => '%Y(NA)%n', Offline => '%R(Off)%n' ); } my $my_uin = Irssi::settings_get_int('irssiq_uin'); $line .= '...' if $more; $line .= $table{$contacts{$my_uin}{status}}; my $format = "{sb ".$line."}"; $item->{min_size} = $item->{max_size} = length($line); $item->default_handler($get_size_only, $format, 0, 1); } sub get_uin ($) { my ($input) = @_; return $input if $input =~ /^[0-9]+$/; foreach (keys %contacts) { if ($contacts{$_}{user_info_main} && $contacts{$_}{user_info_main}{Nickname}) { return $_ if lc($contacts{$_}{user_info_main}{Nickname}) eq lc($input); } } return undef; } sub get_nick ($) { my ($uin) = @_; if ($contacts{$uin} && $contacts{$uin}{user_info_main}) { return $contacts{$uin}{user_info_main}{Nickname}; } # Fallback return $uin; } sub send_auth ($) { my ($uin) = @_; return unless $uin =~ /^[0-9]+$/; my ($details); $details->{uin} = $uin; $icq->Send_Command("Cmd_Authorize", $details); output "%R>>%n Authorization sent to ".$uin; } sub start_query ($) { my ($uin) = @_; return if ref Irssi::window_find_name(''); Irssi::command("window new hide"); my $win = Irssi::active_win; $win->set_name(''); $win->set_history(''); $win->print('Starting IrssiQ query with '.get_nick($uin).' ('.$uin.')'); } sub sig_send_text ($) { my ($text, $foo1, $foo2) = @_; my $win = Irssi::active_win; return unless (ref $win && $win->{name} =~ //); my $uin = $1; if ($icq && $icq->{_Connected}) { send_message($icq, $uin, $text); } else { $win->print("%R>>%n You are not connected to ICQ", MSGLEVEL_CLIENTCRAP); } } sub send_url ($$$) { my ($uin, $url, $description) = @_; return unless ($icq && $icq->{_Connected}); my %details = ( uin => $uin, MessageType => 'url', URL => $url, Description => $description ); write_to_log($uin, 'to', 'url', $url."\n".$description); $icq->Send_Command("Cmd_Send_Message", \%details); my $win = Irssi::window_find_name(''); my $output = draw_box("IrssiQ", $url, "url to ".get_nick($uin), 1); unless (ref $win) { output $output; } else { my $my_uin = Irssi::settings_get_int('irssiq_uin'); $win->print("<".get_nick($my_uin)."> ".$url, MSGLEVEL_CRAP); } } # calles by scriptassist on reload sub pre_unload { save_contacts(); return unless $icq->{_Connected}; $icq->Disconnect() if ($icq && $icq->{_Connected}); while ($icq->{_Connected}) { $icq->Execute_Once(); } $contacts{$_}{status} = 'Offline' foreach keys %contacts; output "%R>>%n IrssiQ disconnected"; } sub sig_complete_word ($$$$$) { my ($list, $window, $word, $linestart, $want_space) = @_; return unless $linestart =~ /^.irssiq (\w+)/; my @newlist; if ($1 eq 'status') { foreach (('online', 'away', 'na', 'occupied', 'dnd', 'invisible', 'ffc')) { push @newlist, $_ if /^(\Q$word\E.*)?$/i; } } else { foreach (keys %contacts) { push @newlist, $_ if /^(\Q$word\E.*)?$/; if ($contacts{$_}{user_info_main} && $contacts{$_}{user_info_main}{Nickname}) { push @newlist, $contacts{$_}{user_info_main}{Nickname} if $contacts{$_}{user_info_main}{Nickname} =~ /^(\Q$word\E.*)?$/i; } } } $want_space = 0; push @$list, $_ foreach @newlist; } sub toggle_inv_list ($) { my ($uin) = @_; return unless defined $contacts{$uin}; $contacts{$uin}{invisible} = not $contacts{$uin}{invisible}; my ($details); $details->{InVisibleList} = [$uin]; if ($contacts{$uin}{invisible}) { $icq->Send_Command("Cmd_BOS_Add_InVisibleList", $details) if $icq->{_Connected}; output "%B>>%n You are now invisible for ".get_nick($uin)." (".$uin.")"; } else { $icq->Send_Command("Cmd_BOS_Remove_InVisibleList", $details) if $icq->{_Connected}; output "%B>>%n You are no longer invisible for ".get_nick($uin)." (".$uin.")"; } } sub toggle_vis_list ($) { my ($uin) = @_; return unless defined $contacts{$uin}; $contacts{$uin}{visible} = not $contacts{$uin}{visible}; my ($details); $details->{VisibleList} = [$uin]; if ($contacts{$uin}{visible}) { $icq->Send_Command("Cmd_BOS_Add_VisibleList", $details) if $icq->{_Connected}; output "%B>>%n You are now visible for ".get_nick($uin)." (".$uin.")"; } else { $icq->Send_Command("Cmd_BOS_Remove_VisibleList", $details) if $icq->{_Connected}; output "%B>>%n You are no longer visible for ".get_nick($uin)." (".$uin.")"; } } sub toggle_hidden ($) { my ($uin) = @_; return unless defined $contacts{$uin}; $contacts{$uin}{hide_in_sb} = not $contacts{$uin}{hide_in_sb}; if ($contacts{$uin}{hide_in_sb}) { output "%B>>%n ".get_nick($uin)." (".$uin.") is now hidden"; } else { output "%B>>%n ".get_nick($uin)." (".$uin.") is no longer hidden"; } Irssi::statusbar_items_redraw('irssiq'); } sub cmd_irssiq ($$$) { my ($args, $server, $witem) = @_; my @arg = split / +/, $args; if (scalar(@arg) == 0) { list_contacts(); } elsif ($arg[0] eq 'connect') { $want_connect = 1; icq_connect(); } elsif ($arg[0] eq 'disconnect') { $want_connect = 0; $icq->Disconnect() if ($icq && $icq->{_Connected}); } elsif ($arg[0] eq 'msg' && defined $arg[1] && defined $arg[2]) { my $uin = get_uin($arg[1]); return unless $uin; shift @arg; shift @arg; send_message($icq, $uin, join(" ", @arg)); } elsif ($arg[0] eq 'url' && defined $arg[1] && defined $arg[2]) { my $uin = get_uin($arg[1]); return unless $uin; my $url = $arg[2]; shift @arg; shift @arg; send_url($uin, $url, join(" ", @arg)); } elsif ($arg[0] eq 'auth' && defined $arg[1]) { send_auth($arg[1]) if ($icq && $icq->{_Connected}); } elsif ($arg[0] eq 'email' && defined $arg[1]) { my $uin = get_uin($arg[1]); return unless $uin; if ($contacts{$uin} && $contacts{$uin}{user_info_main}) { call_openurl($contacts{$uin}{user_info_main}{Email}) if $contacts{$uin}{user_info_main}{Email}; } } elsif ($arg[0] eq 'add' && defined $arg[1]) { shift @arg; foreach (@arg) { next unless $_ =~ /^[0-9]+$/; add_uin($_); output "%B>>%n Added UIN ".$_." to contact list"; } send_contacts() if ($icq && $icq->{_Connected}); } elsif ($arg[0] eq 'del' && defined $arg[1]) { shift @arg; foreach (@arg) { next unless $_ =~ /^[0-9]+$/; del_uin($_); output "%B>>%n Removed UIN ".$_." from contact list"; } send_contacts() if ($icq && $icq->{_Connected}); } elsif ($arg[0] eq 'save') { save_contacts(); } elsif ($arg[0] eq 'load') { load_contacts(); send_contacts if ($icq && $icq->{_Connected}); } elsif ($arg[0] eq 'info') { shift @arg; foreach (@arg) { my $uin = get_uin($_); get_userinfo($uin) if $uin; } } elsif ($arg[0] eq 'status' && defined $arg[1]) { set_status($arg[1]) if ($icq && $icq->{_Connected}); } elsif ($arg[0] eq 'query' && defined $arg[1]) { my $uin = get_uin($arg[1]); start_query($uin) if $uin; } elsif ($arg[0] eq 'invisible') { my $uin = get_uin($arg[1]); toggle_inv_list($uin); } elsif ($arg[0] eq 'visible') { my $uin = get_uin($arg[1]); toggle_vis_list($uin); } elsif ($arg[0] eq 'hidden') { my $uin = get_uin($arg[1]); toggle_hidden($uin); } elsif ($arg[0] eq 'help') { show_help(); } } Irssi::settings_add_int($IRSSI{name}, 'irssiq_uin', ''); Irssi::settings_add_str($IRSSI{name}, 'irssiq_password', ''); Irssi::settings_add_bool($IRSSI{name}, 'irssiq_debug', 0); Irssi::settings_add_bool($IRSSI{name}, 'irssiq_statusbar_show_online', 1); Irssi::settings_add_bool($IRSSI{name}, 'irssiq_statusbar_show_offline', 0); Irssi::settings_add_bool($IRSSI{name}, 'irssiq_statusbar_show_away', 1); Irssi::settings_add_bool($IRSSI{name}, 'irssiq_statusbar_show_dnd', 1); Irssi::settings_add_bool($IRSSI{name}, 'irssiq_statusbar_show_occupied', 1); Irssi::settings_add_bool($IRSSI{name}, 'irssiq_statusbar_show_invisible', 1); Irssi::settings_add_bool($IRSSI{name}, 'irssiq_statusbar_show_not_available', 1); Irssi::settings_add_bool($IRSSI{name}, 'irssiq_statusbar_short_status', 0); Irssi::settings_add_bool($IRSSI{name}, 'irssiq_list_show_offline', 1); Irssi::settings_add_bool($IRSSI{name}, 'irssiq_statusbar_compact', 0); Irssi::settings_add_bool($IRSSI{name}, 'irssiq_auto_open_query', 0); Irssi::settings_add_str($IRSSI{name}, 'irssiq_away_status', 'away'); Irssi::settings_add_bool($IRSSI{name}, 'irssiq_msg_border_in_query', 0); Irssi::settings_add_bool($IRSSI{name}, 'irssiq_auto_reconnect', 1); Irssi::signal_add_first('complete word', \&sig_complete_word); Irssi::signal_add('setup saved', \&save_contacts); Irssi::signal_add('away mode changed', \&sig_away); Irssi::signal_add('send text', \&sig_send_text); Irssi::statusbar_item_register('irssiq', 0, 'sb_show'); Irssi::command_bind('irssiq', \&cmd_irssiq); foreach my $cmd ('help', 'connect', 'disconnect', 'msg', 'auth', 'email', 'save', 'load', 'add', 'del', 'info', 'status', 'query', 'url', 'invisible', 'visible', 'hidden' ) { Irssi::command_bind('irssiq '.$cmd => sub { cmd_scripassist("$cmd ".$_[0], $_[1], $_[2]); }); } load_contacts(); print CLIENTCRAP '%B>>%n '.$IRSSI{name}.' '.$VERSION.' loaded: /irssiq help for help';