#!/usr/bin/perl -w

# Skrypt wysyłający SMS-y na wszystko przez bramkę
# www.1rstwap.com
# http://www.1rstwap.com/partners/go.to/1rstwap
# Napisany w Perlu. 
# Wymaga: perl + LWP (RedHat RPM: "perl-libwww").
#
# (c) 2003 Jacek Fiok <jfiok@jfiok.org>; http://sms.jfiok.org
#
# wysyła wiadomości do 160 znaków; na: Plus, Era, IDEA + różne zagraniczne.

use strict;
use HTTP::Request::Common;
use HTTP::Cookies;
use LWP::UserAgent;

# ----------------------- pomocnicze ---------------------------------
my $debug = 0;					# czy "tryb gadatliwy"
sub debug { if ($debug) { print "[", shift, "]\n"; } }

sub zakoncz {
  my ($tekst, $ret) = @_;
  print "$tekst\n";
  exit $ret;
}

# format struktury danych:
# string który możemy znaleźć w odpowiedzi z serwera =>
# [co należy z niego wywnioskować-opis, kod powrotu ze skryptu ]
my %odpowiedzi = (
	"has been sent to Queue" => ["Wszystko OK", 0],
	"is not covered yet" => ["Zły numer!", 2],
	"exceeded your weekly quota" => ["Limit wiadomości na ten tydzień przekroczony!", 3],
);
# limit is reached --> trzeba zweryfikować jeszcze

# główna procedurka analizująca odpowiedź serwera
# jeśli nie umiemy nic wywnioskować -> rzucamy [Nieznana Odpowiedz, 127]
sub analizujWynik {
	my $res = $_[0];
	my $searchString;
	my @val;
	while ( ($searchString, @val) = each (%odpowiedzi) ) {
	  if ($res =~ /$searchString/ ) {
		  print $odpowiedzi{$searchString}[0], "\n";
		  exit $odpowiedzi{$searchString}[1];
	  }		  
	}
	# nie znaleziono w opisach
	print "Nieznana odpowiedź:\n$res\n";
	exit 127;
}

# getCookie ($nazwa) -> wartość cookie; wymaga: $cookie_jar.
my $ckey = "";
my $cval = "";
my $cookie_jar = HTTP::Cookies->new;

# funkcja-plugin do cookie_jar->scan()
# zwraca wartość ciasteczka dla podanej w $ckey nazwy klucza
sub cookieScanner {
	($ckey eq $_[1]) and $cval = $_[2]; 
}
sub getCookie {
	$cval = "";
	$ckey = shift;
	$cookie_jar->scan (\&cookieScanner);
	return $cval;
}

my $ua = new LWP::UserAgent;
$ua->timeout(30);
$ua->agent("Mozilla/5.0 Galeon/1.2.7 (X11; Linux i686; U;) Gecko/20021216");
$ua->env_proxy();
$ua->cookie_jar($cookie_jar);

# odwiedza stronę $_[0]; w razie błędu wychodzi z tekstem $_[1] i kodem $_[2].
# w zmiennej globalnej $res ląduje HTML -- wynik zapytania.
my $res; my $req;
sub visit {
	$res = $ua->request (GET $_[0]);
	if (!($res->is_success)) { zakoncz($_[1], $_[2]); }
}
# ----------------------- main() -----------------------------

select(STDERR); $| = 1;     # make unbuffered
select(STDOUT); $| = 1;     # make unbuffered

if ($#ARGV != 3 ) { die "Zła ilość parametrów - podaj numer i treść sms-a oraz użytkownika i hasło do serwisu"; }

my $numer = $ARGV[0];
my $tresc = $ARGV[1];
my $username = $ARGV[2];
my $password = $ARGV[3];

if (!($numer =~ /^\+/)) { $numer = "+48".$numer; }

# --------- konwersacja -----------

# 1. get sms-index
visit ("http://www.1rstwap.com/partners/go.to/1rstwap", 
       "Błąd przy otwieraniu formularza [1]", 1);
visit ('http://www.1rstwap.com/partners/blank.php?PHPSESSID=&pid=first',
	"Błąd przy otwieraniu formularza [1.2]", 1);
visit ('http://www.1rstwap.com/partners/go.php?PHPSESSID=&pid=first&LangID=en',
	"Błąd przy otwieraniu formularza [1.3]", 1);

my $par1;
if ($res->content =~ /"frmlogin" action="([^"]+)"/) { $par1 = $1; } 
else { zakoncz ("Błąd przy otwieraniu formularza [regexp] [1]", 1); }

# 2. send the POST login form
$par1 = 'http://www.1rstwap.com'.$par1;
debug ("Logging in: ".$par1);

$req = POST $par1, [
	UserID => $username,
	Passwd => $password,
	submitButtonName => "Sign In",
	language => "/partners/go.php?PHP_SESSID=&pid=first&LangID=en&cobid=1RSTWAP",
	cobid => "1RSTWAP"
];
$req->referer ("http://www.1rstwap.com/partners/go.to/1rstwap");
$res = $ua->request($req);
if (!($res->is_success)) { zakoncz("Błąd przy logowaniu [2]", 1); }

$res = $ua->request (GET 'http://www.1rstwap.com/partners/go.php?pid=home');
if (!($res->content =~ /My Profile/)) {
	zakoncz("Błąd przy logowaniu - regexp fail [2]", 1);
} 
debug ("zalogowany");

visit ("http://www.1rstwap.com/partners/go.php?pid=addressbook&aid=smswindow&step=openfmenu", "Błąd przy otwarciu formularza SMS [3]", 1);

debug ("przed wysłaniem POST");

if ($res->content =~ /"frmnewsmsuser" action="([^"]+)"/) { $par1 = $1; }
else { zakoncz ("Błąd przy dekodowaniu POST sendsms [regexp] [4.1.1]", 1); }

my $par2;
if ($res->content =~ /name="SENDER" value="([^"]+)"/) { $par2 = $1; }
else { zakoncz ("Błąd przy dekodowaniu POST sendsms [regexp] [4.1.2]", 1); }

$par1 = 'http://www.1rstwap.com'.$par1;
debug ("SENDER = ".$par2);
debug ("Sending SMS: ".$par1);

$req = POST $par1, [
hp => $numer,
COUNTER => (160 - length($tresc)),
flashsms => 0,
m => $tresc,
submitButtonName => "Send",
resetButtonName => "Clear",
SENDER => $par2
];

debug ("dotarłem OK do końca procedury, wysyłam...");

$res = $ua->request($req);
if (!($res->is_success)) { zakoncz("Błąd przy ostatecznym wysyłaniu SMS [5]", 1);
}
analizujWynik ($res->content);

# TODO: 
#	- wypisuj oprócz "wszystko OK" liczbę pozostałych SMS-ów;
#	- raporty doręczenia (per-numer, ostatni SMS?)

