WikiHUD (Source)
Revision as of 19:39, 15 February 2008 by Lillie Yifu (talk | contribs) (New page: For WikiHUD by User:Lillie Yifu <code> // wiki reader 1.03 Lillie Yifu // http://sexsecond.blogspot.com // chat on channel 4 the name of an article to get the top of the entry...)
For WikiHUD by User:Lillie Yifu
// wiki reader 1.03 Lillie Yifu
// http://sexsecond.blogspot.com
// chat on channel 4 the name of an article to get the top of the entry text
// permission is granted to distribute this script free and open source with the header attached
// adding second channel to listen for mode changes
// adding category mode
list wikis = ["wikia","lindenlabs"];
list urls = ["http://secondlife.wikia.com","http://wiki.secondlife.com"];
// need to find the api.php for wiki.secondlife, seems like we will need some kind of list for languages, and for where various installations put files
integer sources;
integer oldmode;
integer wiki = 0;
string redirect = "#REDIRECT";
integer section ;
integer follow= 0;
integer redirlen;
string qname;
list meta = [HTTP_MIMETYPE,"text/plain;charset=utf-8"];
key hid;
string name;
string str_replace(string src, string from, string to)
{//replaces all occurrences of 'from' with 'to' in 'src'.
integer len = (~-(llStringLength(from)));
if(~len)
{
string buffer = src;
integer b_pos = -1;
integer to_len = (~-(llStringLength(to)));
@loop; //instead of a while loop, saves 5 bytes (and run faster).
integer to_pos = ~llSubStringIndex(buffer, from);
if(to_pos)
{
buffer = llGetSubString(src = llInsertString(llDeleteSubString(src, b_pos -= to_pos, b_pos + len), b_pos, to), (-~(b_pos += to_len)), 0x8000);
jump loop;
}
}
return src;
}
key image = "f07b2853-6aa2-7819-cbde-a1bf4187091d";
vector large = <0.01,0.3,.3>;
vector small = <0.01,0.1,0.1>;
integer islarge =TRUE;
integer qmode = 0;//mode of query
integer mode = 0;//mode of command
string url;
integer modes;
//action=query & list=search & srsearch=wikipedia & srlimit=10
list modenames = ["summary","categories","word","full","source","wikis"];
list phps = [
"/index.php?action=raw&title=",
"/api.php?format=xml&prop=categories&action=query&titles=",
"/api.php?format=xml&action=query&list=search&srlimit=20&srsearch=",
"/index.php?action=raw&title="
];
//string url = "http://en.wikipedia.org/index.php?action=raw&title=";
integer achan = 4;
integer mchan = 5;
default
{
state_entry()
{
integer i = 0;
url = llList2String(wikis,wiki);
sources = llGetListLength(wikis);
modes = llGetListLength(modenames);
llSetTexture(image,ALL_SIDES);
llOwnerSay("Chat on channel "+(string) achan+" the name of an article to reference the Second Life Wiki.");
llOwnerSay("Chat on channel "+(string) mchan+" to change query mode.");
for(;i<modes;++i) {
llOwnerSay(llList2String(modenames, i));
}
llListen(achan,"",llGetOwner(),"");
llListen(mchan,"",llGetOwner(),"");
}
listen(integer c,string n,key id,string m)
{
string article = str_replace(m," ","_");
if(achan==c) {
if(0==mode|| 3==mode) {
qname=url+llList2String(phps,mode)+article;
name = qname +"§ion=0"; // section postpend
llOwnerSay(name+" "+ llList2String(modenames,mode));
hid = llHTTPRequest(name, meta, "");
qmode = mode;
section =-1;
} else if(1==mode) {
name = url+llList2String(phps,mode)+article;
llOwnerSay(name+" "+ llList2String(modenames,mode));
hid = llHTTPRequest(name, meta, "");
qmode = mode;
} else if(2==mode) {// will need a loop here
name = url+llList2String(phps,mode)+article;
llOwnerSay(name+" "+ llList2String(modenames,mode));
hid = llHTTPRequest(name, meta, "");
qmode = mode;
}
} else if (mchan ==c) {
integer i =0;
oldmode = mode;
for(;i<modes;++i) {
if(llGetSubString(m,0,2) == llGetSubString(llList2String(modenames,i),0,2) ){
mode = i;
i=modes;
}
}// end look for mode
if(4 == mode) { // set source
list parse = llParseString2List(m,[" "],[]);
string newsource = llGetSubString(llList2String(parse,1),0,3);
for(i=0;i<sources;++i) { // I should sort and search...
if(llGetSubString(llList2String(wikis,i),0,3)==newsource) {
wiki = i;
url = llList2String(urls,wiki);
llOwnerSay("Setting source to " + url);
i=sources;
}
}
mode = oldmode; // set mode to default, we should never stay here.
} else if(5 ==mode) {
llOwnerSay("To change source chat /" + (string)mchan + " source <wiki name>");
for(i=0;i<sources;++i) {
llOwnerSay(llList2String(wikis,i) + "\t\t @ " + llList2String(urls,i));
}
mode = oldmode; // set mode back, we should never stay here
} // end of mode processing
if(mode!= oldmode) {
llOwnerSay("Setting mode to "+llList2String(modenames,mode));
}
}// end channel 5
}
on_rez(integer p)
{
llResetScript();
}
touch_start(integer p)
{
if(1==p) {
if(islarge) {
llSetScale(small);
islarge = FALSE;
llSetAlpha(.3,ALL_SIDES);
} else {
llSetScale(large);
islarge = TRUE;
llSetAlpha(1.,ALL_SIDES);
}
}
}
timer()
{
if(hid){
hid = NULL_KEY;
follow = 0;
llOwnerSay("Query timed out.");
}
llSetTimerEvent(0.);
}
http_response(key request_id, integer status, list metadata, string body)
{
if(0==qmode || 3==qmode) { // article or full
key image;
if (request_id == hid) {
image = (key)llGetSubString(body,5,40); // image key if available
llSetTexture(image,ALL_SIDES);
follow = TRUE;
if(llSubStringIndex(body,redirect)!=0) { // no redirect
if( qmode == 0) { // if summary mode, or multipart query after first
llOwnerSay(body);
return;
} else {
if(0 == section && llSubStringIndex(body,"=")!=0) {
llOwnerSay(llGetSubString(body,0,llSubStringIndex(body,"\n="))); //truncate at first line that starts with =
} else if(section >0)
llOwnerSay(body);
}
if(body !="") {
++section ; // increment section, will now be 0
name = qname + "&templates=expand§ion=" + (string) section; // query name
hid = llHTTPRequest(name, meta, "");
}
}
} else if(follow< 3) {// if redirect and less than 3 jumps
integer start = llSubStringIndex(body,"[[") + 2;
integer end = llSubStringIndex(body,"]]") -1;
string m = llGetSubString(body,start, end);
++follow ;
llSetTimerEvent(180.);
name=url+str_replace(m," ","_");
llOwnerSay("Following Redirect to \n"+name);
list meta = [HTTP_MIMETYPE,"text/plain;charset=utf-8"];
hid = llHTTPRequest(name, meta, "");
} else {
hid = NULL_KEY;
follow=0;
llOwnerSay("Too many redirects");
}
} else if(1 == qmode) {// xml categories
list catraw = llParseString2List(body,["Category:"],[]);
integer i = 1;
string temp;
for(;i<llGetListLength(catraw);++i){
temp = llList2String(catraw,i);
llOwnerSay(llGetSubString(temp,0,llSubStringIndex(temp,"\"")-1));
}
} else if(2 == qmode) {
list catraw = llParseString2List(body,["title=\""],[]);
integer i = 1;
string temp;
for(;i<llGetListLength(catraw);++i){
temp = llList2String(catraw,i);
llOwnerSay(llGetSubString(temp,0,llSubStringIndex(temp,"\"")-1));
}
}
}
}