Created
September 23, 2010 15:47
-
-
Save kimoto/593835 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| // gede99 @ http://pen2.com/google/ | |
| var version = "google.js v0.05"; | |
| // | |
| var chList = new Array(); | |
| var chListFile = "google_chlist.txt"; | |
| var entity = {"ne":8800,"le":8804,"para":182,"xi":958,"darr":8595,"nu":957,"oacute":243,"Uacute":218,"omega":969,"prime":8242,"pound":163,"igrave":236,"thorn":254,"forall":8704,"emsp":8195,"lowast":8727,"brvbar":166,"alefsym":8501,"nbsp":160,"delta":948,"clubs":9827,"lArr":8656,"Omega":937,"quot":34,"Auml":196,"cedil":184,"and":8743,"plusmn":177,"ge":8805,"raquo":187,"uml":168,"equiv":8801,"laquo":171,"Epsilon":917,"rdquo":8221,"divide":247,"fnof":402,"chi":967,"Dagger":8225,"iacute":237,"rceil":8969,"sigma":963,"Oslash":216,"acute":180,"frac34":190,"upsih":978,"lrm":8206,"Scaron":352,"part":8706,"exist":8707,"nabla":8711,"image":8465,"prop":8733,"omicron":959,"zwj":8205,"gt":62,"aacute":225,"Yuml":376,"Yacute":221,"weierp":8472,"rsquo":8217,"otimes":8855,"kappa":954,"thetasym":977,"harr":8596,"Ouml":214,"Iota":921,"ograve":242,"sdot":8901,"copy":169,"oplus":8853,"acirc":226,"sup":8835,"zeta":950,"Iacute":205,"Oacute":211,"crarr":8629,"Nu":925,"bdquo":8222,"lsquo":8216,"Beta":914,"eacute":233,"egrave":232,"lceil":8968,"Kappa":922,"piv":982,"Ccedil":199,"ldquo":8220,"Xi":926,"cent":162,"uarr":8593,"hellip":8230,"Aacute":193,"ensp":8194,"sect":167,"Ugrave":217,"aelig":230,"ordf":170,"curren":164,"sbquo":8218,"macr":175,"Phi":934,"Eta":919,"rho":961,"Omicron":927,"sup2":178,"euro":8364,"aring":229,"Theta":920,"mdash":8212,"uuml":252,"otilde":245,"eta":951,"uacute":250,"rArr":8658,"nsub":8836,"agrave":224,"notin":8713,"Psi":936,"ndash":8211,"Ocirc":212,"sube":8838,"szlig":223,"micro":181,"not":172,"sup1":185,"middot":183,"iota":953,"ecirc":234,"lsaquo":8249,"thinsp":8201,"sum":8721,"ntilde":241,"scaron":353,"cap":8745,"atilde":227,"lang":9001,"isin":8712,"gamma":947,"Euml":203,"ang":8736,"upsilon":965,"Ntilde":209,"hearts":9829,"Tau":932,"Alpha":913,"spades":9824,"THORN":222,"dagger":8224,"int":8747,"lambda":955,"Eacute":201,"Uuml":220,"infin":8734,"Aring":197,"rlm":8207,"ugrave":249,"Egrave":200,"Acirc":194,"ETH":208,"oslash":248,"rsaquo":8250,"alpha":945,"Ograve":210,"Prime":8243,"mu":956,"ni":8715,"real":8476,"bull":8226,"beta":946,"icirc":238,"eth":240,"prod":8719,"larr":8592,"ordm":186,"perp":8869,"Gamma":915,"Pi":928,"reg":174,"ucirc":251,"psi":968,"tilde":732,"asymp":8776,"zwnj":8204,"Agrave":192,"Delta":916,"deg":176,"AElig":198,"times":215,"sim":8764,"Mu":924,"Otilde":213,"uArr":8657,"circ":710,"theta":952,"Rho":929,"sup3":179,"diams":9830,"tau":964,"Chi":935,"frac14":188,"oelig":339,"shy":173,"or":8744,"dArr":8659,"phi":966,"Lambda":923,"iuml":239,"rfloor":8971,"iexcl":161,"cong":8773,"ccedil":231,"Icirc":206,"frac12":189,"loz":9674,"rarr":8594,"cup":8746,"radic":8730,"frasl":8260,"euml":235,"OElig":338,"hArr":8660,"Atilde":195,"lt":60,"Upsilon":933,"there4":8756,"ouml":246,"oline":8254,"Ecirc":202,"yacute":253,"amp":38,"auml":228,"sigmaf":962,"permil":8240,"iquest":191,"empty":8709,"pi":960,"Ucirc":219,"supe":8839,"Igrave":204,"yen":165,"rang":9002,"trade":8482,"lfloor":8970,"minus":8722,"Zeta":918,"sub":8834,"epsilon":949,"Sigma":931,"yuml":255,"Iuml":207,"ocirc":244}; | |
| var lang ={"ar":1,"it":1,"nl":1,"el":1,"hr":1,"sv":1,"es":1,"cs":1,"da":1,"de":1,"no":1,"hi":1,"fi":1,"fr":1,"bg":1,"pl":1,"pt":1,"ro":1,"ru":1,"en":1,"ko":1,"zh-CN":1,"zh-TW":1,"ja":1}; | |
| function event::onLoad(){ | |
| log(version + " (" + GetScriptEngineInfo()+")"); | |
| loadChList(); | |
| } | |
| // scripts\files\google_chlist.txt からスクリプトを作動させるチャンネルリストを取得 | |
| function loadChList(){ | |
| var file = openFile(chListFile); | |
| if(file){ | |
| var line; | |
| while( (line = file.readLine())!= null){ | |
| chList[ line.toLowerCase() ] = 1; | |
| } | |
| file.close(); | |
| } | |
| } | |
| // チャンネルリストを保存 | |
| function saveChList(){ | |
| var file = openFile(chListFile,false); | |
| if(file){ | |
| for (var i in chList) { | |
| if(chList[i])file.writeLine(i.toLowerCase()); | |
| } | |
| file.truncate(); | |
| file.close(); | |
| } | |
| } | |
| // asyncExecuteCommand - 非同期にコマンドを実行する | |
| // command : 実行するコマンド | |
| // callback : 標準出力の内容を受け取る関数 | |
| function asyncExecuteCommand(command, callback) { | |
| var wshExec = (new ActiveXObject("WScript.Shell")).Exec(command); | |
| (function commandWaitLoop() { | |
| switch(wshExec.Status) { | |
| case 0: // WshRunning - 未だ実行中 | |
| // 100ミリ秒後にもう一度statusを見ることにする | |
| setTimeout(commandWaitLoop, 100); | |
| break; | |
| case 1: // WshFinished - コマンドの実行が完了した | |
| // 標準出力の内容を全て読み取ってコールバック関数に渡す | |
| callback(wshExec.StdOut.ReadAll()); | |
| break; | |
| case 2: // WshFailed - コマンドの実行に失敗した | |
| // 例外を投げる | |
| throw new Error("asyncExecuteCommand failed"); | |
| } | |
| })(); | |
| } | |
| Array.prototype.shuffle = function(){ | |
| var len = this.length; | |
| var ary = this.concat(); | |
| var res = []; | |
| while(len) res.push(ary.splice(Math.floor(Math.random()*len--),1)); | |
| return res | |
| } | |
| // 発言から | |
| function event::onChannelText(prefix, channel, text){ | |
| if( text == "google.js"){ | |
| send(channel,"google検索・翻訳Scriptです。 開始["+myNick+">google>start] 停止["+myNick+">google>stop] " + (chList[channel.toLowerCase()]?"稼動中":"停止中")); | |
| send(channel,"例 [g>検索] [g3>検索] [g>5+5] [g>1ドルを円で] [en|ja nobita]"); | |
| } else if( chList[channel.toLowerCase()] ){ | |
| //g> 検索 | |
| if( text.match(/^g(\d*)>[\s ]*/) || text.match(/^ggrks(\d*)[\s ]*/) ){ | |
| var num = parseInt(RegExp.$1); | |
| if (isNaN(num) || num < 1) num = 0; | |
| if (num > 10) num = 10; | |
| var q = RegExp.rightContext; | |
| if (q.length > 0) google(channel,q,num); | |
| //ja|en 翻訳 | |
| } else if ( text.match(/^([-\w]+\|[-\w]+)[\s ]+/) ){ | |
| var q = RegExp.rightContext; | |
| var langpair = RegExp.$1; | |
| var l = langpair.split("|"); | |
| if (q.length > 0) { | |
| if(lang[ l[0] ] && lang[ l[1] ]){ | |
| googleTrans(channel , q , langpair); | |
| } | |
| } | |
| } else if ( text.match(/^(uploader|up|あぷろだ|アップロード|アップローダ|あっぷろーど|uploda).*/i) ) { | |
| var uploaders = [ | |
| ["Axfc Networks", "http://www.axfc.net/"], | |
| ["[200M]吉祥アップローダー", "http://kissho.xii.jp/"], | |
| ["[1G]FONOの日常", "http://fono.jp/uploader/"] | |
| ]; | |
| send(channel, "<bold><color red>Plab推奨アップローダーリスト"); | |
| for(var i=0; i<uploaders.length; i++){ | |
| send(channel, "<bold>" + uploaders[i][0] + " " + uploaders[i][1]); | |
| } | |
| } else if ( text.match(/^(たすけて|助けて|tasukete|help|yabai|usage).*/i) ) { // plabbot使い方表示 | |
| send(channel, "<bold><color red>PlaBOTの使いかた"); | |
| send(channel, "-------------------"); | |
| send(channel, "ggrks 単語 (グーグル検索)"); | |
| send(channel, "up (おすすめアップローダー表示)"); | |
| send(channel, "フレ戦 p1,p2,p3,p4,p5,p6,p7,p8 (ランダムチームシャッフル)"); | |
| send(channel, "g> 天気 東京 (天気確認)"); | |
| send(channel, "ja|en 単語 (翻訳)"); | |
| send(channel, "map (ランダムにマップ抽選)"); | |
| send(channel, "-------------------"); | |
| } else if ( text.match(/^暇|ひま|ヒマ|hima/i) ) { | |
| send(channel, "<bold><color red>はよtofuフレ戦"); | |
| } else if ( text.match(/^フレ戦\s*([^,]+([,@\s,、][^,]+)+)/i) ) { | |
| var str = RegExp.$1; | |
| var players = str.split(/[,@\s,、]/) | |
| // triming | |
| for(var i=0; i<players.length; i++){ | |
| players[i] = players[i].replace(/[\s ]/, ""); | |
| } | |
| players = players.shuffle(); | |
| var team_size = Math.floor(players.length / 2); | |
| // 前半4人 | |
| var team1 = "team1: "; | |
| for(var i=0; i<team_size; i++){ | |
| team1 += players[i] + " "; | |
| } | |
| // 後半4人 | |
| var team2 = "team2: "; | |
| for(var i=team_size; i<players.length; i++){ | |
| team2 += players[i] + " "; | |
| } | |
| send(channel, "<bold><color red>ランダムチームシャッフル"); | |
| send(channel, team1); | |
| send(channel, team2); | |
| } else if( text.match(/^map$/i) ) { | |
| maps = [ | |
| "デッドセンター", | |
| "ダークカーニバル", | |
| "スワンプフィーバー", | |
| "ハードレイン", | |
| "パリッシュ", | |
| "パッシング" | |
| ]; | |
| send(channel, maps.shuffle()[0]); | |
| } else if (text.match(/^server|confogl$/)) { | |
| // 使用例 | |
| /* | |
| asyncExecuteCommand("execute_test.bat", function(result) { | |
| log(result); | |
| //send(channel, result); | |
| send(channel, RegExp.$1); | |
| }); | |
| */ | |
| send(channel, "<color red>過疎confogl鯖"); | |
| var result = executeCommand("confogl_mm.bat"); | |
| log("getting"); | |
| log("original result records"); | |
| log(result); | |
| // 改行コードを統一する | |
| log("replace line feed"); | |
| result = result.replace(/\r\n|\r|\n/g, "\n"); | |
| log(result); | |
| // 行ごとに分割して配列に変換 | |
| log("string to array"); | |
| array = result.split(/\n/); | |
| log(array.join(",")); | |
| // 先頭行は無視 | |
| var first_line = array.shift(); | |
| // 残りの行を対象にそのまま出力する | |
| for(var i=1; i<array.length; i++){ | |
| //log("output: " + array[i]); | |
| send(channel, array[i]); | |
| } | |
| /* | |
| var trimed = result.replace(/[\r\n\t\s]/g, ""); | |
| log(trimed); | |
| if( trimed.match(/^(.*?)>(.*)$/) ){ | |
| log("match!!"); | |
| log(RegExp.$2); | |
| } | |
| */ | |
| log("terminated"); | |
| } else if( text.match(/find\s+(\S+)/) ) { | |
| send(channel, "<color red>プレイヤー検索"); | |
| // find test | |
| var exec_str = "find_player.bat " + RegExp.$1 | |
| log(exec_str); | |
| var result = executeCommand(exec_str); | |
| log("getting"); | |
| log("original result records"); | |
| log(result); | |
| // 改行コードを統一する | |
| log("replace line feed"); | |
| result = result.replace(/\r\n|\r|\n/g, "\n"); | |
| log(result); | |
| // 行ごとに分割して配列に変換 | |
| log("string to array"); | |
| array = result.split(/\n/); | |
| log(array.join(",")); | |
| // 先頭行は無視 | |
| var first_line = array.shift(); | |
| // 残りの行を対象にそのまま出力する | |
| for(var i=1; i<array.length; i++){ | |
| //log("output: " + array[i]); | |
| send(channel, array[i]); | |
| } | |
| log("find test"); | |
| } else if( text.match(/^setup$/) ) { | |
| log("setup"); | |
| result = executeCommand("setup.bat"); | |
| log(result); | |
| log("setup exit"); | |
| } | |
| } | |
| //コマンド | |
| if( text.match(/>google>/) ){ | |
| if( text == myNick+">google>start"){ | |
| chList[ channel.toLowerCase() ] = 1; | |
| send(channel,"google検索を開始します。"); | |
| saveChList(); | |
| }else if( text == myNick+">google>stop"){ | |
| chList[ channel.toLowerCase() ] = 0; | |
| send(channel,"google検索を停止します。"); | |
| saveChList(); | |
| } | |
| } | |
| } | |
| //検索の旅に出る | |
| function google(channel , q , num){ | |
| var xmlhttp = XMLHttpRequest(); | |
| if (xmlhttp) { | |
| xmlhttp.setTimeouts(5*1000,5*1000,15*1000,15*1000);//タイムアウト15秒ぐらい。 | |
| xmlhttp.onreadystatechange = function() { | |
| if (xmlhttp.readyState == 4 && xmlhttp.responseText.length ) { | |
| var s = xmlhttp.responseText; | |
| //電卓結果があれば表示 | |
| if(s.match(/<img src=\/images\/calc_img.gif[^>]*>.*?<b>(.+?)<\/b>/i)){ | |
| send(channel, decode_entities(RegExp.$1).replace(/<.*?>/g,"")); | |
| return; | |
| //天気があれば | |
| }else if(s.match(/<b>([^<]+)<\/b> の<b>天気情報<.*?<b>(-?\d.*?)<.*?<b>([^<]+)<\/b><br>.*?>([^<>]+)<br><img[^>]+weather[^>]+alt="(.*?)".*?(<nobr>.*?<\/nobr>).*?>([^<>]+)<br><img[^>]+weather[^>]+alt="(.*?)".*?(<nobr>.*?<\/nobr>)/i)){ | |
| var txt = RegExp.$1+"≪"+RegExp.$3+" "+RegExp.$2+"≫ "+RegExp.$4+"曜日:"+RegExp.$5+"("+RegExp.$6+") "+RegExp.$7+"曜日:"+RegExp.$8+"("+RegExp.$9+")"; | |
| send(channel, decode_entities(txt).replace(/<.*?>/g,"")); | |
| return; | |
| //「g>」と検索されたら該当件数とURLだけ表示 | |
| }else if(num == 0 && s.match(/約 ([\d,]+) 件/i) ){ | |
| send(channel, RegExp.$1+"件該当 http://www.google.co.jp/search?ie=utf-8&q=" + encodeURIComponent(q)); | |
| return; | |
| }else { | |
| //「g\d+>」検索結果を表示 | |
| for (var i=0; i<num; i++) { | |
| if (!s.match(/<a href="([^"]+)"[^>]*class=l[^>]*>(.+?)<\/a>/)) break; | |
| s = RegExp.rightContext; | |
| var url = RegExp.$1; | |
| var title = RegExp.$2; | |
| send(channel, decode_entities(title.replace(/<\/?(b|em)>/g, "\x02")).replace(/\s/g," ").replace(/<.*?>/g,"") + " " + url); | |
| } | |
| } | |
| } | |
| } | |
| xmlhttp.open("GET", 'http://www.google.co.jp/search?ie=utf-8&oe=utf-8&num=' + (num+1) + '&q=' + encodeURIComponent(q) , true); | |
| xmlhttp.setRequestHeader("User-Agent","Mozilla/5.0 (compatible; google.js@limechat;)"); | |
| xmlhttp.send(""); | |
| } | |
| } | |
| //翻訳の旅に出る | |
| function googleTrans( channel , str , langpair ){ | |
| var xmlhttp = XMLHttpRequest(); | |
| if (xmlhttp) { | |
| xmlhttp.setTimeouts(5*1000,5*1000,15*1000,15*1000); | |
| xmlhttp.onreadystatechange = function() { | |
| if (xmlhttp.readyState == 4 && xmlhttp.responseText.length ) { | |
| var s = xmlhttp.responseText; | |
| // log(s); | |
| if(s.match(/"translatedText":(".*?")/)){ | |
| eval('var str='+ RegExp.$1 +';'); | |
| send( channel, decode_entities(str).replace(/\s/g," ") ); | |
| return; | |
| } | |
| } | |
| } | |
| xmlhttp.open("GET", 'http://ajax.googleapis.com/ajax/services/language/translate?v=1.0&langpair=' + encodeURIComponent(langpair) + '&q=' + encodeURIComponent(str) , true); | |
| xmlhttp.setRequestHeader("User-Agent","Mozilla/5.0 (compatible; google.js@limechat;)"); | |
| xmlhttp.send(""); | |
| } | |
| } | |
| // Msxml2.ServerXMLHTTP が欲しい | |
| function XMLHttpRequest(){ | |
| try { | |
| return new ActiveXObject("Msxml2.ServerXMLHTTP.6.0"); | |
| } catch(e) {} | |
| try { | |
| return new ActiveXObject("Msxml2.ServerXMLHTTP.5.0"); | |
| } catch(e) {} | |
| try { | |
| return new ActiveXObject("Msxml2.ServerXMLHTTP.4.0"); | |
| } catch(e) {} | |
| try { | |
| return new ActiveXObject("Msxml2.ServerXMLHTTP.3.0"); | |
| } catch(e) {} | |
| try { | |
| return new ActiveXObject("Msxml2.ServerXMLHTTP"); | |
| } catch(e) {} | |
| } | |
| // エンティティ変換 | |
| function decode_entities(str){ | |
| return str.replace(/&#(\d+);?|&#x([0-9a-fA-F]+);?|&(AElig|Aacute|Acirc|Agrave|Alpha|Aring|Atilde|Auml|Beta|Ccedil|Chi|Dagger|Delta|ETH|Eacute|Ecirc|Egrave|Epsilon|Eta|Euml|Gamma|Iacute|Icirc|Igrave|Iota|Iuml|Kappa|Lambda|Mu|Ntilde|Nu|OElig|Oacute|Ocirc|Ograve|Omega|Omicron|Oslash|Otilde|Ouml|Phi|Pi|Prime|Psi|Rho|Scaron|Sigma|THORN|Tau|Theta|Uacute|Ucirc|Ugrave|Upsilon|Uuml|Xi|Yacute|Yuml|Zeta|aacute|acirc|acute|aelig|agrave|alefsym|alpha|amp|and|ang|aring|asymp|atilde|auml|bdquo|beta|brvbar|bull|cap|ccedil|cedil|cent|chi|circ|clubs|cong|copy|crarr|cup|curren|dArr|dagger|darr|deg|delta|diams|divide|eacute|ecirc|egrave|empty|emsp|ensp|epsilon|equiv|eta|eth|euml|euro|exist|fnof|forall|frac12|frac14|frac34|frasl|gamma|ge|gt|hArr|harr|hearts|hellip|iacute|icirc|iexcl|igrave|image|infin|int|iota|iquest|isin|iuml|kappa|lArr|lambda|lang|laquo|larr|lceil|ldquo|le|lfloor|lowast|loz|lrm|lsaquo|lsquo|lt|macr|mdash|micro|middot|minus|mu|nabla|nbsp|ndash|ne|ni|not|notin|nsub|ntilde|nu|oacute|ocirc|oelig|ograve|oline|omega|omicron|oplus|or|ordf|ordm|oslash|otilde|otimes|ouml|para|part|permil|perp|phi|pi|piv|plusmn|pound|prime|prod|prop|psi|quot|rArr|radic|rang|raquo|rarr|rceil|rdquo|real|reg|rfloor|rho|rlm|rsaquo|rsquo|sbquo|scaron|sdot|sect|shy|sigma|sigmaf|sim|spades|sub|sube|sum|sup|sup1|sup2|sup3|supe|szlig|tau|there4|theta|thetasym|thinsp|thorn|tilde|times|trade|uArr|uacute|uarr|ucirc|ugrave|uml|upsih|upsilon|uuml|weierp|xi|yacute|yen|yuml|zeta|zwj|zwnj);?/g,function(str, int, hex, ent){ | |
| if(int){ | |
| return String.fromCharCode(int); | |
| }else if(hex){ | |
| return String.fromCharCode(parseInt("0x"+hex)); | |
| }else if(entity[ent]){ | |
| return String.fromCharCode(entity[ent]); | |
| }else{ | |
| return "&" + ent; | |
| } | |
| }); | |
| } | |
| //JScriptのバージョン | |
| function GetScriptEngineInfo(){ | |
| var s; | |
| s = ""; // Build string with necessary info. | |
| s += ScriptEngine() + " Version "; | |
| s += ScriptEngineMajorVersion() + "."; | |
| s += ScriptEngineMinorVersion() + "."; | |
| s += ScriptEngineBuildVersion(); | |
| return(s); | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment