- easy configuration
- dialogs with extended station descriptions, prev & next pages
- chat commands (change station, list current chunk, list all, prev & next chunks)
Four files:
radio script
README
stations-short
Use of Dianne's Radio
Enjoy, and let me know of any bugs, custom work you want me to do, etc.
Bucky Barkley
-- radio script:
CODE
// -- Bucky's Radio - 2.6.4
// an update/expansion of an earlier script
// Bucky.Barkley@gmail.com - August 2006
// based on...
//=======Land Radio Script =======
//
// assembled for this purpose by
// sky Honey and Dianne Mechanique
// based on the work of others
//
//===========9/12/05==============
// which notecard would you like to use?
string _notecard = "stations-short";
integer chatChannel = 77;
string HELP_MSG = "touch for station dialog, or use ch 77 to change stations (example \"/77 3\")";
list _radioURLs;
list _radioStations;
list theStations;
integer _linenum = 0;
integer curStationOffset = 0;
integer stationChunk = 6;
integer curStationEnd = 5;
integer totalStations = 0;
integer dialogActive = 0;
integer curIdx = -1;
string dispStationStr = "";
string NEXT_MSG = "Next >>";
string PREV_MSG = "<< Prev";
string LIST_MSG = "List";
string CUR_SET = "c";
string ALL_SET = "a";
list cmdNextChunk = [">>", "next", "Next", NEXT_MSG];
list cmdPrevChunk = ["<<", "prev", "Prev", PREV_MSG];
list cmdLsCur = ["ls", "list", LIST_MSG];
list cmdLsAll = ["la", "listall"];
list cmdSearch = ["s", "search"];
string newURL;
string newDesc;
//-----------------------
reset_radio() {
llSetText("starting radio ....", // message to display
<1,0,0>, // color: <red,green,blue>
1.0 ); // 1.0 = 100% opaque, 0.0 = transparent
llListen(77, "", "", "");
curStationOffset = 0;
curStationEnd = 5;
_linenum = 0;
dialogActive = 0;
_radioURLs = [];
_radioStations = [];
totalStations = 0;
curIdx = -1;
dispStationStr = "";
llGetNotecardLine(_notecard, _linenum);
}
add_station(string line) {
list words = llParseString2List(line, [" ", " ", "="], []);
if (llGetListLength(words) < 2) {
return;
}
string url = llList2String(words, llGetListLength(words) - 1);
string station = "";
integer i;
for (i=0; i<llGetListLength(words) - 1; i++) {
if (llStringLength(station) > 0) {
station += " ";
}
station += llList2String(words, i);
}
_radioURLs += ;
_radioStations += [station];
}
curStations() {
theStations = [PREV_MSG, LIST_MSG, NEXT_MSG];
integer i;
dispStationStr = "";
// llWhisper(0, "offset: " + (string)curStationOffset);
// llWhisper(0, "end: " + (string)curStationEnd);
for (i = curStationOffset; i <= curStationEnd; i++) {
if (curIdx == i) {
dispStationStr += "*";
} else {
dispStationStr += " ";
}
dispStationStr += (string) (i + 1) + ") ";
dispStationStr += llList2String(_radioStations, i);
dispStationStr += "\n";
theStations += (string)(i + 1);
}
}
doNextSet() {
curStationOffset += stationChunk;
curStationEnd = curStationOffset + (stationChunk - 1);
if (curStationOffset >= totalStations) {
curStationOffset = 0;
curStationEnd = curStationOffset + (stationChunk - 1);
}
if (curStationEnd >= totalStations) {
curStationEnd = totalStations - 1;
}
}
doPrevSet() {
if (curStationOffset > 1 && ((curStationOffset - stationChunk) < 1)) {
curStationOffset = 0;
} else {
curStationOffset -= stationChunk;
}
curStationEnd = curStationOffset + (stationChunk - 1);
if (curStationEnd >= totalStations) {
curStationEnd = totalStations - 1;
}
if (curStationOffset < 0) {
curStationEnd = totalStations - 1;
curStationOffset = totalStations - (stationChunk - 1);
}
}
doListStations(string mode) {
integer i;
integer startPos;
integer endPos;
if (mode == "a") {
startPos = 0;
endPos = totalStations - 1;
} else {
startPos = curStationOffset;
endPos = curStationEnd;
}
for (i = startPos; i <= endPos; i++) {
string newURL = llList2String(_radioURLs, i);
string newDesc = llList2String(_radioStations, i);
llSay(0, (string)(i + 1) + ": " + newDesc + " = " + newURL);
}
}
doSearch(string theTerm) {
integer i;
llSay(0, "the term is " + theTerm);
for (i = 0; i < totalStations; i++) {
string curString = llList2String(_radioStations, i);
if (llSubStringIndex(curString, theTerm) != -1) {
string newURL = llList2String(_radioURLs, i);
llSay(0, (string)(i + 1) + ": " + curString + " = " + newURL);
}
}
}
//-----------------------
default {
on_rez(integer start_param) {
reset_radio();
}
state_entry() {
reset_radio();
}
changed(integer change) {
if (change & CHANGED_INVENTORY) {
reset_radio();
}
}
dataserver(key query_id, string data) {
if (data != EOF) {
add_station(data);
_linenum++;
if (_linenum % 5 == 0) {
llSetText("starting: \n" + (string)_linenum + " stations ...", // message to display
<1,0,0>, // color: <red,green,blue>
1.0 ); // 1.0 = 100% opaque, 0.0 = transparent
}
llGetNotecardLine(_notecard, _linenum);
return;
}
llListen(93, "", NULL_KEY, "");
totalStations = llGetListLength(_radioURLs);
llSay(0, HELP_MSG);
dialogActive = 1;
llSetText("", <1,0,0>, 1.0 );
}
touch_start(integer touchNumber) {
curStations();
llDialog(llDetectedKey(0),
dispStationStr,
theStations, 93);
}
listen(integer channel, string name, key id, string message) {
if (dialogActive == 0) {
llWhisper(0, " ... still loading stations ...");
return;
}
if (message == "") {
message = "cur";
}
list words = llParseString2List(message, [" ", " ", "="], []);
list testFind = llList2List(words, 0, 0);
if (llListFindList(cmdNextChunk, testFind) != -1) {
doNextSet();
curStations();
if (channel == chatChannel) {
doListStations(CUR_SET);
} else {
llDialog(id, dispStationStr,theStations, 93);
}
return;
}
else if (llListFindList(cmdPrevChunk, testFind) != -1) {
doPrevSet();
curStations();
if (channel == chatChannel) {
doListStations(CUR_SET);
} else {
llDialog(id, dispStationStr, theStations, 93);
}
return;
}
else if (llListFindList(cmdSearch, testFind) != -1) {
doSearch(message);
return;
}
else if (llListFindList(cmdLsAll, testFind) != -1) {
doListStations(ALL_SET);
return;
}
else if (llListFindList(cmdLsCur, testFind) != -1) {
doListStations(CUR_SET);
return;
}
else if ((integer)message > 0 && (integer)message < 256) {
curIdx = (integer)message - 1;
string newURL = llList2String(_radioURLs, curIdx);
string newDesc = llList2String(_radioStations, curIdx);
llSay(0, "setting station " + message + ":");
llSay(0, newDesc + " = " + newURL);
llSetParcelMusicURL(newURL);
}
}
}
-- README
CODE
Bucky's Radio - the free version 2.6.4
Please see the notecard "Use of Diane's Radio" for OPEN SOURCE terms.
This radio script drops into your favorite object. It provides dialog & chat interfaces, and you can throw a lot of stations at it!
Configuration
* As shipped, the radio looks for the notecard "stations-short"
* each line of the notecard takes the format:
<station description> = <url>
example:
Secret Agent = http://somafm-sc.streamguys.com:8082
* if you want to change the chat channel or notecard name, see the top of the "radio script" file. I ship it with channel 77 enabled.
Group Land
* make sure you are currently set to be in the same group as the land you are putting the radio on
* edit the radio object, under "General": set the group to be that of the land. Share the radio with the group, and Deed it.
Commands & Notes -- Dialog
* station descriptions are in a list, click the number of the station to change the channel
* the "Next" and "Prev" buttons will take you forwards and backwards through the list. They wrap around.
* "List" will echo the current chunk of stations to your chat history
* The currently selected station is preceded with a '*'
Commands -- Chat
As shipped, commands take the form of "/77 <command>"
* <number> - change the station - example: "/77 3" to change to channel 3 (without quotes...)
* "ls", "list" - same as "List" in dialog - echo current chunk of stations
* "la", "listall" - dump all stations to chat history
* "<<", "prev" - go backwards in station listing
* ">>", "next" - go forwards in station listing
This radio is derived from the one done by Dianne Mechanique & sky Honey.
-- stations-short
(I believe the stations in this list are all public knowledge]
CODE
BRITISH INVASION The Beatles.=http://64.40.99.2:8080
BeBop Radio = http://213.251.136.72:8800
BeatBlender [SOMAFM] =http://207.200.96.232:8006
Chillout,The Chillout Lounge = http://64.71.145.130:8010
European Trance, Techno, Hi-NRG =http://64.236.34.196:80/stream/1003
DavidByrne = http://www.live365.com/play/321397
Digitally Imported House silky sexy deep house = http://64.236.34.196:80/stream/1007
Frequence3 -- www.Frequence3.org - Une Rafale De Tubes =http://193.251.154.243:8000
Groove Salad - SOMA FM = http://somafm-sc.streamguys.com:8066
Jazz SKY - Absolutely Smooth Jazz 24/7 = http://64.236.34.196:80/stream/1010
Lounge,Digitally Imported Lounge = http://64.236.34.67:80/stream/1009
CLASSICAL =http://64.236.34.196:80/stream/1006
SOMA Groove Salad = http://64.202.98.91:8066
SOMA Illinois Street Lounge = http://207.200.96.231:8014
Salsa = http://194.79.31.246:7180
Secret Agent = http://somafm-sc.streamguys.com:8082
The Chillout Lounge = http://64.71.145.130:8010
TokyoNinja = http://211.9.44.188:8020
dance trance,Music One - Today's Dance = http://64.236.34.97:80/stream/1011
lounge - SmoothLounge.com = http://66.28.209.20:80
psy chillout -Chillout ambient psy chillout = http://64.236.34.67:80/stream/1035
-- Use of Dianne's Radio
(I am including this, as I used her code as a starting point)
CODE
March 6th, 2006
=================================
THIS RADIO IS PROVIDED FREE OF CHARGE TO ALL. =================================
IF YOU HAVE PAID MONEY FOR THIS RADIO PLEASE
"ABUSE REPORT" THE SELLER AS THEY HAVE *CHEATED*
YOU ON PURPOSE AND DESERVE TO BE PUNISHED.
The script is also provided as an OPEN SOURCE script and
is intended to allow you to make your own Radio and to
understand how the Radio and scripting works, NOT to
provide you with a means to rip-off others by re-using it
in a "closed" COMMERCIAL product.
IF YOU USE THIS SCRIPT IN ANOTHER RADIO, PLEASE LEAVE
IT SIMILARLY OPEN SOURCE FOR ALL TO SEE AND TO USE.
To work effectively, a Land Radio needs to be both copy-
able and transferable, so there is nothing to stop
copying and reselling of products like this except your
own sense of RIGHT and WRONG. Please use it. :-)
=================================
INSTRUCTIONS:
If you own the land:
- Click on the Radio to get the dialogue box and change stations.
- Put new stations in by editing the notecard inside
On group land the Radio must be owned by the group so:
- Make sure you have your Group Title showing
(the same group as the land you are on)
- Select "Share with Group" in the Radio properties
- Select "Deed to Group"
The Radio is now owned by the group and should be able to
change the land URL.
***ONCE THE RADIO IS DEEDED TO THE GROUP YOU CANT GET
IT BACK NOR ALTER THE STATIONS CARD INSIDE****
If you want to change the list of stations you have to res
another radio, change the notecard and then deed *that* Radio
to the group as before.
You can res and delete as many radios as you like.
Have fun :-)
Dianne Mechanique
sky Honey