roblonium-web/Hexine/api/global_functions.php

676 lines
19 KiB
PHP

<?php
require $_SERVER["DOCUMENT_ROOT"] . '/Hexine/api/private/register.php';
//TODO: Rewrite the awful functions
// Base Website Functions
if (!function_exists('session_started')) {
function session_started() //Check if session has started or not
{
if ( php_sapi_name() !== 'cli' ) {
if ( version_compare(phpversion(), '5.4.0', '>=') ) {
return session_status() === PHP_SESSION_ACTIVE ? TRUE : FALSE;
} else {
return session_id() === '' ? FALSE : TRUE;
}
}
return FALSE;
}
}
// Alerts
if (!function_exists('alert')) {
function alert($text, $color) {
return('<div id="ctl00_Announcement"><div id="ctl00_SystemAlertDiv" class="SystemAlert" style="background-color:'.$color.';"><div id="ctl00_SystemAlertTextColor" class="SystemAlertText"><div id="ctl00_LabelAnnouncement">'.$text.'</div></div></div></div>');
}
}
// Overlays
if (!function_exists('overlayUrl')) {
function overlayUrl($overlay, $size = 1) {
$sizes = [0 => "small", 1 => "", 2 => "big"];
if ($size == 1)
{
return '/Images/Overlays/overlay_'.$overlay.'.png';
}
else
{
return '/Images/Overlays/overlay_'.$overlay.'_'.$sizes[$size].'.png';
}
}
function overlayUrlDependent($depVar, $overlay, $size)
{ //This probably won't be used anywhere else but the ItemImage api but idc.
if ($depVar == 1)
{
return overlayUrl($overlay, $size);
}
else
{
return 'null';
}
}
function membershipLevelToString($membershipLevel)
{
$membershipLevels = [0 => null, 1 => "BC", 2 => "TBC", 3 => "OBC"];
return $membershipLevels[$membershipLevel];
}
function MembershipLabel($mlevel, $size)
{
if (membershipLevelToString($mlevel) !== "None" and membershipLevelToString($mlevel) !== null)
{
return overlayUrl(membershipLevelToString($mlevel).'Only', $size);
}
else
{
return null;
}
}
}
// Assets/Catalog
if (!function_exists('assetTypeToString'))
{
// oi, this isn't so ugly anymore
function assetTypeToString($assetType)
{
$assetTypes =
[
1 => "Image",
2 => "T-Shirt",
3 => "Audio",
4 => "Mesh",
5 => "Lua",
6 => "HTML",
7 => "Text",
8 => "Hat",
9 => "Place",
10 => "Model",
11 => "Shirt",
12 => "Pants",
13 => "Decal",
16 => "Avatar",
17 => "Head",
18 => "Face",
19 => "Gear",
21 => "Badge",
22 => "Group Emblem",
24 => "Animation",
25 => "Arms",
26 => "Legs",
27 => "Torso",
28 => "Right Arm",
29 => "Left Arm",
30 => "Left Leg",
31 => "Right Leg",
32 => "Package",
33 => "YouTube Video",
34 => "Game Pass",
0 => "Product"
];
return $assetTypes[$assetType];
}
}
if (!function_exists('currencyTypeToString')) {
function currencyTypeToString($currencyType)
{
if ($currencyType == 2) {
return "Tix";
}
else
{
return "R$";
}
}
}
if (!function_exists('itemPrice'))
{
function itemPrice($asset, $sellerId)
{
$itemInf = ['expectedCurrency' => 1, 'expectedPrice' => 0];
if ($sellerId == $asset['Creator']['Id'])
{ //Selling to the creator
//Decide which currency to use
if ($asset['PriceInRobux'] == null and $asset['PriceInTickets'] !== null)
{
$itemInf['expectedCurrency'] = 2;
}
elseif ($asset['PriceInRobux'] !== null and $asset['PriceInTickets'] == null)
{
$itemInf['expectedCurrency'] = 1;
}
else
{
$itemInf['expectedCurrency'] = 1;
}
//Get item price
if ($itemInf['expectedCurrency'] == 1)
{
$itemInf['expectedPrice'] = (int)$asset['PriceInRobux'];
}
elseif ($itemInf['expectedCurrency'] == 2)
{
$itemInf['expectedPrice'] = (int)$asset['PriceInTickets'];
}
}
elseif (in_array($sellerId, $asset['Sellers']))
{ //Selling to a private seller
$itemInf['expectedCurrency'] = (int)$asset['Sellers'][$sellerId]['expectedCurrency'];
$itemInf['expectedPrice'] = (int)$asset['Sellers'][$sellerId]['expectedPrice'];
}
else
{
return false;
}
return $itemInf;
}
}
if(!class_exists('itemApi', true))
{
class itemApi
{
function GetMarketplaceFee($itemPrice)
{
$MarketplaceTaxRate = 0.9;
$minimumFee = 1;
$derivedFee = round($itemPrice * $MarketplaceTaxRate);
if ($derivedFee > $minimumFee)
$fee = $derivedFee;
else
$fee = $minimumFee;
return $fee;
}
function GetUserProfit($itemPrice)
{
global $itemApi;
if ($itemPrice <= 0 or $itemPrice == "0")
{
return 0;
}
else
{
return $itemPrice - $itemApi->GetMarketplaceFee($itemPrice);
}
}
function GetAssetInfo($id, $json = false, $rbxAsset = false) //this looks like ass - pizzaboxer
{
//The most optimized of its kind :/
//nvm I should really update this method
global $database;
if (!isset($database) or $database == null) {return "Error: Unable to communicate with database";};
$asset = $database->findRow("asset", ["AssetId" => $id], ["AssetTypeId"]);
if ($asset && $asset->rowCount() > 0 && $asset->rowCount() !== null)
{
$asset = $asset->fetch(PDO::FETCH_OBJ);
}
if ($asset->AssetTypeId == 9) {
$asset = $database->findRow("asset", ["AssetId" => $id], ["AssetId", "Name", "Description", "Created", "Updated", "IsPublicDomain", "MinimumMembershipLevel", "ContentRatingTypeId", "AssetTypeId", "CreatorId", "Favorited", "Visited", "MaxPlayers", "UpVotes", "DownVotes"]);
}
else
{
$asset = $database->findRow("asset", ["AssetId" => $id], ["AssetId", "Name", "Description", "Created", "Updated", "PriceInRobux", "PriceInTickets", "Sales", "IsForSale", "IsPublicDomain", "IsLimited", "IsLimitedUnique", "Remaining", "MinimumMembershipLevel", "ContentRatingTypeId", "AssetTypeId", "CreatorId"]); //Make sure these are all spelled correctly
}
if ($asset && $asset->rowCount() > 0 && $asset->rowCount() !== null)
{
$asset = $asset->fetch(PDO::FETCH_OBJ);
}
else
{
$asset = false;
}
if ($asset)
{
//Even more efficient :)
$user = $database->findRow("public_users", ["Id" => $asset->CreatorId], ["Id", "Name", "MembershipLevel"]);
if ($user && $user->rowCount() > 0){$user = $user->fetch(PDO::FETCH_OBJ);}
$asset->Creator =
[
'Id' => $asset->CreatorId,
'Name' => $user->Name,
'CreatorType' => 'User',
'CreatorTargetId' => $asset->CreatorId,
'MembershipLevel' => $user->MembershipLevel,
];
unset($asset->CreatorId);
$asset->ProductType = assetTypeToString($asset->AssetTypeId);
$asset->ThumbnailUrl = "/Game/Tools/ThumbnailAsset.ashx?aid=" . $id . "&fmt=png&wd=420&ht=420";
if(date('Y-m-d G:i:s') > date('Y-m-d G:i:s', strtotime("+1 days", strtotime($asset->Created))))
{
$asset->IsNew = 0;
}
else
{
$asset->IsNew = 1;
}
if ($asset->AssetTypeId !== 9)
{
//Support for legacy items
if ($asset->PriceInRobux == 0 and $asset->PriceInTickets > 0)
{
$asset->PriceInRobux = null;
}
elseif ($asset->PriceInRobux > 0 and $asset->PriceInTickets == 0)
{
$asset->PriceInTickets = null;
}
elseif ($asset->PriceInRobux > 0 and $asset->PriceInTickets > 0)
{
//No dual-currency options >:(
$asset->PriceInTickets = null;
}
}
if ($json == true)
{
$jsonData = json_encode($asset);
if ($jsonData == false)
{
return $json ? "Error: Failed to parse JSON" : false;
}
return $jsonData;
}
else
{
return (array) $asset;
}
}
else
{
if ($rbxAsset == true)
{
$info = json_decode(file_get_contents('http://api.roblox.com/Marketplace/ProductInfo?assetId='.$id), true);
if ($info['IconImageAssetId'] !== 0)
{
$info['ThumbnailUrl'] = 'https://roblox.com/Asset?id='.$info['IconImageAssetId'];
}
else
{
$info['ThumbnailUrl'] = "https://roblox.com/Game/Tools/ThumbnailAsset.ashx?aid=" . $id . "&fmt=png&wd=420&ht=420";
}
$info['ProductType'] = assetTypeToString($info['AssetTypeId']);
return $json ? json_encode($info) : $info;
}
return $json ? "Error: Asset info not found." : false;
}
}
}
$itemApi = new itemApi();
}
if (!function_exists('giveItem'))
{
function giveItem($userId, $assetId)
{
global $itemApi;
$database = $GLOBALS['database'];
$GLOBALS['Id'] = $userId;
$user = new UserInf();
/*$jsonData = file_get_contents("http://" . $_SERVER['SERVER_NAME'] . "/AssetInfo?id=".$assetId);
$asset = json_decode($jsonData,true);*/
$asset = $itemApi->GetAssetInfo($assetId);
if ($user->Inventory == "" or $user->Inventory == null or !isset($user->Inventory))
{ //Their inventory doesn't exist. It's ok to overwrite it.
$user->Inventory = '{"Inventory":[101]}'; //wait until the item transaction has finished to write to the database
$database->updateRow("asset", ["Sales" => $asset['Sales']+1], ["AssetId" => 101]); //update the sales on the Roblox hat
}
$inv = json_decode($user->Inventory, true);
if ($inv == false)
{
return false;
}
if ($user->Name == "Error" or substr(file_get_contents("http://" . $_SERVER['SERVER_NAME'] . "/AssetInfo?id=".$assetId),0,6) == "Error:" or in_array($assetId, $inv['Inventory']))
{
return false;
}
array_push($inv['Inventory'], $assetId); //Add the item to the user's inventory
$database->updateRow("public_users", ["Inventory" => json_encode($inv)], ["Id" => $userId]);
$database->updateRow("asset", ["Sales" => $asset['Sales']+1], ["AssetId" => $assetId]);
return true;
}
}
if (!function_exists('purchaseItem'))
{
function purchaseItem($userId, $assetId, $sellerId)
{ //this function is massive
$database = $GLOBALS['database'];
global $itemApi;
//$jsonData = file_get_contents("http://" . $_SERVER['SERVER_NAME'] . "/AssetInfo?id=".$assetId);
$asset = $itemApi->GetAssetInfo($assetId);
if ($asset === FALSE)
{
return "An error occurred while trying to fetch the requested item information.";
die();
}
//I really need a good way to tell if the item is coming from a seller
$itemInf = itemPrice($asset, $sellerId);
$expectedPrice = $itemInf['expectedPrice'];
$expectedCurrency = $itemInf['expectedCurrency'];
if (($userId == null and $userId !== 0) or ($sellerId == null and $sellerId !== 0) or ($expectedPrice == null and $expectedPrice !== 0) or ($expectedCurrency == null and $expectedCurrency !== 0) or !isset($expectedCurrency))
{
return "An error occurred while processing the transaction information.";
}
//oml
$userId = (int)$userId;
$assetId = (int)$assetId;
$sellerId = (int)$sellerId;
//$expectedPrice = (int)$expectedPrice;
$GLOBALS['Id'] = $userId;
$user = new UserInf();
$GLOBALS['Id'] = $sellerId;
$seller = new UserInf();
//return "Seller profit: ".GetUserProfit($expectedPrice);
//purchase enforcements
/*if ($expectedPrice !== $givenPrice or $expectedCurrency !== $givenCurrency) {
return 'While you were shopping, the price of this item changed from <span class="currency CurrencyColor'.$givenCurrency.'">'.$givenPrice.'</span> to <span class="currency CurrencyColor'.$expectedCurrency.'">'.$expectedPrice.'</span>.';
}*/
if ($asset['IsForSale'] !== "1" and $asset['IsForSale'] !== 1)
{ //asset isn't for sale
return "This item is no longer for sale.";
}
if ($user->MembershipLevel < $asset['MinimumMembershipLevel'])
{ //user doesn't meet required membership level
return "Your account doesn't meet the requirements to purchase this item.";
}
if ($user->Robux < $expectedPrice and $expectedCurrency == 1)
{ //user doesn't have enough Robux to purchase the item
return "You don't have enough Robux to purchase this item.";
}
if ($user->Tickets < $expectedPrice and $expectedCurrency == 2)
{ //user doesn't have enough Robux to purchase the item
return "You don't have enough Tix to purchase this item.";
}
if(($asset['IsLimited'] !== "0" or $asset['IsLimitedUnique'] !== "0") and $asset['Remaining'] <= 0)
{ //asset is limited and no copies remain
return "There are no more copies of this item remaining.";
}
if(in_array($assetId, json_decode($user->Inventory,true)['Inventory']))
{ //asset is limited and no copies remain
return "You already own this item.";
}
if ($sellerId !== (int)$asset['Creator']['Id'])
{//private seller
if ($expectedPrice !== (int)$asset['Sellers'][$sellerId]['expectedPrice'] or $expectedCurrency !== (int)$asset['Sellers'][$sellerId]['expectedCurrency'])
{
return "An error occurred while verifying the transaction with the seller.";
}
}
elseif ($expectedCurrency == 1)
{
if ($expectedPrice !== (int)$asset['PriceInRobux'] or ($asset['PriceInRobux'] == null and (int)$asset['PriceInRobux'] !== 0))
{
return "An error occurred while verifying the transaction of Robux.";
}
}
elseif ($expectedCurrency == 2)
{
if ($expectedPrice !== (int)$asset['PriceInTickets'] or ($asset['PriceInTickets'] == null and (int)$asset['PriceInTickets'] !== 0))
{
return "An error occurred while verifying the transaction of Tix.";
}
}
else
{
return "An unknown error occurred while verifying the transaction.";
}
if (giveItem($userId, $assetId) == true)
{ //the user has successfully received the item. now charge the user
$expectedProfit = $itemApi->GetUserProfit($expectedPrice);
if ($expectedCurrency == 1)
{ //expected currency is Robux
//user
$user->Robux = $user->Robux-$expectedPrice; //charge the user
$database->updateRow("public_users", ["Robux" => $user->Robux], ["Id" => $user->Id]);
//seller
$seller->Robux = $seller->Robux+$expectedProfit; //pay the seller
$database->updateRow("public_users", ["Robux" => $seller->Robux], ["Id" => $sellerId]);
}
elseif ($expectedCurrency == 2)
{ //expected currency is Tickets
//user
$user->Tickets = $user->Tickets-$expectedPrice; //charge the user
$database->updateRow("public_users", ["Tickets" => $user->Tickets], ["Id" => $user->Id]);
//seller
$seller->Tickets = $seller->Tickets+$expectedProfit; //pay the seller
$database->updateRow("public_users", ["Tickets" => $seller->Tickets], ["Id" => $sellerId]);
}
//store the user's owned items in a json array
//store an array of user ids who're selling the limited item in the database
//have the AssetInfo api implement this into its response for use by Item.ashx
//["1":{"sellerId": 1, "sellerName": "Brent Da Mage", "expectedPrice": 12, "expectedCurrency": 1}]
return "Success";
}
return "An error occurred while giving you your item. Your account has not been charged.";
}
}
$catName =
[
1 => 'All Categories',
0 => 'Featured',
2 => 'Collectibles',
3 => 'Clothing',
4 => 'Body Parts',
5 => 'Gear',
8 => 'Decals',
6 => 'Models',
9 => 'Audio',
7 => 'Plugins'
];
$catType =
[
1 => [0], //All Categories
0 => [0], //Featured (JSON list of featured assets' ids'.) (Now shows all categories)
2 => [0], //Collectibles
3 => [8,2,11,12,32], //Clothing
4 => [32,17,18], //Body Parts
5 => [19], //Gear
8 => [13], //Decals
6 => [10], //Models
9 => [3], //Audio
7 => [10] //Plugins (They're essentially models without thumbnails. They're just scripts.)
];
$catSubType =
[
0 => 0, //All Items
1 => 19, //Melee Weapon
2 => 19, //Ranged Weapon
3 => 19, //Explosive
4 => 19, //Power Up
5 => 19, //Navigation Enhancer
6 => 19, //Musical Instrument
7 => 19, //Social Item
8 => 19, //Building Tool
9 => 8, //Hats [Personal Transport]
10 => 18, //Faces
11 => 32, //Packages
12 => 11, //Shirts
13 => 2, //T-Shirts
14 => 12, //Pants
15 => 17 //Heads
];
$catSortType =
[
0 => 'AssetId', //Relevance
1 => 'AssetId', //Most Favorited
2 => 'Sales', //Bestselling
3 => 'Updated', //Recently updated
4 => 'PriceInRobux', //Price (Low to High)
5 => 'PriceInRobux' //Price (High to Low)
];
if (!function_exists('catManager'))
{
function catManager($cat, $subcat, $catType, $catSubType)
{
if ($subcat == 0)
{
$productType = $catType[$cat][0]; //returns the first item type in the array
}
else
{
$productType = $catSubType[$subcat]; //returns the product type for the set sub-category
}
return $productType;
}
}
//Thumbnails
$renderExclusions =
[ //All of these assets are excluded from 3D thumbnail rendering
1 => "Image",
//2 => "T-Shirt",
3 => "Audio",
5 => "Lua",
6 => "HTML",
7 => "Text",
//11 => "Shirt",
//12 => "Pants",
//13 => "Decal",
//18 => "Face",
21 => "Badge",
22 => "Group Emblem",
33 => "YouTube Video",
34 => "Game Pass",
0 => "Product"
];
$renderIcons =
[ //All of these asset types are given special thumbnails
3 => "/Thumbs/audio.png",
5 => "/Thumbs/Script.png",
6 => "/Thumbs/unknown.png",
7 => "/Thumbs/unknown.png",
33 => "/Thumbs/unknown.png",
0 => "/Thumbs/unknown.png"
];
$imageRenders =
[
1 => "Image",
//2 => "T-Shirt", //what's the worst that could happen?
//11 => "Shirt",
//12 => "Pants",
//13 => "Decal",
//18 => "Face",
21 => "Badge",
22 => "Group Emblem",
34 => "Game Pass"
];
$imageReliantAssetTypes =
[ //these need an image asset uploaded before the processed asset is uploaded dumbass
2 => "T-Shirt",
11 => "Shirt",
12 => "Pants",
13 => "Decal",
18 => "Face"
/*21 => "Badge",
22 => "Group Emblem",
34 => "Game Pass",*/
];
if (!function_exists('processAsset'))
{
function processAsset($assetTypeId, $params)
{
$robloxXMLHeader = '<roblox xmlns:xmime="http://www.w3.org/2005/05/xmlmime" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://www.roblox.com/roblox.xsd" version="4">
<External>null</External>
<External>nil</External>
';
$robloxXMLFooter = '
</roblox>';
$assetPresets = [
2 => ' <Item class="ShirtGraphic" referent="RBX0">
<Properties>
<Content name="Graphic">
<url>'.$params[0].'</url>
</Content>
<string name="Name">Shirt Graphic</string>
<bool name="archivable">true</bool>
</Properties>
</Item>',
11 => ' <Item class="Shirt" referent="RBX0">
<Properties>
<Content name="ShirtTemplate">
<url>'.$params[0].'</url>
</Content>
<string name="Name">Shirt</string>
<bool name="archivable">true</bool>
</Properties>
</Item>',
12 => ' <Item class="Pants" referent="RBX0">
<Properties>
<Content name="PantsTemplate">
<url>'.$params[0].'</url>
</Content>
<string name="Name">Pants</string>
<bool name="archivable">true</bool>
</Properties>
</Item>',
13 => ' <Item class="Decal" referent="RBX0">
<Properties>
<token name="Face">5</token>
<string name="Name">Decal</string>
<float name="Shiny">20</float>
<float name="Specular">0</float>
<Content name="Texture">
<url>'.$params[0].'</url>
</Content>
<bool name="archivable">true</bool>
</Properties>
</Item>',
18 => ' <Item class="Decal" referent="RBX0">
<Properties>
<token name="Face">5</token>
<string name="Name">face</string>
<float name="Shiny">20</float>
<float name="Specular">0</float>
<Content name="Texture"><url>'.$params[0].'</url></Content>
<bool name="archivable">true</bool>
</Properties>
</Item>'
];
if (isset($assetPresets[$assetTypeId]))
{
return $robloxXMLHeader.$assetPresets[$assetTypeId].$robloxXMLFooter;
}
return false;
}
}