123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208 |
- package OpenSim::GridServer;
- use strict;
- use OpenSim::Utility;
- use OpenSim::GridServer::Config;
- use OpenSim::GridServer::GridManager;
- sub getHandlerList {
- my %list = (
- "simulator_login" => \&_simulator_login,
- "simulator_data_request" => \&_simulator_data_request,
- "map_block" => \&_map_block,
- "map_block2" => \&_map_block2, # this is better for the Region Monitor
- );
- return \%list;
- }
- # #################
- # XMLRPC Handlers
- sub _simulator_login {
- my $params = shift;
- my $region_data = undef;
- my %response = ();
- if ($params->{"UUID"}) {
- $region_data = &OpenSim::GridServer::GridManager::getRegionByUUID($params->{"UUID"});
- } elsif ($params->{"region_handle"}) {
- $region_data = &OpenSim::GridServer::GridManager::getRegionByHandle($params->{"region_handle"});
- } else {
- $response{"error"} = "No UUID or region_handle passed to grid server - unable to connect you";
- return \%response;
- }
- if (!$region_data) {
- my %new_region_data = (
- uuid => undef,
- regionHandle => OpenSim::Utility::UIntsToLong($params->{region_locx}*256, $params->{region_locx}*256),
- regionName => $params->{sim_name},
- regionRecvKey => $OpenSim::Config::SIM_RECV_KEY,
- regionSendKey => $OpenSim::Config::SIM_SEND_KEY,
- regionSecret => $OpenSim::Config::SIM_RECV_KEY,
- regionDataURI => "",
- serverIP => $params->{sim_ip},
- serverPort => $params->{sim_port},
- serverURI => "http://" + $params->{sim_ip} + ":" + $params->{sim_port} + "/",
- LocX => $params->{region_locx},
- LocY => $params->{region_locy},
- LocZ => 0,
- regionAssetURI => $OpenSim::Config::ASSET_SERVER_URL,
- regionAssetRecvKey => $OpenSim::Config::ASSET_RECV_KEY,
- regionAssetSendKey => $OpenSim::Config::ASSET_SEND_KEY,
- regionUserURI => $OpenSim::Config::USER_SERVER_URL,
- regionUserRecvKey => $OpenSim::Config::USER_RECV_KEY,
- regionUserSendKey => $OpenSim::Config::USER_SEND_KEY,
- regionMapTextureID => $params->{"map-image-id"},
- serverHttpPort => $params->{http_port},
- serverRemotingPort => $params->{remoting_port},
- );
- eval {
- &OpenSim::GridServer::GridManager::addRegion(\%new_region_data);
- };
- if ($@) {
- $response{"error"} = "unable to add region";
- return \%response;
- }
- $region_data = \%new_region_data;
- }
- my @region_neighbours_data = ();
- my $region_list = &OpenSim::GridServer::GridManager::getRegionList($region_data->{locX}-1, $region_data->{locY}-1, $region_data->{locX}+1, $region_data->{locY}+1);
- foreach my $region (@$region_list) {
- next if ($region->{regionHandle} eq $region_data->{regionHandle});
- my %neighbour_block = (
- "sim_ip" => $region->{serverIP},
- "sim_port" => $region->{serverPort},
- "region_locx" => $region->{locX},
- "region_locy" => $region->{locY},
- "UUID" => $region->{uuid},
- "regionHandle" => $region->{regionHandle},
- );
- push @region_neighbours_data, \%neighbour_block;
- }
- %response = (
- UUID => $region_data->{uuid},
- region_locx => $region_data->{locX},
- region_locy => $region_data->{locY},
- regionname => $region_data->{regionName},
- estate_id => "1", # TODO ???
- neighbours => \@region_neighbours_data,
- sim_ip => $region_data->{serverIP},
- sim_port => $region_data->{serverPort},
- asset_url => $region_data->{regionAssetURI},
- asset_recvkey => $region_data->{regionAssetRecvKey},
- asset_sendkey => $region_data->{regionAssetSendKey},
- user_url => $region_data->{regionUserURI},
- user_recvkey => $region_data->{regionUserRecvKey},
- user_sendkey => $region_data->{regionUserSendKey},
- authkey => $region_data->{regionSecret},
- data_uri => $region_data->{regionDataURI},
- "allow_forceful_banlines" => "TRUE",
- );
- return \%response;
- }
- sub _simulator_data_request {
- my $params = shift;
- my $region_data = undef;
- my %response = ();
- if ($params->{"region_UUID"}) {
- $region_data = &OpenSim::GridServer::GridManager::getRegionByUUID($params->{"region_UUID"});
- } elsif ($params->{"region_handle"}) {
- $region_data = &OpenSim::GridServer::GridManager::getRegionByHandle($params->{"region_handle"});
- }
- if (!$region_data) {
- $response{"error"} = "Sim does not exist";
- return \%response;
- }
- $response{"sim_ip"} = $region_data->{serverIP};
- $response{"sim_port"} = $region_data->{serverPort};
- $response{"http_port"} = $region_data->{serverHttpPort};
- $response{"remoting_port"} = $region_data->{serverRemotingPort};
- $response{"region_locx"} = $region_data->{locX};
- $response{"region_locy"} = $region_data->{locY};
- $response{"region_UUID"} = $region_data->{uuid};
- $response{"region_name"} = $region_data->{regionName};
- $response{"regionHandle"} = $region_data->{regionHandle};
- return \%response;
- }
- sub _map_block {
- my $params = shift;
- my $xmin = $params->{xmin} || 980;
- my $ymin = $params->{ymin} || 980;
- my $xmax = $params->{xmax} || 1020;
- my $ymax = $params->{ymax} || 1020;
- my @sim_block_list = ();
- my $region_list = &OpenSim::GridServer::GridManager::getRegionList($xmin, $ymin, $xmax, $ymax);
- foreach my $region (@$region_list) {
- my %sim_block = (
- "x" => $region->{locX},
- "y" => $region->{locY},
- "name" => $region->{regionName},
- "access" => 0, # TODO ? meaning unknown
- "region-flags" => 0, # TODO ? unknown
- "water-height" => 20, # TODO ? get from a XML
- "agents" => 1, # TODO
- "map-image-id" => $region->{regionMapTexture},
- "regionhandle" => $region->{regionHandle},
- "sim_ip" => $region->{serverIP},
- "sim_port" => $region->{serverPort},
- "sim_uri" => $region->{serverURI},
- "uuid" => $region->{uuid},
- "remoting_port" => $region->{serverRemotingPort},
- );
- push @sim_block_list, \%sim_block;
- }
- my %response = (
- "sim-profiles" => \@sim_block_list,
- );
- return \%response;
- }
- sub _map_block2 {
- my $params = shift;
- my $xmin = $params->{xmin} || 980;
- my $ymin = $params->{ymin} || 980;
- my $xmax = $params->{xmax} || 1020;
- my $ymax = $params->{ymax} || 1020;
- my @sim_block_list = ();
- my $region_list = &OpenSim::GridServer::GridManager::getRegionList2($xmin, $ymin, $xmax, $ymax);
- foreach my $region (@$region_list) {
- my %sim_block = (
- "x" => $region->{locX},
- "y" => $region->{locY},
- "name" => $region->{regionName},
- "access" => 0, # TODO ? meaning unknown
- "region-flags" => 0, # TODO ? unknown
- "water-height" => 20, # TODO ? get from a XML
- "agents" => 1, # TODO
- "map-image-id" => $region->{regionMapTexture},
- "regionhandle" => $region->{regionHandle},
- "sim_ip" => $region->{serverIP},
- "sim_port" => $region->{serverPort},
- "sim_uri" => $region->{serverURI},
- "uuid" => $region->{uuid},
- "remoting_port" => $region->{serverRemotingPort},
- );
- push @sim_block_list, \%sim_block;
- }
- my %response = (
- "sim-profiles" => \@sim_block_list,
- );
- return \%response;
- }
- 1;
|