#!/usr/bin/perl
use IO::Socket;
use Net::IRC;
use Term::ReadLine;
use Net::ICQ2000;
use Time::HiRes;  # high resolution timing required
use Time::Stopwatch;

#########################################################################################
##
## Configuration
##
#########################################################################################

my $icquin="927893";
my $icqpassword="bdfyjdj3";
my $ircserver="irc1.msk.wenet.ru";
my $ircport="6667";
my $ircnick="ICQ2IRC";
my $ircnickpass="rk3uwb";
my $ircmainchan="#37";
my $irclogchan="#icq2irc";
my $LogFile="/home/mms/icq2irc/icq2irc.log";
my $WorkDir="/home/mms/icq2irc";
my $PIDFILE="icq2irc.pid";


my $VERSION = "0.07";
my $maxfails = 20;
	my $quit = 0;
	my $DEBUG = 0;
	my $boottime = 1;
	my $ConfFileName;

	my (%IRCSERV, %ICQSERV, %Admin, %CONTACTS);
	my (%WHOIS, %IRCONLINE, %ICQONLINE, %SEENHASH);
	my ($irc, $icq, $conn, @AUTOJOIN, @LOGCHAN, $TMPPID);
	my ($kidpid, $servconn);
	my $icqfail=0;
	my $irccomm=0;
	my $icqcomm=0;
	my $icq_ready=0;
	$ConfFileName = "./icqserv.conf";
	$WHOIS{'can'} = 1;
#	&parseconfig($ConfFileName);
$ENV{"PERL_RL"} = " o=0";
my %config;
my %contacts;
my $done = 0;
%colors = (
	LIGHT_RED  => "\033[1;31m",
	LIGHT_GREEN => "\033[1;32m",
	YELLOW => "\033[1;33m",
	LIGHT_BLUE => "\033[1;34m",
	MAGENTA => "\033[1;35m",
	LIGHT_CYAN => "\033[1;36m",
	WHITE => "\033[1;37m",
	NORMAL => "\033[0;38m",
	BLACK => "\033[0;30m",
	RED => "\033[0;31m",
	GREEN => "\033[0;32m",
	BROWN => "\033[0;33m",
	BLUE => "\033[0;34m",
	CYAN => "\033[0;36m"
);
$use_colors = 1;

$last_message_from = 0;
$last_message_to = 0;


%helps = (
	'' => "Command list:\nmsg\nadd\nsubmit\ntogvis\ninv\nna\ndnd\nonline\naway\nocc\nauth\nw\ne\nquit\n?\nhelp",
	'msg' =>  "Format: msg [UIN | nickname][/message]",
	'add' =>  "Format: add UIN nickname",
	'submit' => "debug command",
	'togvis' => "Format: togvis [UIN | nickname]",
	'inv' => "Format: inv\nChange status to invisible",
	'na' =>  "Format: na\nChange status to Not Available",
	'dnd' =>  "Format: dnd\nChange status to Do Not Disturb",
	'online' => "Format: online\nChange status to Online",
	'away' => "Format: away\nChange status to Away",
	'occ' =>  "Format: occ\nChange status to Occupied",
	'auth' => "Format: auth [UIN | nickname]\nGive authorization",
	'w' =>  "Format: w\nPrints contactlist",
	'e' =>  "Format: e\nPrints contactlist, but not \"Offline\"",
	'quit' =>  "Format: quit\nThis command allows you to do something else\nbehind ICQ",
	'?' => "Format: help [cmd]\nShow help on command",
	'help' => "Format: help [cmd]\nShow help on command"
);



