mirror of
https://github.com/kcozens/OpenSimSearch.git
synced 2026-08-14 08:52:28 +00:00
Allow 0 or -1 to be considered as the "Any" category for event listings. Event markers are seen on the map again but still can't search for events. git-svn-id: http://forge.opensimulator.org/svn/ossearch/trunk@212 109abde3-1f22-4c10-b5d7-b6b0135cd00c
605 lines
17 KiB
PHP
605 lines
17 KiB
PHP
<?php
|
|
//The description of the flags used in this file are being based on the
|
|
//DirFindFlags enum which is defined in OpenMetaverse/DirectoryManager.cs
|
|
//of the libopenmetaverse library.
|
|
|
|
include("databaseinfo.php");
|
|
|
|
//
|
|
// Search DB
|
|
//
|
|
mysql_connect ($DB_HOST, $DB_USER, $DB_PASSWORD);
|
|
mysql_select_db ($DB_NAME);
|
|
|
|
#
|
|
# Copyright (c)Melanie Thielker (http://opensimulator.org/)
|
|
#
|
|
|
|
###################### No user serviceable parts below #####################
|
|
|
|
//Join a series of terms together with optional parentheses around the result.
|
|
//This function is used in place of the simpler join to handle the cases where
|
|
//one or more of the supplied terms are an empty string. The parentheses can
|
|
//be added when mixing AND and OR clauses in a SQL query.
|
|
function join_terms($glue, $terms, $add_paren)
|
|
{
|
|
if (count($terms) > 1)
|
|
{
|
|
$type = join($glue, $terms);
|
|
if ($add_paren == True)
|
|
$type = "(" . $type . ")";
|
|
}
|
|
else
|
|
{
|
|
if (count($terms) == 1)
|
|
$type = $terms[0];
|
|
else
|
|
$type = "";
|
|
}
|
|
|
|
return $type;
|
|
}
|
|
|
|
|
|
function process_region_type_flags($flags)
|
|
{
|
|
$terms = array();
|
|
|
|
if ($flags & 16777216) //IncludePG (1 << 24)
|
|
$terms[] = "mature = 'PG'";
|
|
if ($flags & 33554432) //IncludeMature (1 << 25)
|
|
$terms[] = "mature = 'Mature'";
|
|
if ($flags & 67108864) //IncludeAdult (1 << 26)
|
|
$terms[] = "mature = 'Adult'";
|
|
|
|
return join_terms(" OR ", $terms, True);
|
|
}
|
|
|
|
|
|
#
|
|
# The XMLRPC server object
|
|
#
|
|
|
|
$xmlrpc_server = xmlrpc_server_create();
|
|
|
|
#
|
|
# Places Query
|
|
#
|
|
|
|
xmlrpc_server_register_method($xmlrpc_server, "dir_places_query",
|
|
"dir_places_query");
|
|
|
|
function dir_places_query($method_name, $params, $app_data)
|
|
{
|
|
$req = $params[0];
|
|
|
|
$flags = $req['flags'];
|
|
$text = $req['text'];
|
|
$category = $req['category'];
|
|
$query_start = $req['query_start'];
|
|
|
|
$pieces = split(" ", $text);
|
|
$text = join("%", $pieces);
|
|
|
|
if ($text == "%%%")
|
|
{
|
|
$response_xml = xmlrpc_encode(array(
|
|
'success' => False,
|
|
'errorMessage' => "Invalid search terms"
|
|
));
|
|
|
|
print $response_xml;
|
|
|
|
return;
|
|
}
|
|
|
|
$terms = array();
|
|
|
|
$type = process_region_type_flags($flags);
|
|
if ($type != "")
|
|
$type = " AND " . $type;
|
|
|
|
if ($flags & 1024)
|
|
$order = "dwell DESC,";
|
|
|
|
if ($category > 0)
|
|
$category = "searchcategory = '".mysql_real_escape_string($category)."' AND ";
|
|
else
|
|
$category = "";
|
|
|
|
$text = mysql_real_escape_string($text);
|
|
$result = mysql_query("SELECT * FROM parcels WHERE $category " .
|
|
"(parcelname LIKE '%$text%'" .
|
|
" OR description LIKE '%$text%')" .
|
|
$type . " ORDER BY $order parcelname" .
|
|
" LIMIT ".(0+$query_start).",101");
|
|
|
|
$data = array();
|
|
while (($row = mysql_fetch_assoc($result)))
|
|
{
|
|
$data[] = array(
|
|
"parcel_id" => $row["infouuid"],
|
|
"name" => $row["parcelname"],
|
|
"for_sale" => "False",
|
|
"auction" => "False",
|
|
"dwell" => $row["dwell"]);
|
|
}
|
|
$response_xml = xmlrpc_encode(array(
|
|
'success' => True,
|
|
'errorMessage' => "",
|
|
'data' => $data
|
|
));
|
|
|
|
print $response_xml;
|
|
}
|
|
|
|
#
|
|
# Popular Places Query
|
|
#
|
|
|
|
xmlrpc_server_register_method($xmlrpc_server, "dir_popular_query",
|
|
"dir_popular_query");
|
|
|
|
function dir_popular_query($method_name, $params, $app_data)
|
|
{
|
|
$req = $params[0];
|
|
|
|
$text = $req['text'];
|
|
$flags = $req['flags'];
|
|
$query_start = $req['query_start'];
|
|
|
|
$terms = array();
|
|
|
|
if ($flags & 0x1000) //PicturesOnly (1 << 12)
|
|
$terms[] = "has_picture = 1";
|
|
|
|
if ($flags & 0x0800) //PgSimsOnly (1 << 11)
|
|
$terms[] = "mature = 0";
|
|
|
|
if ($text != "")
|
|
{
|
|
$text = mysql_real_escape_string($text);
|
|
$terms[] = "(name LIKE '%$text%')";
|
|
}
|
|
|
|
if (count($terms) > 0)
|
|
$where = " WHERE " . join_terms(" AND ", $terms, False);
|
|
else
|
|
$where = "";
|
|
|
|
$result = mysql_query("SELECT * FROM popularplaces" . $where .
|
|
" LIMIT " . mysql_real_escape_string($query_start) . ",101");
|
|
|
|
$data = array();
|
|
while (($row = mysql_fetch_assoc($result)))
|
|
{
|
|
$data[] = array(
|
|
"parcel_id" => $row["infoUUID"],
|
|
"name" => $row["name"],
|
|
"dwell" => $row["dwell"]);
|
|
}
|
|
|
|
$response_xml = xmlrpc_encode(array(
|
|
'success' => True,
|
|
'errorMessage' => "",
|
|
'data' => $data));
|
|
|
|
print $response_xml;
|
|
}
|
|
|
|
#
|
|
# Land Query
|
|
#
|
|
|
|
xmlrpc_server_register_method($xmlrpc_server, "dir_land_query",
|
|
"dir_land_query");
|
|
|
|
function dir_land_query($method_name, $params, $app_data)
|
|
{
|
|
$req = $params[0];
|
|
|
|
$flags = $req['flags'];
|
|
$type = $req['type'];
|
|
$price = $req['price'];
|
|
$area = $req['area'];
|
|
$query_start = $req['query_start'];
|
|
|
|
$terms = array();
|
|
|
|
if ($type != 4294967295) //Include all types of land?
|
|
{
|
|
//Do this check first so we can bail out quickly on Auction search
|
|
if (($type & 26) == 2) // Auction (from SearchTypeFlags enum)
|
|
{
|
|
$response_xml = xmlrpc_encode(array(
|
|
'success' => False,
|
|
'errorMessage' => "No auctions listed"));
|
|
|
|
print $response_xml;
|
|
|
|
return;
|
|
}
|
|
|
|
if (($type & 24) == 8) //Mainland (24=0x18 [bits 3 & 4])
|
|
$terms[] = "parentestate = 1";
|
|
if (($type & 24) == 16) //Estate (24=0x18 [bits 3 & 4])
|
|
$terms[] = "parentestate <> 1";
|
|
}
|
|
|
|
$s = process_region_type_flags($flags);
|
|
if ($s != "")
|
|
$terms[] = $s;
|
|
|
|
if ($flags & 0x100000) //LimitByPrice (1 << 20)
|
|
$terms[] = "saleprice <= '" . mysql_real_escape_string($price) . "'";
|
|
if ($flags & 0x200000) //LimitByArea (1 << 21)
|
|
$terms[] = "area >= '" . mysql_real_escape_string($area) . "'";
|
|
|
|
//The PerMeterSort flag is always passed from a map item query.
|
|
//It doesn't hurt to have this as the default search order.
|
|
$order = "lsq"; //PerMeterSort (1 << 17)
|
|
|
|
if ($flags & 0x80000) //NameSort (1 << 19)
|
|
$order = "parcelname";
|
|
if ($flags & 0x10000) //PriceSort (1 << 16)
|
|
$order = "saleprice";
|
|
if ($flags & 0x40000) //AreaSort (1 << 18)
|
|
$order = "area";
|
|
if (!($flags & 0x8000)) //SortAsc (1 << 15)
|
|
$order .= " DESC";
|
|
|
|
if (count($terms) > 0)
|
|
$where = " WHERE " . join_terms(" AND ", $terms, False);
|
|
else
|
|
$where = "";
|
|
|
|
$sql = "SELECT *,saleprice/area AS lsq FROM parcelsales" . $where .
|
|
" ORDER BY " . $order . " LIMIT " .
|
|
mysql_real_escape_string($query_start) . ",101";
|
|
|
|
$result = mysql_query($sql);
|
|
|
|
$data = array();
|
|
while (($row = mysql_fetch_assoc($result)))
|
|
{
|
|
$data[] = array(
|
|
"parcel_id" => $row["infoUUID"],
|
|
"name" => $row["parcelname"],
|
|
"auction" => "false",
|
|
"for_sale" => "true",
|
|
"sale_price" => $row["saleprice"],
|
|
"landing_point" => $row["landingpoint"],
|
|
"region_UUID" => $row["regionUUID"],
|
|
"area" => $row["area"]);
|
|
}
|
|
|
|
$response_xml = xmlrpc_encode(array(
|
|
'success' => True,
|
|
'errorMessage' => "",
|
|
'data' => $data));
|
|
|
|
print $response_xml;
|
|
}
|
|
|
|
#
|
|
# Events Query
|
|
#
|
|
|
|
xmlrpc_server_register_method($xmlrpc_server, "dir_events_query",
|
|
"dir_events_query");
|
|
|
|
function dir_events_query($method_name, $params, $app_data)
|
|
{
|
|
$req = $params[0];
|
|
|
|
$text = $req['text'];
|
|
$flags = $req['flags'];
|
|
$query_start = $req['query_start'];
|
|
|
|
if ($text == "%%%")
|
|
{
|
|
$response_xml = xmlrpc_encode(array(
|
|
'success' => False,
|
|
'errorMessage' => "Invalid search terms"
|
|
));
|
|
|
|
print $response_xml;
|
|
|
|
return;
|
|
}
|
|
|
|
$pieces = explode("|", $text);
|
|
|
|
$day = $pieces[0];
|
|
$category = $pieces[1];
|
|
if (count($pieces) < 3)
|
|
$search_text = "";
|
|
else
|
|
$search_text = $pieces[2];
|
|
|
|
$terms = array();
|
|
|
|
if ($day == "u")
|
|
{
|
|
//This condition will include upcoming and in-progress events
|
|
$terms[] = "dateUTC+duration*60 >= " . time();
|
|
}
|
|
else
|
|
{
|
|
//Default timezone. Change this value if you use a different
|
|
//in-world timezone for your local standalone or grid.
|
|
date_default_timezone_set('America/Los_Angeles');
|
|
|
|
//To search for events in a given day we need to determine the
|
|
//start time for the day. Get current time, take out UTC offset,
|
|
//adjust time to start of day, add back the UTC time zone offset.
|
|
$time_info = gettimeofday();
|
|
$now = $time_info['sec'] - $time_info['minuteswest'] * 60;
|
|
$now -= ($now % 86400); //Adjust to start of day
|
|
$now += $time_info['minuteswest'] * 60;
|
|
|
|
//Is $day a number of days before or after current date?
|
|
if ($day != 0)
|
|
$now += $day * 86400;
|
|
|
|
$then = $now + 86400;
|
|
$terms[] = "(dateUTC >= $now AND dateUTC < $then)";
|
|
}
|
|
|
|
if ($category > 0)
|
|
$terms[] = "category = ".$category."";
|
|
|
|
$type = array();
|
|
if ($flags & 16777216) //IncludePG (1 << 24)
|
|
$type[] = "eventflags = 0";
|
|
if ($flags & 33554432) //IncludeMature (1 << 25)
|
|
$type[] = "eventflags = 1";
|
|
if ($flags & 67108864) //IncludeAdult (1 << 26)
|
|
$type[] = "eventflags = 2";
|
|
|
|
//Was there at least one PG, Mature, or Adult flag?
|
|
if (count($type) > 0)
|
|
$terms[] = join_terms(" OR ", $type, True);
|
|
|
|
if ($search_text != "")
|
|
{
|
|
$search_text = mysql_real_escape_string($search_text);
|
|
$terms[] = "(name LIKE '%$search_text%' OR " .
|
|
"description LIKE '%$search_text%')";
|
|
}
|
|
|
|
if (count($terms) > 0)
|
|
$where = " WHERE " . join_terms(" AND ", $terms, False);
|
|
else
|
|
$where = "";
|
|
|
|
$sql = "SELECT owneruuid,name,eventid,dateUTC,eventflags,globalPos FROM events". $where.
|
|
" LIMIT " . mysql_real_escape_string($query_start) . ",101";
|
|
|
|
$result = mysql_query($sql);
|
|
|
|
$data = array();
|
|
|
|
while (($row = mysql_fetch_assoc($result)))
|
|
{
|
|
$date = strftime("%m/%d %I:%M %p",$row["dateUTC"]);
|
|
|
|
//The landing point is only needed when this event query is
|
|
//called to allow placement of event markers on the world map.
|
|
$data[] = array(
|
|
"owner_id" => $row["owneruuid"],
|
|
"name" => $row["name"],
|
|
"event_id" => $row["eventid"],
|
|
"date" => $date,
|
|
"unix_time" => $row["dateUTC"],
|
|
"event_flags" => $row["eventflags"],
|
|
"landing_point" => $row["globalPos"]);
|
|
}
|
|
|
|
$response_xml = xmlrpc_encode(array(
|
|
'success' => True,
|
|
'errorMessage' => "",
|
|
'data' => $data));
|
|
|
|
print $response_xml;
|
|
}
|
|
|
|
#
|
|
# Classifieds Query
|
|
#
|
|
|
|
xmlrpc_server_register_method($xmlrpc_server, "dir_classified_query",
|
|
"dir_classified_query");
|
|
|
|
function dir_classified_query ($method_name, $params, $app_data)
|
|
{
|
|
$req = $params[0];
|
|
|
|
$text = $req['text'];
|
|
$flags = $req['flags'];
|
|
$category = $req['category'];
|
|
$query_start = $req['query_start'];
|
|
|
|
if ($text == "%%%")
|
|
{
|
|
$response_xml = xmlrpc_encode(array(
|
|
'success' => False,
|
|
'errorMessage' => "Invalid search terms"
|
|
));
|
|
|
|
print $response_xml;
|
|
|
|
return;
|
|
}
|
|
|
|
$terms = array();
|
|
|
|
//Renew Weekly flag is bit 5 (32) in $flags.
|
|
$f = array();
|
|
if ($flags & 4) //PG (1 << 2)
|
|
$f[] = "classifiedflags & 4 = 4";
|
|
if ($flags & 8) //Mature (1 << 3)
|
|
$f[] = "classifiedflags & 8 = 8";
|
|
if ($flags & 64) //Adult (1 << 6)
|
|
$f[] = "classifiedflags & 64 = 64";
|
|
|
|
//Was there at least one PG, Mature, or Adult flag?
|
|
if (count($f) > 0)
|
|
$terms[] = join_terms(" OR ", $f, True);
|
|
|
|
//Only restrict results based on category if it is not 0 (Any Category)
|
|
if ($category > 0)
|
|
$terms[] = "category = " . $category;
|
|
|
|
if ($text != "")
|
|
$terms[] = "(name LIKE '%$text%'" .
|
|
" OR description LIKE '%$text%')";
|
|
|
|
//Was there at least condition for the search?
|
|
if (count($terms) > 0)
|
|
$where = " WHERE " . join_terms(" AND ", $terms, False);
|
|
else
|
|
$where = "";
|
|
|
|
$sql = "SELECT * FROM classifieds" . $where .
|
|
" ORDER BY priceforlisting DESC" .
|
|
" LIMIT " . mysql_real_escape_string($query_start) . ",101";
|
|
|
|
$result = mysql_query($sql);
|
|
|
|
$data = array();
|
|
while (($row = mysql_fetch_assoc($result)))
|
|
{
|
|
$data[] = array(
|
|
"classifiedid" => $row["classifieduuid"],
|
|
"name" => $row["name"],
|
|
"classifiedflags" => $row["classifiedflags"],
|
|
"creation_date" => $row["creationdate"],
|
|
"expiration_date" => $row["expirationdate"],
|
|
"priceforlisting" => $row["priceforlisting"]);
|
|
}
|
|
|
|
$response_xml = xmlrpc_encode(array(
|
|
'success' => True,
|
|
'errorMessage' => "",
|
|
'data' => $data));
|
|
|
|
print $response_xml;
|
|
}
|
|
|
|
#
|
|
# Events Info Query
|
|
#
|
|
|
|
xmlrpc_server_register_method($xmlrpc_server, "event_info_query",
|
|
"event_info_query");
|
|
|
|
function event_info_query($method_name, $params, $app_data)
|
|
{
|
|
$req = $params[0];
|
|
|
|
$eventID = $req['eventID'];
|
|
|
|
$sql = "SELECT * FROM events WHERE eventID = " .
|
|
mysql_real_escape_string($eventID);
|
|
|
|
$result = mysql_query($sql);
|
|
|
|
$data = array();
|
|
while (($row = mysql_fetch_assoc($result)))
|
|
{
|
|
$date = strftime("%G-%m-%d %H:%M:%S",$row["dateUTC"]);
|
|
|
|
$category = "*Unspecified*";
|
|
if ($row['category'] == 18) $category = "Discussion";
|
|
if ($row['category'] == 19) $category = "Sports";
|
|
if ($row['category'] == 20) $category = "Live Music";
|
|
if ($row['category'] == 22) $category = "Commercial";
|
|
if ($row['category'] == 23) $category = "Nightlife/Entertainment";
|
|
if ($row['category'] == 24) $category = "Games/Contests";
|
|
if ($row['category'] == 25) $category = "Pageants";
|
|
if ($row['category'] == 26) $category = "Education";
|
|
if ($row['category'] == 27) $category = "Arts and Culture";
|
|
if ($row['category'] == 28) $category = "Charity/Support Groups";
|
|
if ($row['category'] == 29) $category = "Miscellaneous";
|
|
|
|
$data[] = array(
|
|
"event_id" => $row["eventid"],
|
|
"creator" => $row["creatoruuid"],
|
|
"name" => $row["name"],
|
|
"category" => $category,
|
|
"description" => $row["description"],
|
|
"date" => $date,
|
|
"dateUTC" => $row["dateUTC"],
|
|
"duration" => $row["duration"],
|
|
"covercharge" => $row["covercharge"],
|
|
"coveramount" => $row["coveramount"],
|
|
"simname" => $row["simname"],
|
|
"globalposition" => $row["globalPos"],
|
|
"eventflags" => $row["eventflags"]);
|
|
}
|
|
|
|
$response_xml = xmlrpc_encode(array(
|
|
'success' => True,
|
|
'errorMessage' => "",
|
|
'data' => $data));
|
|
|
|
print $response_xml;
|
|
}
|
|
|
|
#
|
|
# Classifieds Info Query
|
|
#
|
|
|
|
xmlrpc_server_register_method($xmlrpc_server, "classifieds_info_query",
|
|
"classifieds_info_query");
|
|
|
|
function classifieds_info_query($method_name, $params, $app_data)
|
|
{
|
|
$req = $params[0];
|
|
|
|
$classifiedID = $req['classifiedID'];
|
|
|
|
$sql = "SELECT * FROM classifieds WHERE classifieduuid = '" .
|
|
mysql_real_escape_string($classifiedID). "'";
|
|
|
|
$result = mysql_query($sql);
|
|
|
|
$data = array();
|
|
while (($row = mysql_fetch_assoc($result)))
|
|
{
|
|
$data[] = array(
|
|
"classifieduuid" => $row["classifieduuid"],
|
|
"creatoruuid" => $row["creatoruuid"],
|
|
"creationdate" => $row["creationdate"],
|
|
"expirationdate" => $row["expirationdate"],
|
|
"category" => $row["category"],
|
|
"name" => $row["name"],
|
|
"description" => $row["description"],
|
|
"parceluuid" => $row["parceluuid"],
|
|
"parentestate" => $row["parentestate"],
|
|
"snapshotuuid" => $row["snapshotuuid"],
|
|
"simname" => $row["simname"],
|
|
"posglobal" => $row["posglobal"],
|
|
"parcelname" => $row["parcelname"],
|
|
"classifiedflags" => $row["classifiedflags"],
|
|
"priceforlisting" => $row["priceforlisting"]);
|
|
}
|
|
|
|
$response_xml = xmlrpc_encode(array(
|
|
'success' => True,
|
|
'errorMessage' => "",
|
|
'data' => $data));
|
|
|
|
print $response_xml;
|
|
}
|
|
|
|
#
|
|
# Process the request
|
|
#
|
|
|
|
$request_xml = file_get_contents("php://input");
|
|
xmlrpc_server_call_method($xmlrpc_server, $request_xml, '');
|
|
xmlrpc_server_destroy($xmlrpc_server);
|
|
?>
|