Profile
From OpenSimulator
m (Updated the name of the external addon profile module)  | 
			|||
| (22 intermediate revisions by 8 users not shown) | |||
| Line 1: | Line 1: | ||
__NOTOC__  | __NOTOC__  | ||
{{Quicklinks}}  | {{Quicklinks}}  | ||
| − | |||
| − | + | OpenSimulator 0.7.6 and onwards ships with built-in user profiles support. See [[UserProfiles]].  | |
| − | + | Earlier, an add-on module called "OpenSimProfile" made it possible to create an avatar profile and see other avatar's profiles as well.  | |
| − | + | You can find a newer script that uses mysqli and that replaces the deprecated mysql commands with PHP 5.5.0   | |
| − | + | [http://opensimulator.org/wiki/Profile_based_on_mysqli here]  | |
| − | + | ||
| − | + | ||
| − | ===   | + | === Disclaimer ===  | 
| + | <b>Please note that these are third party modules which you use at your own risk!<br />  | ||
| + | OpenSimulator takes no responsibility for these modules.</b>  | ||
| − | + | === OpenSimProfile Configuration Steps ===  | |
| + | The OpenSimProfile is already compiled and ready for use in current versions of OpenSimulator.  | ||
| − | + | However, you will need to setup the "back-end" database and PHP connector scripts to support the OpenSimProfile.   | |
| − | + | # Upload the profile.sql (below) to your database server  | |
| + | # Upload the profile.php (below) to your web server  | ||
| + | # Enable the OpenSimProfile in your OpenSim.ini file  | ||
| − | + | === STEP 1: profile.sql ===  | |
| + | Save these SQL commands to a profile.sql file on your MySQL database server.  | ||
| − | + | <source lang="sql">  | |
| − | <source lang=  | + | CREATE TABLE IF NOT EXISTS `profile_classifieds`   | 
| + | (  | ||
| + |     `classifieduuid` char(36) NOT NULL,  | ||
| + |     `creatoruuid` char(36) NOT NULL,  | ||
| + |     `creationdate` int(20) NOT NULL,  | ||
| + |     `expirationdate` int(20) NOT NULL,  | ||
| + |     `category` varchar(20) NOT NULL,  | ||
| + |     `name` varchar(255) NOT NULL,  | ||
| + |     `description` text NOT NULL,  | ||
| + |     `parceluuid` char(36) NOT NULL,  | ||
| + |     `parentestate` int(11) NOT NULL,  | ||
| + |     `snapshotuuid` char(36) NOT NULL,  | ||
| + |     `simname` varchar(255) NOT NULL,  | ||
| + |     `posglobal` varchar(255) NOT NULL,  | ||
| + |     `parcelname` varchar(255) NOT NULL,  | ||
| + |     `classifiedflags` int(8) NOT NULL,  | ||
| + |     `priceforlisting` int(5) NOT NULL,  | ||
| + |     PRIMARY KEY (`classifieduuid`)  | ||
| + | ) ENGINE=MyISAM DEFAULT CHARSET=latin1;  | ||
| + | CREATE TABLE IF NOT EXISTS `profile_notes` (  | ||
| + |     `useruuid` varchar(36) NOT NULL,  | ||
| + |     `targetuuid` varchar(36) NOT NULL,  | ||
| + |     `notes` text NOT NULL,  | ||
| + |     UNIQUE KEY `useruuid` (`useruuid`,`targetuuid`)  | ||
| + | ) ENGINE=MyISAM DEFAULT CHARSET=latin1;  | ||
| + | CREATE TABLE IF NOT EXISTS `profile_picks` (  | ||
| + |     `pickuuid` varchar(36) NOT NULL,  | ||
| + |     `creatoruuid` varchar(36) NOT NULL,  | ||
| + |     `toppick` enum('true','false') NOT NULL,  | ||
| + |     `parceluuid` varchar(36) NOT NULL,  | ||
| + |     `name` varchar(255) NOT NULL,  | ||
| + |     `description` text NOT NULL,  | ||
| + |     `snapshotuuid` varchar(36) NOT NULL,  | ||
| + |     `user` varchar(255) NOT NULL,  | ||
| + |     `originalname` varchar(255) NOT NULL,  | ||
| + |     `simname` varchar(255) NOT NULL,  | ||
| + |     `posglobal` varchar(255) NOT NULL,  | ||
| + |     `sortorder` int(2) NOT NULL,  | ||
| + |     `enabled` enum('true','false') NOT NULL,  | ||
| + |     PRIMARY KEY (`pickuuid`)  | ||
| + | ) ENGINE=MyISAM DEFAULT CHARSET=latin1;  | ||
| + | |||
| + | CREATE TABLE IF NOT EXISTS `profile` (  | ||
| + |     `useruuid` varchar(36) NOT NULL,  | ||
| + |     `profilePartner` varchar(36) NOT NULL,  | ||
| + |     `profileAllowPublish` binary(1) NOT NULL,  | ||
| + |     `profileMaturePublish` binary(1) NOT NULL,  | ||
| + |     `profileURL` varchar(255) NOT NULL,  | ||
| + |     `profileWantToMask` int(3) NOT NULL,  | ||
| + |     `profileWantToText` text NOT NULL,  | ||
| + |     `profileSkillsMask` int(3) NOT NULL,  | ||
| + |     `profileSkillsText` text NOT NULL,  | ||
| + |     `profileLanguages` text NOT NULL,  | ||
| + |     `profileImage` varchar(36) NOT NULL,  | ||
| + |     `profileAboutText` text NOT NULL,  | ||
| + |     `profileFirstImage` varchar(36) NOT NULL,  | ||
| + |     `profileFirstText` text NOT NULL,  | ||
| + |     PRIMARY KEY (`useruuid`)  | ||
| + | ) ENGINE=MyISAM DEFAULT CHARSET=latin1;  | ||
| + | |||
| + | CREATE TABLE IF NOT EXISTS `profile_settings` (  | ||
| + |     `useruuid` varchar(36) NOT NULL,  | ||
| + |     `imviaemail` enum('true','false') NOT NULL,  | ||
| + |     `visible` enum('true','false') NOT NULL,  | ||
| + |     `email` varchar(254) NOT NULL,  | ||
| + |     PRIMARY KEY (`useruuid`)  | ||
| + | ) ENGINE=MyISAM DEFAULT CHARSET=latin1;  | ||
</source >  | </source >  | ||
| − | === PHP   | + | Connect to your MySQL (Linux commands shown):  | 
| − | + | <pre>  | |
| + | $ mysql --user=$mysqluser --password=$mysqlpassword $databasename  | ||
| + | </pre>  | ||
| + | Replace $mysqluser, $mysqlpassword, and $databasename with your specific configuration.  | ||
| + | |||
| + | At the mysql prompt, source the profile.sql file to configure your database to hold additional profile information:  | ||
| + | <pre>  | ||
| + | mysql> source profile.sql  | ||
| + | ... ensure no error messages appear here ...  | ||
| + | mysql> quit  | ||
| + | </pre>  | ||
| + | |||
| + | === STEP 2: profile.php ===  | ||
| + | Copy this PHP script to a file called profile.php and upload the script file to your web server.  | ||
| + | |||
| + | Edit the $dbName, $dbHost, $dbUser, and $dbPassword lines at the top of the script to match your database and server information.   | ||
| + | |||
| + |  <source lang="php">  | ||
| + | <?PHP  | ||
| + | $dbName = "comunity";  | ||
| + | $dbHost = "localhost";  | ||
| + | $dbUser = "root";  | ||
| + | $dbPassword ="";  | ||
| + | |||
| + | mysql_connect ($dbHost,$dbUser,$dbPassword);  | ||
| + | mysql_select_db ($dbName);  | ||
| + | |||
| + | $zeroUUID = "00000000-0000-0000-0000-000000000000";  | ||
| + | $xmlrpc_server = xmlrpc_server_create();  | ||
| + | |||
| + | xmlrpc_server_register_method($xmlrpc_server, "avatarclassifiedsrequest",  | ||
| + |         "avatarclassifiedsrequest");  | ||
| + | |||
| + | function avatarclassifiedsrequest($method_name, $params, $app_data)  | ||
| + | {  | ||
| + |     $req            = $params[0];  | ||
| + | |||
| + |     $uuid           = $req['uuid'];  | ||
| + | |||
| + | |||
| + |     $result = mysql_query("SELECT * FROM profile_classifieds WHERE ".  | ||
| + |             "creatoruuid = '". mysql_escape_string($uuid) ."'");  | ||
| + | |||
| + |     $data = array();  | ||
| + | |||
| + |     while (($row = mysql_fetch_assoc($result)))  | ||
| + |     {  | ||
| + |         $data[] = array(  | ||
| + |                 "classifiedid" => $row["classifieduuid"],  | ||
| + |                 "name" => $row["name"]);  | ||
| + |     }  | ||
| + | |||
| + |     $response_xml = xmlrpc_encode(array(  | ||
| + |         'success' => True,  | ||
| + |         'data' => $data  | ||
| + |     ));  | ||
| + | |||
| + |     print $response_xml;  | ||
| + | }  | ||
| + | |||
| + | |||
| + | |||
| + | |||
| + | # Classifieds Update  | ||
| + | |||
| + | xmlrpc_server_register_method($xmlrpc_server, "classified_update",  | ||
| + |         "classified_update");  | ||
| + | |||
| + | function classified_update($method_name, $params, $app_data)  | ||
| + | {  | ||
| + |     global $zeroUUID;  | ||
| + | |||
| + |     $req            = $params[0];  | ||
| + | |||
| + |     $classifieduuid = $req['classifiedUUID'];  | ||
| + |     $creator        = $req['creatorUUID'];  | ||
| + |     $category       = $req['category'];  | ||
| + |     $name           = $req['name'];  | ||
| + |     $description    = $req['description'];  | ||
| + |     $parceluuid     = $req['parcelUUID'];  | ||
| + |     $parentestate   = $req['parentestate'];  | ||
| + |     $snapshotuuid   = $req['snapshotUUID'];  | ||
| + |     $simname        = $req['sim_name'];  | ||
| + |     $globalpos      = $req['globalpos'];  | ||
| + |     $parcelname     = $req['parcelname'];  | ||
| + |     $classifiedflag = $req['classifiedFlags'];  | ||
| + |     $priceforlist   = $req['classifiedPrice'];  | ||
| + | |||
| + |     // Check if we already have this one in the database  | ||
| + |     $check = mysql_query("SELECT COUNT(*) FROM profile_classifieds WHERE ".  | ||
| + |             "classifieduuid = '". mysql_escape_string($classifieduuid) ."'");  | ||
| + | |||
| + |     while ($row = mysql_fetch_row($check))  | ||
| + |     {  | ||
| + |         $ready = $row[0];  | ||
| + |     }  | ||
| + | |||
| + |     if ($ready == 0)  | ||
| + |     {  | ||
| + |         // Doing some late checking  | ||
| + |         // Should be done by the module but let's see what happens when  | ||
| + |         // I do it here  | ||
| + | |||
| + |         if($parcelname == "")  | ||
| + |             $parcelname = "Unknown";  | ||
| + | |||
| + |         if($parceluuid == "")  | ||
| + |             $parceluuid = $zeroUUID;  | ||
| + | |||
| + |         if($description == "")  | ||
| + |             $description = "No Description";  | ||
| + | |||
| + |         if($classifiedflag == 2)  | ||
| + |         {  | ||
| + |             $creationdate = time();  | ||
| + |             $expirationdate = time() + (7 * 24 * 60 * 60);  | ||
| + |         }  | ||
| + |         else  | ||
| + |         {  | ||
| + |             $creationdate = time();  | ||
| + |             $expirationdate = time() + (365 * 24 * 60 * 60);  | ||
| + |         }  | ||
| + | |||
| + |         $insertquery = "INSERT INTO profile_classifieds VALUES ".  | ||
| + |             "('". mysql_escape_string($classifieduuid) ."',".  | ||
| + |             "'". mysql_escape_string($creator) ."',".  | ||
| + |             "". mysql_escape_string($creationdate) .",".  | ||
| + |             "". mysql_escape_string($expirationdate) .",".  | ||
| + |             "'". mysql_escape_string($category) ."',".  | ||
| + |             "'". mysql_escape_string($name) ."',".  | ||
| + |             "'". mysql_escape_string($description) ."',".  | ||
| + |             "'". mysql_escape_string($parceluuid) ."',".  | ||
| + |             "". mysql_escape_string($parentestate) .",".  | ||
| + |             "'". mysql_escape_string($snapshotuuid) ."',".  | ||
| + |             "'". mysql_escape_string($simname) ."',".  | ||
| + |             "'". mysql_escape_string($globalpos) ."',".  | ||
| + |             "'". mysql_escape_string($parcelname) ."',".  | ||
| + |             "". mysql_escape_string($classifiedflag) .",".  | ||
| + |             "". mysql_escape_string($priceforlist) .")";  | ||
| + | |||
| + |         // Create a new record for this classified  | ||
| + |         $result = mysql_query($insertquery);  | ||
| + |     }  | ||
| + |     else  | ||
| + |     {  | ||
| + | |||
| + |     }  | ||
| + | |||
| + |     $response_xml = xmlrpc_encode(array(  | ||
| + |         'success' => True,  | ||
| + |         'data' => $data  | ||
| + |     ));  | ||
| + | |||
| + |     print $response_xml;  | ||
| + | }  | ||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | # Classifieds Delete  | ||
| + | |||
| + | xmlrpc_server_register_method($xmlrpc_server, "classified_delete",  | ||
| + |         "classified_delete");  | ||
| + | |||
| + | function classified_delete($method_name, $params, $app_data)  | ||
| + | {  | ||
| + |     $req            = $params[0];  | ||
| + | |||
| + |     $classifieduuid = $req['classifiedID'];  | ||
| + | |||
| + |     $result = mysql_query("DELETE FROM profile_classifieds WHERE ".  | ||
| + |             "classifieduuid = '".mysql_escape_string($classifieduuid) ."'");  | ||
| + | |||
| + |     $response_xml = xmlrpc_encode(array(  | ||
| + |         'success' => True,  | ||
| + |         'data' => $data  | ||
| + |     ));  | ||
| + | |||
| + |     print $response_xml;  | ||
| + | }  | ||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | #  | ||
| + | # Picks  | ||
| + | #  | ||
| + | |||
| + | # Avatar Picks Request  | ||
| + | |||
| + | xmlrpc_server_register_method($xmlrpc_server, "avatarpicksrequest", "avatarpicksrequest");  | ||
| + | |||
| + | function avatarpicksrequest($method_name, $params, $app_data)  | ||
| + | {  | ||
| + |     $req            = $params[0];  | ||
| + |     $uuid           = $req['uuid'];  | ||
| + |     $data = array();  | ||
| + |     $result = mysql_query("SELECT `pickuuid`,`name` FROM profile_picks WHERE ". "creatoruuid = '". mysql_escape_string($uuid) ."'");  | ||
| + | |||
| + |     while (($row = mysql_fetch_assoc($result)))  | ||
| + |     {  | ||
| + |         $data[] = array(  | ||
| + |                 "pickid" => $row["pickuuid"],  | ||
| + |                 "name" => $row["name"]);  | ||
| + |     }  | ||
| + | |||
| + |     $response_xml = xmlrpc_encode(array(  | ||
| + |         'success' => True,  | ||
| + |         'data' => $data  | ||
| + |     ));  | ||
| + | |||
| + |     print $response_xml;  | ||
| + | }  | ||
| + | |||
| + | # Request Picks for User  | ||
| + | |||
| + | xmlrpc_server_register_method($xmlrpc_server, "pickinforequest",  | ||
| + |         "pickinforequest");  | ||
| + | |||
| + | function pickinforequest($method_name, $params, $app_data)  | ||
| + | {  | ||
| + |     $req            = $params[0];  | ||
| + | |||
| + |     $uuid           = $req['avatar_id'];  | ||
| + |     $pick           = $req['pick_id'];  | ||
| + | |||
| + |     $data = array();  | ||
| + | |||
| + | |||
| + | |||
| + | |||
| + |     $result = mysql_query("SELECT * FROM profile_picks WHERE ".  | ||
| + |             "creatoruuid = '". mysql_escape_string($uuid) ."' AND ".  | ||
| + |             "pickuuid = '". mysql_escape_string($pick) ."'");  | ||
| + | |||
| + |     $row = mysql_fetch_assoc($result);  | ||
| + |     if ($row != False)  | ||
| + |     {  | ||
| + |         if ($row["description"] == null || $row["description"] == "")  | ||
| + |             $row["description"] = "No description given";  | ||
| + | |||
| + |         $data[] = array(  | ||
| + |                 "pickuuid" => $row["pickuuid"],  | ||
| + |                 "creatoruuid" => $row["creatoruuid"],  | ||
| + |                 "toppick" => $row["toppick"],  | ||
| + |                 "parceluuid" => $row["parceluuid"],  | ||
| + |                 "name" => $row["name"],  | ||
| + |                 "description" => $row["description"],  | ||
| + |                 "snapshotuuid" => $row["snapshotuuid"],  | ||
| + |                 "user" => $row["user"],  | ||
| + |                 "originalname" => $row["originalname"],  | ||
| + |                 "simname" => $row["simname"],  | ||
| + |                 "posglobal" => $row["posglobal"],  | ||
| + |                 "sortorder"=> $row["sortorder"],  | ||
| + |                 "enabled" => $row["enabled"]);  | ||
| + |     }  | ||
| + | |||
| + |     $response_xml = xmlrpc_encode(array(  | ||
| + |         'success' => True,  | ||
| + |         'data' => $data  | ||
| + |     ));  | ||
| + | |||
| + |     print $response_xml;  | ||
| + | }  | ||
| + | |||
| + | # Picks Update  | ||
| + | |||
| + | xmlrpc_server_register_method($xmlrpc_server, "picks_update",  | ||
| + |         "picks_update");  | ||
| + | |||
| + | function picks_update($method_name, $params, $app_data)  | ||
| + | {  | ||
| + |     global $zeroUUID;  | ||
| + | |||
| + |     $req            = $params[0];  | ||
| + | |||
| + |     $pickuuid       = $req['pick_id'];  | ||
| + |     $creator        = $req['creator_id'];  | ||
| + |     $toppick        = $req['top_pick'];  | ||
| + |     $name           = $req['name'];  | ||
| + |     $description    = $req['desc'];  | ||
| + |     $parceluuid     = $req['parcel_uuid'];  | ||
| + |     $snapshotuuid   = $req['snapshot_id'];  | ||
| + |     $user           = $req['user'];  | ||
| + |     $simname        = $req['sim_name'];  | ||
| + |     $posglobal      = $req['pos_global'];  | ||
| + |     $sortorder      = $req['sort_order'];  | ||
| + |     $enabled        = $req['enabled'];  | ||
| + | |||
| + |     if($parceluuid == "")  | ||
| + |         $parceluuid = $zeroUUID;  | ||
| + | |||
| + |     if($description == "")  | ||
| + |         $description = "No Description";  | ||
| + | |||
| + |     // Check if we already have this one in the database  | ||
| + |     $check = mysql_query("SELECT COUNT(*) FROM profile_picks WHERE ".  | ||
| + |             "pickuuid = '". mysql_escape_string($pickuuid) ."'");  | ||
| + | |||
| + |     $row = mysql_fetch_row($check);  | ||
| + | |||
| + |     if ($row[0] == 0)  | ||
| + |     {  | ||
| + |         if($user == null || $user == "")  | ||
| + |             $user = "Unknown";  | ||
| + | |||
| + |         //The original parcel name is the same as the name of the  | ||
| + |         //profile pick when a new profile pick is being created.  | ||
| + |         $original = $name;  | ||
| + | |||
| + |         $query = "INSERT INTO profile_picks VALUES ".  | ||
| + |             "('". mysql_escape_string($pickuuid) ."',".  | ||
| + |             "'". mysql_escape_string($creator) ."',".  | ||
| + |             "'". mysql_escape_string($toppick) ."',".  | ||
| + |             "'". mysql_escape_string($parceluuid) ."',".  | ||
| + |             "'". mysql_escape_string($name) ."',".  | ||
| + |             "'". mysql_escape_string($description) ."',".  | ||
| + |             "'". mysql_escape_string($snapshotuuid) ."',".  | ||
| + |             "'". mysql_escape_string($user) ."',".  | ||
| + |             "'". mysql_escape_string($original) ."',".  | ||
| + |             "'". mysql_escape_string($simname) ."',".  | ||
| + |             "'". mysql_escape_string($posglobal) ."',".  | ||
| + |             "'". mysql_escape_string($sortorder) ."',".  | ||
| + |             "'". mysql_escape_string($enabled) ."')";  | ||
| + |     }  | ||
| + |     else  | ||
| + |     {  | ||
| + |         $query = "UPDATE profile_picks SET " .  | ||
| + |             "parceluuid = '". mysql_escape_string($parceluuid) . "', " .  | ||
| + |             "name = '". mysql_escape_string($name) . "', " .  | ||
| + |             "description = '". mysql_escape_string($description) . "', " .  | ||
| + |             "snapshotuuid = '". mysql_escape_string($snapshotuuid) . "' WHERE ".  | ||
| + |             "pickuuid = '". mysql_escape_string($pickuuid) ."'";  | ||
| + |     }  | ||
| + | |||
| + |     $result = mysql_query($query);  | ||
| + |     if ($result != False)  | ||
| + |         $result = True;  | ||
| + | |||
| + |     $response_xml = xmlrpc_encode(array(  | ||
| + |         'success' => $result,  | ||
| + |         'errorMessage' => mysql_error()  | ||
| + |     ));  | ||
| + | |||
| + |     print $response_xml;  | ||
| + | }  | ||
| + | |||
| + | # Picks Delete  | ||
| + | |||
| + | xmlrpc_server_register_method($xmlrpc_server, "picks_delete",  | ||
| + |         "picks_delete");  | ||
| + | |||
| + | function picks_delete($method_name, $params, $app_data)  | ||
| + | {  | ||
| + |     $req            = $params[0];  | ||
| + | |||
| + |     $pickuuid       = $req['pick_id'];  | ||
| + | |||
| + |     $result = mysql_query("DELETE FROM profile_picks WHERE ".  | ||
| + |             "pickuuid = '".mysql_escape_string($pickuuid) ."'");  | ||
| + | |||
| + |     if ($result != False)  | ||
| + |         $result = True;  | ||
| + | |||
| + |     $response_xml = xmlrpc_encode(array(  | ||
| + |         'success' => $result,  | ||
| + |         'errorMessage' => mysql_error()  | ||
| + |     ));  | ||
| + | |||
| + |     print $response_xml;  | ||
| + | }  | ||
| + | |||
| + | #  | ||
| + | # Notes  | ||
| + | #  | ||
| + | |||
| + | # Avatar Notes Request  | ||
| + | |||
| + | |||
| + | xmlrpc_server_register_method($xmlrpc_server, "avatarnotesrequest",  | ||
| + |         "avatarnotesrequest");  | ||
| + | |||
| + | function avatarnotesrequest($method_name, $params, $app_data)  | ||
| + | {  | ||
| + |     $req            = $params[0];  | ||
| + | |||
| + |     $uuid           = $req['avatar_id'];  | ||
| + |     $targetuuid     = $req['uuid'];  | ||
| + | |||
| + |     $result = mysql_query("SELECT notes FROM profile_notes WHERE ".  | ||
| + |             "useruuid = '". mysql_escape_string($uuid) ."' AND ".  | ||
| + |             "targetuuid = '". mysql_escape_string($targetuuid) ."'");  | ||
| + | |||
| + |     $row = mysql_fetch_row($result);  | ||
| + |     if ($row == False)  | ||
| + |         $notes = "";  | ||
| + |     else  | ||
| + |         $notes = $row[0];  | ||
| + | |||
| + |     $data[] = array(  | ||
| + |             "targetid" => $targetuuid,  | ||
| + |             "notes" => $notes);  | ||
| + | |||
| + |     $response_xml = xmlrpc_encode(array(  | ||
| + |         'success' => True,  | ||
| + |         'data' => $data  | ||
| + |     ));  | ||
| + | |||
| + |     print $response_xml;  | ||
| + | }  | ||
| + | |||
| + | # Avatar Notes Update  | ||
| + | |||
| + | xmlrpc_server_register_method($xmlrpc_server, "avatar_notes_update",  | ||
| + |         "avatar_notes_update");  | ||
| + | |||
| + | function avatar_notes_update($method_name, $params, $app_data)  | ||
| + | {  | ||
| + |     $req            = $params[0];  | ||
| + | |||
| + |     $uuid           = $req['avatar_id'];  | ||
| + |     $targetuuid     = $req['target_id'];  | ||
| + |     $notes          = $req['notes'];  | ||
| + | |||
| + |     // Check if we already have this one in the database  | ||
| + | |||
| + |     $check = mysql_query("SELECT COUNT(*) FROM profile_notes WHERE ".  | ||
| + |             "useruuid = '". mysql_escape_string($uuid) ."' AND ".  | ||
| + |             "targetuuid = '". mysql_escape_string($targetuuid) ."'");  | ||
| + | |||
| + |     $row = mysql_fetch_row($check);  | ||
| + | |||
| + |     if ($row[0] == 0)  | ||
| + |     {  | ||
| + |         // Create a new record for this avatar note  | ||
| + |         $result = mysql_query("INSERT INTO profile_notes VALUES ".  | ||
| + |             "('". mysql_escape_string($uuid) ."',".  | ||
| + |             "'". mysql_escape_string($targetuuid) ."',".  | ||
| + |             "'". mysql_escape_string($notes) ."')");  | ||
| + |     }  | ||
| + |     else if ($notes == "")  | ||
| + |     {  | ||
| + |         // Delete the record for this avatar note  | ||
| + |         $result = mysql_query("DELETE FROM profile_notes WHERE ".  | ||
| + |             "useruuid = '". mysql_escape_string($uuid) ."' AND ".  | ||
| + |             "targetuuid = '". mysql_escape_string($targetuuid) ."'");  | ||
| + |     }  | ||
| + |     else  | ||
| + |     {  | ||
| + |         // Update the existing record  | ||
| + |         $result = mysql_query("UPDATE profile_notes SET ".  | ||
| + |             "notes = '". mysql_escape_string($notes) ."' WHERE ".  | ||
| + |             "useruuid = '". mysql_escape_string($uuid) ."' AND ".  | ||
| + |             "targetuuid = '". mysql_escape_string($targetuuid) ."'");  | ||
| + |     }  | ||
| + | |||
| + |     $response_xml = xmlrpc_encode(array(  | ||
| + |         'success' => $result,  | ||
| + |         'errorMessage' => mysql_error()  | ||
| + |     ));  | ||
| + | |||
| + |     print $response_xml;  | ||
| + | }  | ||
| + | |||
| + | # Profile bits  | ||
| + | |||
| + | xmlrpc_server_register_method($xmlrpc_server, "avatar_properties_request",  | ||
| + |         "avatar_properties_request");  | ||
| + | |||
| + | function avatar_properties_request($method_name, $params, $app_data)  | ||
| + | {  | ||
| + |     global $zeroUUID;  | ||
| + | |||
| + |     $req            = $params[0];  | ||
| + | |||
| + |     $uuid           = $req['avatar_id'];  | ||
| + | |||
| + |     $result = mysql_query("SELECT * FROM profile WHERE ".  | ||
| + |             "useruuid = '". mysql_escape_string($uuid) ."'");  | ||
| + |     $row = mysql_fetch_assoc($result);  | ||
| + | |||
| + |     if ($row != False)  | ||
| + |     {  | ||
| + |         $data[] = array(  | ||
| + |                 "ProfileUrl" => $row["profileURL"],  | ||
| + |                 "Image" => $row["profileImage"],  | ||
| + |                 "AboutText" => $row["profileAboutText"],  | ||
| + |                 "FirstLifeImage" => $row["profileFirstImage"],  | ||
| + |                 "FirstLifeAboutText" => $row["profileFirstText"],  | ||
| + |                 "Partner" => $row["profilePartner"],  | ||
| + | |||
| + |                 //Return interest data along with avatar properties  | ||
| + |                 "wantmask"   => $row["profileWantToMask"],  | ||
| + |                 "wanttext"   => $row["profileWantToText"],  | ||
| + |                 "skillsmask" => $row["profileSkillsMask"],  | ||
| + |                 "skillstext" => $row["profileSkillsText"],  | ||
| + |                 "languages"  => $row["profileLanguages"]);  | ||
| + |     }  | ||
| + |     else  | ||
| + |     {  | ||
| + |         //Insert empty record for avatar.  | ||
| + |         //FIXME: Should this only be done when asking for ones own profile?  | ||
| + |         $sql = "INSERT INTO profile VALUES ( ".  | ||
| + |                 "'". mysql_escape_string($uuid) ."', ".  | ||
| + |                 "'$zeroUUID', 0, 0, '', 0, '', 0, '', '', ".  | ||
| + |                 "'$zeroUUID', '', '$zeroUUID', '')";  | ||
| + |         $result = mysql_query($sql);  | ||
| + | |||
| + |         $data[] = array(  | ||
| + |                 "ProfileUrl" => "",  | ||
| + |                 "Image" => $zeroUUID,  | ||
| + |                 "AboutText" => "",  | ||
| + |                 "FirstLifeImage" => $zeroUUID,  | ||
| + |                 "FirstLifeAboutText" => "",  | ||
| + |                 "Partner" => $zeroUUID,  | ||
| + | |||
| + |                 "wantmask"   => 0,  | ||
| + |                 "wanttext"   => "",  | ||
| + |                 "skillsmask" => 0,  | ||
| + |                 "skillstext" => "",  | ||
| + |                 "languages"  => "");  | ||
| + |     }  | ||
| + | |||
| + |     $response_xml = xmlrpc_encode(array(  | ||
| + |         'success' => True,  | ||
| + |         'data' => $data  | ||
| + |     ));  | ||
| + | |||
| + |     print $response_xml;  | ||
| + | }  | ||
| + | |||
| + | xmlrpc_server_register_method($xmlrpc_server, "avatar_properties_update",  | ||
| + |         "avatar_properties_update");  | ||
| + | |||
| + | function avatar_properties_update($method_name, $params, $app_data)  | ||
| + | {  | ||
| + |     $req            = $params[0];  | ||
| + | |||
| + |     $uuid           = $req['avatar_id'];  | ||
| + |     $profileURL     = $req['ProfileUrl'];  | ||
| + |     $image          = $req['Image'];  | ||
| + |     $abouttext      = $req['AboutText'];  | ||
| + |     $firstlifeimage = $req['FirstLifeImage'];  | ||
| + |     $firstlifetext  = $req['FirstLifeAboutText'];  | ||
| + | |||
| + |     $result=mysql_query("UPDATE profile SET ".  | ||
| + |             "profileURL='". mysql_escape_string($profileURL) ."', ".  | ||
| + |             "profileImage='". mysql_escape_string($image) ."', ".  | ||
| + |             "profileAboutText='". mysql_escape_string($abouttext) ."', ".  | ||
| + |             "profileFirstImage='". mysql_escape_string($firstlifeimage) ."', ".  | ||
| + |             "profileFirstText='". mysql_escape_string($firstlifetext) ."' ".  | ||
| + |             "WHERE useruuid='". mysql_escape_string($uuid) ."'"  | ||
| + |         );  | ||
| + | |||
| + |     $response_xml = xmlrpc_encode(array(  | ||
| + |         'success' => $result,  | ||
| + |         'errorMessage' => mysql_error()  | ||
| + |     ));  | ||
| + | |||
| + |     print $response_xml;  | ||
| + | }  | ||
| + | |||
| + | |||
| + | // Profile Interests  | ||
| + | |||
| + | xmlrpc_server_register_method($xmlrpc_server, "avatar_interests_update",  | ||
| + |         "avatar_interests_update");  | ||
| + | |||
| + | function avatar_interests_update($method_name, $params, $app_data)  | ||
| + | {  | ||
| + |     $req            = $params[0];  | ||
| + | |||
| + |     $uuid           = $req['avatar_id'];  | ||
| + |     $wanttext       = $req['wanttext'];  | ||
| + |     $wantmask       = $req['wantmask'];  | ||
| + |     $skillstext     = $req['skillstext'];  | ||
| + |     $skillsmask     = $req['skillsmask'];  | ||
| + |     $languages      = $req['languages'];  | ||
| + | |||
| + |     $result = mysql_query("UPDATE profile SET ".  | ||
| + |             "profileWantToMask = ". mysql_escape_string($wantmask) .",".  | ||
| + |             "profileWantToText = '". mysql_escape_string($wanttext) ."',".  | ||
| + |             "profileSkillsMask = ". mysql_escape_string($skillsmask) .",".  | ||
| + |             "profileSkillsText = '". mysql_escape_string($skillstext) ."',".  | ||
| + |             "profileLanguages = '". mysql_escape_string($languages) ."' ".  | ||
| + |             "WHERE useruuid = '". mysql_escape_string($uuid) ."'"  | ||
| + |         );  | ||
| + | |||
| + |     $response_xml = xmlrpc_encode(array(  | ||
| + |         'success' => True  | ||
| + |     ));  | ||
| + | |||
| + |     print $response_xml;  | ||
| + | }  | ||
| + | |||
| + | // User Preferences  | ||
| + | |||
| + | xmlrpc_server_register_method($xmlrpc_server, "user_preferences_request",  | ||
| + |         "user_preferences_request");  | ||
| + | |||
| + | function user_preferences_request($method_name, $params, $app_data)  | ||
| + | {  | ||
| + |     $req            = $params[0];  | ||
| + | |||
| + |     $uuid           = $req['avatar_id'];  | ||
| + | |||
| + |     $result = mysql_query("SELECT imviaemail,visible,email FROM profile_settings WHERE ".  | ||
| + |             "useruuid = '". mysql_escape_string($uuid) ."'");  | ||
| + | |||
| + |     $row = mysql_fetch_assoc($result);  | ||
| + | |||
| + |     if ($row != False)  | ||
| + |     {  | ||
| + |         $data[] = array(  | ||
| + |                 "imviaemail" => $row["imviaemail"],  | ||
| + |                 "visible" => $row["visible"],  | ||
| + |                 "email" => $row["email"]);  | ||
| + |     }  | ||
| + |     else  | ||
| + |     {  | ||
| + |         //Insert empty record for avatar.  | ||
| + |         //NOTE: The 'false' values here are enums defined in database  | ||
| + |         $sql = "INSERT INTO profile_settings VALUES ".  | ||
| + |                 "('". mysql_escape_string($uuid) ."', ".  | ||
| + |                 "'false', 'false', '')";  | ||
| + |         $result = mysql_query($sql);  | ||
| + | |||
| + |         $data[] = array(  | ||
| + |                 "imviaemail" => False,  | ||
| + |                 "visible" => False,  | ||
| + |                 "email" => "");  | ||
| + |     }  | ||
| + | |||
| + |     $response_xml = xmlrpc_encode(array(  | ||
| + |         'success' => True,  | ||
| + |         'data' => $data  | ||
| + |     ));  | ||
| + | |||
| + |     print $response_xml;  | ||
| + | }  | ||
| + | |||
| + | xmlrpc_server_register_method($xmlrpc_server, "user_preferences_update",  | ||
| + |         "user_preferences_update");  | ||
| + | |||
| + | function user_preferences_update($method_name, $params, $app_data)  | ||
| + | {  | ||
| + | |||
| + |     $req            = $params[0];  | ||
| + | |||
| + |     $uuid           = $req['avatar_id'];  | ||
| + |     $wantim         = $req['imViaEmail'];  | ||
| + |     $directory      = $req['visible'];  | ||
| + | |||
| + |     $result = mysql_query("UPDATE profile_settings SET ".  | ||
| + |             "imviaemail = '".mysql_escape_string($wantim) ."', ".  | ||
| + |             "visible = '".mysql_escape_string($directory) ."' WHERE ".  | ||
| + |             "useruuid = '". mysql_escape_string($uuid) ."'");  | ||
| + | |||
| + |     $response_xml = xmlrpc_encode(array(  | ||
| + |         'success' => True,  | ||
| + |         'data' => $data  | ||
| + |     ));  | ||
| + | |||
| + |     print $response_xml;  | ||
| + | }  | ||
| + | |||
| + | #  | ||
| + | # Process the request  | ||
| + | #  | ||
| + | |||
| + | $request_xml = $HTTP_RAW_POST_DATA;  | ||
| + | xmlrpc_server_call_method($xmlrpc_server, $request_xml, '');  | ||
| + | xmlrpc_server_destroy($xmlrpc_server);  | ||
| + | ?>  | ||
</source >  | </source >  | ||
| + | |||
| + | === STEP 3: OpenSimProfile ===  | ||
| + | Shutdown your simulator.  | ||
| + | |||
| + | Edit the OpenSim.ini [Profile] block.  | ||
| + | |||
| + | An example configuration is shown below:  | ||
| + |  <source lang="ini">  | ||
| + | [Profile]  | ||
| + |     Module = "OpenSimProfile"  | ||
| + |     ProfileURL = "http://yourwebserverdomainname/pathto/profile.php"  | ||
| + | </source>  | ||
| + | |||
| + | Once the edits are made, save your OpenSim.ini and restart your simulator.   | ||
| + | |||
| + | === Using the OpenSimProfile module ===  | ||
| + | Login to your simulator and try to create your profile.  | ||
| + | |||
| + | Check the database profile table to verify whether or not profile.php has written a record there.   | ||
| + | |||
| + | P.D: OpenSimProfile only works while you are on your home grid, not when you are connected to other grids over hypergrid.  | ||
| + | |||
| + | === Troubleshooting ===  | ||
| + | Error shown in Apache error_log:  | ||
| + | <pre style="color:red">  | ||
| + | PHP Fatal error:  Call to undefined function xmlrpc_server_create() in /var/www/html/opensim/profile.php  | ||
| + | </pre>  | ||
| + | |||
| + | Cause:  | ||
| + | <pre>Many Linux distributions may not ship with PHP XML RPC extensions.</pre>  | ||
| + | |||
| + | Steps to Fix:  | ||
| + | * Fedora 17:  | ||
| + | <pre>  | ||
| + | # yum install php-xmlrpc  | ||
| + | </pre>  | ||
| + | |||
| + | === Testing Notes ===  | ||
| + | These steps and configuration tested working on 2013-Jan-13 with:  | ||
| + | * OpenSimulator 0.7.5 r21607 from 2013-Jan-09  | ||
| + | * Nant 0.90  | ||
| + | * Mono 2.10.8  | ||
| + | * MySQL 5.5.28  | ||
| + | * PHP XMLRPC 5.4.10  | ||
| + | * PHP 5.4.1  | ||
| + | * Apache 2.2.22  | ||
| + | * Linux Kernel 3.6.11  | ||
| + | * Fedora Linux 17 (Beefy Miracle)  | ||
Latest revision as of 11:57, 6 August 2017
OpenSimulator 0.7.6 and onwards ships with built-in user profiles support. See UserProfiles.
Earlier, an add-on module called "OpenSimProfile" made it possible to create an avatar profile and see other avatar's profiles as well.
You can find a newer script that uses mysqli and that replaces the deprecated mysql commands with PHP 5.5.0 here
[edit] Disclaimer
Please note that these are third party modules which you use at your own risk!
OpenSimulator takes no responsibility for these modules.
[edit] OpenSimProfile Configuration Steps
The OpenSimProfile is already compiled and ready for use in current versions of OpenSimulator.
However, you will need to setup the "back-end" database and PHP connector scripts to support the OpenSimProfile.
- Upload the profile.sql (below) to your database server
 - Upload the profile.php (below) to your web server
 - Enable the OpenSimProfile in your OpenSim.ini file
 
[edit] STEP 1: profile.sql
Save these SQL commands to a profile.sql file on your MySQL database server.
CREATE TABLE IF NOT EXISTS `profile_classifieds` ( `classifieduuid` char(36) NOT NULL, `creatoruuid` char(36) NOT NULL, `creationdate` int(20) NOT NULL, `expirationdate` int(20) NOT NULL, `category` varchar(20) NOT NULL, `name` varchar(255) NOT NULL, `description` text NOT NULL, `parceluuid` char(36) NOT NULL, `parentestate` int(11) NOT NULL, `snapshotuuid` char(36) NOT NULL, `simname` varchar(255) NOT NULL, `posglobal` varchar(255) NOT NULL, `parcelname` varchar(255) NOT NULL, `classifiedflags` int(8) NOT NULL, `priceforlisting` int(5) NOT NULL, PRIMARY KEY (`classifieduuid`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1; CREATE TABLE IF NOT EXISTS `profile_notes` ( `useruuid` varchar(36) NOT NULL, `targetuuid` varchar(36) NOT NULL, `notes` text NOT NULL, UNIQUE KEY `useruuid` (`useruuid`,`targetuuid`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1; CREATE TABLE IF NOT EXISTS `profile_picks` ( `pickuuid` varchar(36) NOT NULL, `creatoruuid` varchar(36) NOT NULL, `toppick` enum('true','false') NOT NULL, `parceluuid` varchar(36) NOT NULL, `name` varchar(255) NOT NULL, `description` text NOT NULL, `snapshotuuid` varchar(36) NOT NULL, `user` varchar(255) NOT NULL, `originalname` varchar(255) NOT NULL, `simname` varchar(255) NOT NULL, `posglobal` varchar(255) NOT NULL, `sortorder` int(2) NOT NULL, `enabled` enum('true','false') NOT NULL, PRIMARY KEY (`pickuuid`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1; CREATE TABLE IF NOT EXISTS `profile` ( `useruuid` varchar(36) NOT NULL, `profilePartner` varchar(36) NOT NULL, `profileAllowPublish` BINARY(1) NOT NULL, `profileMaturePublish` BINARY(1) NOT NULL, `profileURL` varchar(255) NOT NULL, `profileWantToMask` int(3) NOT NULL, `profileWantToText` text NOT NULL, `profileSkillsMask` int(3) NOT NULL, `profileSkillsText` text NOT NULL, `profileLanguages` text NOT NULL, `profileImage` varchar(36) NOT NULL, `profileAboutText` text NOT NULL, `profileFirstImage` varchar(36) NOT NULL, `profileFirstText` text NOT NULL, PRIMARY KEY (`useruuid`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1; CREATE TABLE IF NOT EXISTS `profile_settings` ( `useruuid` varchar(36) NOT NULL, `imviaemail` enum('true','false') NOT NULL, `visible` enum('true','false') NOT NULL, `email` varchar(254) NOT NULL, PRIMARY KEY (`useruuid`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
Connect to your MySQL (Linux commands shown):
$ mysql --user=$mysqluser --password=$mysqlpassword $databasename
Replace $mysqluser, $mysqlpassword, and $databasename with your specific configuration.
At the mysql prompt, source the profile.sql file to configure your database to hold additional profile information:
mysql> source profile.sql ... ensure no error messages appear here ... mysql> quit
[edit] STEP 2: profile.php
Copy this PHP script to a file called profile.php and upload the script file to your web server.
Edit the $dbName, $dbHost, $dbUser, and $dbPassword lines at the top of the script to match your database and server information.
<?PHP $dbName = "comunity"; $dbHost = "localhost"; $dbUser = "root"; $dbPassword =""; mysql_connect ($dbHost,$dbUser,$dbPassword); mysql_select_db ($dbName); $zeroUUID = "00000000-0000-0000-0000-000000000000"; $xmlrpc_server = xmlrpc_server_create(); xmlrpc_server_register_method($xmlrpc_server, "avatarclassifiedsrequest", "avatarclassifiedsrequest"); function avatarclassifiedsrequest($method_name, $params, $app_data) { $req = $params[0]; $uuid = $req['uuid']; $result = mysql_query("SELECT * FROM profile_classifieds WHERE ". "creatoruuid = '". mysql_escape_string($uuid) ."'"); $data = array(); while (($row = mysql_fetch_assoc($result))) { $data[] = array( "classifiedid" => $row["classifieduuid"], "name" => $row["name"]); } $response_xml = xmlrpc_encode(array( 'success' => True, 'data' => $data )); print $response_xml; } # Classifieds Update xmlrpc_server_register_method($xmlrpc_server, "classified_update", "classified_update"); function classified_update($method_name, $params, $app_data) { global $zeroUUID; $req = $params[0]; $classifieduuid = $req['classifiedUUID']; $creator = $req['creatorUUID']; $category = $req['category']; $name = $req['name']; $description = $req['description']; $parceluuid = $req['parcelUUID']; $parentestate = $req['parentestate']; $snapshotuuid = $req['snapshotUUID']; $simname = $req['sim_name']; $globalpos = $req['globalpos']; $parcelname = $req['parcelname']; $classifiedflag = $req['classifiedFlags']; $priceforlist = $req['classifiedPrice']; // Check if we already have this one in the database $check = mysql_query("SELECT COUNT(*) FROM profile_classifieds WHERE ". "classifieduuid = '". mysql_escape_string($classifieduuid) ."'"); while ($row = mysql_fetch_row($check)) { $ready = $row[0]; } if ($ready == 0) { // Doing some late checking // Should be done by the module but let's see what happens when // I do it here if($parcelname == "") $parcelname = "Unknown"; if($parceluuid == "") $parceluuid = $zeroUUID; if($description == "") $description = "No Description"; if($classifiedflag == 2) { $creationdate = time(); $expirationdate = time() + (7 * 24 * 60 * 60); } else { $creationdate = time(); $expirationdate = time() + (365 * 24 * 60 * 60); } $insertquery = "INSERT INTO profile_classifieds VALUES ". "('". mysql_escape_string($classifieduuid) ."',". "'". mysql_escape_string($creator) ."',". "". mysql_escape_string($creationdate) .",". "". mysql_escape_string($expirationdate) .",". "'". mysql_escape_string($category) ."',". "'". mysql_escape_string($name) ."',". "'". mysql_escape_string($description) ."',". "'". mysql_escape_string($parceluuid) ."',". "". mysql_escape_string($parentestate) .",". "'". mysql_escape_string($snapshotuuid) ."',". "'". mysql_escape_string($simname) ."',". "'". mysql_escape_string($globalpos) ."',". "'". mysql_escape_string($parcelname) ."',". "". mysql_escape_string($classifiedflag) .",". "". mysql_escape_string($priceforlist) .")"; // Create a new record for this classified $result = mysql_query($insertquery); } else { } $response_xml = xmlrpc_encode(array( 'success' => True, 'data' => $data )); print $response_xml; } # Classifieds Delete xmlrpc_server_register_method($xmlrpc_server, "classified_delete", "classified_delete"); function classified_delete($method_name, $params, $app_data) { $req = $params[0]; $classifieduuid = $req['classifiedID']; $result = mysql_query("DELETE FROM profile_classifieds WHERE ". "classifieduuid = '".mysql_escape_string($classifieduuid) ."'"); $response_xml = xmlrpc_encode(array( 'success' => True, 'data' => $data )); print $response_xml; } # # Picks # # Avatar Picks Request xmlrpc_server_register_method($xmlrpc_server, "avatarpicksrequest", "avatarpicksrequest"); function avatarpicksrequest($method_name, $params, $app_data) { $req = $params[0]; $uuid = $req['uuid']; $data = array(); $result = mysql_query("SELECT `pickuuid`,`name` FROM profile_picks WHERE ". "creatoruuid = '". mysql_escape_string($uuid) ."'"); while (($row = mysql_fetch_assoc($result))) { $data[] = array( "pickid" => $row["pickuuid"], "name" => $row["name"]); } $response_xml = xmlrpc_encode(array( 'success' => True, 'data' => $data )); print $response_xml; } # Request Picks for User xmlrpc_server_register_method($xmlrpc_server, "pickinforequest", "pickinforequest"); function pickinforequest($method_name, $params, $app_data) { $req = $params[0]; $uuid = $req['avatar_id']; $pick = $req['pick_id']; $data = array(); $result = mysql_query("SELECT * FROM profile_picks WHERE ". "creatoruuid = '". mysql_escape_string($uuid) ."' AND ". "pickuuid = '". mysql_escape_string($pick) ."'"); $row = mysql_fetch_assoc($result); if ($row != False) { if ($row["description"] == null || $row["description"] == "") $row["description"] = "No description given"; $data[] = array( "pickuuid" => $row["pickuuid"], "creatoruuid" => $row["creatoruuid"], "toppick" => $row["toppick"], "parceluuid" => $row["parceluuid"], "name" => $row["name"], "description" => $row["description"], "snapshotuuid" => $row["snapshotuuid"], "user" => $row["user"], "originalname" => $row["originalname"], "simname" => $row["simname"], "posglobal" => $row["posglobal"], "sortorder"=> $row["sortorder"], "enabled" => $row["enabled"]); } $response_xml = xmlrpc_encode(array( 'success' => True, 'data' => $data )); print $response_xml; } # Picks Update xmlrpc_server_register_method($xmlrpc_server, "picks_update", "picks_update"); function picks_update($method_name, $params, $app_data) { global $zeroUUID; $req = $params[0]; $pickuuid = $req['pick_id']; $creator = $req['creator_id']; $toppick = $req['top_pick']; $name = $req['name']; $description = $req['desc']; $parceluuid = $req['parcel_uuid']; $snapshotuuid = $req['snapshot_id']; $user = $req['user']; $simname = $req['sim_name']; $posglobal = $req['pos_global']; $sortorder = $req['sort_order']; $enabled = $req['enabled']; if($parceluuid == "") $parceluuid = $zeroUUID; if($description == "") $description = "No Description"; // Check if we already have this one in the database $check = mysql_query("SELECT COUNT(*) FROM profile_picks WHERE ". "pickuuid = '". mysql_escape_string($pickuuid) ."'"); $row = mysql_fetch_row($check); if ($row[0] == 0) { if($user == null || $user == "") $user = "Unknown"; //The original parcel name is the same as the name of the //profile pick when a new profile pick is being created. $original = $name; $query = "INSERT INTO profile_picks VALUES ". "('". mysql_escape_string($pickuuid) ."',". "'". mysql_escape_string($creator) ."',". "'". mysql_escape_string($toppick) ."',". "'". mysql_escape_string($parceluuid) ."',". "'". mysql_escape_string($name) ."',". "'". mysql_escape_string($description) ."',". "'". mysql_escape_string($snapshotuuid) ."',". "'". mysql_escape_string($user) ."',". "'". mysql_escape_string($original) ."',". "'". mysql_escape_string($simname) ."',". "'". mysql_escape_string($posglobal) ."',". "'". mysql_escape_string($sortorder) ."',". "'". mysql_escape_string($enabled) ."')"; } else { $query = "UPDATE profile_picks SET " . "parceluuid = '". mysql_escape_string($parceluuid) . "', " . "name = '". mysql_escape_string($name) . "', " . "description = '". mysql_escape_string($description) . "', " . "snapshotuuid = '". mysql_escape_string($snapshotuuid) . "' WHERE ". "pickuuid = '". mysql_escape_string($pickuuid) ."'"; } $result = mysql_query($query); if ($result != False) $result = True; $response_xml = xmlrpc_encode(array( 'success' => $result, 'errorMessage' => mysql_error() )); print $response_xml; } # Picks Delete xmlrpc_server_register_method($xmlrpc_server, "picks_delete", "picks_delete"); function picks_delete($method_name, $params, $app_data) { $req = $params[0]; $pickuuid = $req['pick_id']; $result = mysql_query("DELETE FROM profile_picks WHERE ". "pickuuid = '".mysql_escape_string($pickuuid) ."'"); if ($result != False) $result = True; $response_xml = xmlrpc_encode(array( 'success' => $result, 'errorMessage' => mysql_error() )); print $response_xml; } # # Notes # # Avatar Notes Request xmlrpc_server_register_method($xmlrpc_server, "avatarnotesrequest", "avatarnotesrequest"); function avatarnotesrequest($method_name, $params, $app_data) { $req = $params[0]; $uuid = $req['avatar_id']; $targetuuid = $req['uuid']; $result = mysql_query("SELECT notes FROM profile_notes WHERE ". "useruuid = '". mysql_escape_string($uuid) ."' AND ". "targetuuid = '". mysql_escape_string($targetuuid) ."'"); $row = mysql_fetch_row($result); if ($row == False) $notes = ""; else $notes = $row[0]; $data[] = array( "targetid" => $targetuuid, "notes" => $notes); $response_xml = xmlrpc_encode(array( 'success' => True, 'data' => $data )); print $response_xml; } # Avatar Notes Update xmlrpc_server_register_method($xmlrpc_server, "avatar_notes_update", "avatar_notes_update"); function avatar_notes_update($method_name, $params, $app_data) { $req = $params[0]; $uuid = $req['avatar_id']; $targetuuid = $req['target_id']; $notes = $req['notes']; // Check if we already have this one in the database $check = mysql_query("SELECT COUNT(*) FROM profile_notes WHERE ". "useruuid = '". mysql_escape_string($uuid) ."' AND ". "targetuuid = '". mysql_escape_string($targetuuid) ."'"); $row = mysql_fetch_row($check); if ($row[0] == 0) { // Create a new record for this avatar note $result = mysql_query("INSERT INTO profile_notes VALUES ". "('". mysql_escape_string($uuid) ."',". "'". mysql_escape_string($targetuuid) ."',". "'". mysql_escape_string($notes) ."')"); } else if ($notes == "") { // Delete the record for this avatar note $result = mysql_query("DELETE FROM profile_notes WHERE ". "useruuid = '". mysql_escape_string($uuid) ."' AND ". "targetuuid = '". mysql_escape_string($targetuuid) ."'"); } else { // Update the existing record $result = mysql_query("UPDATE profile_notes SET ". "notes = '". mysql_escape_string($notes) ."' WHERE ". "useruuid = '". mysql_escape_string($uuid) ."' AND ". "targetuuid = '". mysql_escape_string($targetuuid) ."'"); } $response_xml = xmlrpc_encode(array( 'success' => $result, 'errorMessage' => mysql_error() )); print $response_xml; } # Profile bits xmlrpc_server_register_method($xmlrpc_server, "avatar_properties_request", "avatar_properties_request"); function avatar_properties_request($method_name, $params, $app_data) { global $zeroUUID; $req = $params[0]; $uuid = $req['avatar_id']; $result = mysql_query("SELECT * FROM profile WHERE ". "useruuid = '". mysql_escape_string($uuid) ."'"); $row = mysql_fetch_assoc($result); if ($row != False) { $data[] = array( "ProfileUrl" => $row["profileURL"], "Image" => $row["profileImage"], "AboutText" => $row["profileAboutText"], "FirstLifeImage" => $row["profileFirstImage"], "FirstLifeAboutText" => $row["profileFirstText"], "Partner" => $row["profilePartner"], //Return interest data along with avatar properties "wantmask" => $row["profileWantToMask"], "wanttext" => $row["profileWantToText"], "skillsmask" => $row["profileSkillsMask"], "skillstext" => $row["profileSkillsText"], "languages" => $row["profileLanguages"]); } else { //Insert empty record for avatar. //FIXME: Should this only be done when asking for ones own profile? $sql = "INSERT INTO profile VALUES ( ". "'". mysql_escape_string($uuid) ."', ". "'$zeroUUID', 0, 0, '', 0, '', 0, '', '', ". "'$zeroUUID', '', '$zeroUUID', '')"; $result = mysql_query($sql); $data[] = array( "ProfileUrl" => "", "Image" => $zeroUUID, "AboutText" => "", "FirstLifeImage" => $zeroUUID, "FirstLifeAboutText" => "", "Partner" => $zeroUUID, "wantmask" => 0, "wanttext" => "", "skillsmask" => 0, "skillstext" => "", "languages" => ""); } $response_xml = xmlrpc_encode(array( 'success' => True, 'data' => $data )); print $response_xml; } xmlrpc_server_register_method($xmlrpc_server, "avatar_properties_update", "avatar_properties_update"); function avatar_properties_update($method_name, $params, $app_data) { $req = $params[0]; $uuid = $req['avatar_id']; $profileURL = $req['ProfileUrl']; $image = $req['Image']; $abouttext = $req['AboutText']; $firstlifeimage = $req['FirstLifeImage']; $firstlifetext = $req['FirstLifeAboutText']; $result=mysql_query("UPDATE profile SET ". "profileURL='". mysql_escape_string($profileURL) ."', ". "profileImage='". mysql_escape_string($image) ."', ". "profileAboutText='". mysql_escape_string($abouttext) ."', ". "profileFirstImage='". mysql_escape_string($firstlifeimage) ."', ". "profileFirstText='". mysql_escape_string($firstlifetext) ."' ". "WHERE useruuid='". mysql_escape_string($uuid) ."'" ); $response_xml = xmlrpc_encode(array( 'success' => $result, 'errorMessage' => mysql_error() )); print $response_xml; } // Profile Interests xmlrpc_server_register_method($xmlrpc_server, "avatar_interests_update", "avatar_interests_update"); function avatar_interests_update($method_name, $params, $app_data) { $req = $params[0]; $uuid = $req['avatar_id']; $wanttext = $req['wanttext']; $wantmask = $req['wantmask']; $skillstext = $req['skillstext']; $skillsmask = $req['skillsmask']; $languages = $req['languages']; $result = mysql_query("UPDATE profile SET ". "profileWantToMask = ". mysql_escape_string($wantmask) .",". "profileWantToText = '". mysql_escape_string($wanttext) ."',". "profileSkillsMask = ". mysql_escape_string($skillsmask) .",". "profileSkillsText = '". mysql_escape_string($skillstext) ."',". "profileLanguages = '". mysql_escape_string($languages) ."' ". "WHERE useruuid = '". mysql_escape_string($uuid) ."'" ); $response_xml = xmlrpc_encode(array( 'success' => True )); print $response_xml; } // User Preferences xmlrpc_server_register_method($xmlrpc_server, "user_preferences_request", "user_preferences_request"); function user_preferences_request($method_name, $params, $app_data) { $req = $params[0]; $uuid = $req['avatar_id']; $result = mysql_query("SELECT imviaemail,visible,email FROM profile_settings WHERE ". "useruuid = '". mysql_escape_string($uuid) ."'"); $row = mysql_fetch_assoc($result); if ($row != False) { $data[] = array( "imviaemail" => $row["imviaemail"], "visible" => $row["visible"], "email" => $row["email"]); } else { //Insert empty record for avatar. //NOTE: The 'false' values here are enums defined in database $sql = "INSERT INTO profile_settings VALUES ". "('". mysql_escape_string($uuid) ."', ". "'false', 'false', '')"; $result = mysql_query($sql); $data[] = array( "imviaemail" => False, "visible" => False, "email" => ""); } $response_xml = xmlrpc_encode(array( 'success' => True, 'data' => $data )); print $response_xml; } xmlrpc_server_register_method($xmlrpc_server, "user_preferences_update", "user_preferences_update"); function user_preferences_update($method_name, $params, $app_data) { $req = $params[0]; $uuid = $req['avatar_id']; $wantim = $req['imViaEmail']; $directory = $req['visible']; $result = mysql_query("UPDATE profile_settings SET ". "imviaemail = '".mysql_escape_string($wantim) ."', ". "visible = '".mysql_escape_string($directory) ."' WHERE ". "useruuid = '". mysql_escape_string($uuid) ."'"); $response_xml = xmlrpc_encode(array( 'success' => True, 'data' => $data )); print $response_xml; } # # Process the request # $request_xml = $HTTP_RAW_POST_DATA; xmlrpc_server_call_method($xmlrpc_server, $request_xml, ''); xmlrpc_server_destroy($xmlrpc_server); ?>
[edit] STEP 3: OpenSimProfile
Shutdown your simulator.
Edit the OpenSim.ini [Profile] block.
An example configuration is shown below:
[Profile] Module = "OpenSimProfile" ProfileURL = "http://yourwebserverdomainname/pathto/profile.php"
Once the edits are made, save your OpenSim.ini and restart your simulator.
[edit] Using the OpenSimProfile module
Login to your simulator and try to create your profile.
Check the database profile table to verify whether or not profile.php has written a record there.
P.D: OpenSimProfile only works while you are on your home grid, not when you are connected to other grids over hypergrid.
[edit] Troubleshooting
Error shown in Apache error_log:
PHP Fatal error: Call to undefined function xmlrpc_server_create() in /var/www/html/opensim/profile.php
Cause:
Many Linux distributions may not ship with PHP XML RPC extensions.
Steps to Fix:
- Fedora 17:
 
# yum install php-xmlrpc
[edit] Testing Notes
These steps and configuration tested working on 2013-Jan-13 with:
- OpenSimulator 0.7.5 r21607 from 2013-Jan-09
 - Nant 0.90
 - Mono 2.10.8
 - MySQL 5.5.28
 - PHP XMLRPC 5.4.10
 - PHP 5.4.1
 - Apache 2.2.22
 - Linux Kernel 3.6.11
 - Fedora Linux 17 (Beefy Miracle)