W-Hat.com provides a couple of useful services for LSL developers:
In the past, we also offered:
The group became inactive and faded into obscurity as its members grew up. In 2011 the owner of the group and land was quietly banned from Second Life.
Some of us still hang out in #sl on irc.synirc.net, but almost
nobody still plays Second Life.
Yes, please do. Everything on this site is free and open source and all the services are free to use and abuse in any manner you see fit.
masa@w-hat.com
Watch this space for a zip.
Enter as many names as you want, separated by anything other than spaces or periods.
Paste keys in this box to add them to the database. Formatting and extraneous text don't matter; anything that doesn't look like a UUID will be ignored.
Looks up a name. <name> may be in user.name or resident name format. If the name is found, returns status 200 and the UUID. If it is not found, returns status 404 and NULL_KEY.
| Request | Response | ||
|---|---|---|---|
| Method | URL | Status | Body |
| GET | /name2key/Masakazu%20Kojima | 200 | a27b84f0-2757-4176-9579-43a181d4a5a0 |
| GET | /name2key/goVeRnoR.linDEN | 200 | 3d6181b0-6a4b-97ef-18d8-722652995cf1 |
| GET | /name2key/a | 404 | 00000000-0000-0000-0000-000000000000 |
| GET | /name2key/username.a.a.a | 400 | Invalid name |
Looks up multiple names at once. <names> should be a list of up to 50 names in user.name or resident name format separated by anything that is unambiguous. Returns status 200 and a list of names exactly as input and corresponding UUIDs separated by newlines. If a key was not found the UUID will be NULL_KEY.
| Request | Response | ||
|---|---|---|---|
| Method | URL | Status | Body |
| GET | /name2key?names=Masakazu%20Kojima,governor.linden,username,a | 200 | Masakazu Kojima a27b84f0-2757-4176-9579-43a181d4a5a0 governor.linden 3d6181b0-6a4b-97ef-18d8-722652995cf1 username 3223a4e4-01c6-44f8-9aa1-df790e02aa93 a 00000000-0000-0000-0000-000000000000 |
| GET | /name2key/?names=username.a.a.a | 200 | username.a 00000000-0000-0000-0000-000000000000 a.a 00000000-0000-0000-0000-000000000000 |
Look up a UUID. If found, returns 200 and the name in canonical user.name format. If not found, returns 404 and an empty string. Note this may attempt to resolve keys via world.secondlife.com and in-world search and may wait up to 60 seconds before returning a negative response.
| Request | Response | ||
|---|---|---|---|
| Method | URL | Status | Body |
| GET | /key2name/a27b84f0-2757-4176-9579-43a181d4a5a0 | 200 | masakazu.kojima |
| GET | /key2name/3223a4e4-01c6-44f8-9aa1-df790e02aa93 | 200 | username |
| GET | /key2name/a27b84f0-2757-4176-9579-43a181d4a5a1 | 404 | |
| GET | /key2name/a27b84f0-2757-4176-9579-43a181d4a5a | 404 | (undefined) |
Add keys to the database. The request body should contain one or more UUIDs separated by anything (or nothing). Keys will be queued up for resolution and an estimate of the number of new keys will be returned. Always returns status 200.
Add keys to the database. <keys> should contain one or more UUIDs separated by anything (or nothing). Keys will be queued up for resolution and an estimate of the number of new keys will be returned. Always returns status 200. This API only exists to preserve compatibility with older scripts, and should not be used in new scripts.
Looks up a name in the database or SL search. Name may be in user.name or resident name format. If the name is found, returns status 200 and the UUID. If it is not found, returns status 200 and NULL_KEY. When terse=1 is not specified, result UUIDs will be prefixed by the name exactly the same as input, and the string "None found" will be returned instead of NULL_KEY. This API only exists to preserve compatibility with older scripts, and should not be used in new scripts.
| Request | Response | ||
|---|---|---|---|
| Method | URL | Status | Body |
| GET | /name2key?name=Masakazu%20Kojima | 200 | Masakazu Kojima a27b84f0-2757-4176-9579-43a181d4a5a0 |
| GET | /name2key/?name=goVeRnoR.linDEN | 200 | goVeRnoR.linDEN 3d6181b0-6a4b-97ef-18d8-722652995cf1 |
| GET | /name2key/?name=goVeRnoR.linDEN&terse=1 | 200 | 3d6181b0-6a4b-97ef-18d8-722652995cf1 |
| POST | /name2key/?name=a | 200 | None found |
| POST | /name2key/?name=a&terse=1 | 200 | 00000000-0000-0000-0000-000000000000 |
string NAME = "Masakazu Kojima"; // name to look up
string URL = "http://w-hat.com/name2key"; // name2key url
key reqid; // http request id
default {
state_entry() {
reqid = llHTTPRequest( URL + "/" + llEscapeURL(NAME), [], "" );
}
http_response(key id, integer status, list meta, string body) {
if ( id != reqid )
return;
if ( status == 499 )
llOwnerSay("name2key request timed out");
else if ( status == 400 )
llOwnerSay("Invalid name: " + NAME);
else if ( status == 404 )
llOwnerSay("No key found for " + NAME);
else if ( status != 200 )
llOwnerSay("the internet exploded!!");
else
llOwnerSay(NAME + "'s key is: " + body );
}
}
There is no reason to worry about somebody else having your key. It is not a secret, it is just an identifier that LSL scripts use to interact with you.
Since Second Life introduced usernames, the concept of what a name is has gotten complicated. The service understands four types of names:
Resident Names are the original format. Everybody has a first and last name, separated by a space. Accounts created after the switch to usernames have the last name Resident. Examples: Masakazu Kojima, Governor Linden, Username Resident
Usernames are the new format. The first and last name are separated by a period (.), and the last name is optional if it is "resident". "username.resident" and "username" are equivalent. Examples: Masakazu.Kojima, governor.linden, username.resident, username
Canonical usernames are what this database stores. They are the same as usernames, exept they are always lowercase, and anything that can be omitted is. "username.resident" is not a valid canonical name. Examples: masakazu.kojima, governor.linden, username
A display name is freeform text that can be entered by a user and is displayed instead of their username. This is used in search results and profile pages. The actual account name is always appended in parentheses. Examples: Governor Linden (masakazu.kojima), Plastic Duck (username)
These files are updated daily at 08:00 UTC. Names are in Title Case resident name format, and the file is sorted by UUID.
lslint is a tool to check the syntactic and semantic validity of Second Life LSL scripts.
Please see the github page.
Unfortunately, this feature is no longer available.
API documentation is a work-in-progress and the web interface is currently unavailable. They will be restored as soon as possible.
httpdb provides free, persistent, off-site storage for Second Life LSL scripts via llHTTPRequest. You can store up to 250kb of data in the form of key/value pairs, and read or write the data from any script. You can share your data with other users, protect it with passwords, browse and manage your data on the web, and download backups.
There is no need to register to use httpdb, you can just start saving and retrieving data at any time.
If 250kb is not enough for your purposes, you can request more by emailing masa@w-hat.com. You are also welcome to use multiple accounts to store your data.
Retrieve a record stored in HTTPDB.
| start|s | Drop specified number of leading bytes from the response. |
|---|---|
| password|p | The password required to access this record. |
| Request | Response | ||
|---|---|---|---|
| Method | URL | Status | Body |
| GET | /httpdb/blah | 404 | |
| GET | /httpdb/some/path | 200 | some data |
| GET | /httpdb/some/path?s=2 | 200 | me data |
| GET | /httpdb/protected | 403 | |
| GET | /httpdb/protected?password=secret | 200 | top secret data |
List all stored paths starting with specified prefix.
| start|s | Drop specified number of leading bytes from the response. |
|---|
| Request | Response | ||
|---|---|---|---|
| Method | URL | Status | Body |
| GET | /httpdb/hello?mode=list | 200 | |
| GET | /httpdb/user_?mode=list | 200 | user_1 user_2 |
| GET | /httpdb/user_?mode=list&start=4 | 200 | _1 user_2 |
Create or overwrite a record in HTTPDB.
| mode|m | How to handle existing data. No effect when creating new record.
|
|---|---|
| password|p | The password required to update this record. TODO: explain |
| read_password|readpass|rp | A password that will be required to read this record in the future. If the record already exists, setting this requires admin permission. |
| write_password|writepass|wp | A password that will be required to write to this record in the future. If the record already exists, setting this requires admin permission. |
| Request | Response | |||
|---|---|---|---|---|
| Method | URL | Body | Status | Body |
| PUT | /httpdb/test | Hello | 201 | 249995 |
| PUT | /httpdb/test?mode=append | World | 200 | 249989 |
Delete a record in HTTPDB.
| password|p | The password required to update this record. TODO: explain |
|---|
| Request | Response | ||
|---|---|---|---|
| Method | URL | Status | Body |
| DELETE | /httpdb/test | 200 | 250000 |
| DELETE | /httpdb/test | 404 | |
Change the read and/or write password on a record.
| password|p | Current admin password for owner of record. |
|---|---|
| read_password|readpass|rp | New password to require for future reads of record. |
| write_password|writepass|wp | New password to require for future writes to record. |
| Request | Response | ||
|---|---|---|---|
| Method | URL | Status | Body |
| POST | /httpdb/test?wp=write | 403 | |
| POST | /httpdb/test?wp=write&p=admin | 200 | |
Get remaining free space.
Get count of space used.
Get total space allocated to you.