#!/usr/bin/perl

#---------------------Configuracio------------------
$veure=1;
################
#veure=0 -> Si troba que ens contesten algu que conte "se está procesando correctamente" diu
#           missatge ben enviat
#veure=1 -> Ens ensenya el tros de text de Navegalia que conte "correctamente"
#veure=2 -> Ens ensenya tot el HTML de Navegalia (bo per trobar problemes).

#Si Navegalia canvia de paraula enlloc de OkSMS, ho podem canviar:
$correctament='OkSMS';
#$correctament='" se está procesando correctamente';

#Numero max. de caracters
$max=120;

#---------------------Fi configuracio--------------------

#port
$port=80;

#SMS Versio 0.4c (Enviament d' SMS a traves de Navegalia)
#Copyright (C) 2001 Carles Pina i Estany
#
#This program is free software; you can redistribute it and/or
#modify it under the terms of the GNU General Public License
#as published by the Free Software Foundation; either version 2
#of the License, or any later version.
#
#This program is distributed in the hope that it will be useful,
#but WITHOUT ANY WARRANTY; without even the implied warranty of
#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#GNU General Public License for more details.
#
#You should have received a copy of the GNU General Public License
#along with this program; if not, write to the Free Software
#Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.


$HOME="$ENV{HOME}";
chomp $HOME;
if ($^O eq "MSWin32") {
	$HOME="c:\\";
	$agenda="agenda";
}
else {
	$agenda=$HOME."/.agenda";
}
use Socket;
#TODO: posar timeout per connexions
sub servidor 
{
	my $texte=shift(@_);
	my $tlf=shift(@_);
	my $llarg;
	my $ok=0;
	my $cook1;
	my $cook2;
	my $cook3;
	my $dada;
	my $temp;
	
	my $proto=getprotobyname ('tcp');
	
	socket ("socket1", PF_INET, SOCK_STREAM, $proto) || die "Problema connexio 1. $!\n";

	my $sin=sockaddr_in($port,inet_aton("212.73.32.54")) || die "Problema connexio 2\n";
	connect ("socket1",$sin) || die "Problema connexio 3: $!\n";

	my $tmp=select ("socket1");
	$|=1;
	select ($tmp);
$llarg=length($texte)+24;
print socket1 <<END;
POST /cgi-bin/cgi-airt HTTP/1.0
Referer: http://sms.airtelvodafone.com/Vodafone/sms/IndexSMS
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*
Accept-Language: es
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 5.0; Windows 98; DigExt)
Connection: Keep-Alive
Pragma: no-cache
Host: 212.73.32.54
Content-Length: $llarg

mBody=$texte&tNumber=$tlf
END
	while (<socket1>) {
		if (/$correctament/ && $veure==1) {
			print $_;
			$ok=1;
		}
		if ($veure==2) {
			print $_;
			if (/$correctament/) {
				$ok=1;
			}
		}

		if (/$correctament/ && $veure==0) {
			$ok=1;
		}
	}
	print "\n";	
	if ($ok==1 && $veure==0) {
		print "Sembla missatge ben enviat\n";
	}

	if ($ok==0) {
		print "Navegalia no ho ha enviat -en principi...\n";
	}

	close socket1;

}

sub busca 
{
	my $pers=shift(@_);
	my $tlf;
	my $linia;
	my @registre;
	my $on=$agenda;
	$tlf="";
	
	#open (FITXER,$on) or die "No puc obrir el fitxer ".$on."\n";
	open (FITXER,$on);
	while ($linia=<FITXER>) {
		
 	       @registre=split /\ / ,$linia;

 	       if ($registre[0] eq $pers) {
        	        $tlf=$registre[1];
                	#chomp $tlf;
        		chomp $tlf;
		}
	}
	close FITXER;
	return $tlf;
}

sub enviar 
{
	my @separat;
	my $body=shift (@_);
	my $tlf=shift (@_);
	my $k=1;

	$num=(length $body)/($max-4);
	$num=$num%($max-4)+1;

	if ($num != 1) {
        	print "Son ".$num." missatges";
		print "La llargada es de ".(length $body)."\n";
		print "\nEnviament multimissatge de $num missatges\n";
    
		@separat=&separa_espais ($body);
    		foreach (@separat) {
			print "ARA ENVIARE: $_\n";

			&servidor ($k."/".$num.")".$_,$tlf);
			$k++;
			sleep 5;
		}
	
	}
	else {
		print "\nEnviament d' un missatge\n";
		&servidor ($body,$tlf);
	}
}

