Created
June 11, 2010 04:42
-
-
Save ebith/434055 to your computer and use it in GitHub Desktop.
This file contains 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
/* | |
require : | |
GNTP/COM http://github.com/snaka/GNTPCom | |
mkdir -p C:\bin\limechat2\users\ebith\scripts\files\ti2gfw\ | |
cp default.png C:\bin\limechat2\users\ebith\scripts\files\ti2gfw\default.png | |
*/ | |
function event::onChannelText(prefix, channel, text) | |
{ | |
if(prefix.nick == myNick){ | |
}else{ | |
//除外チャンネル設定 | |
if(!channel.match(/^#reply@twitter$/i)){ | |
//設定した正規表現が誰かの発言内に見つかったらcallで通知する | |
//Growl for Windows側でsticky alwaysにしたりすると便利 | |
var nameCall = new RegExp(".*ebith.*","i"); | |
var fso = new ActiveXObject("Scripting.FileSystemObject"); | |
var cacheDir = fso.BuildPath(userScriptFilePath, "ti2gfw"); | |
//どうせ画像は3種類なので決め打ちでキャッシュがあるかどうか判断する | |
var jpg = fso.BuildPath(cacheDir, prefix.nick + ".jpg"); | |
var png = fso.BuildPath(cacheDir, prefix.nick + ".png"); | |
var gif = fso.BuildPath(cacheDir, prefix.nick + ".gif"); | |
if(fso.FileExists(jpg)){ | |
log("jpgのキャッシュあった"); | |
var iconFile = jpg; | |
}else if(fso.FileExists(png)){ | |
log("pngのキャッシュあった"); | |
var iconFile = png; | |
}else if(fso.FileExists(gif)){ | |
log("gifのキャッシュあった"); | |
var iconFile = gif; | |
} | |
//アイコンがあっても一日以上前にキャッシュしていた場合削除してDLしなおす | |
if(iconFile){ | |
Icon = fso.GetFile(iconFile); | |
var now = new Date(); | |
var cache = new Date(Icon.DateLastModified); | |
enow = now.getTime(); | |
ecache = cache.getTime(); | |
if(enow > ecache+86400000){ | |
log("キャッシュ古いらしい"); | |
fso.DeleteFile(iconFile, true) | |
var iconFile = getIcon(prefix.nick, cacheDir); | |
} | |
} | |
if(!iconFile){ | |
log("キャッシュ無い"); | |
var iconFile = getIcon(prefix.nick, cacheDir); | |
} | |
//GNTP/Comを使ってGrowlへ通知を送信 | |
var g = new ActiveXObject("GNTPCom.Growler"); | |
g.Init(channel, SA("notify", "warn", "call")); | |
//正規表現にマッチしたらcallそれ以外はnotifyで通知 | |
if(text.match(nameCall)){ | |
log("名前呼ばれたよ"); | |
g.Notify("call", prefix.nick, text, iconFile); | |
}else{ | |
g.Notify("notify", prefix.nick, text, iconFile); | |
} | |
// Utility for create SAFEARRAY object | |
function SA() { | |
var temp = new ActiveXObject("Scripting.Dictionary"); | |
for (var i = 0; i < arguments.length; i++) | |
temp.add(i, arguments[i]); | |
return temp.Items(); | |
} | |
log(iconFile); | |
} | |
} | |
function getIcon(nick, saveDir ){ | |
log("アイコン取得しちゃう"); | |
//リダイレクトされちゃうとファイル名がわからんくて拡張子不明で困るので | |
//無効にしておいてLocationヘッダからリダイレクト先を取得する | |
//ファイルの中身を見て拡張子判断すべき? | |
var fso = new ActiveXObject("Scripting.FileSystemObject"); | |
var winhttp = new ActiveXObject("WinHttp.WinHttpRequest.5.1"); | |
var WinHttpRequestOption_EnableRedirects = 6; | |
winhttp.setTimeouts(5*1000, 5*1000, 15*1000, 15*1000); | |
winhttp.option(WinHttpRequestOption_EnableRedirects) = false; | |
winhttp.open("GET", "http://usericons.relucks.org/twitter/" + nick, false); | |
winhttp.send(""); | |
//TwitterのIDと関係のないNickとかアイコン無変更の場合アイコンが見つからずエラーになるので | |
//用意しておいたデフォルトアイコンをNick.pngの名前でコピーしてキャッシュ扱いにする | |
try{ | |
var url = winhttp.getResponseHeader("Location"); | |
}catch(e){ | |
log("予定だったけど見当たらないからデフォルトをコピーしとく"); | |
fso.CopyFile(saveDir + "\\default.png", saveDir + "\\" + nick + ".png"); | |
var fileName = nick + ".png" | |
var iconFile = fso.BuildPath(saveDir, fileName); | |
//その時にファイルのmtimeを更新しておく | |
log("mtimeも更新した"); | |
var oShell = new ActiveXObject("Shell.Application"); | |
var oFolder = oShell.NameSpace(cacheDir); | |
var oFile = oFolder.ParseName(fileName); | |
oFile.ModifyDate = now.toLocaleString(); | |
return iconFile; | |
} | |
//アイコンの拡張子はなんだ | |
var filext = url.match(/\.\w{3,4}$/); | |
//アイコンをDLして保存する | |
winhttp.open("GET", url, false); | |
winhttp.send(""); | |
var iconFile = fso.BuildPath(saveDir, nick + filext); | |
var ads = new ActiveXObject("Adodb.Stream"); | |
ads.type = 1; | |
ads.open(); | |
ads.write(winhttp.responseBody); | |
ads.savetofile(iconFile, 2); | |
return iconFile; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment