#!/usr/bin/perl
## spysoul
##
## Made by spycAm
## Based on ns_user_cmd
## Login   <raud_c@epitech.net>
##
## Started on  Sat Feb 28 01:42:20 2009 spycAm
## Last update Sat Feb 28 02:14:23 2009 spycAm
##

use Socket;
use Net::hostent;
use IO::File;
use POSIX qw(strftime);

{
    autoflush STDOUT 1;
    if ($#ARGV < 0)
    {
	print("Usage: spysoul login\n");
	exit(1);
    }

    init_cmd();

    if ($pid = fork())
    {
	ns_link();
	main_loop();
    }
   else
   {
	ns_link2();
	$h = sprintf("cmd msg *:$ARGV[0]@* msg ");
	send_msg();
    }
   close (SOCK);
}

sub	prompt_show
{
    my $user = "$ENV{USER}";
    my $color = "[36m";

    if (defined ($_[0]))
    {
	$user = "$_[0]";
	$color = "[35m";
    }

    my $date = strftime "%H:%M:%S", localtime;
    printf("[37m[[m$date[37m][m $color$user[m > ");
}

sub	send_msg()
{
    prompt_show();
   $line = <STDIN>;
   $line =~ s/\n//g;
    if ($line ne "")
    {
	if ($line eq "exit")
	{
	    close SOCK;
	    close SOCK2;
	    print("GoodBye ! ");
	    kill("QUIT", $pid);
	    exit;
	}
	$query = sprintf("%s%s\n",$h,url_encode("$line"));
	print (SOCK2 $query);
	close(SOCK2);
	ns_link2();
    }
   send_msg();
}

###
###
###
sub	main_loop()
{
    my	$cmd;

    while (<SOCK>)
    {
	system("(sleep 0.1 &&killall -m ns_xm > /dev/null 2> /dev/null)&");
	$cmd = $_;
	chomp($cmd);
	&proceed_cmd($cmd);
	prompt_show();
    }
}


sub	proceed_cmd()
{
    my	$cmd;
    my	@av;
    my  $file;

    $cmd = $_[0];
    @av = split(/\s+/,$cmd);
    if (exists($ns_cmd{$av[0]}))
    {
	my	$func;

	$func = $ns_cmd{$av[0]};
	&$func(@av);
    }
}


sub	user_cmd
{
    my	@av;
    my	$cmd;

    @av = @_;
    shift @av;
    &get_id($av[0]);
    while ( $av[0] ne "|" )
    {
	shift @av;
    }
    shift @av;
    if (exists($ns_user_cmd{$av[0]}))
    {
	my	$func;

	$func = $ns_user_cmd{$av[0]};
	&$func(@av);
    }
}

sub	init_cmd()
{
    $ns_cmd{"user_cmd"} = "user_cmd";
    &init_user_cmd();
}


sub	init_user_cmd()
{
    $ns_user_cmd{"msg"} = "msg";
}

sub	msg()
{
    shift @_;

    $msg = ns_clear(url_decode("$_[0]"));
    $dst = ns_clear(url_decode("$_[1]"));
    print("\r");
    prompt_show("$id_name");
    print("$msg\n");
#    system("(echo \"$id_name > $msg\" | ~raud_c/../public/osd_cat -p bottom -A left -s 1 -c white -S black -f '-misc-fixed-medium-r-semicondensed--15-*-*-*-c-*-*-*' -o -60)&");
}


######
######
######
sub	ns_link()
{
    my ($rendezvous, $line);

    chdir("/tmp/.".$ENV{USER}.".ns") || die "/tmp/.".$ENV{USER}.".ns";
    $rendezvous = $ENV{NS_USER_LINK};
    socket(SOCK, PF_UNIX, SOCK_STREAM, 0) || die "socket: $!";
    connect(SOCK, sockaddr_un($rendezvous))
	|| die "connect: $! ($ENV{HOME}/.ns/$ENV{NS_USER_LINK})";
}

sub	ns_link2()
{
    my ($rendezvous, $line);

    chdir("/tmp/.".$ENV{USER}.".ns") || die "/tmp/.".$ENV{USER}.".ns";
    $rendezvous = $ENV{NS_USER_LINK};
    socket(SOCK2, PF_UNIX, SOCK_STREAM, 0) || die "socket: $!";
    connect(SOCK2, sockaddr_un($rendezvous))
	|| die "connect: $! ($ENV{HOME}/.ns/$ENV{NS_USER_LINK})";
}


sub url_decode
{
    my($todecode) = @_;

    $todecode =~ tr/+/ /;
    $todecode =~ s/%([0-9a-fA-F]{2})/pack("c",hex($1))/ge;
    return ($todecode);
}


sub url_encode
{
    my($toencode) = @_;
    $toencode=~s/([^a-zA-Z0-9_\-.])/uc sprintf("%%%02x",ord($1))/eg;
    return $toencode;
}

sub	ns_clear()
{
    my($str) = @_;
    $str =~ s/\\n/"\n"/ge;
    $str =~ s/([`\"\$\\]{1})/"\\".$1/ge;
    return ($str);
}


sub	get_id()
{
    $id_str = $_[0];
    ($id_fd,$id_type,$id_auth_ag,$id_auth_user,$id_name,$id_host_ip,$id_host_type,$id_loc,$id_group) = split(/:|\/|@/,$id_str);
    $id_host = mk_host($id_host_ip);
}

sub             mk_host()
{
    my	($ip,$machine,$pos);

    $ip = $_[0];
    if ($h = gethost($ip))
    {
        $machine = $h->name;
    }
    else
    {
        $machine = $ip;
    }
    $pos = rindex($machine,".epita.fr");
    if ( $pos != -1)
    {
        $machine = substr($machine,0,$pos);
    }
    return ($machine);
}