sub valid {
	my $nom=shift (@_);
	return ((&busca($nom)) && ($nom=~/ /));
}

sub demana_enviar {
	my $body;
	my $to;
	my $num;
	my $i;
	my @destintaris;
	my $voler;

	if (@_ != 0 ) {
		$body=$_[0];
	}
	else {
		$body="";
	}

	if (length($body)==0) {
		print "Escriu el missatge:\n";
		$body=<STDIN>;
		chomp $body;
	}

	print "\nEcriu el destinatari/s:\n";
	$to=<STDIN>;
	chomp $to;
	$to=lc($to);
	$to=~s/\ //g;
	@destinataris=split /\,/,$to;

	foreach $to (@destinataris) {
		$tlf=&busca ($to);

		if ($tlf) {
        		print "\nNom trobat, telefon es: ".$tlf."\n";
	        	&enviar ($body,$tlf);
		}
		else {
			print "\nNom (".$to.") no trobat\n";
	        	print "Escriu telefon: \n";
	        	$tlf=<STDIN>;
	
			chomp $tlf;
	        	&enviar ($body,$tlf);

			print "Vols afegir aquest tlf. a l' agenda?\n";
			$voler=<STDIN>;
			chomp $voler;

			&afegir ($to,$tlf) if ($voler eq "s" || $voler eq "S" || $voler eq "y" || $voler eq "si" || $voler eq "SI" || $voler eq "yes" || $voler eq "YES");

		}
	}
	print "\nPresiona una tecla per continuar\n";
	<STDIN>;
}


sub afegir {
	my @arg=@_;
	my $nom="";
	my $tlf="";

	my $ok=0;
	#Si ens passen algun argument ho posem a $tlf
	if ($#arg==1) {
		$nom=$arg[0];
		$tlf=$arg[1];
	}

	while ($ok==0) {
		if ($nom eq "") {
			print "Digues el nom nou\n";
			$nom=<STDIN>;
			$nom=lc($nom);
			chomp $nom;
		}
		my $p=&busca($nom);
		my $q=($nom=~/ /);

		#volem que:
		#-nom no hi sigui ->$p==""
		#-no tingui espais -> $q==$nom

		if((length($p)==0) && ($q!=1)){
			$ok=1;
		}
		else {
			print "Nom invalid\n";
			$nom="";
		}
	}

	#Entra a l' if si no ens han passat el tlf
	if (length($tlf)==0) {
		print "Digues el telèfon\n";
		$tlf=<STDIN>;
		chomp $tlf;
	}

	open (FITXER, ">>$agenda") or die "No puc obrir $agenda??";
	print FITXER "$nom $tlf\n";
	close FITXER;
}

sub modifica {
	my @a;
	my $p;
	my $nom_nou;
	my $tlf;
	my $nom;
	my $ok;
	my $q;
	my @lin;

	print "A qui vols modificar?\n";
	$nom=<STDIN>;

	chomp $nom;

	$tlf=&busca($nom);
	
	if(length($tlf)==0) {
		print "Nom no trobat\n";
		<STDIN>;
	}
	else {
		$ok=0;
		while ($ok==0) {
			print "Digues nom nou. Intro per mantenir\n";
			$nom_nou=<STDIN>;
			chomp $nom_nou;

                	#my $p=&busca($nom);
			$q=($nom_nou=~/ /);

			#TODO: pots posar noms repetits

			if($q!=1){ 
				$ok=1;
			}
			else {
				print "Nom invalid\n";
			}
		}

		
		print "Tlf. nou. Intro per mantenir\n";
		$tlf_nou=<STDIN>;
		chomp $tlf_nou;

		open(FITXER,"$agenda") or die "No puc obrir $agenda";	
		my @tot=<FITXER>;
		close FITXER;
		
		open(FITXER,">$agenda") or die "No puc obrir $agenda";
		foreach (@tot) {
			@lin=split / /;
			print FITXER "$lin[0] $lin[1]" if ($lin[0] ne $nom);
		}

		$nom=$nom_nou if (length($nom_nou)!=0);
		$tlf=$tlf_nou if (length($tlf_nou)!=0);
		print FITXER "$nom $tlf\n";
		close FITXER;
	}
}

