WikiHUD (Source)

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));
 }
 }
 }
 
 }