OSSL Script Library/OpenSim Radio
From OpenSimulator
(Difference between revisions)
(My first contribution to the script library....) |
m (Robot: Replacing 'OpenSim' to 'OpenSimulator', which is the precise name) |
||
(3 intermediate revisions by 2 users not shown) | |||
Line 4: | Line 4: | ||
* Very basic, and much could be added or improved. | * Very basic, and much could be added or improved. | ||
* Demonstrates the use of OSSL functions to read a notecard. | * Demonstrates the use of OSSL functions to read a notecard. | ||
+ | |||
+ | '''Updates''' | ||
+ | * 0.12 - Selected station choice is now saved in the object description, and will be re-applied to the land/parcel upon script stert. | ||
+ | * 0.11 - Improved menu system | ||
+ | * 0.10 - Initial version | ||
=== Notecard === | === Notecard === | ||
Line 16: | Line 21: | ||
More stations can be found at http://www.shoutcast.com | More stations can be found at http://www.shoutcast.com | ||
− | === | + | === OpenSimulator Radio === |
<source lang = "lsl"> | <source lang = "lsl"> | ||
// ###################################### | // ###################################### | ||
// Radio for OpenSim, by Fritigern Gothly | // Radio for OpenSim, by Fritigern Gothly | ||
− | // Version 0. | + | // Version 0.12 - Oct 08, 2011 |
− | // | + | // |
// Add your name and date to these | // Add your name and date to these | ||
// comments if you alter this script in | // comments if you alter this script in | ||
Line 46: | Line 51: | ||
initialize() | initialize() | ||
{ | { | ||
+ | //Clear the values to prevent problems | ||
+ | names =[]; | ||
+ | uris=[]; | ||
+ | page = []; | ||
+ | pagenum=0; | ||
+ | cardlines=0; | ||
+ | // Now get all stations (again) | ||
cardlines = osGetNumberOfNotecardLines(stationcard); | cardlines = osGetNumberOfNotecardLines(stationcard); | ||
for(n=0;n<cardlines;++n) | for(n=0;n<cardlines;++n) | ||
Line 52: | Line 64: | ||
// string. Makes this script a little more forgiving. | // string. Makes this script a little more forgiving. | ||
string line = llStringTrim(osGetNotecardLine(stationcard,n), STRING_TRIM); | string line = llStringTrim(osGetNotecardLine(stationcard,n), STRING_TRIM); | ||
− | integer seperator = llSubStringIndex(line, "="); | + | if(llGetSubString(line,0,0)=="#" || line == "") |
− | + | { | |
− | + | // Skip comments and empty lines | |
− | + | } else { | |
− | + | integer seperator = llSubStringIndex(line, "="); | |
− | + | uris += [llStringTrim(llGetSubString(line,seperator+1,llStringLength(line)), STRING_TRIM)]; | |
− | + | ||
− | + | // Make sure that the button names fit on the buttons. Names | |
− | + | // can be up to 24 characters (but only a few will show), | |
− | + | // Doing this will let you put really long station names in | |
+ | // the notecard without problems. | ||
+ | string desc = llStringTrim(llGetSubString(line,0,seperator-1), STRING_TRIM); | ||
+ | if(llStringLength(desc) >= 23) desc = llGetSubString(desc,0,23); | ||
+ | names += [desc]; | ||
+ | } | ||
} | } | ||
Line 78: | Line 95: | ||
btn=""; | btn=""; | ||
} | } | ||
+ | llOwnerSay("Notecard loaded. "+(string)llGetListLength(names)+" stations in "+llGetListLength(page)+" pages."); | ||
} | } | ||
Line 84: | Line 102: | ||
{ | { | ||
list b = ["< Prev","Cancel","Next >"]+llParseString2List(buttons,",",""); | list b = ["< Prev","Cancel","Next >"]+llParseString2List(buttons,",",""); | ||
− | llDialog(toucher, "\nChoose a station:", b, dchannel); | + | string txt = "\nShowing stations "+(string)((pagenum*9)+1)+" to "+(string)((pagenum*9)+llGetListLength(llParseString2List(buttons,",","")))+ |
+ | " of "+(string)llGetListLength(names)+" loaded.\n"+ | ||
+ | "\nPage "+(string)(pagenum+1)+" of "+(string)llGetListLength(page); | ||
+ | llDialog(toucher, txt+"\nChoose a station:", b, dchannel); | ||
b=[]; // Clear the list, and save some memory. | b=[]; // Clear the list, and save some memory. | ||
} | } | ||
Line 93: | Line 114: | ||
{ | { | ||
dchannel = llFloor(llFrand(9999999)); // Choose a random channel. | dchannel = llFloor(llFrand(9999999)); // Choose a random channel. | ||
− | |||
initialize(); | initialize(); | ||
+ | if(llGetObjectDesc() != (integer)llGetObjectDesc()||llGetObjectDesc() == "") | ||
+ | { | ||
+ | llSetText("OpenSimulator Radio\nClick to choose a station", <1,1,1>,1); | ||
+ | } else { | ||
+ | integer index = (integer)llGetObjectDesc(); | ||
+ | llSetText(llList2String(names,index)+"\n"+llList2String(uris,index),<1,1,0>,1); | ||
+ | llSetParcelMusicURL(llList2String(uris,index)); // Sometimes the parcel's audio settings don't survive a restart or server upgrade. So we'll set it again, just to make sure. | ||
+ | } | ||
+ | // llOwnerSay("Ready"); | ||
} | } | ||
Line 128: | Line 157: | ||
integer index = llListFindList(names,msg); | integer index = llListFindList(names,msg); | ||
llSetParcelMusicURL(llList2String(uris,index)); | llSetParcelMusicURL(llList2String(uris,index)); | ||
+ | llSay(0,"Station changed to "+llList2String(names,index)+" ("+llList2String(uris,index)+")"); | ||
llSetText(llList2String(names,index)+"\n"+llList2String(uris,index),<1,1,0>,1); | llSetText(llList2String(names,index)+"\n"+llList2String(uris,index),<1,1,0>,1); | ||
+ | llSetObjectDesc((string)index); | ||
} | } | ||
} | } | ||
Line 137: | Line 168: | ||
if(ischanged & CHANGED_INVENTORY) initialize(); | if(ischanged & CHANGED_INVENTORY) initialize(); | ||
} | } | ||
− | } | + | }</source> |
− | </source> | + | |
− | + | ||
[[Category:Scripts]] | [[Category:Scripts]] |
Latest revision as of 23:48, 3 March 2012
A basic parcel radio, using OSSL functions to read a notecard, cointaining a list of stations.
- Open access, so anyone can change stations.
- Very basic, and much could be added or improved.
- Demonstrates the use of OSSL functions to read a notecard.
Updates
- 0.12 - Selected station choice is now saved in the object description, and will be re-applied to the land/parcel upon script stert.
- 0.11 - Improved menu system
- 0.10 - Initial version
[edit] Notecard
Name the notecard "stations" and place it in your prim. Here are some example stations, copy and pase these exatly into your notecard:
Public Domain Jazz=http://82.197.167.138:80 Digital Gunfire=http://radio1-uk.digitalgunfire.com:8000 Salsa and Latin=http://205.188.215.231:8010 Retro=http://scfire-ntc-aa03.stream.aol.com:80/stream/1013
More stations can be found at http://www.shoutcast.com
[edit] OpenSimulator Radio
// ###################################### // Radio for OpenSim, by Fritigern Gothly // Version 0.12 - Oct 08, 2011 // // Add your name and date to these // comments if you alter this script in // any way. // If you put this in your own build, // make sure to mention BOTH me and you! // ###################################### integer dchannel; // Will be a random number. key toucher; string stationcard = "stations"; // Name for the notecard. Change this is you want to use a different name. integer cardlines; integer n; integer i; list names; list uris; list page; integer pagenum; // ---------------------- // Needed user functions. // ---------------------- initialize() { //Clear the values to prevent problems names =[]; uris=[]; page = []; pagenum=0; cardlines=0; // Now get all stations (again) cardlines = osGetNumberOfNotecardLines(stationcard); for(n=0;n<cardlines;++n) { // Use llStringTrim to get rid of additional spaces around the // string. Makes this script a little more forgiving. string line = llStringTrim(osGetNotecardLine(stationcard,n), STRING_TRIM); if(llGetSubString(line,0,0)=="#" || line == "") { // Skip comments and empty lines } else { integer seperator = llSubStringIndex(line, "="); uris += [llStringTrim(llGetSubString(line,seperator+1,llStringLength(line)), STRING_TRIM)]; // Make sure that the button names fit on the buttons. Names // can be up to 24 characters (but only a few will show), // Doing this will let you put really long station names in // the notecard without problems. string desc = llStringTrim(llGetSubString(line,0,seperator-1), STRING_TRIM); if(llStringLength(desc) >= 23) desc = llGetSubString(desc,0,23); names += [desc]; } } // Get all entries from the list of station names and put them in a string // in groups of nine, and put them in a new list.. string btn; for(n=0;n<llGetListLength(names);n=n+9) { for(i=n;i<(n+9);++i) // Get 9 buttons.... { if(n>llGetListLength(names)) return; btn += llList2String(names,i)+","; } page += [btn]; // ...And put them in a list again! (As a string, not as list items!) btn=""; } llOwnerSay("Notecard loaded. "+(string)llGetListLength(names)+" stations in "+llGetListLength(page)+" pages."); } dialog(string buttons) { list b = ["< Prev","Cancel","Next >"]+llParseString2List(buttons,",",""); string txt = "\nShowing stations "+(string)((pagenum*9)+1)+" to "+(string)((pagenum*9)+llGetListLength(llParseString2List(buttons,",","")))+ " of "+(string)llGetListLength(names)+" loaded.\n"+ "\nPage "+(string)(pagenum+1)+" of "+(string)llGetListLength(page); llDialog(toucher, txt+"\nChoose a station:", b, dchannel); b=[]; // Clear the list, and save some memory. } default { state_entry() { dchannel = llFloor(llFrand(9999999)); // Choose a random channel. initialize(); if(llGetObjectDesc() != (integer)llGetObjectDesc()||llGetObjectDesc() == "") { llSetText("OpenSimulator Radio\nClick to choose a station", <1,1,1>,1); } else { integer index = (integer)llGetObjectDesc(); llSetText(llList2String(names,index)+"\n"+llList2String(uris,index),<1,1,0>,1); llSetParcelMusicURL(llList2String(uris,index)); // Sometimes the parcel's audio settings don't survive a restart or server upgrade. So we'll set it again, just to make sure. } // llOwnerSay("Ready"); } touch_start(integer numdet) { toucher = llDetectedKey(0); llListen(dchannel, "","",""); dialog(llList2String(page,pagenum)); } listen(integer channel, string name, key id, string msg) { if(msg == "< Prev") { --pagenum; if(pagenum<0) pagenum = llGetListLength(page)-1; dialog(llList2String(page,pagenum)); } else if(msg == "Next >") { ++pagenum; if(pagenum>=llGetListLength(page)) pagenum = 0; dialog(llList2String(page,pagenum)); } else if(msg == "Cancel") { pagenum = 0; return; } else { // If none of the predefined buttons were clicked, it must be a station name. integer index = llListFindList(names,msg); llSetParcelMusicURL(llList2String(uris,index)); llSay(0,"Station changed to "+llList2String(names,index)+" ("+llList2String(uris,index)+")"); llSetText(llList2String(names,index)+"\n"+llList2String(uris,index),<1,1,0>,1); llSetObjectDesc((string)index); } } changed(integer ischanged) { //If something changed in the inventory, go and read the list with stations again! if(ischanged & CHANGED_INVENTORY) initialize(); } }