Skip to content

Instantly share code, notes, and snippets.

@ebith
Created Jun 11, 2010
Embed
What would you like to do?
/*
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