Create a gist now

Instantly share code, notes, and snippets.

What would you like to do?
CmdUtils.CreateCommand({
names: ["checkIP"],
preview: function preview(pblock, args){
// プレビューをクリア
pblock.innerHTML = "";
/**
* DB は IP を検索するサイト。
*
* {spec.url サイトの URL,
* spec.existp サイトでの検索結果から、対象がサイトに存在するか判定する述語}
*
* @param {Object} spec
*/
var db = function(spec){
var that = {};
// public --------------------------------------------
/**
* 与えられた IP が存在することを確認し、その結果に対して関数 f を適用する。
* @param {Object} ip IP アドレス
* @param {Function} f コールバック関数
*/
var exists = function(ip, f){
jq(ip, function(page){
f(spec.existp(page));
});
};
that.exists = exists;
/**
* 与えられた IP に対する存否の結果ページを取得し、その結果に対して関数 f を適用する。
* @param {Object} ip IP アドレス
* @param {Function} f コールバック関数
*/
var getHTML = function(ip, f){
jq(ip, function(page){
f(page);
});
};
that.getHTML = getHTML;
// private --------------------------------------------
/**
* jQuery.get をラップした関数
* @param {Object} ip
* @param {Function} f
*/
var jq = function(ip, f){
jQuery.get(spec.url + ip, null, function(page){
f(page);
});
};
return that;
};
/**
* DB SET は検索対象の DB を集約。
*
* {spec.dbs db の配列}
*
* @param {Object} spec
*/
var dbSet = function(spec){
var that = {};
/**
* DB における IP アドレスの存否の結果を HTML で取得し、それに関数 f を適用する。
* @param {Object} ip
* @param {Function} f
*/
var getHTML = function(ip, f){
each(function(db){
db.getHTML(ip, function(page){
f(page);
});
});
};
that.getHTML = getHTML;
/**
* いずれかの DB に与えられた IP が存在するか確認し、その結果に対して関数 f を適用する。
*
* @param {Object} ip
* @param {Function} f
*/
var exists = function(ip, f){
var result = [];
var allChecked = function(){
var b = false;
if (result.length === spec.dbs.length) {
for (var i = 0; i < spec.dbs.length; i++) {
b = b || result[i];
}
f(b);
}
};
each(function(db){
db.exists(ip, function(exists){
var idx = result.length;
exists ? result[idx] = true : result[idx] = false;
allChecked();
});
});
};
that.exists = exists;
// private ----------------------------------------------
/**
* 各 DB に対して関数 f を適用する
* @param {Function} f
*/
var each = function(f){
for (var i = 0; i < spec.dbs.length; i++) {
f(spec.dbs[i]);
}
};
return that;
};
// 各 DB の設定
var dronebl = db({
url: "http://dronebl.org/lookup_branded.do?ip=",
existp: function(page){
var msg = /This means that your IP is not listed in DroneBL/;
return page.match(msg) ? false : true;
}
});
var efnetrbl = db({
url: "http://rbl.efnetrbl.org/?i=",
existp: function(page){
var msg = /was found in the database/;
return page.match(msg) ? true : false;
}
});
// ブラウザで選択された IP アドレス
var ip = CmdUtils.getSelection("").match(/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/);
// DB を集約
dbSet({
dbs: [dronebl, efnetrbl],
}).exists(ip, function(b){
pblock.innerHTML += b;
});
},
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment