From 545419e3649fc79878b63b13e95cd7da0320e160 Mon Sep 17 00:00:00 2001
From: deuce <>
Date: Fri, 15 Jun 2012 02:15:41 +0000
Subject: [PATCH] Move callsign lookups into a separate library...

---
 exec/ircbots/ham/ham.js | 157 ++++------------------------------------
 exec/load/callsign.js   | 122 +++++++++++++++++++++++++++++++
 2 files changed, 137 insertions(+), 142 deletions(-)
 create mode 100644 exec/load/callsign.js

diff --git a/exec/ircbots/ham/ham.js b/exec/ircbots/ham/ham.js
index 7868c2e2ff..5fc1eec0c3 100644
--- a/exec/ircbots/ham/ham.js
+++ b/exec/ircbots/ham/ham.js
@@ -1,5 +1,7 @@
 if(!js.global || js.global.HTTPRequest==undefined)
-	load("http.js");
+	js.global.load("http.js");
+if(!js.global || js.global.USCallsign==undefined)
+	js.global.load("callsign.js");
 
 // Comment these...
 //Bot_Commands={};
@@ -169,173 +171,44 @@ Bot_Commands["CALLSIGN"].command = function (target,onick,ouh,srv,lvl,cmd) {
 		return true;
 	}
 