%_command_handlers = (
	'msg' => sub {
				my @args = @_;
				my $uin = '';
				my $msg = '';
				my ($details);
				if($args[0]=~/\//)
				{
					my $line = join ' ',@args;
					if($line =~ /^(.*?)\/(.*)$/)
					{
						$msg = encode($2);
						$uin = GetUIN($1);
						if(!$uin) { return "No such nick"; }
					}
				} else
				{
    				$uin = GetUIN($args[0]);
					if(!$uin) { return "No such nick"; }
					print "Composing message to $args[0]:\n";
					$msg = encode(read_message());
				}
				$last_message_to = $uin;
				my %details = ( uin => $uin,
								MessageType => 'text',
								text =>  $msg
				);
				$icq->Send_Command("Cmd_Send_Message", \%details);
				my $nick = GetContact($uin);
				$nick = color_nick($nick);
				return "You send instant message to $nick";
			},
	'a' => sub {
				my @args = @_;
				my $uin = $last_message_to;
				my $msg = '';
				my ($details);
				if(!$uin)
				{
					return 'You didn\'t send messages yet';
				}

				my $nick = GetContact($uin);
				$nick = color_nick($nick);
				if($#args>-1)
				{
					$msg = encode(join ' ',@args);
				} else
				{
					print "Composing message to $nick:\n";
					$msg = encode(read_message());
				}
				$last_message_to = $uin;
				my %details = ( uin => $uin,
								MessageType => 'text',
								text =>  $msg
				);
				$icq->Send_Command("Cmd_Send_Message", \%details);

				return "You send instant message to $nick";
			},
	'reg' => sub {
				return Register();
				},
	'r' => sub {
				my @args = @_;
				my $uin = $last_message_from;
				my $msg = '';
				my ($details);
				if(!$uin)
				{
					return 'You didn\'t send messages yet';
				}
				my $nick = GetContact($uin);
				$nick = color_nick($nick);
				if($#args>-1)
				{
					$msg = encode(join ' ',@args);
				} else
				{
					print "Composing message to $nick:\n";
					$msg = encode(read_message());
				}
				$last_message_to = $uin;
				my %details = ( uin => $uin,
								MessageType => 'text',
								text =>  $msg
				);
				$icq->Send_Command("Cmd_Send_Message", \%details);

				my $nick = GetContact($uin);
				$nick = color_nick($nick);
				return "You send instant message to $nick";
			},


	'add' => sub {
				my @args = @_;
				my $uin = $args[0];
				my $contact = $args[1];
				$contacts{$uin} = $contact;
				my ($details);
				my @uins = ($uin);
				$details->{ContactList} = \@uins;
				$icq->Send_Command("Cmd_Add_ContactList", $details);
				return "You added $uin($contact) to ContactList";
			},
	'submit' => sub {
				my ($details);
				my @uins = ();
				foreach (keys %contacts)
				{
					push(@uins,$_);
				}
				$details->{ContactList} = \@uins;
				$icq->Send_Command("Cmd_CTL_UploadList", $details);
				return '';
			},
	'togvis' => sub {
				my ($details);
				my @args=@_;
				my $uin = GetUIN($args[0]);
				my @uins = ($uin);
				if($prefs{$uin}{visible} eq 'yes')
				{
					$prefs{$uin}{visible} = 'no';
					$details->{InVisibleList} = \@uins;
					$icq->Send_Command("Cmd_BOS_Add_InVisibleList", $details);
				} else
				{
					$prefs{$uin}{visible} = 'yes';
					$details->{VisibleList} = \@uins;
					$icq->Send_Command("Cmd_BOS_Add_VisibleList", $details);
				}
			
				return '';
			},
	'inv' => sub {
				my ($details);
				$details->{Status} = "Invisible";
				$icq->Send_Command("Cmd_GSC_Set_Status", $details);
				return $details->{Status};
			},
	'na' => sub {
				my ($details);
				$details->{Status} = "Not_Avalible";
				$icq->Send_Command("Cmd_GSC_Set_Status", $details);
				return $details->{Status};
			},
	'dnd' => sub {
				my ($details);
				$details->{Status} = "Do_Not_Disturb";
				$icq->Send_Command("Cmd_GSC_Set_Status", $details);
				return $details->{Status};
			},
	'online' => sub {
				my ($details);
				$details->{Status} = "Online";
				$icq->Send_Command("Cmd_GSC_Set_Status", $details);
				return $details->{Status};
			},
	'away' => sub {
				my ($details);
				$details->{Status} = "Away";
				$icq->Send_Command("Cmd_GSC_Set_Status", $details);
				return $details->{Status};
			},
	'occ' => sub {
				my ($details);
				$details->{Status} = "Occupied";
				$icq->Send_Command("Cmd_GSC_Set_Status", $details);
				return $details->{Status};
			},
	'auth' => sub {
				my ($details);
        		$details->{uin} = GetUIN(@_[0]);
				$last_message_to = $details->{uin};
        		$icq->Send_Command("Cmd_Authorize", $details);
				return "Authorization sent to $details->{uin}";
			},
	'w' => sub {
				separator('Offline users');
				foreach (keys %contacts)
				{
					my $ip = sprintf "%15s",$prefs{$_}{ip};
					my $status = $prefs{$_}{status};
					if($status ne 'Offline') { next; }
					my $uin = GetContact($_);
					if($prefs{$_}{visible} eq 'yes')
					{
						$uin = "*$uin";
					}
					$uin = sprintf "%20s",$uin;
					$uin = $colors{$config{nick_color}} . $uin . $colors{NORMAL};
					print "$uin [$ip] ($status)\n";
				}
				separator('Online users');
				foreach (keys %contacts)
				{
					my $ip = sprintf "%15s",$prefs{$_}{ip};
					my $status = $prefs{$_}{status};
					if($status eq 'Offline') { next; }
					my $uin = GetContact($_);
					if($prefs{$_}{visible} eq 'yes')
					{
						$uin = "*$uin";
					}
					$uin = sprintf "%20s",$uin;
					$uin = $colors{$config{nick_color}} . $uin . $colors{NORMAL};
					print "$uin [$ip] ($status)\n";
				}

				separator();
				return '';
			},
	'e' => sub {
				separator('Online users');
				foreach (keys %contacts)
				{
				my $ip = sprintf "%15s",$prefs{$_}{ip};
					my $status = $prefs{$_}{status};
					if($status eq 'Offline') { next; }
					my $uin = GetContact($_);
					if($prefs{$_}{visible} eq 'yes')
					{
						$uin = "*$uin";
					}
					$uin = sprintf "%20s",$uin;
					$uin = $colors{$config{nick_color}} . $uin . $colors{NORMAL};
					print "$uin [$ip] ($status)\n";
				}

				separator();
				return '';
			},

	'quit' => sub {
				$done = 1;
				return "ZZZZZZZZZZZAAAAAAAAAPPPPPPPPP!!!!!";
			},
	'?' => sub {
				my $cmd = shift;
				help($cmd);
				return '';
			},
	'help' => sub {
				my $cmd = shift;
				help($cmd);
				return '';
			}
);


#########################################################################################
##
## main part of script
##
#########################################################################################

# print Register(),"\n";
# exit 0;

#ignores_to_hash();
#!/usr/bin/perl
#$WorkDir="/home/forum/test/ovicq/vicq";
#$PIDFILE="icq2irc.pid";
	open (PIDFILE, "$WorkDir/$PIDFILE");
print "$WorkDir/$PIDFILE\n";
	$TMPPID = <PIDFILE>;
	close (PIDFILE);
	$TMPPID =~ s/(\n|\r| )//g;

	if ($TMPPID) {
		print "Another ICQ2IRC is already started in $TMPPID.\n";
		print "If you think this is not true please remove $WorkDir/$PIDFILE\n";
		exit 0;
	}

	if ($< == 0) {
		printf "[ UID: %-5d | GID: %-5d ] Droping root privileges...\n", $<, 
$(;
		$< = 99;
		$( = 99;
		printf "[ UID: %-5d | GID: %-5d ] That's better :)\n", $<, $(;
	}
		print "Going to background...";
		die "Error while going to background: $!" unless defined($kidpid = 
fork());
if ($kidpid) { print "OK! PID: $kidpid\n"; 
open (PIDFILE, ">$WorkDir/$PIDFILE");
		print PIDFILE "$kidpid\n";
		close (PIDFILE);
}
if (!$kidpid) {

#&parse_config;

$icq = Net::ICQ2000->new($icquin, $icqpassword,"1"); #the 1 tells the module to auto connect
$icq->{_Status} = "Online";


$icq->Add_Hook("Srv_Mes_Received", \&RecMessage);
$icq->Add_Hook("Srv_GSC_User_Info", \&DisplayDetails);
$icq->Add_Hook("Srv_Srv_Message", \&SrvMessage);
$icq->Add_Hook("Srv_GSC_MOTD", \&MOTD);
$icq->Add_Hook("Srv_BLM_Contact_Online", \&User_Online);
$icq->Add_Hook("Srv_BLM_Contact_Offline", \&DisplayDetails);
my $message = 0;

METAK: while(!$icq->{_LoggedIn})
{
	$icq->Execute_Once();
}

#$SIG{INT} = \&disconnect;
$SIG{ALRM} = \&do_network;
alarm 1;
$| = 1;
$irc = new Net::IRC;
$conn = $irc->newconn(	Server   => "$ircserver",
Ircname => "UIN: $icquin",
Username => "icq2irc",
			Port     => "$ircport"); 
$conn->sl("NICK $ircnick\nUSER $ircnick 0 * :440154\r\n");
sleep 2;
$conn->sl("MODE $ircnick -x\r\n");
$conn->sl("PRIVMSG nickserv :identify $ircnickpass\r\n");
$conn->sl("JOIN $ircmainchan\r\n");
$conn->sl("JOIN $irclogchan\r\n");
&on_connect($conn);
&addhandlers();



$term = new Term::ReadLine 'vICQ v0.1';
$prompt = "vICQ>";
$OUT = $term->OUT || STDOUT;
#my ( $timer ) = new Tibco::Rv::Timer( interval => 30, sub
#   {
#use Time::Unix;  # high resolution timing required
#use Time::Stopwatch;
#tie my $time, 'Time::Stopwatch';
#$mt=time();
  


  # $timer->interval( 30 );

ignores_to_hash();
cont_to_hash(); 
while (1) 
{
#if($que ne "") { $irc->send($que);
#$que=""; }
	$res = parse_command($_), "\n";
     tie my $wait, 'Time::Stopwatch';  # loop timer

    
while ($wait < 30) {  # run for one minute
   $irc->do_one_loop();


    }
print "xxx\n";
$wait=0;
send_to();

	warn $@ if $@;
	#$irc->do_one_loop();
	if($res) 
	{
		print $OUT $res, "\n" unless $@;
	}
	$term->addhistory($_) if /\S/;
}

#&save_config;

}
#########################################################################################
##
## subroutines section
##
#########################################################################################


sub help
{
	my $cmd = shift;
	print $helps{$cmd};
	print "\n";
}

sub save_config
{
	my $section = '';
	print "\n";
	print "Writing config...\n";
	my $home = $ENV{HOME};
	open CONF,">.vicqrc" or die "Cann't write config file ~/.vicqrc";
	print CONF "[options]\n";
	foreach (keys %config)
	{
		print CONF "$_=$config{$_}\n";
	}
	print CONF "[contacts]\n";
	foreach (keys %contacts)
	{
		$uin = $_;
		$uin = '*' . $_ if($prefs{$_}{visible} eq 'yes');
		
		print CONF "$uin $contacts{$_}\n";
	}
	return '';
}



sub parse_config
{
	my $section = '';
	print "Reading config...\n";
	my $home = $ENV{HOME};
	if(! -e  "$home/.vicq.log")
	{
		mkdir "$home/.vicq.log",0700 or die "Can't create dir $home/.vicq";
	}
	open CONF,"< .vicqrc" or die "Cann't read config file ~/.vicqrc";
	while(<CONF>)
	{
		chomp;
		s/^\s+//g;
		s/\s+$//g;
		if($_ eq '') { next; }
		if(/^\[(\w+)\]$/)
		{
			$section = $1;
		} 
		elsif($section eq 'options')
		{
			($name,$value) = split /=/;
			$config{$name} = $value;
		}
		elsif($section eq 'contacts')
		{
			if(/^(\*?\d+)\s+(.*)$/)
			{
				$uin = $1;
				$name = $2;
				if($uin =~ /^\*(\d+)/)
				{
					$uin = $1;
					$prefs{$uin}{visible} = 'yes';
					
				} else
				{
					$prefs{$uin}{visible} = 'no';
				}
				$contacts{$uin} = $name;
				$prefs{$uin}{ip} = 'x.x.x.x';
				$prefs{$uin}{status} = 'Offline';
			}
			
	

		}
	}
	if($use_colors)
	{
		$config{separator_color} = 'BLUE';
		$config{uin_color} = 'MAGENTA';
		$config{nick_color} = 'MAGENTA';
		$config{message_color} = 'LIGHT_BLUE';
		$config{separator_length} = 70;
	}

	if($config{encoding} ne 'koi')
	{
		$config{encoding} = 'win';
	}
}

sub parse_command
{
	my $command = shift;
	$command =~ s/^\s+//g;
	$command =~ s/\s+$//g;
	my($cmd,@args) = split /\s+/,$command;
	$cmd = lc($cmd);
	return &{$_command_handlers{$cmd}}(@args) if (exists $_command_handlers{$cmd});
	return "No such command. Use 'help' or '?' to get help'" if ($cmd ne '');




}

sub do_network {
	if($icq)
	{
   		$icq->Execute_Once();
#   		$icq->{_Connected} or &disconnect;
	}
	alarm 1;
}

sub GetStatus
{
    my $st = shift;
    $st &= 0xffff;
    my $hexst =  sprintf '%04x',$st;
    return $Net::ICQ2000::_r_Status_Codes{$hexst};
}

sub GetContact
{
print "gitting contact $_[0]";
	my $uin = $_[0];
	my $contact = $uin;
	if($contacts{$uin} ne '')
	{
		$contact = $contacts{$uin};
	}
print "$contact\n";
	return $contact;
}

sub GetUIN
{
	my$contact = shift;
	foreach (keys %contacts)
	{
		return $_ if(lc($contacts{$_}) eq lc($contact));
		
	}
	if($contact !~ /^\d+$/)
	{
		return 0;
	} else
	{
		return $contact;
	}
		
}

sub read_message
{
	my $text = '';
	my $term = new Term::ReadLine 'vICQ v0.1';
	my $prompt = "msg# ";
	while ( ($_ = $term->readline($prompt)) ne ".")
	{
		$text .= "$_\r\n";
	}

	return $text;
}



sub disconnect {
	&save_config;
    print "Exiting..\n";
    exit(0);
}

sub MOTD {
    my($Object, $details) = @_;
    #the message of the day handler... (don't know why you'd want to catch this.. : )
    print "MOTD = [$details->{Web_Address}]\n";
    print "\n";
}


sub DisplayDetails {
    my($Object, $details) = @_;
    
    #very generic handler that just print's out all the bit's of data that get passed to it..
}

sub SrvMessage {
    my($Object, $details) = @_;
#	beep();
    print "\n";
	separator();
    #These are responces from the server which r unique to ICQ..
    if ($details->{Responce_Type}){
    }
    elsif ($details->{MessageType} eq "auth_request"){
		my $nick = color_nick(decode(GetContact($details->{nick})));
		my $first_name = color_nick(decode($details->{first_name}));
		my $last_name = color_nick(decode($details->{last_name}));
		my $reason = color_message(decode($details->{reason}));
		my $last_message_from = $details->{Sender};
		my $Sender = color_uin($details->{Sender});
		print "Authorization request from $Sender\n" .
		"Nick       :     $nick\n" .
		"First name :     $first_name\n" .
		"Last name  :     $last_name\n" .
		"Email      :     $email\n" .
		"\n$reason\n";
		log_event( $details->{Sender},"Authorization request from $Sender\n" .
		"Nick       :     $nick\n" .
		"First name :     $first_name\n" .
		"Last name  :     $last_name\n" .
		"Email      :     $email\n" .
		"\n$reason\n");

	}
    elsif ($details->{MessageType} eq "contacts"){
		my $nick = color_nick(GetContact($details->{Sender}));
		$last_message_from = $details->{Sender};
		print "Got $details->{Count} contacts from $nick:\n";
		my $log = "Got $details->{Count} contacts from $nick:\n";
		my$i = 0;
		while($i<= $#{$details->{Contacts}})
		{
			print color_uin($details->{Contacts}->[$i])," ", color_nick("$details->{Contacts}->[$i+1]\n");
			$log .= $details->{Contacts}->[$i]. " " . "$details->{Contacts}->[$i+1]\n";
			$i+=2;
		}
		log_event($last_message_from, $log);
	}
    elsif ($details->{MessageType} eq "contacts_request"){
		my $name = GetContact($details->{Sender});
		$last_message_from = $details->{Sender};
		my $reason = decode(GetContact($details->{Reason}));
		$name = color_nick($name);
		$reason = color_message($reason);
		print "Contacts request from $name:\n$reason\n";	
		log_event($last_message_from, "Contacts request from $name:\n$reason\n");
	}

    elsif ($details->{MessageType} eq "Normal"){
		$name = color_nick(GetContact($details->{Sender}));
		$last_message_from = $details->{Sender};
		my $text = decode($details->{text});
		$text = color_message($text);
		print "Instant offline message from $name:\n$text\n";	
		log_event($last_message_from, "Instant offline message from $name:\n$text\n");
    }
    elsif ($details->{MessageType} eq "ack_offline"){
		print "End of offline messages!\n";
    }
    elsif ($details->{MessageType} eq "URL"){
		$name = color_nick(GetContact($details->{Sender}));
		$last_message_from = $details->{Sender};
		$details->{URL} = color_message(decode($details->{URL}));
		$details->{Description} = color_message(decode($details->{Description}));
		print "URL message from $name\nURL : $details->{URL}\nDescription:\n$details->{Description}\n";	
		log_event($last_message_from, "URL message from $name\nURL : $details->{URL}\nDescription:\n$details->{Description}\n");
    }
    elsif ($details->{MessageType} eq "sms_message"){
		$last_message_from = color_message($details->{Sender});
		print "SMS message from $details->{sender}($details->{senders_network})\n$details->{time}\n$details->{text}\n";
		log_event($last_message_from, "SMS message from $details->{sender}($details->{senders_network})\n$details->{time}\n$details->{text}\n");
    }
    elsif ($details->{MessageType} eq "sms_response"){
        #$details->{deliverable}      - is it deliverable? (Yes/No)
        #$details->{network}          - What company is sending the message
        #$details->{message_id}       - The ID given to the SMS message
        #$details->{messages_left}    - Messages left to send (I always get 0..)
        #$details->{TaggedDataString} - The non decoded data string, log it if the message isn't deliverable, since it contains the error message (which isn't collected very verll otherwise..)
    }
	separator();
}


sub User_Online {
    my($Object, $details) = @_;
    
    #someone on your contact list has come online..
	$status = GetStatus($details->{Online_Status});
	$ip = $details->{Ip_Address};
	$contact = GetContact($details->{UIN});
	if($prefs{$details->{UIN}}{status} ne $status)
	{
    	print "\n";
		print "$contact change status to  $status\n";
	}
	$prefs{$details->{UIN}}{ip} = $ip;
	$prefs{$details->{UIN}}{status} = $status;
	
    
    #$details->{Online_Status}  - Contact's Status (not very nice currenlty, I'll be making it better soon..)
    #$details->{Online_User}    - Contact's ICQ number
    #$details->{SignOn_Date}    - Contact's Logon Date (in UTC)
    #$details->{Time_Online}    - Contact's Online length of Time (in secs)
}

sub RecMessage {
    my($Object, $details) = @_;
	
    
    print "\n";
	separator();
	#beep();
    if ($details->{MessageType} eq "auth_request"){

		$last_message_from = $details->{Sender};
		$details->{nick} = color_nick(decode($details->{Sender}));
		$details->{first_name} = color_nick(decode($details->{first_name}));
		$details->{last_name} = color_nick(decode($details->{last_name}));
		$details->{reason} = color_message(decode($details->{reason}));
		print "Authorization request from $details->{Sender}\n";
		print "Nick       :     $details->{nick}\n";
		print "First name :     $details->{first_name}\n";
		print "Last name  :     $details->{last_name}\n";
		print "Email      :     $details->{email}\n";
		print "\n$details->{reason}\n";
	}
    elsif ($details->{MessageType} eq "contacts"){
		my $nick = color_nick(GetContact($details->{Sender}));
		$last_message_from = $details->{Sender};
		print "Got $details->{Count} contacts from $nick:\n";
		my $log = "Got $details->{Count} contacts from $nick:\n";
		my$i = 0;
		while($i<= $#{$details->{Contacts}})
		{
			print color_uin("$details->{Contacts}->[$i]")," ",color_nick("$details->{Contacts}->[$i+1]\n");
			$log .=  "$details->{Contacts}->[$i] $details->{Contacts}->[$i+1]\n";
			$i+=2;
		}
		log_event($last_message_from,$log);
	}
    elsif ($details->{MessageType} eq "Normal"){
$text=~ s/\r//g;              
$text=~ s/\n//g;		
$name = color_nick(GetContact($details->{Sender}));
		$last_message_from = $details->{Sender};
		my $text  = (decode($details->{text}));
		
$text=~ s/\r//g;
$text=~ s/\n//g;
$name=GetContact($details->{Sender});
#&tolog("ICQMSSG","$details->{Sender} | $text");
print "Instant message from $name:\n$text\n";
$text=~ s/\r//g;
$text=~ s/\n//g;
@argzz=split(/ /,$text);
if(@argzz[0] eq "!start") { 
$bnb=is_in_list($details->{Sender});
$bnb2=is_in_ign_list($details->{Sender});
if ($bnb2 ne "1") {
if ($bnb eq "1") { } else {
&tolog("ICQSTART","starting session for $details->{Sender}");
$conn->sl("PRIVMSG $irclogchan :opening session for $details->{Sender}\n");
$uins{"$details->{Sender}"}="";
send_to_other($details->{Sender},"$name had join ICQ2IRC");
$conn->sl("PRIVMSG $ircmainchan :\00305   \00304$name\003\n") || die " ERROR"; 

}
}
} 
elsif(@argzz[0] eq "!help") {
$tosendd="!start -    $ircmainchan\n!stop -    (  )\n!setnick -      ICQ-   ,        (nickname), : !setnick lamer (:    ,  , ,      32 )\n!names -   ,      \n!status -         ICQ2IRC Gate\n!m <nick> -    /msg  mIRC.      , , !m nick text  !m uin text (,   ICQ-     ,   !status)";
my %details = ( uin => $details->{Sender},
               MessageType => 'text',
       text => $tosendd
);
$icq->Send_Command("Cmd_Send_Message", \%details);
}
elsif(@argzz[0] eq "!names") {
$bnb2=is_in_ign_list($details->{Sender});
if ($bnb2 ne "1") {
&tolog("NAMES","sending to $details->{Sender}");
$conn->sl("NAMES $ircmainchan\r\n");
$who_want_names=$details->{Sender};
}
}
elsif(@argzz[0] eq "!m") {
$bnb=is_in_list($details->{Sender});
if ($bnb eq "1") {
$msgs{"@argzz[1]"}="$details->{Sender}";
shift(@argzz);
$tonick=shift(@argzz);
&tolog("ICQMSG","$details->{Sender}: @argzz");
$conn->sl("PRIVMSG $irclogchan :[ICQMSG] $details->{Sender}: @argzz\n");
$conn->sl("PRIVMSG $tonick :\00304$name\003: @argzz\n");
}
}
elsif(@argzz[0] eq "!setnick") {
if(@argzz[1]) {
$contacts{$details->{Sender}}=@argzz[1];
write_cont();
}

}
elsif(@argzz[0] eq "!stop") {
$bnb=is_in_list($details->{Sender});
if ($bnb eq "1") {
delete $uins{$details->{Sender}};
send_to_other($details->{Sender},"$name has left ICQ2IRC");
&tolog("ICQSTART","closing session for $details->{Sender}");
$conn->sl("PRIVMSG $irclogchan :closing session for $details->{Sender}\n");
$conn->sl("PRIVMSG $ircmainchan :\00313   \00305 $name\003\n") || die " ERROR";
#rem_from_list($details->{Sender})
}
}
else  {
$bnb=is_in_list($details->{Sender});
if ($bnb eq "1") 
{ 

send_to_other($details->{Sender},"<$name> $text");
&tolog("ICQPUB","$details->{Sender}:$text");
#$que=$que."PRIVMSG $ircmainchan :<\00304$details->{Sender}\003> $text\n";
#next METKA;
$conn->sl("PRIVMSG $ircmainchan :\00304$name\003: $text\n") || die " ERROR";	
} else { 
#$irc->send("PRIVMSG #mtest :yo") or die " ERROR"; }
}		
}
log_event($details->{Sender},"Instant message from $name:\n$text\n");	
    }
    elsif ($details->{MessageType} eq "contacts_request"){
		$name = color_nick(GetContact($details->{Sender}));
		$last_message_from = $details->{Sender};
		$Reason = color_message(decode($details->{Reason}));
		print "Contacts request from $name:\n$Reason\n";	
		log_event($details->{Sender},"Contacts request from $name:\n$Reason\n");	
    }
    elsif ($details->{MessageType} eq "URL"){
		$name = color_nick(GetContact($details->{Sender}));
		$last_message_from = $details->{Sender};
		$details->{URL} = color_message(decode($details->{URL}));
		$details->{Description} = color_message(decode($details->{Description}));
		print "URL message from $name\nURL : $details->{URL}\nDescription:\n$details->{Description}\n";	
		log_event($last_message_from, "URL message from $name\nURL : $details->{URL}\nDescription:\n$details->{Description}\n");	

	}
    elsif ($details->{MessageType} eq "sms_message"){
		print "SMS message from $details->{sender}($details->{senders_network})\n$details->{time}\n$details->{text}\n";
		$last_message_from = $details->{Sender};
		log_event($last_message_from, "SMS message from $details->{sender}($details->{senders_network})\n$details->{time}\n$details->{text}\n");
    } else
	{
		print "Unknown Message!\n";
	}
        
	separator();
}


sub win2koi
{
	my $s = shift;
	$s =~  tr/޸//;
	return $s;
}

sub koi2win
{
	my $s = shift;
	$s =~  tr//޸/;
	return $s;
}

sub decode
{
	my $s = shift;
	return win2koi($s) if($config{encoding} eq 'koi');
	return $s;
}

sub encode
{
	my $s = shift;
	return koi2win($s) if($config{encoding} eq 'koi');
	return $s;
}

sub separator
{
	my $title = shift;
	my $len = int(($config{separator_length} - length($title) - 2) / 2);
	if($title ne '')
	{
		print  $colors{$config{separator_color}},"="x$len," ",$title," ","="x$len,"$colors{NORMAL}\n";
	} else 
	{
				print $colors{$config{separator_color}},"="x$config{separator_length},"$colors{NORMAL}\n";
	}
}

sub color_uin
{
	my $uin = shift;
	$uin = $colors{$config{uin_color}} . $uin . $colors{NORMAL};
	return $uin;
}

sub color_nick
{
	my $nick = shift;
	$nick = $colors{$config{nick_color}} . $nick . $colors{NORMAL};
	return $nick;
}

sub color_message
{
	my $message = shift;
	$message = $colors{$config{message_color}} . $message . $colors{NORMAL};
	return $message;
}

sub Register
{
	return "This function is not implemented yet :(";
}

sub beep
{
	print "\x07";
}


sub log_event
{
	my $uin = shift;
	my $message = shift;
	my $now_string = localtime;
	$message =~ s/\033\[[10];3.m//g;
	my $home = $ENV{HOME};
	open LOG,">> $home/.vicq.log/$uin.log" or warn "Can't open file  $home/.vicq.log/$uin.log";
	print LOG "--[ $now_string\n";
	print LOG $message;
	close LOG;
	
}
sub is_in_list {
foreach $key (keys (%uins)) { # once for each key of %fred
    if($key eq $_[0]) { return 1; }
}

return 0;

}
sub is_in_ign_list {
foreach $key (keys (%ignores)) { # once for each key of %fred
print "$key...";
    if($key eq $_[0]) { 
print "$_[0] in ignore list\n\n";
return 1; }
}
print "$_[0] not in ignore list\n\n";
return 0;

}

sub send_to_all {
foreach $key (keys (%uins)) { # once for each key of %fred
#my %details = ( uin => $key,
#               MessageType => 'text',
#       text => $_[0]  
#);

#$icq->Send_Command("Cmd_Send_Message", \%details);
$uins{$key}=$uins{$key}."\r\n".$_[0];
}
}
sub send_to_other {
foreach $key (keys (%uins)) {
if($key ne $_[0]) {
#my %details = ( uin => $key,
#               MessageType => 'text',
#       text => "$_[1]"
#);
#$icq->Send_Command("Cmd_Send_Message", \%details);
$uins{$key}=$uins{$key}."\r\n".$_[1];
}
}
}
sub remove_g {

}





sub on_user_disconnect {
	my ($irc, $event) = @_;

	my ($nick) = ($event->nick);
	my ($info) = ($event->args);



	
}

sub on_user_nickchange {
	my ($irc, $event) = @_;

	my ($from) = ($event->from);
	my ($to)   = ($event->args)[0];

print "nick change $from to $to";
}

sub whois_us {
	my ($irc, $event) = @_;

	my ($from) = ($event->from);
	my ($to)   = ($event->to);
	my ($args) = ($event->args);

	&tolog("IRC", "WHOIS: $from -> $to [$args]");
}
sub on_user_connect {
	my ($irc, $event) = @_;

	my ($host) = ($event->host);
	my ($serv) = ($event->to);
	my ($time) = ($event->format);
	my ($nick) = ($event->nick);
	my ($user) = ($event->user);
	my ($info) = ($event->args);
        print "connect $nick $serv";

}


sub on_whois {
	my ($self, $event) = @_;
	my (@args) = ($event->args);
	my ($COMM) = ($event->type);
	shift(@args);
	my ($nick1) = shift(@args);
	my ($arg) = join(' ', @args);
	my ($tmp,$tmp1,$tmp2);

#	&tolog("IRC","WHOIS($COMM): [$arg]");
	return 0 if ($WHOIS{'can'});

	if ($COMM =~ /whoisuser/) {
#		&tolog("TEST", "$arg");
		($tmp,$tmp1,$tmp2) = ($arg =~ /^(\S*) (\S*) \* (.*)/);
		$WHOIS{'res'} .= "User: $tmp\r\nHost: $tmp1\r\nIrcName: $tmp2\r\n";
	} elsif ($COMM =~ /whoisoperator/) {
		$WHOIS{'res'} .= "Oper: $arg\r\n";
	} elsif ($COMM =~ /whoischannels/) {
		$WHOIS{'res'} .= "Channels: $arg\r\n";
	} elsif ($COMM =~ /whoisidle/) {
		($tmp,$tmp1) = ($arg=~/^(\d*) (\d*)/);
		$WHOIS{'res'} .= "Idle: $tmp sec\r\nSignOn: ".scalar localtime($tmp1)." ($tmp1)";
	} elsif ($COMM =~ /away/) {
		$WHOIS{'res'} .= "Away: $arg\r\n";
	}		
	if ($COMM =~ /endofwhois/) {
#		&tolog("ICQSERV", "Sending to [$WHOIS{'uin'}]: [$WHOIS{'res'}]");
		$icq->send_event('CMD_SEND_MESSAGE', {
				'type' => 1,
				'text' => "Nick: $nick1\r\n$WHOIS{'res'}",
                                'receiver_uin' => $WHOIS{'uin'}
		});
		$WHOIS{'can'} = 1;
		$WHOIS{'res'} = "";
	} elsif ($COMM =~ /nosuchnick/) {
		$icq->send_event('CMD_SEND_MESSAGE', {
				'type' => 1,
				'text' => "[$nick1]: no such nick\r\n",
				'receiver_uin' => $WHOIS{'uin'}
		});
		$WHOIS{'can'} = 1;
		$WHOIS{'res'} = "";
	}
	
	return 0;
}


sub on_msg {
	my ($irc, $event) = @_;
	my ($nick) = $event->nick;
	my ($arg) = ($event->args);
	my ($to) = ($event->to)[0];
	my ($params);
	my ($text,$uin,$mess);
	my ($adcomm, $adpass, $null);
	my $stats=0;

	my (@argz) = (split(' ', $arg));

	$irccomm++;
print "$to $nick";
#send_to_all("<$nick> $arg");
my (@argz)=split(/ /,$arg);

if(@argz[0] eq "!status") {
$conn->sl("PRIVMSG $nick :     UIN:\n");
print "!status to $nick\n";
foreach $key (keys (%uins)) {
$name=GetContact($key);
$conn->sl("PRIVMSG $nick :$name ($key)\n");
}	
$conn->sl("PRIVMSG $nick : \n"); 
} 
elsif(@argz[0] eq "!help") {
$conn->sl("PRIVMSG $nick :    $ircmainchan  IrcNet  ICQ,     ICQ      ICQ-: 506080.  ,     ICQ-    ,      !start -        $ircmainchan.\n");
$conn->sl("PRIVMSG $nick :\003\n");
$conn->sl("PRIVMSG $nick :!start -    $ircmainchan\n");
$conn->sl("PRIVMSG $nick :!stop -    (  )\n");
$conn->sl("PRIVMSG $nick :!setnick -      ICQ-   ,        (nickname), : !setnick lamer (:    ,  , ,      32 )\n");
$conn->sl("PRIVMSG $nick :!names -   ,      \n");
$conn->sl("PRIVMSG $nick :!status -         ICQ2IRC Gate\n");
$conn->sl("PRIVMSG $nick :\003\n");
$conn->sl("PRIVMSG $nick : ,         mIRC:\n");
$conn->sl("PRIVMSG $nick :/msg $ircnick !m <nick>  <uin> <text> -          ICQ-.       ICQ2IRC ,   !status\n");
$conn->sl("PRIVMSG $nick :        ICQ-  , , /msg ICQ2IRC !m 123456 .  ICQ    (123456)   .         ICQ2IRC\n");
}
elsif(@argz[0] eq "!m") {
if(@argz[1]) {
if(@argz[2]) {
shift(@argz);

$conn->sl("PRIVMSG $irclogchan :[IRCMSG] $nick | $touin | @argz\r\n");
&tolog("IRCMSG","$nick : $touin : @argz");
$touin=shift(@argz); 
my %details = ( uin => $touin,
               MessageType => 'text',
       text => "(PRIVATE) <$nick> @argz"
);
print "Sending irc2icq to $touin : @argz\n\n";
$icq->Send_Command("Cmd_Send_Message", \%details);


}
}

} elsif(@argz[0] eq "admin") {
if(@argz[1] eq "gjrfytne") {
if(@argz[2] eq "ignore") {
if(@argz[3]) {
add_ignore(@argz[3]);
}
} elsif(@argz[2] eq "unignore") {
if(@argz[3]) {
del_ignore(@argz[3]);
}
} elsif(@argz[2] eq "ignores") {
ignores();
}
elsif(@argz[2] eq "addnick") {
ignores();
if(@argz[3]) {
if(@argz[4]) {
$contacts{"@argz[3]"} = @argz[4]; 
print "aditing nick @argz[4] ( @argz[3] )";
write_cont();
}
}
}




}
}
}

sub parse_irc {
	my ($message) = @_;
	my ($comm, $uin, $mess, $tmp);
	
	if ($message=~/^\s*(\S*)\s*(\S*) (.*)/i) {
		$comm = "$1";
		$uin = "$2";
		$mess = "$3";
	} elsif ($message=~/^\s*(\S*)\s*(\S*)/) {
		$comm = "$1";
		$mess = "$2";
	}

	if ($comm =~ /^send/i) {
		return 0 if (!$uin || !$mess);
		return($uin, $mess) if ($uin=~/^\d*$/);
		foreach $tmp(keys %CONTACTS) {
			return($tmp, $mess) if ($CONTACTS{$tmp} =~ /^$uin$/i);
		}
		return("1","");
	} elsif ($comm =~ /^show/i) {
		return("2","$mess");
	} elsif ($comm =~ /^about/i) {
		return("3","$mess");
	} elsif ($comm =~ /^stats/i) {
		return("4","$mess");
	}
	return "0";
}



sub wallops {
	my ($what) = @_;
	$conn->sl(":$IRCSERV{'NICK'} WALLOPS :$what");
	&tolog("IRC", "WALLOPS: $what");
}


sub on_connect {
	my $irc = shift;
	my $chan;

	&tolog("IRC", "Connected to $IRCSERV{'SERVER'}");
	&tolog("IRC", "Joining #icq-debug...");
	
	

	foreach $chan(@AUTOJOIN) {
		&tolog("IRC", "AutoJoining $chan...");
		$irc->sl(":$IRCSERV{'NICK'} JOIN $chan");
#		&irc_privmsg("$chan", "Hi there.");
	};

	$IRCSERV{'CONNECTED'} = 1;	
}



sub on_nick_taken {
	my ($self) = shift;

	&tolog("IRC","nickname ".$self->nick." in use, killing him. ?!?!?!?");
	$self->nick($self->nick."_");
}


sub on_disconnect {
	my ($self, $event) = @_;

	$IRCSERV{'CONNECTED'} = 0;

	&tolog("IRC","connection lost with ".$event->from()." (".($event->args())[0].").");

	&exitserv("100","connection lost with ".$event->from()." (".($event->args())[0].")");
}

sub on_nick_error {
	my ($irc, $event) = @_;
	my ($line) = ($event->args());
	my ($from) = ($event->from());
	my ($to) = ($event->to);
	my ($reason)   = ($event->format);
	my ($nick);

	if ($to =~ /^ICQ-/i) {
		($nick) = ($to =~ /^ICQ-(\S*)$/i);
		if ($IRCONLINE{lc($nick)}) {
			$IRCONLINE{lc($nick)}=0;
			&tolog("IRC","[$nick] cannot login [$reason]");
		} else {
			&tolog("IRC","not for me [$from] [$to] [$reason] [$line]");
		}
	} else {
		&tolog("IRC","hmm... [$from] [$to] [$reason] [$line]");
	}
	
}

sub on_kill {
	my ($irc, $event) = @_;
	my ($line) = ($event->args());
	my ($from) = ($event->from());
	my ($to)   = ($event->to)[0];
	my ($nick);

	if ($to =~ /^ICQ-/i) {
		($nick) = ($to =~ /^ICQ-(\S*)$/i);
		if ($IRCONLINE{lc($nick)}) {
			$IRCONLINE{lc($nick)}=0;
			&tolog("IRC","[$from] killed icquser [$nick] for [$line]");
		} else {
			&tolog("IRC","[$from] killed [$to] for [$line]");
		}
	} else {
		&tolog("IRC","[$to] has been killed by [$from] for [$line]");
	}
	
}


sub on_init {
	my ($self, $event) = @_;
	my (@args) = ($event->args);
	my ($COMM) = ($event->type);
	shift (@args);
	
	foreach(@args) {
	&tolog("IRC","($COMM) - $_");
	}
}


sub on_public {
	my ($self, $event) = @_;
	my $to = join(", ", @{$event->{'to'}});
	my ($nick) = ($event->nick);
	my ($arg) = ($event->args);
print "msg $nick $to $arg\n\r";
@argzz=split(/ /,$arg);
if(@argzz[0] eq "!status") {
$conn->sl("NOTICE $nick :     UIN:\n");
print "!status to $nick\n";
foreach $key (keys (%uins)) {
$name=GetContact($key);
$conn->sl("NOTICE $nick :$name ($key)\n");
}	
$conn->sl("NOTICE $nick : \n"); 
} else {
print "$to\n";
if($to eq "$ircmainchan") {
send_to_all("<$nick> $arg"); 
}
}


}

sub on_action {
        my ($self, $event) = @_;
        my ($nick, @args) = ($event->nick, $event->args);
#        shift @args;
print "action $nick @args";
        &tolog("IRC"," * [$nick] @args") if $DEBUG > 2;
}

sub on_kick {
        my $self = shift;
        my $event = shift;
$conn->sl("JOIN $ircmainchan\n");
#        &tolog("IRC","".$event->nick." (".$event->userhost.") kicked me from ".$event->{args}[0]."!!");
}

sub on_join {
        my ($self, $event) = @_;
        my ($channel) = ($event->to)[0];
        my ($line, $host);
send_to_all("***".$event->nick." has join $ircmainchan");
print "join".$event->nick." $channel\n";
}
sub on_part {
        my ($self, $event) = @_;
        my ($channel) = ($event->to)[0];
        my $line;
send_to_all("***".$event->nick." has part $ircmainchan");
print "part $event->nick $channel\n";
}
sub addhandlers {
	&tolog("IRC", "building all connection handlers");
	$conn->add_global_handler('376', \&on_connect);     # global
	$conn->add_global_handler('disconnect', \&on_disconnect);
	$conn->add_global_handler([ 251,252,253,254,302,255 ], \&on_init);
	$conn->add_global_handler([ 353,366 ], \&on_names);
	$conn->add_global_handler([ 311,319,301,313,317,318,401 ], \&on_whois);
	$conn->add_global_handler([ 401 ], \&no_such_nick);
	$conn->add_global_handler(432, \&on_nick_error);
	$conn->add_global_handler(433, \&on_nick_taken);
	$conn->add_handler('caction', \&on_action);
	$conn->add_handler('public', \&on_public);
	$conn->add_handler('msg', \&on_msg);
	$conn->add_handler('kick', \&on_kick);
	$conn->add_handler('join', \&on_join);
	$conn->add_handler('part', \&on_part);
	$conn->add_handler('kill', \&on_kill);
	$conn->add_handler('quit', \&on_user_disconnect);
	$conn->add_handler('clientconnect', \&on_user_connect);
	$conn->add_handler('whois_us', \&whois_us);
	$conn->add_handler('nick', \&on_user_nickchange);
	$SIG{"TERM"} = sub {
		syswrite(STDOUT, "ouch. SIGTERM.\n");
#&save_config;
#&save_config;
		&exitserv("0", "SIGTERM Received.");
	};
	$SIG{"SEGV"} = sub {
		syswrite(STDOUT, "ouch. SIGSEGV.\n");
		&exitserv("0", "SIGSEGV Reveiced from Perl ?!?");
#&save_config;
	};
	$SIG{"HUP"} = sub {
		syswrite(STDOUT, "ouch. SIGHUP. Rehashing.");
		&tolog("ICQSERV", "SIGHUP. Rehashing.");
#&save_config;
	#	&parseconfig($ConfFileName);
	};	
	$SIG{"INT"} = sub {
		syswrite(STDOUT, "ouch. SIGINT.\n");
		&exitserv("0", "Ctrl-C Pressed.");
	};
}
sub tolog {
	my ($type) = shift;
	my ($what) = shift;

	my ($time,$sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst);

	$what =~ s/(\n|\r)/ /g;
	$conn->sl(":$IRCSERV{'NICK'} PRIVMSG #icq-debug :$type: $what") if $IRCSERV{'CONNECTED'};
	print "[$type]: $what\n" if $DEBUG;
	($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
	$mon = $mon + 1;
	open(LOGFILE, ">>$WorkDir/$LogFile");
	print LOGFILE "".$mday."/".$mon." ".$hour.":".$min.":".$sec.": [$type]: $what\n";
	close(LOGFILE);
}
sub exitserv {
	my ($err) = shift;
	my ($reason) = @_;
	&tolog("IRC", "QUIT: $reason");
	$conn->sl(":$IRCSERV{'NICK'} WALLOPS :DISCONNECTING: $reason");
	$conn->sl(":$IRCSERV{'NICK'} GLOBOPS :DISCONNECTING: $reason");
	$conn->sl(":$IRCSERV{'NICK'} QUIT :$reason [irc: $irccomm][icq: $icqcomm]");

	&tolog("ICQ", "QUIT: $reason");
#	$icq->disconnect();
	
	&tolog("ICQSERV", "========================================");
	open (PIDFILE, ">$WorkDir/$PIDFILE");
	print PIDFILE "";
	close (PIDFILE);
	unlink "$WorkDir/$PIDFILE" ||
	&tolog("EXIT", "Cant unlink pid file. Delete it manualy.");
	exit($err);
}


sub parseconfig {
	my (@CONF);
	my ($line);
	my ($tmp);

	&tolog("ICQSERV", "Parsing ConfigFile '@_'.");
	open(CONFFILE, "@_") || die("Error opening \"@_\" for reading.");
	@CONF = <CONFFILE>;
	close(CONFFILE);
	foreach $line(@CONF) {
		next if $line=~/^#/; next unless $line=~/\S/;
		if ($line =~ /^Debug/i) {
			($DEBUG) = ($line=~/^Debug\s*=\s*(\S*)/i);
			$DEBUG = 0 unless ($DEBUG=~/(1|on)/i);
		}
		elsif ($line =~ /^WorkDir/i) {
			($WorkDir) = ($line=~/^WorkDir\s*=\s*(.*)/i);
		}
		elsif ($line =~ /^PidFile/i) {
			($PIDFILE) = ($line=~/^PidFile\s*=\s*(.*)/i);
		}
		elsif ($line =~ /^ContactFile/i) {
			($ContactFile) = ($line=~/^ContactFile\s*=\s*(.*)/i);
		}
		elsif ($line =~ /^LogFile/i) {
			($LogFile) = ($line=~/^LogFile\s*=\s*(.*)$/i);
		}
		elsif ($line =~ /^AdminName/i) {
			($Admin{'NAME'}) = ($line=~/^AdminName\s*=\s*(.*)/i);
		}
		elsif ($line =~ /^AdminNick/i) {
			($Admin{'NICK'}) = ($line=~/^AdminNick\s*=\s*(.*)/i);
		}
		elsif ($line =~ /^AdminPass/i) {
			($Admin{'PASS'}) = ($line=~/^AdminPass\s*=\s*(.*)/i);
		}
		elsif ($line =~ /^AdminMail/i) {
			($Admin{'MAIL'}) = ($line=~/^AdminMail\s*=\s*(.*)/i);
		}
		elsif ($line =~ /^AdminUIN/i) {
			($Admin{'UIN'}) = ($line=~/^AdminUIN\s*=\s*(.*)/i);
		}
		elsif ($line =~ /^ServerPass/i) {
			($IRCSERV{'SERVPASS'}) = ($line=~/^ServerPass\s*=\s*(.*)/i);
		}
		elsif ($line =~ /^BindAddress/i) {
			($IRCSERV{'ADDR'}) = ($line=~/^BindAddress\s*=\s*(.*)/i);
		}
		elsif ($line =~ /^ServerName/i) {
			($IRCSERV{'SERVNAME'}) = ($line=~/^ServerName\s*=\s*(.*)/i);
		}
		elsif ($line =~ /^IrcNetworkName/i) {
			($IRCSERV{'NETNAME'}) = ($line=~/^IrcNetworkName\s*=\s*(.*)/i);
		}
		elsif ($line =~ /^IrcServer/i) {
			($IRCSERV{'SERVER'}) = ($line=~/^IrcServer\s*=\s*(.*)/i);
		}
		elsif ($line =~ /^IrcPort/i) {
			($IRCSERV{'PORT'}) = ($line=~/^IrcPort\s*=\s*(.*)/i);
		}
		elsif ($line =~ /^BotNick/i) {
			($IRCSERV{'NICK'}) = ($line=~/^BotNick\s*=\s*(.*)/i);
		}
		elsif ($line =~ /^BotUser/i) {
			($IRCSERV{'USER'}) = ($line=~/^BotUser\s*=\s*(.*)/i);
		}
		elsif ($line =~ /^BotIrcName/i) {
			($IRCSERV{'IRCNAME'}) = ($line=~/^BotIrcName\s*=\s*(.*)/i);
		}
		elsif ($line =~ /^BotHost/i) {
			($IRCSERV{'HOST'}) = ($line=~/^BotHost\s*=\s*(.*)/i);
		}
		elsif ($line =~ /^WantOper\s/i) {
			($IRCSERV{'OPER'}) = ($line=~/^WantOper\s*=\s*(\S*)/i);
			$IRCSERV{'OPER'} = 0 unless ($IRCSERV{'OPER'}=~/(1|on)/i);
		}
		elsif ($line =~ /^OperNick/i) {
			($IRCSERV{'OPERNICK'}) = ($line=~/^OperNick\s*=\s*(.*)/i);
		}
		elsif ($line =~ /^OperPass/i) {
			($IRCSERV{'OPERPASS'}) = ($line=~/^OperPass\s*=\s*(.*)/i);
		}
		elsif ($line =~ /^IcqUIN/i) {
			($ICQSERV{'UIN'}) = ($line=~/^IcqUIN\s*=\s*(.*)/i);
		}
		elsif ($line =~ /^IcqPass/i) {
			($ICQSERV{'PASS'}) = ($line=~/^IcqPass\s*=\s*(.*)/i);
		}
		elsif ($line =~ /^IcqServer/i) {
			($ICQSERV{'SERVER'}) = ($line=~/^IcqServer\s*=\s*(.*)/i);
		}
		elsif ($line =~ /^IcqPort/i) {
			($ICQSERV{'PORT'}) = ($line=~/^IcqPort\s*=\s*(.*)/i);
		}
		elsif ($line =~ /^AutoJoin/i) {
			($tmp) = ($line=~/^AutoJoin\s*=\s*(.*)/i);
			$tmp =~ s/,/ /g;
			$tmp =~ s/\s / /g;
			@AUTOJOIN = split(" ",$tmp);
		}
		elsif ($line =~ /^LogChannels/i) {
			($tmp) = ($line=~/^LogChannels\s*=\s*(.*)/i);
			$tmp =~ s/,/ /g;
			$tmp =~ s/\s+/ /g;
			@LOGCHAN = split(" ",$tmp);
		}

	}
	&tolog("ICQSERV", "ConfigFile '@_' Done.");
}
sub send_to {
foreach $key (keys (%uins)) { # once for each key of %fred
if($uins{$key} ne "") {
my %details = ( uin => $key,
               MessageType => 'text',
       text => $uins{$key}  
);

$icq->Send_Command("Cmd_Send_Message", \%details);
print "sending all![$key] (( $uins{$key} )) ";
#$uins{$key}=$uins{key}."\n".$_[0];
$uins{$key}=""; }
}
}
sub on_names {
	my ($self, $event) = @_;
	my (@args) = ($event->args);
	my ($COMM) = ($event->type);
if($COMM eq "namreply") {
shift(@args);
shift(@args);
shift(@args);
my %details = ( uin => $who_want_names,
               MessageType => 'text',
       text => @args
);

$icq->Send_Command("Cmd_Send_Message", \%details);
print "sending names to $who_want_names ";
#$who_want_names="";

#@args
}
if($COMM eq "endofnames") {
$who_want_names="";
}
}
sub add_ignore {
print "additing ignore $_[0]\n\n";
delete $uins{$_[0]};
$ignores{"$_[0]"}="";
$conn->sl("PRIVMSG $ircmainchan :\00305UIN\00304 $_[0]\00305    .");  
open(OUT, ">ignores.icq");
foreach $keybb (keys (%ignores)) {
print OUT "$keybb";
}
close(OUT);
}
sub del_ignore {
print "deliting ignore $_[0]\n\n";
#delete $uins{$details->{Sender}};
delete $ignores{$_[0]};
$conn->sl("PRIVMSG $ircmainchan :\00305UIN\00304 $_[0]\00305    .");
open(OUT, ">ignores.icq");
foreach $keybb (keys (%ignores)) {
print OUT "$keybb";
}
close(OUT);
}
sub ignores {
#print "adding ignore 
foreach $keybb (keys (%ignores)) {
$conn->sl("PRIVMSG LINK :ignores $keybb");
}

}
sub ignores_to_hash {
open(OUT,"ignores.icq");  
@ign=<OUT>;
close(OUT);
print "xxxx";
foreach $keybb (@ign) {
if($keybb ne "") {
print "deliting ignore $keybb\n\n";
#print $keybb;
$keybb=~ s/\r//g;
$keybb=~ s/\n//g;
$ignores{"$keybb"}="";
}
}
}
sub no_such_nick {
my ($self, $event) = @_;
my (@args) = ($event->args);
my ($COMM) = ($event->type);

#$conn->sl("PRIVMSG $ircmainchan :@args\n");
if($msgs{"@args[1]"} ne "") {
#$conn->sl("PRIVMSG $msgs{@args[1]} :no such nick @args[1]\n");
my %details = ( uin => $msgs{"@args[1]"},
               MessageType => 'text',
       text => "***@args[1] no such nick"
);
print "bo such_nick\n";
$icq->Send_Command("Cmd_Send_Message", \%details);
$msgs{"@args[1]"}="";
}
}
sub write_cont {
open(OUT, ">contacts.icq");
foreach $keybb (keys (%contacts)) {
print OUT "$keybb $contacts{$keybb}\n";
}
close(OUT);
}
sub cont_to_hash {
open(OUT,"contacts.icq");  
@ign=<OUT>;
close(OUT);
#print "xxxx";
foreach $keybb (@ign) {
if($keybb ne "") {
print "deliting ignore $keybb\n\n";
#print $keybb;
$keybb=~ s/\r//g;
$keybb=~ s/\n//g;
@xxxc=split(/ /,$keybb);
$contacts{"@xxxc[0]"}="@xxxc[1]";
}
}
}


