package SecondLife::SimpleLogin;
use strict;
use warnings;
use XMLRPC::Lite;
use Digest::MD5 'md5_hex';
use XML::Simple;
our $VERSION = 0.01;
our $LOGIN_URI = 'https://login.agni.lindenlab.com/cgi-bin/login.cgi';
sub new { bless {}, shift }
sub login {
my ($self, $first, $last, $passwd, $mac ) = @_;
my $passwd_md5 = '$1$' . md5_hex($passwd);
my %login_details = (
'first' => $first,
'last' => $last,
'passwd' => $passwd_md5,
'start' => 'last',
'major' => '1',
'minor' => '18',
'patch' => '2',
'build' => '15',
'platform' => 'Win',
'mac' => $mac,
'options' => [],
'user-agent' => "$0/$VERSION",
'id0' => '',
'agree_to_tos' => '',
'viewer_digest' => '09d93740-8f37-c418-fbf2-2a78c7b0d1ea'
);
my $res = $self->do_login(\%login_details);
if ($res->{login} eq 'false' && $res->{message} =~ /^Required version: (\d+).(\d+)\.(\d+)\.(\d+)\.$/) {
@login_details{qw/major minor patch build/} = ($1, $2, $3, $4);
$res = $self->do_login(\%login_details);
$self->{login_resposnse} = $res;
return $res;
} else {
$self->{login_resposnse} = $res;
return $res;
}
}
sub do_login {
my ($self, $login_details) = @_;
return XMLRPC::Lite->proxy($LOGIN_URI)
->call( 'login_to_simulator', $login_details )->result;
}
sub get_capabilities {
my ($self, ) = @_;
my $url = $self->{login_resposnse}->{seed_capability};
my $xml = <<'...';
MapLayer
MapLayerGod
NewAgentInventory
EventQueueGet
...
my $req = HTTP::Request->new(POST => $url);
$req->content($xml);
my $ua = $self->_ua;
my $res = $ua->request($req);
if ($res->is_success) {
return XMLin($res->content);
} else {
die $res->status_line;
}
}
sub _ua {
LWP::UserAgent->new(agent => join '/', __PACKAGE__, $VERSION);
}
1;
package main;
use strict;
use warnings;
use Data::Dumper;
use XML::Simple;
my $sl = SecondLife::SimpleLogin->new;
warn Dumper($sl->login(@ARGV));
warn Dumper($sl->get_capabilities());
=head1 DESCRIPTION
simple sample script for secondlife login XMLRPC.
=head1 SEE ALSO
L
=head1 AUTHOR
tokuhiro matsuno.