-	function USCallsign(callsign, srv, target) {
-		var i;
-		var CookieRequest=new HTTPRequest();
-		var m=CookieRequest.Get('http://wireless2.fcc.gov/UlsApp/UlsSearch/searchLicense.jsp');
-		var jsess='';
-		var cookies=['refineIndex=0'];
-		for(i in CookieRequest.response_headers) {
-			if(CookieRequest.response_headers[i].search(/^Set-Cookie:/i)!=-1) {
-				if(m=CookieRequest.response_headers[i].match(/^Set-Cookie:\s*(.*?);/)) {
-					cookies.push(m[1]);
-					if(m[1].search(/JSESSIONID_/)==0)
-						jsess=m[1];
-				}
-			}
-		}
-		req=new HTTPRequest();
-		req.SetupPost('http://wireless2.fcc.gov/UlsApp/UlsSearch/results.jsp;'+jsess, undefined, undefined, 'fiUlsSearchByType=uls_l_callsign++++++++++++++++&fiUlsSearchByValue='+callsign+'&fiUlsExactMatchInd=Y&hiddenForm=hiddenForm&jsValidated=true&x=0&y=0');
-		req.request_headers.push("Cookie: "+cookies.join('; '));
-		req.request_headers.push("Referer: http://wireless2.fcc.gov/UlsApp/UlsSearch/searchLicense.jsp");
-		req.SendRequest();
-		req.ReadResponse();
-
-		m=req.body.match(/license.jsp\?licKey=[^\s]*/g);
-
-		if(m && m.length) {
-			var response=new HTTPRequest().Get('http://wireless2.fcc.gov/UlsApp/UlsSearch/'+m[m.length-1]);
-			m=response.match(/In the case of City, state and zip[^-]*?-->([\s\S]*?)<\/td>/);
-			if(m) {
-				var info=callsign+':';
-				m[1]=m[1].replace(/<[^>]*>/g,'');
-				m[1]=m[1].replace(/[\r\n]/g,' ');
-				m[1]=m[1].replace(/\s+/g,' ');
-				info += m[1];
-
-				m=response.match(/>Type<\/td>[\s\S]*?>([^<&]*)[<&]/);
-				if(m) {
-					m[1]=m[1].replace(/<[^>]*>/g,'');
-					m[1]=m[1].replace(/[\r\n]/g,' ');
-					m[1]=m[1].replace(/\s+/g,' ');
-					info += ' -  Type: '+m[1];
-				}
-
-				m=response.match(/<!--Example: Amateur Extra -->([^&<]*?)[&<]/);
-				if(m) {
-					m[1]=m[1].replace(/<[^>]*>/g,'');
-					m[1]=m[1].replace(/[\r\n]/g,' ');
-					m[1]=m[1].replace(/\s+/g,' ');
-					info += ' -  Class: '+m[1];
-				}
-
-				m=response.match(/>Status<\/td>[\s\S]*?>([^<&]*)[<&]/);
-				if(m) {
-					m[1]=m[1].replace(/<[^>]*>/g,'');
-					m[1]=m[1].replace(/[\r\n]/g,' ');
-					m[1]=m[1].replace(/\s+/g,' ');
-					info += ' ('+m[1]+')';
-				}
-				srv.o(target,info);
-				return true;
-			}
-			else {
-				return false;
-			}
-		}
-		else {
-			return false;
-		}
-	}
-
-	function CanadaCallsign(callsign, srv, target) {
-		var result=new HTTPRequest().Post('http://apc-cap.ic.gc.ca/pls/apc_anon/query_amat_cs$callsign.actionquery','P_CALLSIGN='+callsign+'&P_SURNAME=&P_CITY=&P_PROV_STATE_CD=&P_POSTAL_ZIP_CODE=&Z_ACTION=QUERY&Z_CHK=0');
-		var re=new RegExp("<a href=\"(query_amat_cs\\$callsign\\.QueryViewByKey\\?P_CALLSIGN="+callsign.toUpperCase()+"&amp;Z_CHK=[0-9]+)\">"+callsign.toUpperCase()+"</a>");
-		var m=result.match(re);
-		if(m!=null) {
-			result=new HTTPRequest().Get('http://apc-cap.ic.gc.ca/pls/apc_anon/'+m[1].replace(/&amp;/g, '&'));
-			m=result.match(/Call Sign:[\s\S]*?\<td>([^<]+)<[\s\S]*?Amateur Name:[\s\S]*?\<td>([^<]+)<[\s\S]*?Address:[\s\S]*?\<td>([^<]+)<[\s\S]*?City:[\s\S]*?\<td>([^<]+)<[\s\S]*?Province:[\s\S]*?\<td>([^<]+)<[\s\S]*?Postal Code:[\s\S]*?\<td>([^<]+)<[\s\S]*?Qualifications:[\s\S]*?\<td>([^<]+)</);
-			if(m!=null) {
-				srv.o(target, (m[1]+": "+m[2]+", "+m[3]+", "+m[4]+", "+m[5]+" "+m[6]+". "+m[7]).replace(/&nbsp;/g,''));
-				return true;
-			}
-			else {
-				return false;
-			}
-		}
-		else {
-			return false;
-		}
-	}
-
-	function HamcallCallsign(callsign, srv, target) {
-		var req=new HTTPRequest();
-		var config = new File(system.ctrl_dir + js.global.config_filename);
-		if(!config.open('r')) {
-			log("Unable to open config!");
-			return false;
-		}
-
-		req.SetupGet('http://hamcall.net/call?callsign='+callsign);
-		req.request_headers.push("Cookie: callsign="+config.iniGetValue("module_Ham", 'callsign')+'; password='+config.iniGetValue("module_Ham", 'password'));
-		req.SendRequest();
-		req.ReadResponse();
-
-		config.close();
-
-		var m=req.body.match(/Tell them you found it on HamCall.net, the world's largest callsign database!.*?<BR>([\s\S]*?)(<font size|<\/td>)/);
-		if(m) {
-			m[1]=m[1].replace(/<[^>]*>/g,' ');
-			m[1]=m[1].replace(/[\r\n]/g,' ');
-			m[1]=m[1].replace(/\s+/g,' ');
-			m[1] += ' (Found on HamCall.net)';
-			srv.o(target, m[1]);
-			return true;
-		}
-		else {
-			return false;
-		}
-	}
-
-	function USSpecialEvent(callsign,src,target) {
-		var result=new HTTPRequest().Post('http://www.arrl.org/special-event-stations', '_method=POST&data%5BSearch%5D%5Bcall_sign%5D='+callsign+'&data%5BSearch%5D%5Bkeywords%5D=&data%5BLocation%5D%5Bzip%5D=&data%5BLocation%5D%5Barea%5D=&data%5BLocation%5D%5Bcity%5D=&data%5BLocation%5D%5Bstate%5D=&data%5BLocation%5D%5Bdivision_id%5D=&data%5BLocation%5D%5Bsection_id%5D=&data%5BLocation%5D%5Bcountry%5D=&data%5BDate%5D%5Bstart%5D=&data%5BDate%5D%5Bend%5D=');
-		var m=result.match(/<h3>\s*([\s\S]*?)<\/p/);
-		if(m!=null) {
-			m[1]=m[1].replace(/<[^>]*>/g,'');
-			m[1]=m[1].replace(/[\r\n]/g,' ');
-			m[1]=m[1].replace(/\s+/g,' ');
-			srv.o(target, m[1]);
-			return true;
-		}
-		else {
-			return false;
-		}
-	}
-
-	var matched=false;
-	if(!matched && callsign.search(/(C[F-K]|C[Y-Z]|V[A-GOXY]|X[J-O])/)==0) {
+	var matched;
+	if(matched==undefined && callsign.search(/(C[F-K]|C[Y-Z]|V[A-GOXY]|X[J-O])/)==0) {
 		try {
-			matched=CanadaCallsign(callsign, srv, target);
+			matched=CanadaCallsign(callsign);
+			srv.o(target, (matched.callsign+": "+matched.name+", "+matched.address+", "+matched.city+", "+matched.province+" "+matched.postalzip+". "+matched.qualifications));
 		}
 		catch(e) {
 			srv.o(target, "Failed to look up Canadian Callsign: "+e);
 		}
 	}
-	if(!matched && callsign.search(/^\s*(K|N|W)[0-9].\s*$/)==0) {
+	if(matched==undefined && callsign.search(/^\s*(K|N|W)[0-9].\s*$/)==0) {
 		try {
 			matched=USSpecialEvent(callsign,srv,target);
+			srv.o(target, matched.string);
 		}
 		catch(e) {
 			srv.o(target, "Failed to look up US Special Event Callsign: "+e);
 		}
 	}
-	if(!matched && callsign.search(/(A[A-L]|K|N|W)/)==0) {
+	if(matched==undefined && callsign.search(/(A[A-L]|K|N|W)/)==0) {
 		try {
-			matched=USCallsign(callsign,srv,target);
+			matched=USCallsign(callsign);
+			srv.o(target, matched.callsign+':'+matched.address+' - Type: '+matched.type+' - Class: '+matched.class+' ('+matched.status+')');
 		}
 		catch(e) {
 			srv.o(target, "Failed to look up US Callsign: "+e);
 		}
 	}
-	if(!matched) {
+	if(matched==undefined) {
 		try {
 			matched=HamcallCallsign(callsign, srv, target);
+			srv.o(target, matched.string);
 		}
 		catch(e) {
 			srv.o(target, "Failed to look up Callsign on HamCall: "+e);
 		}
 	}
-	if(!matched) {
+	if(matched==undefined) {
 		srv.o(target, "Unable to match callsign in any databases.");
 	}
 
diff --git a/exec/load/callsign.js b/exec/load/callsign.js
new file mode 100644
index 0000000000..16498e1d37
--- /dev/null
+++ b/exec/load/callsign.js
@@ -0,0 +1,122 @@
+function USCallsign(callsign) {
+	var ret={callsign:callsign};
+	var i;
+	var CookieRequest=new HTTPRequest();
+	var m=CookieRequest.Get('http://wireless2.fcc.gov/UlsApp/UlsSearch/searchLicense.jsp');
+	var jsess='';
+	var cookies=['refineIndex=0'];
+	for(i in CookieRequest.response_headers) {
+		if(CookieRequest.response_headers[i].search(/^Set-Cookie:/i)!=-1) {
+			if(m=CookieRequest.response_headers[i].match(/^Set-Cookie:\s*(.*?);/)) {
+				cookies.push(m[1]);
+				if(m[1].search(/JSESSIONID_/)==0)
+					jsess=m[1];
+			}
+		}
+	}
+	req=new HTTPRequest();
+	req.SetupPost('http://wireless2.fcc.gov/UlsApp/UlsSearch/results.jsp;'+jsess, undefined, undefined, 'fiUlsSearchByType=uls_l_callsign++++++++++++++++&fiUlsSearchByValue='+callsign+'&fiUlsExactMatchInd=Y&hiddenForm=hiddenForm&jsValidated=true&x=0&y=0');
+	req.request_headers.push("Cookie: "+cookies.join('; '));
+	req.request_headers.push("Referer: http://wireless2.fcc.gov/UlsApp/UlsSearch/searchLicense.jsp");
+	req.SendRequest();
+	req.ReadResponse();
+
+	m=req.body.match(/license.jsp\?licKey=[^\s]*/g);
+
+	if(m && m.length) {
+		var response=new HTTPRequest().Get('http://wireless2.fcc.gov/UlsApp/UlsSearch/'+m[m.length-1]);
+		m=response.match(/In the case of City, state and zip[^-]*?-->([\s\S]*?)<\/td>/);
+		if(m) {
+			m[1]=m[1].replace(/<[^>]*>/g,'');
+			m[1]=m[1].replace(/[\r\n]/g,' ');
+			m[1]=m[1].replace(/\s+/g,' ');
+			ret.address=m[1];
+
+			m=response.match(/>Type<\/td>[\s\S]*?>([^<&]*)[<&]/);
+			if(m) {
+				m[1]=m[1].replace(/<[^>]*>/g,'');
+				m[1]=m[1].replace(/[\r\n]/g,' ');
+				m[1]=m[1].replace(/\s+/g,' ');
+				ret.type=m[1];
+			}
+
+			m=response.match(/<!--Example: Amateur Extra -->([^&<]*?)[&<]/);
+			if(m) {
+				m[1]=m[1].replace(/<[^>]*>/g,'');
+				m[1]=m[1].replace(/[\r\n]/g,' ');
+				m[1]=m[1].replace(/\s+/g,' ');
+				ret.class=m[1];
+			}
+
+			m=response.match(/>Status<\/td>[\s\S]*?>([^<&]*)[<&]/);
+			if(m) {
+				m[1]=m[1].replace(/<[^>]*>/g,'');
+				m[1]=m[1].replace(/[\r\n]/g,' ');
+				m[1]=m[1].replace(/\s+/g,' ');
+			}
+			return ret;
+		}
+	}
+	throw("No ULS results");
+}
+
+function CanadaCallsign(callsign) {
+	var result=new HTTPRequest().Post('http://apc-cap.ic.gc.ca/pls/apc_anon/query_amat_cs$callsign.actionquery','P_CALLSIGN='+callsign+'&P_SURNAME=&P_CITY=&P_PROV_STATE_CD=&P_POSTAL_ZIP_CODE=&Z_ACTION=QUERY&Z_CHK=0');
+	var re=new RegExp("<a href=\"(query_amat_cs\\$callsign\\.QueryViewByKey\\?P_CALLSIGN="+callsign.toUpperCase()+"&amp;Z_CHK=[0-9]+)\">"+callsign.toUpperCase()+"</a>");
+	var m=result.match(re);
+	if(m!=null) {
+		var ret={callsign:callsign};
+		result=new HTTPRequest().Get('http://apc-cap.ic.gc.ca/pls/apc_anon/'+m[1].replace(/&amp;/g, '&'));
+		result=result.replace(/&nbsp;/g,' ');
+		result=result.replace(/\s+/g,' ');
+		m=result.match(/Call Sign:[\s\S]*?\<td>([^<]+)<[\s\S]*?Amateur Name:[\s\S]*?\<td>([^<]+)<[\s\S]*?Address:[\s\S]*?\<td>([^<]+)<[\s\S]*?City:[\s\S]*?\<td>([^<]+)<[\s\S]*?Province:[\s\S]*?\<td>([^<]+)<[\s\S]*?Postal Code:[\s\S]*?\<td>([^<]+)<[\s\S]*?Qualifications:[\s\S]*?\<td>([^<]+)</);
+		if(m!=null) {
+			ret.callsign=m[1];
+			ret.name=m[2];
+			ret.address=m[3];
+			ret.city=m[4];
+			ret.province=m[5];
+			ret.postalzip=m[6];
+			ret.qualifications=m[7];
+			return ret;
+		}
+	}
+	throw("No IC results");
+}
+
+function HamcallCallsign(callsign) {
+	var req=new HTTPRequest();
+	var config = new File(system.ctrl_dir + js.global.config_filename);
+	if(!config.open('r')) {
+		throw("Unable to open config!");
+	}
+
+	req.SetupGet('http://hamcall.net/call?callsign='+callsign);
+	req.request_headers.push("Cookie: callsign="+config.iniGetValue("module_Ham", 'callsign')+'; password='+config.iniGetValue("module_Ham", 'password'));
+	req.SendRequest();
+	req.ReadResponse();
+
+	config.close();
+
+	var m=req.body.match(/Tell them you found it on HamCall.net, the world's largest callsign database!.*?<BR>([\s\S]*?)(<font size|<\/td>)/);
+	if(m) {
+		m[1]=m[1].replace(/<[^>]*>/g,' ');
+		m[1]=m[1].replace(/[\r\n]/g,' ');
+		m[1]=m[1].replace(/\s+/g,' ');
+		m[1] += ' (Found on HamCall.net)';
+		return {callsign:callsign,string:m[1]};
+	}
+	throw("No match");
+}
+
+function USSpecialEvent(callsign) {
+	var result=new HTTPRequest().Post('http://www.arrl.org/special-event-stations', '_method=POST&data%5BSearch%5D%5Bcall_sign%5D='+callsign+'&data%5BSearch%5D%5Bkeywords%5D=&data%5BLocation%5D%5Bzip%5D=&data%5BLocation%5D%5Barea%5D=&data%5BLocation%5D%5Bcity%5D=&data%5BLocation%5D%5Bstate%5D=&data%5BLocation%5D%5Bdivision_id%5D=&data%5BLocation%5D%5Bsection_id%5D=&data%5BLocation%5D%5Bcountry%5D=&data%5BDate%5D%5Bstart%5D=&data%5BDate%5D%5Bend%5D=');
+	var m=result.match(/<h3>\s*([\s\S]*?)<\/p/);
+	if(m!=null) {
+		m[1]=m[1].replace(/<[^>]*>/g,'');
+		m[1]=m[1].replace(/[\r\n]/g,' ');
+		m[1]=m[1].replace(/\s+/g,' ');
+		return {callsign:callsign,string:m[1]};
+	}
+	throw("No match");
+}
-- 
GitLab