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
postcards.zip 5779 files, 1.0 GB
It took 15 years, and almost another before we noticed, but LSL finally has llName2Key and llRequestUserKey. They were added about the same time our site was blocked grid-wide last year. Coincidence?
Back in 2005 when our database started, name2key was a hotly debated issue. People were losing their minds even over "responsible" databases with opt-out features. And 'lo the brave hero W-Hat proclaimed "wait, we are the bad guys, and we already have your key, and the world's not ending??", and it was good. And also terrible, and slow, and outdated, and smaller than what's-her-face's, and always missing that one key you really needed, and anyway I heard those w-hatters all got banned so their site is probably going away any day now.
Our traffic from in-world is still growing and we have no plans to shut down, but we are looking for a volunteer to run some new in-world resolvers since I'm still banned forever. Please tweet @www_hat or email masa@w-hat.com.
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.
Releases and source are available on Makopoppo's GitHub.
Unfortunately, this feature is no longer available.
Please reach out via twitter or email if you are currently using or considering httpdb.
API documentation is a work-in-progress and the web interface is currently unavailable.
They will be restored as soon as possible probably not be back.
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.