get_update_time('UserAccounts'); return $utime; } // // Check and get Basic Data of DB // function opensim_check_db(&$db=null) { $ret['grid_status'] = false; $ret['now_online'] = 0; $ret['hg_online'] = 0; $ret['lastmonth_online'] = 0; $ret['user_count'] = 0; $ret['region_count'] = 0; if (!is_object($db)) $db = opensim_new_db(3); if ($db==null) return $ret; if ($db->exist_table('regions')) { $db->query('SELECT COUNT(*) FROM regions'); if ($db->Errno==0) { list($ret['region_count']) = $db->next_record(); } } $db->query('SELECT COUNT(*) FROM UserAccounts'); // Local User list($ret['user_count']) = $db->next_record(); // if ($db->exist_table('Presence')) { $db->query("SELECT COUNT(DISTINCT Presence.UserID) FROM GridUser,Presence ". //"WHERE GridUser.UserID=Presence.UserID AND Online='True' AND RegionID!='".UUID_ZERO."'"); "WHERE GridUser.UserID=Presence.UserID AND RegionID!='".UUID_ZERO."'"); list($loc_user) = $db->next_record(); $db->query("SELECT COUNT(*) FROM Presence WHERE RegionID!='".UUID_ZERO."'"); list($all_user) = $db->next_record(); $ret['now_online'] = $all_user; $ret['hg_online'] = $all_user - $loc_user; } // Standalone else { $db->query("SELECT COUNT(*) FROM GridUser WHERE Online='True' AND UserID NOT LIKE '%;%'"); list($loc_user) = $db->next_record(); $db->query("SELECT COUNT(*) FROM GridUser WHERE Online='True'"); list($all_user) = $db->next_record(); $ret['now_online'] = $all_user; $ret['hg_online'] = $all_user - $loc_user; } // $db->query('SELECT COUNT(*) FROM GridUser WHERE Login>unix_timestamp(now())-2592000'); // Local and HG User list($ret['lastmonth_online']) = $db->next_record(); // $ret['grid_status'] = true; return $ret; } function opensim_is_standalone(&$db=null) { if (!is_object($db)) $db = opensim_new_db(); if ($db->exist_table('Presence')) return false; return true; } ///////////////////////////////////////////////////////////////////////////////////// // // for Avatar // // // ローカルなアバター数 // function opensim_get_avatars_num($condition='', &$db=null) { if (!is_object($db)) $db = opensim_new_db(); if ($condition!='') $condition = 'WHERE '.$condition; $num = 0; $db->query('SELECT COUNT(*) FROM UserAccounts '.$condition); list($num) = $db->next_record(); return $num; } // // HGユーザも含めた全アバター数 // function opensim_allavatars_count_records(&$db=null) { if (!is_object($db)) $db = opensim_new_db(); $count = 0; $db->query('SELECT COUNT(*) FROM GridUser'); list($count) = $db->next_record(); return $count; } function opensim_get_avatar_name($uuid, $hguser=true, &$db=null) { $name = array(); if (!isGUID($uuid)) return $name; if ($uuid==UUID_ZERO) { $name['firstname'] = 'System'; $name['lastname'] = ''; $name['fullname'] = 'System'; return $name; } if (!is_object($db)) $db = opensim_new_db(); $firstname = null; $lastname = null; $fullname = null; $db->query("SELECT FirstName,LastName FROM UserAccounts WHERE PrincipalID='$uuid'"); list($firstname, $lastname) = $db->next_record(); $fullname = $firstname.' '.$lastname; if ($fullname==' ') { $fullname = null; $firstname = null; $lastname = null; } // HG if ($hguser and $fullname==null) { $db->query("SELECT UserID FROM GridUser WHERE UserID LIKE '".$uuid.";%' ORDER BY Login DESC"); list($hg_uuid) = $db->next_record(); $uuids = explode(';', $hg_uuid); // if (array_key_exists(2, $uuids)) { $fullname = $uuids[2]; $firstname = $uuids[2]; $lastname = null; $hg_name = explode(' ', $fullname); $firstname = $hg_name[0]; if (array_key_exists(1, $hg_name)) $lastname = $hg_name[1]; } } $name['firstname'] = $firstname; $name['lastname'] = $lastname; $name['fullname'] = $fullname; return $name; } function opensim_get_avatar_uuid($name, $hguser=true, &$db=null) { if (!isAlphabetNumericSpecial($name)) return null; if (!is_object($db)) $db = opensim_new_db(); if (mb_strtolower($name)=='system') return UUID_ZERO; $avatar_name = preg_split("/ /", $name, 0, PREG_SPLIT_NO_EMPTY); $firstname = $avatar_name[0]; $lastname = 'Resident'; if (array_key_exists(1, $avatar_name)) $lastname = $avatar_name[1]; if ($firstname=='') return null; $uuid = null; $db->query("SELECT PrincipalID FROM UserAccounts WHERE FirstName='$firstname' AND LastName='$lastname'"); list($uuid) = $db->next_record(); // HG if ($hguser and $uuid==null) { $db->query("SELECT UserID FROM GridUser WHERE UserID LIKE '%;%;".$firstname.' '.$lastname."' ORDER BY Login DESC"); list($hg_uuid) = $db->next_record(); $uuids = explode(';', $hg_uuid); $uuid = $uuids[0]; } return $uuid; } function opensim_get_avatar_session($uuid, &$db=null) { if (!isGUID($uuid)) return null; if (!is_object($db)) $db = opensim_new_db(); $avssn = array(); // if ($db->exist_table('Presence')) { $sql = "SELECT RegionID,SessionID,SecureSessionID FROM Presence WHERE UserID='".$uuid."'"; $db->query($sql); list($RegionID, $SessionID, $SecureSessionID) = $db->next_record(); // $avssn['regionID'] = $RegionID; $avssn['sessionID'] = $SessionID; $avssn['secureID'] = $SecureSessionID; } // Standalone else { $sql = "SELECT LastRegionID FROM GridUser WHERE UserID='".$uuid."'"; $db->query($sql); list($RegionID) = $db->next_record(); // $avssn['regionID'] = $RegionID; $avssn['sessionID'] = UUID_ZERO; $avssn['secureID'] = UUID_ZERO; } return $avssn; } /* return: $avinfo['UUID'] $avinfo['firstname'] $avinfo['lastname'] $avinfo['fullname'] $avinfo['created'] $avinfo['lastlogin'] $avinfo['regionUUID'] $avinfo['regionName'] $avinfo['serverIP'] $avinfo['serverHttpPort'] $avinfo['serverPort'] $avinfo['serverURI'] $avinfo['serverName'] // $avinfo['hgURI'] $avinfo['hgName'] // $avinfo['profileText'] $avinfo['profileImage'] $avinfo['firstText'] $avinfo['firstImage'] $avinfo['partner'] */ function opensim_get_avatar_info($uuid, $hguser=true, &$db=null) { if (!isGUID($uuid)) return null; if (!is_object($db)) $db = opensim_new_db(); $created = 0; $regionName = null; $serverIP = null; $serverHttpPort = null; $serverURI = null; $hgURI = null; $profileText = null; $profileImage = null; $firstText = null; $firstImage = null; $partner = null; $db->query('SELECT PrincipalID,FirstName,LastName,HomeRegionID,Created,Login FROM UserAccounts'. " LEFT JOIN GridUser ON PrincipalID=UserID WHERE PrincipalID='$uuid'"); list($UUID, $firstname, $lastname, $regionUUID, $created, $lastlogin) = $db->next_record(); $fullname = $firstname.' '.$lastname; if ($fullname==' ') { $fullname = null; $firstname = null; $lastname = null; } if ($fullname!=null) { $db->query("SELECT regionName,serverIP,serverHttpPort,serverURI FROM regions WHERE uuid='$regionUUID'"); list($regionName, $serverIP, $serverHttpPort, $serverURI) = $db->next_record(); } // HG else if ($hguser) { $db->query("SELECT UserID,HomeRegionID,Login FROM GridUser WHERE UserID LIKE '".$uuid.";%' ORDER BY Login DESC"); list($hg_uuid, $regionUUID, $lastlogin) = $db->next_record(); $uuids = explode(';', $hg_uuid); $UUID = $uuids[0]; if (array_key_exists(1, $uuids)) $hgURI = $uuids[1]; if (array_key_exists(2, $uuids)) { $fullname = $uuids[2]; $hg_name = explode(' ', $fullname); $firstname = $hg_name[0]; if (array_key_exists(1, $hg_name)) $lastname = $hg_name[1]; } } $avinfo['UUID'] = $UUID; $avinfo['firstname'] = $firstname; $avinfo['lastname'] = $lastname; $avinfo['fullname'] = $fullname; $avinfo['created'] = $created; $avinfo['lastlogin'] = $lastlogin; $avinfo['regionUUID'] = $regionUUID; $avinfo['regionName'] = $regionName; $avinfo['serverIP'] = $serverIP; $avinfo['serverHttpPort'] = $serverHttpPort; $avinfo['serverPort'] = $serverHttpPort; $avinfo['serverURI'] = $serverURI; $avinfo['serverName'] = ''; $avinfo['hgURI'] = $hgURI; $avinfo['hgName'] = ''; // $avinfo['profileText'] = $profileText; $avinfo['profileImage'] = $profileImage; $avinfo['firstText'] = $firstText; $avinfo['firstImage'] = $firstImage; $avinfo['partner'] = $partner; $uri = preg_split("/[:\/]/", $serverURI); if (array_key_exists(3, $uri)) { $avinfo['serverName'] = $uri[3]; // $avinfo['serverIP2'] = gethostbyname($uri[3]); } // $uri = preg_split("/[:\/]/", $hgURI); if (array_key_exists(3, $uri)) { $avinfo['hgName'] = $uri[3]; } return $avinfo; } /* HG avatars are not supported. return: $avinfos[$UUID]['UUID'] ... UUID $avinfos[$UUID]['firstname'] ... first name $avinfos[$UUID]['lastname'] ... lasti name $avinfos[$UUID]['created'] ... created time $avinfos[$UUID]['lastlogin'] ... lastlogin time $avinfos[$UUID]['hmregion'] ... uuid of home region */ function opensim_get_avatars_infos($condition='', $order='', $limit='', &$db=null) { if (!is_object($db)) $db = opensim_new_db(); if ($condition!='') $condition = 'WHERE '.$condition; if ($order!='') $order = ' ORDER BY '.$order; if ($limit!='') $limit = ' LIMIT '. $limit; $avinfos = array(); $query_str = 'SELECT PrincipalID,FirstName,LastName,Created,Login,homeRegionID FROM UserAccounts '. 'LEFT JOIN GridUser ON PrincipalID=UserID '.$condition.$order.$limit; $db->query($query_str); if ($db->Errno==0) { while (list($UUID,$firstname,$lastname,$created,$lastlogin,$hmregion) = $db->next_record()) { $avinfos[$UUID]['UUID'] = $UUID; $avinfos[$UUID]['firstname'] = $firstname; $avinfos[$UUID]['lastname'] = $lastname; $avinfos[$UUID]['created'] = $created; $avinfos[$UUID]['lastlogin'] = $lastlogin; $avinfos[$UUID]['hmregion_id'] = $hmregion; } } return $avinfos; } /* return: $avinfos[$UUID]['UUID'] ... UUID $avinfos[$UUID]['firstname'] ... first name $avinfos[$UUID]['lastname'] ... lasti name $avinfos[$UUID]['created'] ... always 0 $avinfos[$UUID]['lastlogin'] ... lastlogin time $avinfos[$UUID]['hgURI'] ... Hyper Grid URI $avinfos[$UUID]['hgName'] ... Hyper Grid name */ function opensim_get_hg_avatars_infos($condition='', $order='', $limit='', &$db=null) { if (!is_object($db)) $db = opensim_new_db(); if ($condition!='') $condition = '('.$condition.') AND'; if ($order!='') $order = ' ORDER BY '.$order; if ($limit!='') $limit = ' LIMIT '. $limit; $avinfos = array(); $query_str = 'SELECT UserID,Login FROM GridUser WHERE '.$condition." UserID LIKE '%;%;%' ".$order.$limit; $db->query($query_str); if ($db->Errno==0) { while (list($hg_uuid, $lastlogin) = $db->next_record()) { $hgURI = ''; $fullname = ''; $firstname = ''; $lastname = ''; $uuids = explode(';', $hg_uuid); $UUID = $uuids[0]; if (array_key_exists(1, $uuids)) $hgURI = $uuids[1]; if (array_key_exists(2, $uuids)) { $fullname = $uuids[2]; $hg_name = explode(' ', $fullname); $firstname = $hg_name[0]; if (array_key_exists(1, $hg_name)) $lastname = $hg_name[1]; } // if (!array_key_exists($UUID, $avinfos)) { $avinfos[$UUID]['UUID'] = $UUID; $avinfos[$UUID]['firstname'] = $firstname; $avinfos[$UUID]['lastname'] = $lastname; $avinfos[$UUID]['created'] = 0; $avinfos[$UUID]['lastlogin'] = $lastlogin; $avinfos[$UUID]['hgURI'] = $hgURI; $avinfos[$UUID]['hgName'] = ''; // $uri = preg_split("/[:\/]/", $hgURI); if (array_key_exists(3, $uri)) { $avinfos[$UUID]['hgName'] = $uri[3]; } } } } return $avinfos; } /* return: $ret['online'] $ret['regionUUID'] $ret['regionName'] $ret['timeStamp'] */ function opensim_get_avatar_online($uuid, &$db=null) { if (!isGUID($uuid)) return null; if (!is_object($db)) $db = opensim_new_db(); $online = false; $timestamp = 0; $region = UUID_ZERO; $rgn_name = ''; if ($db->exist_table('Presence')) { $query_str = "SELECT RegionID,unix_timestamp(LastSeen) FROM Presence,GridUser WHERE Presence.UserID='$uuid'". " AND RegionID!='".UUID_ZERO."' AND GridUser.UserID LIKE '".$uuid."%'"; $db->query($query_str); if ($db->Errno==0) { list($region, $timestamp) = $db->next_record(); if ($region!='') { $rgn_name = opensim_get_region_name($region); if ($rgn_name!='') $online = true; else opensim_set_avatar_offline($uuid); } } } // Standalone else { $query_str = "SELECT LastRegionID,unix_timestamp(Login) FROM GridUser WHERE UserID LIKE '".$uuid."%' AND Online='True'"; $db->query($query_str); if ($db->Errno==0) { list($region, $timestamp) = $db->next_record(); if ($region!='') { $rgn_name = opensim_get_region_name($region); if ($rgn_name!='') $online = true; else opensim_set_avatar_offline($uuid); } } } $ret['online'] = $online; $ret['regionUUID'] = $region; $ret['regionName'] = $rgn_name; $ret['timeStamp'] = $timestamp; return $ret; } /* return: $ret[$UUID]['UUID'] $ret[$UUID]['online'] $ret[$UUID]['regionUUID'] $ret[$UUID]['regionName'] $ret[$UUID]['timeStamp'] */ function opensim_get_avatars_online($condition='', $order='', $limit='', $hg_avatar=true, &$db=null) { if (!is_object($db)) $db = opensim_new_db(); if ($condition!='') $condition = 'AND ('.$condition.')'; if ($order!='') $order = ' ORDER BY '.$order; if ($limit!='') $limit = ' LIMIT '. $limit; $ret = array(); $condition .= $order.$limit; if ($db->exist_table('Presence')) { if ($hg_avatar) { $query_str = 'SELECT UserID,RegionID,unix_timestamp(LastSeen) FROM Presence '. " WHERE RegionID!='".UUID_ZERO."'".$condition; } else { $query_str = 'SELECT Presence.UserID,RegionID,unix_timestamp(LastSeen) FROM Presence,GridUser '. " WHERE Presence.UserID=GridUser.UserID AND GridUser.UserID NOT LIKE '%;%' AND RegionID!='".UUID_ZERO."'".$condition; } $db->query($query_str); if ($db->Errno==0) { while (list($UUID, $region, $lastlogin) = $db->next_record()) { $ret[$UUID]['UUID'] = $UUID; $ret[$UUID]['online'] = true; $ret[$UUID]['regionUUID'] = $region; $ret[$UUID]['timeStamp'] = $lastlogin; // $rgn_name = opensim_get_region_name($region); if ($rgn_name!='') $ret[$UUID]['regionName'] = $rgn_name; else opensim_set_avatar_offline($UUID); } } } // Standalone else { if (!$hg_avatar) $condition = " AND UserID NOT LIKE '%;%'".$condition; $query_str = 'SELECT UserID,LastRegionID,Login FROM GridUser '. " WHERE Online='True' AND LastRegionID!='".UUID_ZERO."'".$condition; $db->query($query_str); if ($db->Errno==0) { while (list($UUID, $region, $lastlogin) = $db->next_record()) { $uuids = explode(';', $UUID); $ret[$UUID]['UUID'] = $uuids[0]; $ret[$UUID]['online'] = true; $ret[$UUID]['regionUUID'] = $region; $ret[$UUID]['timeStamp'] = $lastlogin; // $rgn_name = opensim_get_region_name($region); if ($rgn_name!='') $ret[$UUID]['regionName'] = $rgn_name; else opensim_set_avatar_offline($uuids[0]); } } } return $ret; } function opensim_get_avatars_online_num($hg_avatar=true, &$db=null) { if (!is_object($db)) $db = opensim_new_db(); if ($db->exist_table('Presence')) { if ($hg_avatar) { $query_str = "SELECT COUNT(*) FROM Presence WHERE RegionID!='".UUID_ZERO."'"; } else { $query_str = "SELECT COUNT(*) FROM Presence,GridUser WHERE Presence.UserID=GridUser.UserID ". "AND GridUser.UserID NOT LIKE '%;%' AND RegionID!='".UUID_ZERO."'"; } } // Standalone else { $query_str = "SELECT COUNT(*) FROM GridUser WHERE Online='True' AND LastRegionID!='".UUID_ZERO."'"; if (!$hg_avatar) $query_str .= " AND UserID NOT LIKE '%;%'"; } $num = 0; $db->query($query_str); list($num) = $db->next_record(); return $num; } function opensim_get_avatar_flags($uuid, &$db=null) { if (!isGUID($uuid)) return null; if (!is_object($db)) $db = opensim_new_db(); $db->query("SELECT UserFlags FROM UserAccounts WHERE PrincipalID='$uuid'"); if ($db->Errno==0) { list($flags) = $db->next_record(); return $flags; } return 0; } function opensim_set_avatar_flags($uuid, $flags=0, &$db=null) { if (!isGUID($uuid)) return false; if (!isNumeric($flags)) return false; if (!is_object($db)) $db = opensim_new_db(); $query_str = "UPDATE UserAccounts SET UserFlags='$flags' WHERE PrincipalID='$uuid'"; $db->query($query_str); if ($db->Errno==0) return true; return false; } function opensim_set_avatar_offline($uuid, &$db=null) { if (!isGUID($uuid)) return; if (!is_object($db)) $db = opensim_new_db(); if ($db->exist_table('Presence')) { $db->query("DELETE FROM Presence WHERE UserID='".$uuid."'"); } $db->query("UPDATE GridUser SET Online='False' WHERE UserID LIKE '". $uuid."%'"); return; } function opensim_create_avatar($UUID, $firstname, $lastname, $passwd, $homeregion, $base_avatar=UUID_ZERO, &$db=null) { if (!isGUID($UUID)) return false; if (!isAlphabetNumericSpecial($firstname)) return false; if (!isAlphabetNumericSpecial($lastname)) return false; if (!isAlphabetNumericSpecial($passwd)) return false; if (!isAlphabetNumericSpecial($homeregion)) return false; if (!is_object($db)) $db = opensim_new_db(); $nulluuid = UUID_ZERO; $passwdsalt = make_random_hash(); $passwdhash = md5(md5($passwd).":".$passwdsalt); $db->query("SELECT uuid,regionHandle FROM regions WHERE regionName='$homeregion'"); $errno = $db->Errno; if ($errno==0) { list($regionID,$regionHandle) = $db->next_record(); $serviceURLs = 'HomeURI= GatekeeperURI= InventoryServerURI= AssetServerURI='; $db->query('INSERT INTO UserAccounts (PrincipalID,ScopeID,FirstName,LastName,Email,ServiceURLs,Created,UserLevel,UserFlags,UserTitle) '. "VALUES ('$UUID','$nulluuid','$firstname','$lastname','','$serviceURLs','".time()."','0','0','')"); $errno = $db->Errno; if ($errno==0) { $db->query('INSERT INTO GridUser (UserID,HomeRegionID,HomePosition,HomeLookAt,LastRegionID,LastPosition,LastLookAt,Online,Login,Logout) '. "VALUES ('$UUID','$regionID','<128,128,0>','<0,0,0>','$regionID','<128,128,0>','<0,0,0>','false','0','0')"); $errno = $db->Errno; } if ($errno==0) { $db->query('INSERT INTO auth (UUID,passwordHash,passwordSalt,webLoginKey,accountType) '. "VALUES ('$UUID','$passwdhash','$passwdsalt','$nulluuid','UserAccount')"); $errno = $db->Errno; } // if ($errno==0) { opensim_create_avatar_inventory($UUID, $base_avatar, $db); } else { $db->query("DELETE FROM UserAccounts WHERE PrincipalID='$UUID'"); $db->query("DELETE FROM auth WHERE UUID='$UUID'"); $db->query("DELETE FROM inventoryfolders WHERE agentID='$UUID'"); $db->query("DELETE FROM GridUser WHERE UserID='$UUID'"); } } if ($errno!=0) return false; return true; } // // データベースからアバタ情報を削除する. // function opensim_delete_avatar($uuid, &$db=null) { if (!isGUID($uuid)) return false; if (!is_object($db)) $db = opensim_new_db(); $db->query("DELETE FROM UserAccounts WHERE PrincipalID='$uuid'"); $db->query("DELETE FROM auth WHERE UUID='$uuid'"); $db->query("DELETE FROM Avatars WHERE PrincipalID='$uuid'"); $db->query("DELETE FROM Friends WHERE PrincipalID='$uuid'"); $db->query("DELETE FROM tokens WHERE UUID='$uuid'"); $db->query("DELETE FROM GridUser WHERE UserID='$uuid'"); if ($db->exist_table('Presence')) $db->query("DELETE FROM Presence WHERE UserID='$uuid'"); if ($db->exist_table('Avatars')) $db->query("DELETE FROM Avatars WHERE PrincipalID='$uuid'"); $db->query("DELETE FROM estate_managers WHERE uuid='$uuid'"); $db->query("DELETE FROM estate_users WHERE uuid='$uuid'"); $db->query("DELETE FROM estateban WHERE bannedUUID='$uuid'"); $db->query("DELETE FROM inventoryfolders WHERE agentID='$uuid'"); $db->query("DELETE FROM inventoryitems WHERE avatarID='$uuid'"); $db->query("DELETE FROM landaccesslist WHERE AccessUUID='$uuid'"); $db->query("DELETE FROM regionban WHERE bannedUUID='$uuid'"); // for DTL Money Server if ($db->exist_table('balances')) { $db->query("DELETE FROM balances WHERE user='$uuid'"); $db->query("DELETE FROM userinfo WHERE user='$uuid'"); } return true; } ///////////////////////////////////////////////////////////////////////////////////// // // for Region // function opensim_get_regions_num($hg=false, $condition='', &$db=null) { if (!is_object($db)) $db = opensim_new_db(); if ($condition!='') { $condition = 'WHERE '.$condition; if (!$hg) $condition .= " AND (regionName NOT LIKE 'http://%' and regionName NOT LIKE 'https://%') "; } else { if (!$hg) $condition = " WHERE (regionName NOT LIKE 'http://%' and regionName NOT LIKE 'https://%') "; } $num = 0; $db->query('SELECT COUNT(*) FROM regions '.$condition); list($num) = $db->next_record(); return $num; } function opensim_get_region_uuid($name, &$db=null) { // $name = addslashes($name); // if (!isAlphabetNumericSpecial($name)) return false; if (!is_object($db)) $db = opensim_new_db(); $uuid = ''; if ($name!='') { $query = "SELECT uuid FROM regions WHERE regionName='$name'"; $db->query($query); list($uuid) = $db->next_record(); } return $uuid; } function opensim_get_regions_uuid($hg=false, &$db=null) { if (!is_object($db)) $db = opensim_new_db(); $uuids = array(); $query = "SELECT uuid FROM regions"; if (!$hg) $query .= " WHERE (regionName NOT LIKE 'http://%' and regionName NOT LIKE 'https://%') "; // for Standalone $db->query($query); if ($db->Errno==0) { while (list($UUID) = $db->next_record()) $uuids[$UUID] = $UUID; } return $uuids; } function opensim_get_region_name($id, &$db=null) { if (!isGUID($id) and !isNumeric($id)) return null; if (!is_object($db)) $db = opensim_new_db(); if (isGUID($id)) { $db->query("SELECT regionName FROM regions WHERE uuid='$id'"); list($regionName) = $db->next_record(); } else { $db->query("SELECT regionName FROM regions WHERE regionHandle='$id'"); list($regionName) = $db->next_record(); } return $regionName; } // function opensim_get_regions_names($hg=false, $condition='', $order='', $limit='', &$db=null) { if (!is_object($db)) $db = opensim_new_db(); if ($condition!='') { $condition = 'WHERE '.$condition; if (!$hg) $condition .= " AND (regionName NOT LIKE 'http://%' and regionName NOT LIKE 'https://%') "; } else { if (!$hg) $condition = " WHERE (regionName NOT LIKE 'http://%' and regionName NOT LIKE 'https://%') "; } if ($order!='') $order = ' ORDER BY '.$order; if ($limit!='') $limit = ' LIMIT '. $limit; $regions = array(); $db->query('SELECT regionName FROM regions '.$condition.$order.$limit); while ($db->Errno==0 and list($region)=$db->next_record()) { $regions[] = $region; } return $regions; } /* return: $rginfo[firstname] $rginfo[lastname] $rginfo[fullname] $rginfo[owner_uuid] $rginfo[estate_id] $rginfo[estate_owner] $rginfo[estate_name] $rginfo[regionHandle] $rginfo[regionName] $rginfo[regionSecret] $rginfo[serverIP] $rginfo[serverHttpPort] $rginfo[serverPort] $rginfo[serverURI] $rginfo[locX] $rginfo[locY] $rginfo[sizeX] $rginfo[sizeY] $rginfo[serverName] */ function opensim_get_region_info($region, &$db=null) { if (!isGUID($region)) return null; if ($region==UUID_ZERO) return null; if (!is_object($db)) $db = opensim_new_db(); $sql = "SELECT regionHandle,regionName,regionSecret,serverIP,serverHttpPort,serverURI,owner_uuid,locX,locY,sizeX,sizeY FROM regions WHERE uuid='$region'"; $db->query($sql); list($regionHandle, $regionName, $regionSecret, $serverIP, $serverHttpPort, $serverURI, $owner_uuid, $locX, $locY, $sizeX, $sizeY) = $db->next_record(); $rginfo = opensim_get_estate_info($region, $db); $rginfo['regionHandle'] = $regionHandle; $rginfo['regionName'] = $regionName; $rginfo['regionSecret'] = $regionSecret; $rginfo['serverIP'] = $serverIP; $rginfo['serverHttpPort'] = $serverHttpPort; $rginfo['serverPort'] = $serverHttpPort; $rginfo['serverURI'] = $serverURI; $rginfo['locX'] = $locX; $rginfo['locY'] = $locY; $rginfo['sizeX'] = $sizeX; $rginfo['sizeY'] = $sizeY; // $uri = preg_split("/[:\/]/", $serverURI); if (array_key_exists(3, $uri)) { $rginfo['serverName'] = $uri[3]; //$rginfo['serverIP2'] = gethostbyname($uri[3]); } else { $rginfo['serverName'] = ''; //$rginfo['serverIP2'] = ''; } if ($rginfo['owner_uuid']=='') $rginfo['owner_uuid'] = $owner_uuid; return $rginfo; } /* return: $rginfos[$UUID]['UUID'] ... UUID $rginfos[$UUID]['regionName'] ... name of region $rginfos[$UUID]['locX'] ... location X $rginfos[$UUID]['locY'] ... location Y $rginfos[$UUID]['sizeX'] ... size X $rginfos[$UUID]['sizeY'] ... size Y $rginfos[$UUID]['serverIP'] ... IP address of server $rginfos[$UUID]['serverIP2'] ... IP address of server $rginfos[$UUID]['serveName'] ... Name of server $rginfos[$UUID]['serverPort'] ... port num of server $rginfos[$UUID]['serverURI'] ... URI of server $rginfos[$UUID]['owner_uuid'] ... UUID of region owner $rginfos[$UUID]['estate_id'] ... ID of estate $rginfos[$UUID]['estate_owner'] ... UUID of estate owner $rginfos[$UUID]['estate_name'] ... estate name $rginfos[$UUID]['est_firstname'] ... first name $rginfos[$UUID]['est_lastname'] ... last name $rginfos[$UUID]['est_fullname'] ... full name */ function opensim_get_regions_infos($hg=false, $condition='', $order='', $limit='', &$db=null) { if (!is_object($db)) $db = opensim_new_db(); if ($condition!='') { $condition = 'WHERE '.$condition; if (!$hg) $condition .= " AND (regionName NOT LIKE 'http://%' and regionName NOT LIKE 'https://%') "; } else { if (!$hg) $condition = " WHERE (regionName NOT LIKE 'http://%' and regionName NOT LIKE 'https://%') "; } if ($order!='') $order = ' ORDER BY '.$order; if ($limit!='') $limit = ' LIMIT '. $limit; $rginfos = array(); $items = ' regions.uuid,regionName,locX,locY,sizeX,sizeY,serverIP,serverURI,serverHttpPort,owner_uuid,estate_map.EstateID,EstateOwner,EstateName,'; $uname = ' FirstName,LastName '; $from = ' FROM regions'; $join1 = ' LEFT JOIN estate_map ON RegionID=regions.uuid '; $join2 = ' LEFT JOIN estate_settings ON estate_map.EstateID=estate_settings.EstateID '; $join3 = ' LEFT JOIN UserAccounts ON owner_uuid=UserAccounts.PrincipalID '; $frmwh = ' FROM UserAccounts WHERE UserAccounts.PrincipalID='; $query_str = 'SELECT '.$items.$uname.$from.$join1.$join2.$join3.$condition.$order.$limit; $db->query($query_str); if ($db->Errno==0) { while (list($UUID,$regionName,$locX,$locY,$sizeX,$sizeY,$serverIP,$serverURI,$serverPort, $owneruuid,$estateid,$estateowner,$estatename,$firstname,$lastname) = $db->next_record()) { $rginfos[$UUID]['UUID'] = $UUID; $rginfos[$UUID]['regionName'] = $regionName; $rginfos[$UUID]['locX'] = $locX; $rginfos[$UUID]['locY'] = $locY; $rginfos[$UUID]['sizeX'] = $sizeX; $rginfos[$UUID]['sizeY'] = $sizeY; $rginfos[$UUID]['serverIP'] = $serverIP; $rginfos[$UUID]['serverPort'] = $serverPort; $rginfos[$UUID]['serverURI'] = $serverURI; $rginfos[$UUID]['owner_uuid'] = $owneruuid; $rginfos[$UUID]['estate_id'] = $estateid; $rginfos[$UUID]['estate_owner'] = $estateowner; $rginfos[$UUID]['estate_name'] = $estatename; $rginfos[$UUID]['est_firstname']= $firstname; $rginfos[$UUID]['est_lastname'] = $lastname; $rginfos[$UUID]['est_fullname'] = null; // if ($rginfos[$UUID]['estate_owner']==null) $rginfos[$UUID]['estate_owner'] = $owneruuid; $uri = preg_split("/[:\/]/", $serverURI); if (array_key_exists(3, $uri)) { $rginfos[$UUID]['serverName'] = $uri[3]; //$rginfos[$UUID]['serverIP2'] = gethostbyname($uri[3]); } else { $rginfo['serverName'] = ''; //$rginfo['serverIP2'] = ''; } // $fullname = $firstname.' '.$lastname; if ($fullname!=' ') $rginfos[$UUID]['est_fullname'] = $fullname; } } // Region Owner foreach($rginfos as $region) { $rginfos[$region['UUID']]['rgn_firstname'] = null; $rginfos[$region['UUID']]['rgn_lastname'] = null; $rginfos[$region['UUID']]['rgn_fullname'] = null; if ($region['owner_uuid']!=null) { $db->query('SELECT '.$uname.$frmwh."'".$region['owner_uuid']."'"); list($firstname,$lastname) = $db->next_record(); $rginfos[$region['UUID']]['rgn_firstname'] = $firstname; $rginfos[$region['UUID']]['rgn_lastname'] = $lastname; $fullname = $firstname.' '.$lastname; if ($fullname!=' ') $rginfos[$region['UUID']]['rgn_fullname'] = $fullname; } } return $rginfos; } function opensim_set_current_region($uuid, $regionid, &$db=null) { if (!isGUID($uuid) or !isGUID($regionid)) return false; if (!is_object($db)) $db = opensim_new_db(); if ($db->exist_table('Presence')) { $sql = "UPDATE Presence SET RegionID='".$regionid."' WHERE UserID='". $uuid."'"; } // Standalone else { $sql = "UPDATE GridUser SET LastRegionID='".$regionid."' WHERE UserID='". $uuid."'"; } $db->query($sql); if ($db->Errno!=0) return false; $db->next_record(); return true; } function opensim_delete_region($uuid, &$db=null) { if (!isGUID($uuid)) return false; if (!is_object($db)) $db = opensim_new_db(); $db->query("DELETE FROM regions WHERE uuid='$uuid'"); if ($db->Errno!=0) return false; return true; } ///////////////////////////////////////////////////////////////////////////////////// // // for Home Region // function opensim_get_home_region($uuid, &$db=null) { if (!isGUID($uuid)) return null; if (!is_object($db)) $db = opensim_new_db(); $region_name = ''; $db->query("SELECT regionName FROM GridUser,regions WHERE HomeRegionID=uuid AND UserID='$uuid'"); list($region_name) = $db->next_record(); return $region_name; } function opensim_set_home_region($uuid, $hmregion, $pos_x='128', $pos_y='128', $pos_z='0', &$db=null) { if (!isGUID($uuid)) return false; if (!isNumeric($pos_x) or !isNumeric($pos_y) or !isNumeric($pos_z)) return false; if (!is_object($db)) $db = opensim_new_db(); $db->query("SELECT uuid,regionHandle FROM regions WHERE regionName='$hmregion'"); $errno = $db->Errno; if ($errno==0) { list($regionID, $regionHandle) = $db->next_record(); $homePosition = "<$pos_x,$pos_y,$pos_z>"; $db->query("UPDATE GridUser SET HomeRegionID='$regionID',HomePosition='$homePosition' WHERE UserID='$uuid'"); $errno = $db->Errno; } if ($errno!=0) return false; return true; } ///////////////////////////////////////////////////////////////////////////////////// // // for Estate // // // リージョンID $region のエステート名を $estate にし,オーナーを $owner(UUID) にする. // エステート名と オーナー(UUID) の組み合わせが存在しない場合は,新しくエステートを作成する. // function opensim_set_region_estate($region, $estate, $owner, &$db=null) { if (!isGUID($region) or $estate=='' or !isGUID($owner)) return false; if (!is_object($db)) $db = opensim_new_db(); $estate_id = opensim_create_estate($estate, $owner, $db); if ($estate_id==0) return false; $db->query("UPDATE estate_map SET EstateID='$estate_id' WHERE RegionID='$region'"); if ($db->Errno!=0) return false; return true; } // // Estate名 $estate, オーナーUUID $owner のエステートを作成して ID を返す. // 既に有る場合も,そのエステートのIDを返す. // エラーの場合は 0を返す. // function opensim_create_estate($estate, $owner, &$db=null) { if ($estate=='' or !isGUID($owner)) return 0; if (!is_object($db)) $db = opensim_new_db(); $db->query("SELECT EstateID FROM estate_settings WHERE EstateName='$estate' AND EstateOwner='$owner'"); if ($db->Errno==0) { list($eid) = $db->next_record(); if (intval($eid)>0) return $eid; } $insert_columns = 'EstateName,AbuseEmailToEstateOwner,DenyAnonymous,ResetHomeOnTeleport,FixedSun,DenyTransacted,BlockDwell,'. 'DenyIdentified,AllowVoice,UseGlobalTime,PricePerMeter,TaxFree,AllowDirectTeleport,RedirectGridX,RedirectGridY,'. 'ParentEstateID,SunPosition,EstateSkipScripts,BillableFactor,PublicAccess,AbuseEmail,EstateOwner,DenyMinors,'. 'AllowLandmark,AllowParcelChanges,AllowSetHome'; $insert_values = "'$estate','0','0','0','0','0','0','0','1','1','1','0','1','0','0','1','0','0','0','1','','$owner','0','1','1','1'"; $db->query("INSERT INTO estate_settings ($insert_columns) VALUES ($insert_values)"); $db->query("SELECT EstateID FROM estate_settings WHERE EstateName='$estate' AND EstateOwner='$owner'"); if ($db->Errno==0) { list($eid) = $db->next_record(); return $eid; } return 0; } function opensim_get_estates_infos(&$db=null) { if (!is_object($db)) $db = opensim_new_db(); $estates = array(); $db->query('SELECT EstateID,EstateOwner,EstateName FROM estate_settings ORDER BY EstateID'); if ($db->Errno==0) { while (list($estateid, $estateown, $estatename) = $db->next_record()) { $estates[$estateid]['estate_id'] = $estateid; $estates[$estateid]['estate_owner'] = $estateown; $estates[$estateid]['estate_name'] = $estatename; $estates[$estateid]['firstname'] = ''; $estates[$estateid]['lastname'] = ''; $estates[$estateid]['fullname'] = ''; } } foreach($estates as $estate) { $avatar = opensim_get_avatar_name($estate['estate_owner'], false); if ($avatar!=null) { $estateid = $estate['estate_id']; $estates[$estateid]['firstname'] = $avatar['firstname']; $estates[$estateid]['lastname'] = $avatar['lastname']; $estates[$estateid]['fullname'] = $avatar['fullname']; } } return $estates; } // // SIMのリージョンIDからエステートの情報を返す. // function opensim_get_estate_info($region, &$db=null) { if (!isGUID($region)) return null; if (!is_object($db)) $db = opensim_new_db(); $firstname = null; $lastname = null; $fullname = null; $owneruuid = null; $rqdt = 'PrincipalID,FirstName,LastName,estate_settings.EstateID,EstateOwner,EstateName'; $tbls = 'UserAccounts,estate_map,estate_settings'; $cndn = "RegionID='$region' AND estate_map.EstateID=estate_settings.EstateID AND EstateOwner=PrincipalID"; $db->query('SELECT '.$rqdt.' FROM '.$tbls.' WHERE '.$cndn); list($owneruuid, $firstname, $lastname, $estateid, $estateowner, $estatename) = $db->next_record(); $fullname = $firstname.' '.$lastname; if ($fullname==' ') $fullname = null; // owner name $name['firstname'] = $firstname; $name['lastname'] = $lastname; $name['fullname'] = $fullname; // $name['owner_uuid'] = $owneruuid; $name['estate_id'] = $estateid; $name['estate_owner']= $estateowner; $name['estate_name'] = $estatename; return $name; } // // リージョンのエステートを変更する. // function opensim_set_region_estateid($region, $estateid, &$db=null) { if (!isGUID($region) or !isNumeric($estateid)) return false; if (!is_object($db)) $db = opensim_new_db(); $db->query("SELECT EstateID FROM estate_settings WHERE EstateID='$estateid'"); list($esid) = $db->next_record(); if (intval($esid)==0) return false; $db->query("SELECT EstateID FROM estate_map WHERE RegionID='$region'"); list($esid) = $db->next_record(); if (intval($esid)!=$estateid) { $db->query("UPDATE estate_map SET EstateID='$estateid' WHERE RegionID='$region'"); } else if (intval($esid)==0) { $db->query("INSERT INTO estate_map (RegionID,EstateID) VALUES ('$region','$estateid')"); } return true; } // // リージョンのエステートを変更せずに,オーナーのみ変更する. // 従って,同じエステートを持つ他のリージョンのオーナーも変更される. // function opensim_set_estate_owner($region, $owner, &$db=null) { if (!isGUID($region) or !isGUID($owner)) return false; if (!is_object($db)) $db = opensim_new_db(); $db->query("UPDATE estate_settings,estate_map SET EstateOwner='$owner' WHERE estate_settings.EstateID=estate_map.EstateID AND RegionID='$region'"); $errno = $db->Errno; if ($errno==0) $db->query("UPDATE regions SET owner_uuid='$owner' WHERE uuid='$region'"); if ($errno!=0) return false; return true; } function opensim_del_estate($id, &$db=null) { if (!isNumeric($id)) return; if (!is_object($db)) $db = opensim_new_db(); $db->query("DELETE from estate_settings WHERE EstateID=$id"); return; } function opensim_update_estate($id, $name, $owner, &$db=null) { if (!isNumeric($id)) return false; if (!$name and !$owner) return false; if (!is_object($db)) $db = opensim_new_db(); if ($name) { $db->query("UPDATE estate_settings SET EstateName='$name' WHERE EstateID=$id"); } $uuid = opensim_get_avatar_uuid($owner, false); if ($uuid) { $db->query("UPDATE estate_settings SET EstateOwner='$uuid' WHERE EstateID=$id"); } return true; } ///////////////////////////////////////////////////////////////////////////////////// // // for Parcel // function opensim_get_parcel_name($parcel, &$db=null) { if (!isGUID($parcel)) return null; if (!is_object($db)) $db = opensim_new_db(); $name = null; $db->query("SELECT name FROM land WHERE UUID='$parcel'"); if ($db->Errno==0) list($name) = $db->next_record(); return $name; } function opensim_get_parcel_info($parcel, &$db=null) { if (!isGUID($parcel)) return null; if (!is_object($db)) $db = opensim_new_db(); $info = array(); $items = "RegionUUID,Name,Description,OwnerUUID,Category,SalePrice,LandStatus,LandFlags,LandingType,Dwell"; $query_str = "SELECT ".$items." FROM land WHERE UUID='".$parcel."'"; $db->query($query_str); if ($db->Errno==0) $info = $db->next_record(); return $info; } ///////////////////////////////////////////////////////////////////////////////////// // // for Assets // function opensim_get_asset_data($uuid, &$db=null) { if (!isGUID($uuid)) return null; if (!is_object($db)) $db = opensim_new_db(); $asset = array(); $db->query("SELECT name,description,assetType,data,asset_flags,CreatorID FROM assets WHERE id='$uuid'"); list($name, $desc, $type, $data, $flag, $creator) = $db->next_record(); $asset['UUID'] = $uuid; $asset['name'] = $name; $asset['desc'] = $desc; $asset['type'] = $type; $asset['data'] = $data; $asset['flag'] = $flag; $asset['creator'] = $creator; return $asset; } function opensim_display_texture_data($uuid, $prog, $xsize='0', $ysize='0', $cachedir='', $use_tga=false) { if (!isGuid($uuid)) return false; if ($prog==null or $prog=='') return false; if ($cachedir=='') $cachedir = '/tmp'; $cachefile = $cachedir.'/'.$uuid; $win_com = ''; // PHP module $imagick = null; if ($prog=='imagick') { if (class_exists('Imagick')) { $imagick = new Imagick(); } else { echo '