sub elimina {
	my $nom;
	my $tlf;
	my @tot;
	my @lin;

	print "Digues persona a eliminar\n";
	$nom=<STDIN>;
	chomp $nom;

	$tlf=&busca($nom);

	if (length($tlf)!=0) {
		open (FITXER,"$agenda") or die "No puc obrir $agenda";
		@tot=<FITXER>;
		close FITXER;

		open (FITXER,">$agenda") or die "No puc obrir $agenda";
		
		foreach (@tot) {
			@lin=split / /;
			print FITXER "$lin[0] $lin[1]" if ($lin[0] ne $nom);
		}
		close FITXER;
		print "$nom esborrat\n";
		<STDIN>;
	}
	else {
		print "Nom no trobat\n";
		<STDIN>;
	}
}

sub demana_enviar2 {
	my $tlf;
	my $body;

	print "Digues el missatge\n";
	$body=<STDIN>;
	chomp $body;

	print "Digues el número de tlf.\n";
	$tlf=<STDIN>;
	chomp $tlf;

	&enviar($body,$tlf);

	print "Presiona una tecla per continuar\n";
	<STDIN>;
}

sub separa_espais {
	my $cadena=$_[0];
	my $trossos=length($cadena)/$max;
	my @ret;
	my $j;
	for ($min=0,$i=$max,$total=0,$j=0;$total<length($cadena);$j++) {
        	$i=&endarrera($cadena,$i);
		#print "He retornat: $i\n";
        	$part=substr($cadena,$min,$i);
		$ret[$j]=$part;
		#print "j:$j RET: $ret[$j]\n";
        	$total+=length($part);
        	$min+=$i;
        	$i+=$max;
		
	}
	return (@ret);
}


sub endarrera {
	#funció auxiliar de separa_espais
        my $cad=$_[0];
        my $j=$_[1];

	if ($j>length($cad)) {
		$j=length($cad);
	}
        else {
		while (substr($cad,$j,1) ne " ") {
                	$j--;
        	}
	}
        return $j;
}


sub menu {
	my $opc="1";
	while ($opc ne "7") {
	
	if ($^O eq "MSWin32") {
		system ("cls");
	}
	else {
		system("clear");
	}
print <<EOF_PRINT;
        ****************************************************************
        *                       MENU SMS 0.4c                          *
        ****************************************************************
        *            1.- Enviar SMS amb agenda                         *
        *	     2.- Enviar SMS sense agenda                       *
        *            3.- Afegir persona a l' agenda                    *
        *            4.- Modificar persona de l' agenda                *
        *            5.- Eliminar persona de l' agenda                 *
	*	     6.- Llistar agenda				       *
        *            7.- Sortir                                        *
        *                                                              *
        *                        Carles Pina i Estany  Aka: Pinux      *
        *                        E-Mail: carles\@pinux.info             *
        ****************************************************************
        Selecciona una opció:

EOF_PRINT

		$opc=<STDIN>;
		chomp $opc;

		&demana_enviar if ($opc eq "1");
		&demana_enviar2 if ($opc eq "2");
		&afegir if ($opc eq "3");
		&modifica if ($opc eq "4");
		&elimina if ($opc eq "5");
	
		if ($opc eq "6") {
			if ($^O eq "MSWin32") {
				system ("more ".$agenda);
				print "Apreta una tecla per continuar\n";
				<STDIN>;
			}
			else {
				system("less ".$agenda);
			}
		}
#		&demana_enviar($opc) if ($opc lt "7" || $opc gt "1");

	}

}
if (@ARGV != 1) {
	&menu;
}
else {

	if ($ARGV[0] eq "--help") {
print <<END;
Sense arguments:
sms04
Obre un menú

Amb arguments:
echo "hola que tal" | sms04 600555555
Agafa el primer paràmetre i el fa servir com a telèfon destí. I l'entrada estàndard ho usa com el missatge a enviar.
END
	exit
	}

	$nbody=<STDIN>;
	print "enviare cos: $nbody tlf: $ARGV[0]\n";
	&enviar($nbody,$ARGV[0]);

}
1;
