mruno

!imdb 23.May.2017 - (omdbapi.com) requires api key

Sep 26th, 2015 (edited)
593
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
mIRC 24.63 KB | None | 0 0
  1. ;Requires API key ! See more at https://www.omdbapi.com/apikey.aspx
  2.  
  3. ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  4. ;script !imdb Script
  5. ;version 23.May.2017
  6. ;author mruno
  7. ;email mruno@ircN.org
  8. ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  9.  
  10. ;23.May.2017 - added movie year support and added api key support. get a key at http://www.omdbapi.com/
  11.  
  12. ;this version of imdb does NOT have actor search or recommended movies
  13.  
  14. ;Paste your API key below. Do not share your API key.
  15. alias omdb.api.key return ENTER_YOUR_API_KEY_HERE
  16.  
  17. ;max results when user is searching
  18. alias -l imdb2.max.results return 3
  19.  
  20. ;for colors, set to 1
  21. alias -l imdb2.colors return 1
  22.  
  23. ;------------------------------------------------------------------
  24.  
  25. on *:TEXT:*:#: {
  26.   if ($chr(37) isin $1-) || ($chr(36) isin $1-) return
  27.   if ($1 == !imdb) || ($1 == !imdb2) {
  28.     if (!$findtok(%imdb2,$nick,0,46)) {
  29.       set -u10 %imdb2 $addtok(%imdb2,$nick,46)
  30.       var %h imdb2
  31.       if ($hget(%a)) hfree %h
  32.       h %h chan $chan
  33.       h %h cid $cid
  34.       h %h nick $nick
  35.       h %h network $network
  36.       imdb2 $nick $2-
  37.     }
  38.     else .timerimdb2. $+ $nick 1 1 .notice $nick Please wait 10 seconds and try again...
  39.   }
  40.   elseif (*imdb.com/title/tt*/* iswm $1-) {
  41.     var %url $1-
  42.     var %tt $gettok(%url,$calc($findtok(%url,title,47) + 1),47)
  43.     if (tt isin %tt) {
  44.       if (!$findtok(%imdb2,$nick,0,46)) {
  45.         set -u10 %theatre $addtok(%imdb2,$nick,46)
  46.         var %h imdb2
  47.         if ($hget(%a)) hfree %a
  48.         h %h chan $chan
  49.         h %h cid $cid
  50.         h %h nick $nick
  51.         h %h network $network
  52.         h %h code %tt
  53.         imdb2 $nick %tt
  54.       }
  55.     }
  56.   }
  57. }
  58. on *:INPUT:#:{
  59.   if ($1 == !imdb) || ($1 == !imdb2) {
  60.     var %a = imdb2
  61.     if ($hget(%a)) hfree %a
  62.     h %a chan $chan
  63.     h %a network $network
  64.     h %a cid $cid
  65.     h %a nick $me
  66.     imdb2 $me $2-
  67.   }
  68. }
  69. alias imdb2.TIMEOUT {
  70.   dualcmd Connection to imdb.com has timed out. Try again later.
  71.   imdb2.gclean
  72. }
  73. alias -l iMDbhelp {
  74.   if (!$h(imdb2,nick)) return
  75.   .notice $h(imdb2,nick) iMdb by mruno  - Options:
  76.   .notice $h(imdb2,nick) !imdb <keywords>
  77.   .notice $h(imdb2,nick) Not the one you want? Try !imdb -s <keywords>
  78. }
  79. alias imdb2 {
  80.   var %h imdb2
  81.   if (!$2) { imdbhelp $1 | return }
  82.   if ($2 == -s) || ($2 == -l) && (!$3) { imdbhelp $1 | return }
  83.   elseif ($left($2,2) == -l) || ($left($2,2) == -s) {
  84.     var %text $3-
  85.     var %spaces $gettok(%text,0,32)
  86.     var %end $gettok(%text,%spaces,32), %year
  87.     if ($len(%end) == 4) && (%end isnum) {
  88.       if ($left(%end,2) == 19) || ($left(%end,2) == 20) {
  89.         set %year %end
  90.         set %text $gettok(%text,1 - $calc(%spaces - 1),32)
  91.       }
  92.     }
  93.  
  94.     .timerimdb2.timeout 0 45 imdb2.TIMEOUT
  95.     var %a, %b, %p, %u, %o, %query
  96.     if ($left($3,2) == tt) && ($remove($3,tt,/) isnum) {
  97.       h %h query code
  98.       h %h jsonurl $+(http://www.omdbapi.com/?apikey=,$omdb.api.key,&i=,$remove(%text,$chr(32)),&y=,$iif(%year,%year),&plot=short&r=json)
  99.       imdb2.search.single
  100.     }
  101.     else {
  102.       h %h query multiple
  103.       h %h jsonurl $+(http://www.omdbapi.com/?apikey=,$omdb.api.key,&s=,$replace(%text,$chr(32),+),&y=,$iif(%year,%year),&plot=short&r=json)
  104.       imdb2.search.multiple
  105.     }
  106.     set %query $replace($3-,$chr(32),+,.,+,-,+)
  107.     set %query $remove(%query,<,>)
  108.     h %h text %query
  109.   }
  110.   else {
  111.     .timerimdb2.timeout 0 45 imdb2.TIMEOUT
  112.     var %a, %b, %p, %u, %o, %query
  113.     set %query $replace($2-,$chr(32),+,.,+,-,+)
  114.     set %query $remove(%query,<,>)
  115.     h %h text %query
  116.     var %text %query
  117.     var %spaces $gettok(%text,0,43)
  118.     var %end $gettok(%text,%spaces,43), %year
  119.     if ($len(%end) == 4) && (%end isnum) {
  120.       if ($left(%end,2) == 19) || ($left(%end,2) == 20) {
  121.         set %year %end
  122.         set %text $gettok(%text,1 - $calc(%spaces - 1),43)
  123.       }
  124.     }
  125.  
  126.     if ($left($2,2) == tt) && ($remove($2,tt,/) isnum) {
  127.       h %h query code
  128.       h %h jsonurl $+(http://www.omdbapi.com/?apikey=,$omdb.api.key,&i=,%text,&y=,$iif(%year,%year),&plot=short&r=json)
  129.     }
  130.     else {
  131.       h %h query single
  132.       h %h jsonurl $+(http://www.omdbapi.com/?apikey=,$omdb.api.key,&t=,%text,&y=,$iif(%year,%year),&plot=short&r=json)
  133.     }
  134.     imdb2.search.single
  135.   }
  136.   .notice $h(imdb2,nick) Querying imdb.com...
  137. }
  138. alias -l imdb2.search.multiple {
  139.   ;searches for a title and returns multiple results
  140.   var %h imdb2
  141.   imdb2.Json
  142.   .timerimdb2.Waiting.to.Query 0 1 imdb2.Get.Multiple.Query
  143. }
  144. alias -l imdb2.Get.Multiple.Query {
  145.   ; called by imdb2.Search.Multiple to record multiple shows' information
  146.   var %h imdb2
  147.   if (!%imdb2.num) set %imdb2.num 1
  148.   else inc %imdb2.num
  149.   if (%imdb2.num > 3) {
  150.     unset %imdb2.num
  151.     if ($hget(imdb2,query.type) == id) .timerimdb2.repeat -m 1 500 imdb2.Json
  152.     else .timerimdb2.repeat -m 1 500 imdb2.Json
  153.   }
  154.   var %response $json(imdb2,Response)
  155.   if (%response != False) {
  156.     var %total 0
  157.     var %i 0
  158.     while ($json(imdb2,Search,%i,Title)) {
  159.       inc %total
  160.       if (%total > 10) break
  161.       h %h title. $+ %i $json(imdb2,Search,%i,Title)
  162.       h %h year. $+ %i $replace($json(imdb2,Search,%i,Year),–,-)
  163.       h %h type. $+ %i $json(imdb2,Search,%i,Type)
  164.       h %h id. $+ %i $json(imdb2,Search,%i,imdbID)
  165.       inc %i
  166.     }
  167.   }
  168.   else h %h Error $json(imdb2,Error)
  169.   .timerimdb2.Waiting.to.Query off
  170.   if (!$hget(imdb2,Waiting)) imdb2.Complete
  171. }
  172.  
  173. alias -l imdb2.search.single {
  174.   ;searches for a title or code and returns a single result
  175.   var %h imdb2
  176.   imdb2.Json
  177.   .timerimdb2.Waiting.to.Query 0 1 imdb2.Get.Single.Query
  178. }
  179. alias imdb2.Get.Single.Query {
  180.   ; called by imdb2.Search.Single to record a single search show's information
  181.   var %h imdb2
  182.   if (!%imdb2.num) set %imdb2.num 1
  183.   else inc %imdb2.num
  184.   if (%imdb2.num > 3) {
  185.     unset %imdb2.num
  186.     if ($hget(imdb2,query.type) == id) .timerimdb2.repeat -m 1 500 imdb2.Json
  187.     else .timerimdb2.repeat -m 1 500 imdb2.Json
  188.   }
  189.   var %response $json(imdb2,Response)
  190.   if (%response == True) {
  191.     h %h Title $json(imdb2,Title)
  192.     h %h Year $replace($json(imdb2,Year),–,-)
  193.     h %h Rated $json(imdb2,Rated)
  194.     h %h Released $json(imdb2,Released)
  195.     h %h Genre $json(imdb2,Genre)
  196.     h %h Runtime $json(imdb2,Runtime)
  197.     h %h imdbRating $json(imdb2,imdbRating)
  198.     h %h Network $json(imdb2,network,Network)
  199.     h %h Country $json(imdb2,Country)
  200.     h %h Director $json(imdb2,Director)
  201.     h %h Writer $json(imdb2,Writer)
  202.     h %h Actors $json(imdb2,Actors)
  203.     h %h Plot $json(imdb2,Plot)
  204.     h %h Language $json(imdb2,Language )
  205.     h %h Type $json(imdb2,Type)
  206.     h %h Awards $json(imdb2,Awards)
  207.     h %h ID $json(imdb2,imdbID)
  208.   }
  209.   else h %h Error $json(imdb2,Error)
  210.   .timerimdb2.Waiting.to.Query off
  211.   if (!$hget(imdb2,Waiting)) imdb2.Complete
  212. }
  213. alias -l IMDB2.COMPLETE {
  214.   ;this alias produces the text
  215.   var %h imdb2  
  216.   if ($h(%h,Error)) {
  217.     dualcmd Error, $ifmatch Try using less keywords.
  218.   }
  219.   else {
  220.     if ($h(%h,query) == multiple) {
  221.       var %nick $h(%h,nick)
  222.       if (!%nick) { .timer 1 1 imdb2.gclean | return }
  223.       var %total 0
  224.       var %i 0
  225.       while ($h(%h,title. $+ %i)) {
  226.         inc %total
  227.         if (%total > $imdb2.max.results) break
  228.         .notice %nick $h(%h,title. $+ %i) $paren($h(%h,year. $+ %i)) - Type: $h(%h,type. $+ %i) - ID: $h(%h,id. $+ %i)
  229.         inc %i
  230.       }
  231.       .notice %nick Type !imdb <ID> to lookup a specific title. Example: !imdb tt1520211
  232.     }
  233.     else {
  234.       var %url http://www.imdb.com/title/ $+ $h(%h,ID)
  235.       if ($imdb2.colors) var %logo 1,8[iMDb]
  236.       else var %logo [iMDb]
  237.       dualcmd %logo $h(%h,title) $+  $paren($h(%h,year)) $chr(40) 12 $+ %url $+  $chr(41)
  238.       dualcmd $iif($h(%h,rating),Rated: $h(%h,rating)) $iif($h(%h,released) && $h(%h,released) != N/A,Released: $h(%h,released)) $iif($h(%h,runtime) && $h(%h,runtime) != N/A,Runtime: $h(%h,runtime)) $iif($h(%h,genre),Genre: $h(%h,genre))
  239.       dualcmd $iif($h(%h,director) && $h(%h,director) != N/A,Director: $h(%h,director)) $iif($h(%h,actors) && $h(%h,actors) != N/A,Cast: $h(%h,actors))
  240.       dualcmd $iif($h(%h,plot),Plot: $h(%h,Plot))
  241.  
  242.       var %r
  243.       if ($h(%h,imdbrating) isnum) set %r $h(%h,imdbrating)
  244.       if (%r) dualcmd Rating: $chr(91) $+ $iif(%r > .55,12,) $+ * $+ $iif(%r > 1.55,12,) $+ * $+ $iif(%r > 2.55,12,) $+ * $+ $iif(%r > 3.55,12,) $+ * $+ $iif(%r > 4.55,12,) $+ * $+ $iif(%r > 5.55,12,) $+ * $+ $iif(%r > 6.55,12,) $+ * $+ $iif(%r > 7.55,12,) $+ * $+ $iif(%r > 8.55,12,) $+ * $+ $iif(%r > 9.55,12,) $+ *] %r $+ /10
  245.       else dualcmd Rating: none
  246.       var %nick $h(%h,nick)
  247.       if (!%nick) { .timer 1 1 imdb2.gclean | return }
  248.       if ($h(%h,query) != code) .notice %nick Not the right movie or show? Try !imdb -s $replace($h(%h,text),+,$chr(32))
  249.     }
  250.   }
  251.   imdb2.gclean
  252. }
  253.  
  254. alias -l imdb2.results {
  255.   if (!$h(imdb2,code)) { echo -st 4ERROR! imdb no code: $h(imdb2,code) | return }
  256.   imdb2.Json
  257.   .timerimdb2.Waiting.to.Query 0 1 imdb2.Get.Single.Query %name %query
  258. }
  259. alias imdb2.Query.Single {
  260.   ;/imdb2.Query.Single channel nickname query
  261.   ;this returns a single show's results
  262.  
  263.   set %query $+(http://www.omdbapi.com/?apikey=,$omdb.api.key,&i=,$h(imdb2,code),&plot=short&r=json)
  264.   h imdb2 query $+(http://www.omdbapi.com/?apikey=,$omdb.api.key,&i=,$h(imdb2,code),&plot=short&r=json)
  265.   imdb2.Json
  266.   .timerimdb2.Waiting.to.Query 0 1 imdb2.Get.Single.Query imdb2 %query
  267. }
  268. alias imdb2.Get.Single.Query {
  269.   ; called by imdb2.Query.Single to record a single search show's information
  270.  
  271.   if (!%imdb2.num) set %imdb2.num 1
  272.   else inc %imdb2.num
  273.   if (%imdb2.num > 3) {
  274.     unset %imdb2.num
  275.     if ($hget(imdb2,query.type) == id) .timerimdb2.repeat -m 1 500 imdb2.Json imdb2
  276.     else .timerimdb2.repeat -m 1 500 imdb2.Json
  277.   }
  278.   var %title $json(imdb2,Title)
  279.   if (%title) {
  280.     h imdb2 Title %title
  281.     h imdb2 Year $replace($json(imdb2,Year),–,-)
  282.     h imdb2 Rated $json(imdb2,Rated)
  283.     h imdb2 Released $json(imdb2,Released)
  284.     h imdb2 Genre $json(imdb2,Genre)
  285.     h imdb2 Runtime $json(imdb2,Runtime)
  286.     h imdb2 imdbRating $json(imdb2,imdbRating)
  287.     h imdb2 Network $json(imdb2,network,Network)
  288.     h imdb2 Country $json(imdb2,Country)
  289.     h imdb2 Director $json(imdb2,Director)
  290.     h imdb2 Writer $json(imdb2,Writer)
  291.     h imdb2 Actors $json(imdb2,Actors)
  292.     h imdb2 Plot $json(imdb2,Plot)
  293.     h imdb2 Language $json(imdb2,Language )
  294.     h imdb2 Type $json(imdb2,Type)
  295.  
  296.     var %genres
  297.     var %i 0
  298.     while (%i < 5) {
  299.       if ($json(%name,genres,%i)) set %genres $addtok(%genres,$ifmatch,44)
  300.       inc %i
  301.     }
  302.     h imdb2 genres %genres
  303.     .timerimdb2.Waiting.to.Query off
  304.     if (!$hget(imdb2,Waiting)) .timerimdb2.Complete 1 1 imdb2.Complete
  305.   }
  306. }
  307. alias imdb2.Json JSONOpen -u imdb2 $h(imdb2,jsonurl)
  308. alias -l h {
  309.   if ($1 == isnum) return
  310.   if (!$2) { echo -a error: no 2 for hash table | return }
  311.   if (!$hget($1)) hmake $1
  312.   if ($isid) return $hget($1,$2)
  313.   else hadd $1 $2-
  314. }
  315. alias -l dualcmd {
  316.   if ($1) {
  317.     if ($me ison $h(imdb2,chan)) msg $h(imdb2,chan) $iif($imdb2.colors,$1-,$strip($1-))
  318.   }
  319. }
  320. alias -l paren {
  321.   if ($3) return $2 $+ $1 $+ $3
  322.   elseif ($2) return $2 $+ $1 $+ $2
  323.   elseif ($1 != $null) return ( $+ $1- $+ )
  324. }
  325. alias imdb2.gclean {
  326.   ;this removes the hash tables that were used
  327.   if ($hget(imdb2)) hfree $ifmatch
  328.   unset %imdb2*
  329.   jsonclose imdb2
  330.   .timerimdb2.timeout off
  331. }
  332.  
  333. on 1:UNLOAD:imdb2.gclean
  334.  
  335. ;JSON for MIRC By SReject
  336. ;http://hawkee.com/snippet/10194/
  337. alias -l JSONOpen {
  338.   var %switches = -
  339.   if (-* iswm $1) {
  340.     %switches = $1
  341.     tokenize 32 $2-
  342.   }
  343.   var %com = JSONHandler:: $+ $1, %error, %file, %rem
  344.   var %init = function init(a,b){errortext="";data="";url=b ? b : "";method="GET";headers=[];parsedJSON={};status=a;fso=new ActiveXObject("Scripting.FileSystemObject")}
  345.   var %read = function readFile(filename){var ado=new ActiveXObject("ADODB.Stream");ado.CharSet="utf-8";ado.Open();ado.LoadFromFile(filename);if(!ado.EOF){data=ado.ReadText();}ado.close()}
  346.   var %json = "object"!==typeof JSON&&(JSON={});(function(){function m(a){return 10>a?"0"+a:a}function t(a){p.lastIndex=0;return p.test(a)?'"'+a.replace(p,function(a){var c=u[a];return"string"===typeof c?c:"\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4)})+'"':'"'+a+'"'}function q(a,l){var c,d,h,r,g=e,f,b=l[a];b&&"object"===typeof b&&"function"===typeof b.toJSON&&(b=b.toJSON(a));"function"===typeof k&&(b=k.call(l,a,b));switch(typeof b){case "string":return t(b);case "number":return isFinite(b)?String(b):"null";case "boolean":case "null":return String(b);case "object":if(!b)return"null";e+=n;f=[];if("[object Array]"===Object.prototype.toString.apply(b)){r=b.length;for(c=0;c<r;c+=1)f[c]=q(c,b)||"null";h=0===f.length?"[]":e?"[\n"+e+f.join(",\n"+e)+"\n"+g+"]":"["+f.join(",")+"]";e=g;return h}if(k&&"object"===typeof k)for(r=k.length,c=0;c<r;c+=1)"string"===typeof k[c]&&(d=k[c],(h=q(d,b))&&f.push(t(d)+(e?": ":":")+h));else for(d in b)Object.prototype.hasOwnProperty.call(b,d)&&(h=q(d,b))&&f.push(t(d)+(e?": ":":")+h);h=0===f.length?"{}":e?"{\n"+e+f.join(",\n"+e)+"\n"+g+"}":"{"+f.join(",")+"}";e=g;return h}}"function"!==typeof Date.prototype.toJSON&&(Date.prototype.toJSON=function(){return isFinite(this.valueOf())?this.getUTCFullYear()+"-"+m(this.getUTCMonth()+1)+"-"+m(this.getUTCDate())+"T"+m(this.getUTCHours())+":"+m(this.getUTCMinutes())+":"+m(this.getUTCSeconds())+"Z":null},String.prototype.toJSON=Number.prototype.toJSON=Boolean.prototype.toJSON=function(){return this.valueOf()});var s,p,e,n,u,k;"function"!==typeof JSON.stringify&&(p=/[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,u={"\b":"\\b","\t":"\\t","\n":"\\n","\f":"\\f","\r":"\\r",'"':'\\"',"\\":"\\\\"},JSON.stringify=function(a,l,c){var d;n=e="";if("number"===typeof c)for(d=0;d<c;d+=1)n+=" ";else"string"===typeof c&&(n=c);if((k=l)&&"function"!==typeof l&&("object"!==typeof l||"number"!==typeof l.length))throw Error("JSON.stringify");return q("",{"":a})});"function"!==typeof JSON.parse&&(s=/[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,JSON.parse=function(a,e){function c(a,d){var g,f,b=a[d];if(b&&"object"===typeof b)for(g in b)Object.prototype.hasOwnProperty.call(b,g)&&(f=c(b,g),void 0!==f?b[g]=f:delete b[g]);return e.call(a,d,b)}var d;a=String(a);s.lastIndex=0;s.test(a)&&(a=a.replace(s,function(a){return"\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4)}));if(/^[\],:{}\s]*$/.test(a.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,"@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,"]").replace(/(?:^|:|,)(?:\s*\[)+/g,"")))return d=eval("("+a+")"),"function"===typeof e?c({"":d},""):d;throw new SyntaxError("JSON.parse");})})();
  347.   var %xhr = function xhr(){var a,b=['MSXML2.XMLHTTP.6.0','MSXML2.XMLHTTP.3.0','Microsoft.XMLHTTP'],c;for(a=0;a<b.length;a++){try{c=new ActiveXObject(b[a]);break}catch(e){}}if(typeof c==="undefined"){errortext = "Unable to locate an XMLHTTP object for use"}else{c.open(method,url,false);for(a=0;a<headers.length;a++){c.setRequestHeader(headers[a][0],headers[a][1])}c.send(data);if(c.status!==200){errortext="Unable to retrieve data - Server Error: " + c.status}else{status="Parsed";try{parsedJSON=JSON.parse(c.responseText)}catch(ee){errortext="Unable to parse Retrieved Data"}}}}
  348.   if (!$regex(%switches, /^-[ufbwd]*$/)) {
  349.     %error = Invalid switches specified
  350.   }
  351.   elseif ($regex(%switches, /([ufbwd])\1/)) {
  352.     %error = Duplicate switch specified ( $+ $regml(1) $+ )
  353.   }
  354.   elseif ($regex(%switches, /([ufb])/g) > 1) {
  355.     %error = Conflicting switches specified (- $+ $regml(1) $+ , - $+ $regml(2) $+ $iif($regml(3), $chr(44) - $+ $v1) $+ )
  356.   }
  357.   elseif (w isin %switches && u !isin %switches) {
  358.     %error = Invalid switch (-w is only for use with -u)
  359.   }
  360.   elseif ($0 < 2) {
  361.     %error = Required parameters missing
  362.   }
  363.   elseif (!$regex($1,/^[a-z\d_.-]+$/i)) {
  364.     %error = Invalid name specified (Can only contant letters, numbers, _, ., and -)
  365.   }
  366.   elseif ($com(%com)) {
  367.     %error = Specified name in use
  368.   }
  369.   elseif (u isin %switches && $0 > 2) {
  370.     %error = Invalid URL specified. (Contains Spaces: $2-)
  371.   }
  372.   elseif (f isin %switches && !$isfile($2-)) {
  373.     %error = File not found: $2-
  374.   }
  375.   elseif (b isin %switches && &* !iswm $2) {
  376.     %error = Invalid binary variable specified (No '&' Prefix)
  377.   }
  378.   elseif (b isin %switches && $0 > 2) {
  379.     %error = Invalid binary variable specified (Contains Spaces: $2-)
  380.   }
  381.   elseif (b isin %switches && $bvar($2, 0) < 1) {
  382.     %error = Invalid binary variable specified (No content)
  383.   }
  384.   elseif (!$JSON::ComOpen(%com, MSScriptControl.ScriptControl) || $comerr) {
  385.     %error = Unable to create an instance of MSScriptControl.ScriptControl
  386.   }
  387.   elseif (!$com(%com, language, 4, bstr, jscript) || $comerr) {
  388.     %error = Unable to set ScriptControl's language to Javascript
  389.   }
  390.   elseif (!$com(%com, addcode, 1, bstr, %init) || $comerr) {
  391.     %error = Unable to add init() to ScriptControl
  392.   }
  393.   elseif (!$com(%com, addcode, 1, bstr, %xhr) || $comerr) {
  394.     %error = Unable to add xhr() to ScriptControl
  395.   }
  396.   elseif (!$com(%com, addcode, 1, bstr, %read) || $comerr) {
  397.     %error = Unable to add readFile() to ScriptControl
  398.   }
  399.   elseif (!$com(%com, ExecuteStatement, 1, bstr, %JSON) || $comerr) {
  400.     %error = Unable to Initalize the JSON parser object
  401.   }
  402.   elseif (!$com(%com, ExecuteStatement, 1, bstr, $iif(u isin %switches, $+(init,$chr(40), "XHR", $chr(44), $qt($JSON::Escape($2)),$chr(41)), $+(init,$chr(40), "Parsed", $chr(44), "", $chr(41)))) || $comerr) {
  403.     %error = Unable to initalize variables for ScriptControl
  404.   }
  405.   else {
  406.     if (u isin %switches) {
  407.       if (w !isin %switches) {
  408.         var %i = $com(%com, ExecuteStatement, 1, bstr, $+(xhr,$chr(40),$chr(41)))
  409.         if (!%i || $comerr) {
  410.           %error = Unable to retrieve data from $2 :: $com(%com).error :: $com(%com).errortext
  411.         }
  412.         elseif (!$com(%com, eval, 1, bstr, errortext) || $com(%com).result) {
  413.           %error = Unable to retrieve data $+ $iif($v1,: $v1,)
  414.         }
  415.       }
  416.     }
  417.     else {
  418.       %file = $JSON::File($1)
  419.       if (f isin %switches) {
  420.         %file = $longfn($2)
  421.       }
  422.       elseif (b isin %switches) {
  423.         bwrite $qt(%file) 0 -1 $2
  424.         %rem = $true
  425.       }
  426.       else {
  427.         write -n $qt(%file) $2-
  428.         %rem = $true
  429.       }
  430.       if (!$com(%com, ExecuteStatement, 1, bstr, $JSON::Funct(readFile, $qt($JSON::Escape(%file)))) || $comerr) {
  431.         %error = Unable to read contents of data-passing file
  432.       }
  433.       elseif (!$com(%com, ExecuteStatement, 1, bstr, $JSON::Funct(parsedJSON=JSON.parse,data)) || $comerr) {
  434.         %error = Unable to parse data into valid JSON
  435.       }
  436.     }
  437.     if (d isin %switches) {
  438.       $+(.timer,%com) 1 0 JSONClose $1
  439.     }
  440.   }
  441.   :error
  442.   %error = $iif($error, $v1, %error)
  443.   if (%rem && %file && $isfile(%file)) {
  444.     .remove $qt(%file)
  445.   }
  446.   if (%error) {
  447.     if ($timer(%com)) { $+(.timer,%com) off }
  448.     if ($com(%com)) {
  449.       set -eu0 $+(%,%com,::error) %error
  450.       .comclose $v1
  451.     }
  452.     else {
  453.       set -eu0 %JSONError %error
  454.     }
  455.   }
  456. }
  457. alias -l JSONURLOption {
  458.   var %com = JSONHandler:: $+ $1, %error, %head, %value, %x = 2
  459.  
  460.   if (!$com(%com)) {
  461.     return
  462.   }
  463.   unset % [ $+ [ %com ] $+ ] ::error
  464.   if ($0 < 3) {
  465.     %error = Missing parameters
  466.   }
  467.   elseif (!$com(%com, eval, 1, bstr, status) || $com(%com).result != XHR) {
  468.     %error = HTTP Request already completed or wasn't specified
  469.   }
  470.   elseif ($2 == method) {
  471.     if (!$regex($3-, /^(?:GET|POST|PUT|DELETE)$/i)) {
  472.       %error = Invalid HTTP Request method Specified: $3-
  473.     }
  474.     elseif (!$com(%com, ExecuteStatement, 1, bstr, method=" $+ $3 $+ ") || $comerr) {
  475.       %error = Unable to set HTTP Request method
  476.     }
  477.   }
  478.   else {
  479.     if (!$com(%com, ExecuteStatement, 1, bstr, $JSON::Funct(headers.push,[ $+ $qt($JSON::Escape($2)), $qt($JSON::Escape($3-)) $+ ])) || $comerr) {
  480.       %error = Unable to set HTTP Header: %head $+ : $+ %value
  481.     }
  482.   }
  483.   :error
  484.   %error = $iif($error, $v1, %error)
  485.   if (%error) {
  486.     reseterror
  487.     set -e $+(%,%com,::Error) %error
  488.   }
  489. }
  490. alias -l JSONGet {
  491.   var %switches -
  492.   if (-* iswm $1) {
  493.     %switches = $1
  494.     tokenize 32 $2-
  495.   }
  496.   var %com = JSONHandler:: $+ $1
  497.   var %file = $JSON::File($1)
  498.   var %error
  499.   var %rem
  500.   if ($com(%com)) {
  501.     if ($com(%com, eval, 1, bstr, status) && $com(%com).result !== XHR) {
  502.       %error = HTTP Request already completed or wasn't specified
  503.     }
  504.     elseif (!$regex(%switches, /^-[bf]*$/)) {
  505.       %error = Invalid switches specified
  506.     }
  507.     elseif ($regex(%switches, /([bf])\1/)) {
  508.       %error = Duplicate switch specified ( $+ $regml(1) $+ )
  509.     }
  510.     elseif ($regex(%switches, /([bf])/g) > 1) {
  511.       %error = Conflicting switches specified (- $+ $regml(1) $+ , - $+ $regml(2) $+ )
  512.     }
  513.     elseif (b isin %switches && &* !iswm $2) {
  514.       %error = Invalid binary variable specified (No '&' Prefix)
  515.     }
  516.     elseif (b isin %switches && $0 > 2) {
  517.       %error = Invalid binary variable specified (Contains Spaces: $2-)
  518.     }
  519.     elseif (f isin %switches && !$isfile($2-)) {
  520.       %error = File not found: $2-
  521.     }
  522.     else {
  523.       if (b isin %switches && $bvar($2,0)) {
  524.         bwrite $qt(%file) 0 -1 $2
  525.         %rem = $true
  526.       }
  527.       elseif (f isin %switches) {
  528.         %file = $2-
  529.       }      
  530.       elseif ($2-) {
  531.         write -n $qt(%file) $2-
  532.         %rem = $true
  533.       }
  534.       %file = $longfn(%file)
  535.       if ($isfile(%file) && (!$com(%com, ExecuteStatement, 1, bstr, $JSON::Funct(readFile,$qt($JSON::Escape(%file)))) || $comerr)) {
  536.         %error = Unable to pass data to JSON Handler
  537.       }
  538.       elseif (!$com(%com, ExecuteStatement, 1, bstr, xhr $+ $chr(40) $+ $chr(41)) || $comerr) {
  539.         %error = Unable to retrieve data from specified URL :: $com(%com).error :: $com(%com).errortext    
  540.       }
  541.       elseif (!$com(%com, eval, 1, bstr, errortext) || $com(%com).result) {
  542.         %error = $v1
  543.       }
  544.       if (%rem && $isfile(%file)) { .remove %file }
  545.     }
  546.   }
  547.   :error
  548.   %error = $iif($error, $v1, %error)
  549.   if (%error) {
  550.     reseterror
  551.     set -eu0 $+(%,%com,::Error) %error
  552.   }
  553. }
  554. alias -l JSON {
  555.   var %com, %x = 1, %i = 0, %get = parsedJSON, %tok, %res
  556.   if ($regex($1,/^\d+$/) && $0 === 1) {
  557.     while ($com(%x)) {
  558.       if (JSONHandler::* iswm $v1) {
  559.         %com = $v2
  560.         inc %i
  561.         if (%i === $1) { return %com }
  562.       }
  563.       inc %x
  564.     }
  565.     return $iif($1 == 0, %i)
  566.   }
  567.   elseif ($regex($1, /^JSONHandler::CHILD::([^:]+)::(.*)$/)) {
  568.     %com = $regml(1)
  569.     %get = $regml(2)
  570.   }
  571.   else {
  572.     %com = JSONHandler:: $+ $1
  573.   }
  574.   if ($com(%com)) {
  575.     if ($0 == 1) {
  576.       if ($prop == isChild) {
  577.         return $iif($regex($1, /^JSONHandler::CHILD::([^:]+)::(.*)$/), $true, $false)
  578.       }
  579.       elseif ($prop == error) {
  580.         return $iif($(,$+(%,%com,::error)), $true,$false)
  581.       }
  582.       elseif ($prop == errortext) {
  583.         return $(,$+(%,%com,::error))
  584.       }
  585.       elseif ($com($1)) {
  586.         return $1
  587.       }
  588.     }
  589.     elseif (!$com(%com, eval, 1, bstr, status) || $com(%com).result != parsed) {
  590.       set -eu0 $+(%,%com,::error) JSON Handler waiting for HTTP Request
  591.     }
  592.     else {
  593.       %x = 2
  594.       while (%x <= $0) {
  595.         %tok = $(,$ $+ %x)
  596.         if (!$regex(%tok, /^\d+$/)) {
  597.           %tok = $qt($replace(%tok,\,\\,",\"))
  598.         }
  599.         %get = $+(%get,[,%tok,])
  600.         inc %x
  601.       }
  602.       if (!$com(%com, eval, 1, bstr, %get) || $comerr) {
  603.         set -e $+(%,%com,::error) Invalid Item|index specified
  604.       }
  605.       else {
  606.         %res = $com(%com).result
  607.         if (%res == [object]) {
  608.           return JSONHandler::CHILD:: $+ $1 $+ :: $+ %get
  609.         }
  610.         else {
  611.           return %res
  612.         }
  613.       }
  614.     }
  615.   }
  616. }
  617. alias -l JSONClose {
  618.   var %com = JSONHandler:: $+ $1
  619.   unset % [ $+ [ %com ] $+ ] ::*
  620.   if ($com(%com)) { .comclose $v1 }
  621.   if ($timer(%com)) { $+(.timer,%com) off }
  622. }
  623. alias -l JSONList {
  624.   var %x = 1, %i = 0
  625.   while ($com(%x)) {
  626.     if (JSONHandler::* iswm $v1) {
  627.       inc %i
  628.       echo $color(info text) -a * # $+ %i : $regsubex($v2, /^JSONHandler::/,)
  629.     }
  630.     inc %x
  631.   }
  632.   if (!%i) {
  633.     echo $color(info text) -a * No active JSON handlers
  634.   }  
  635. }
  636. on *:Start: unset %JSONHandler::*
  637. alias -l JSON::ComOpen { .comopen $1- | if ($com($1) && !$comerr) { return $true } | :error | reseterror | if ($com($1)) { .comclose $1 } }
  638. alias -l JSON::Escape { return $replace($1,\,\\,",\") }
  639. alias -l JSON::File { var %a = 1 | while ($isfile(JSON $+ $1 $+ %a $+ .json)) { inc %a } | return $+(JSON, $1, %a, .json) }
  640. alias -l JSON::Funct { var %a = $1 $+ $chr(40), %i = 1 | while (%i < $0) { inc %i | %a = $+(%a,$iif(%i > 2,$chr(44)),$(, $ $+ %i)) } | return %a $+ $chr(41) }
Add Comment
Please, Sign In to add comment