CommonLSL/functions.lsl

433 lines
No EOL
11 KiB
Text

string DecipherService(string payload, string ident)
{
if(llJsonValueType(payload,[ident]) == JSON_INVALID)
{
return "";
}
return llJsonGetValue(payload, [ident,"protocol"]) + "://" + llJsonGetValue(payload,[ident,"host"]) + ":" + llJsonGetValue(payload,[ident,"port"]);
}
ReadAPIServer(string payload) {
API_SERVER = DecipherService(payload, "api" ) + "/zni";
}
initBasicSupport()
{
g_lSupport = [RED_QUEEN, R_ADMIN|R_DEVELOPER|R_SUPPORT,
ARIA, R_ADMIN|R_DEVELOPER|R_SUPPORT
];
}
integer checkSupportUser(key kID, integer minAccessRights)
{
integer iIndex=llListFindList(g_lSupport, [(string)kID]);
if(iIndex!=-1)
{
integer iMask = (integer)llList2String(g_lSupport, iIndex+1);
if(iMask & minAccessRights)
{
return TRUE;
}else return FALSE;
}
return FALSE;
}
checkSupport()
{
UpdateDSRequest(NULL, llHTTPRequest(API_SERVER + "/Get_Support.php", [], ""), SetDSMeta(["get_support"]));
}
parseSupport(string sValue) {
list lParse = llParseString2List(sValue, [";;", ";"], []);
g_lSupport = llParseString2List(llList2String(lParse,1), ["~"], []);
}
string MakeTimeNotation(integer iSec)
{
integer iDifference = iSec;
integer Days = iDifference/ONE_DAY;
iDifference -= (ONE_DAY*Days);
integer Hours = iDifference/60/60;
iDifference -= (Hours*60*60);
integer Minutes = iDifference/60;
iDifference -= (Minutes*60);
list lItem = [Days,"d", Hours, "h", Minutes, "m", iDifference, "s"];
return llDumpList2String(lItem, "");
}
string MakeTimeNotationFloated(float iSec)
{
float iDifference = iSec;
integer Days = llRound(iDifference/ONE_DAY);
iDifference -= (ONE_DAY*Days);
integer Hours = llRound(iDifference/60/60);
iDifference -= (Hours*60*60);
integer Minutes = llRound(iDifference/60);
iDifference -= (Minutes*60);
list lItem = [Days,"d", Hours, "h", Minutes, "m", llRound(iDifference), "s", llRound((iDifference - llRound(iDifference))*1000), "ms"];
return llDumpList2String(lItem, "");
}
// Returns in the same format as Make: Days, Hours, Minutes, Seconds, TotalSeconds
list ParseTimeNotation(string sNotation)
{
integer Days;
integer Hours;
integer Minutes;
integer Seconds;
integer TotalSec;
list lTmp = llParseString2List(llToLower(sNotation), [], ["d", "h", "m", "s"]);
integer i = 0;
integer end = llGetListLength(lTmp);
for(i=0;i<end;i+=2)
{
string sNote = llList2String(lTmp,i+1);
integer iSeg = (integer)llList2String(lTmp,i);
switch(sNote)
{
case "d":
{
Days = iSeg;
break;
}
case "h":
{
Hours = iSeg;
break;
}
case "m":
{
Minutes=iSeg;
break;
}
case "s":
{
Seconds = iSeg;
break;
}
}
}
TotalSec += Seconds;
TotalSec += (Minutes*60);
TotalSec += (Hours*(60*60));
TotalSec += (Days*((60*60)*24));
return [Days, Hours, Minutes, Seconds, TotalSec];
}
key decodeAvatarInput(string sInput, string sExtra)
{
if(IsLikelyAvatarID(sInput))
{
return (key)sInput;
}else {
list lParts = llParseString2List(sInput, ["/"],[]);
if(llList2String(lParts,0) == "secondlife:")
{
return (key)llList2String(lParts,3);
}else {
UpdateDSRequest(NULL_KEY, llRequestUserKey(sInput), SetDSMeta(["decodeAvatar", sInput, sExtra]));
return NULL_KEY;
}
}
}
string ToBinary(integer num)
{
integer i = 0;
integer end = 16;
string sStr = "";
for(i=0;i<end;i++)
{
if(num & 1)sStr = "1" + sStr;
else sStr = "0" + sStr;
num = num >> 1;
}
return sStr;
}
integer IsLikelyUUID(string sID)
{
if(sID == (string)NULL_KEY)return TRUE;
if(llStringLength(sID)==32)return TRUE;
key kID = (key)sID;
if(kID)return TRUE;
if(llStringLength(sID) >25){
if(llGetSubString(sID,8,8)=="-" && llGetSubString(sID, 13,13) == "-" && llGetSubString(sID,18,18) == "-" && llGetSubString(sID,23,23)=="-") return TRUE;
}
return FALSE;
}
integer IsLikelyAvatarID(key kID)
{
if(!IsLikelyUUID(kID))return FALSE;
// Avatar UUIDs always have the 15th digit set to a 4
if(llGetSubString(kID,8,8) == "-" && llGetSubString(kID,14,14)=="4")return TRUE;
return FALSE;
}
integer IsListOfIDs(list lIDs)
{
integer i=0;
integer end = llGetListLength(lIDs);
for(i=0;i<end;i++){
if(IsLikelyUUID(llList2String(lIDs,i)))return TRUE;
}
return FALSE;
}
integer bool(integer a){
if(a)return TRUE;
else return FALSE;
}
string Checkbox(integer iValue, string sLabel) {
return llList2String(g_lCheckboxes, bool(iValue))+" "+sLabel;
}
string sSetor(integer a, string b, string c)
{
if(a)return b;
else return c;
}
key kSetor(integer a, key b, key c)
{
if(a)return b;
else return c;
}
integer iSetor(integer a, integer b, integer c)
{
if(a)return b;
else return c;
}
vector vSetor(integer a, vector b, vector c)
{
if(a)return b;
else return c;
}
list lSetor(integer a,list b, list c)
{
if(a)return b;
else return c;
}
string List2TypeList(list input) { // converts a list to a CSV string with type information prepended to each item
integer i;
list output;
integer len;
len=llGetListLength(input); //this can shave seconds off long lists
for (i = 0; i < len; i++) {
output += [llGetListEntryType(input, i)] + [llStringToBase64(llList2String(input, i))];
}
return llDumpList2String(output,"^^^");
}
list TypeList2List(string inputstring) { // converts a CSV string created with List2TypeCSV back to a list with the correct type information
integer i;
list input;
list output;
integer len;
input = llParseString2List(inputstring, ["^^^"],[]);
len=llGetListLength(input);
for (i = 0; i < len; i += 2) {
if (llList2Integer(input, i) == TYPE_INTEGER) output += (integer)llBase64ToString(llList2String(input, i + 1));
else if (llList2Integer(input, i) == TYPE_FLOAT) output += (float)llList2String(input, i + 1);
else if (llList2Integer(input, i) == TYPE_STRING) output += llBase64ToString(llList2String(input, i + 1));
else if (llList2Integer(input, i) == TYPE_KEY) output += (key)llBase64ToString(llList2String(input, i + 1));
else if (llList2Integer(input, i) == TYPE_VECTOR) output += (vector)llBase64ToString(llList2String(input, i + 1));
else if (llList2Integer(input, i) == TYPE_ROTATION) output += (rotation)llBase64ToString(llList2String(input, i + 1));
}
return output;
}
string Uncheckbox(string sLabel)
{
integer iBoxLen = 1+llStringLength(llList2String(g_lCheckboxes,0));
return llGetSubString(sLabel,iBoxLen,-1);
}
string SLURL(key kID){
return "secondlife:///app/agent/"+(string)kID+"/about";
}
string OSLURL(key kID)
{
return llKey2Name(kID); // TODO: Replace with a SLURL of some kind pointing to the object inspect.
}
list StrideOfList(list src, integer stride, integer start, integer end)
{
list l = [];
integer ll = llGetListLength(src);
if(start < 0)start += ll;
if(end < 0)end += ll;
if(end < start) return llList2List(src, start, start);
while(start <= end)
{
l += llList2List(src, start, start);
start += stride;
}
return l;
}
string tf(integer a){
if(a)return "true";
return "false";
}
UpdateDSRequest(key orig, key new, string meta){
if(orig == NULL){
g_lDSRequests += [new,meta];
}else {
integer index = HasDSRequest(orig);
if(index==-1)return;
else{
g_lDSRequests = llListReplaceList(g_lDSRequests, [new,meta], index,index+1);
}
}
}
string GetDSMeta(key id){
integer index=llListFindList(g_lDSRequests,[id]);
if(index==-1){
return "N/A";
}else{
return llList2String(g_lDSRequests,index+1);
}
}
integer HasDSRequest(key ID){
return llListFindList(g_lDSRequests, [ID]);
}
DeleteDSReq(key ID){
if(HasDSRequest(ID)!=-1)
g_lDSRequests = llDeleteSubList(g_lDSRequests, HasDSRequest(ID), HasDSRequest(ID)+1);
else return;
}
string MkMeta(list lTmp){
return llDumpList2String(lTmp, ":");
}
string SetMetaList(list lTmp){
return llDumpList2String(lTmp, ":");
}
string SetDSMeta(list lTmp){
return llDumpList2String(lTmp, ":");
}
list GetMetaList(key kID){
return llParseStringKeepNulls(GetDSMeta(kID), [":"],[]);
}
string int2Perms(integer perm)
{
integer fullPerms = PERM_COPY | PERM_MODIFY | PERM_TRANSFER;
integer copyModPerms = PERM_COPY | PERM_MODIFY;
integer copyTransPerms = PERM_COPY | PERM_TRANSFER;
integer modTransPerms = PERM_MODIFY | PERM_TRANSFER;
string output = "";
if ((perm & fullPerms) == fullPerms)
output += "full";
else if ((perm & copyModPerms) == copyModPerms)
output += "copy & modify";
else if ((perm & copyTransPerms) == copyTransPerms)
output += "copy & transfer";
else if ((perm & modTransPerms) == modTransPerms)
output += "modify & transfer";
else if ((perm & PERM_COPY) == PERM_COPY)
output += "copy";
else if ((perm & PERM_TRANSFER) == PERM_TRANSFER)
output += "transfer";
else
output += "none";
return output;
}
string inv2Perms(string inventory, integer iMask)
{
integer perm = llGetInventoryPermMask(inventory,iMask);
integer fullPerms = PERM_COPY | PERM_MODIFY | PERM_TRANSFER;
integer copyModPerms = PERM_COPY | PERM_MODIFY;
integer copyTransPerms = PERM_COPY | PERM_TRANSFER;
integer modTransPerms = PERM_MODIFY | PERM_TRANSFER;
string output = "";
if ((perm & fullPerms) == fullPerms)
output += "full";
else if ((perm & copyModPerms) == copyModPerms)
output += "copy & modify";
else if ((perm & copyTransPerms) == copyTransPerms)
output += "copy & transfer";
else if ((perm & modTransPerms) == modTransPerms)
output += "modify & transfer";
else if ((perm & PERM_COPY) == PERM_COPY)
output += "copy";
else if ((perm & PERM_TRANSFER) == PERM_TRANSFER)
output += "transfer";
else
output += "none";
return output;
}
/*
Usage: i = mask (SET, i, BITMASK)
i = mask (FALSE, i, BITMASK)
*/
integer mask(integer states, integer source, integer mask)
{
if(states==TOGGLE)
{
return source ^ mask;
}
if(states)
{
source = source | mask;
return source;
}else {
source = source &~ mask;
return source;
}
}
string stripMetatags(string sInput)
{
list lTmp = llParseString2List(sInput,[], ["<",">"]);
integer iIndex = llListFindList(lTmp,[">"]);
while(iIndex!=-1){
lTmp = llDeleteSubList(lTmp, iIndex-2, iIndex);
iIndex=llListFindList(lTmp,[">"]);
}
return llDumpList2String(lTmp, "");
}
integer timeAsSeconds(string sInput)
{
// Converts a string like 02:00 into its seconds equivalent (ie. 120)
list lTmp = llParseString2List(stripMetatags(sInput), [":"],[]);
integer iMin = (integer)llList2String(lTmp,0);
integer iSec = (integer)llList2String(lTmp,1);
return (iSec+(iMin*60));
}