CPH tools

agrega funcionalidad a portalhacker.net

目前為 2014-08-14 提交的版本,檢視 最新版本

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// CPH tools
//
// Released under the GPL license
// http://www.gnu.org/copyleft/gpl.html
//
// --------------------------------------------------------------------
//
// This is a Greasemonkey user script.  To install it, you need
// Greasemonkey 0.3 or later: http://greasemonkey.mozdev.org/
// Then restart Firefox and revisit this script.
// Under Tools, there will be a new menu item to "Install User Script".
// Accept the default configuration and install.
//
// To uninstall, go to Tools/Manage User Scripts,
// select "CPH Tools", and click Uninstall.
//
// --------------------------------------------------------------------
//
// ==UserScript==
// @name          CPH tools
// @namespace     http://xd-blog.com.ar/
// @description   agrega funcionalidad a portalhacker.net
// @version       1.3
// @include       http://portalhacker.net/*
// @include       http://www.portalhacker.net/*
// @grant       GM_getValue
// @grant       GM_setValue
// @grant       GM_addStyle
// ==/UserScript==
//
// Changelog:
// 2011-05-23 0.1 privado
// 2011-12-13 0.2 primera version publica
// 2011-12-16 0.3 se puede usar google para buscar en el foro && gorrito navideños
// 2012-04-03 0.4 agrega un dropdown para mandar temas a las faqs
// 2012-12-15 0.5 @grant none
//                se reorganizó el codigo
//                se agregaron mas opciones de configuracion
//                se elimina texto de la pagina que solo ocupa espacio
//                pone un link a los temas recientes arriba a la derecha
// 2012-12-15 0.6 Mejor manejo de errores
//                Se eliminan unos cosos feos del theme
//                Se arregló un bug en makeSpace()
// 2012-12-16 1.0 Acomodada la funcion sendToFaqs()
//                Se arregló un bug en makeSpace()
//                Se configura desde el link abajo de todo
// 2012-12-16 1.1 Se acomodó la apariencia que se rompia en makeSpace()
//                Se cambió la apariencia del menu de opciones
// 2014-03-16 1.2 Se actualizó el link del logo
// 2014-08-14 1.3 Nueva funcion para eliminar las redirecciones de los links
//                Se indenta todo el codigo con tabs y todas las instrucciones tienen ;
//                Se arregló el código de enviar a las faqs que se habia roto con el cambio en las urls
//                Saca los links de mario bros y foro warez

try{
	if (GM_getValue('cambiarLogo', true)) {
		if (nearChristmas()) {
			changeLogo('http://i.imgur.com/oJkrW.png');
		} else {
			changeLogo('http://i.imgur.com/k11Mnox.png');
		}
	}
}catch(e){}

try{
	changeSearchEngine(GM_getValue('buscador', 'DuckDuckGo'));
}catch(e){}

try{
	if (GM_getValue('hacerEspacio', true)) makeSpace();
}catch(e){}

try{
	if (GM_getValue('linkAMensajesRecientes', true)) addRecentMessagesLink();
}catch(e){}

try{
	addFAQsDropdown();
}catch(e){}

try{
	removeSeoRed();
}catch(e){}

try{
	addConfigurationLink();
}catch(e){}

/*
 * Devuelve true si estamos entre el 15 y el 31 de diciembre
 * Se usa para saber si hay que poner el logo de navidad
 */
function nearChristmas(){
	var fecha = new Date ();
	return ((fecha.getMonth() == 11) && (fecha.getDate() > 15));
}

/*
 * Cambia el logo por otro que se ve mejor
 */
function changeLogo(url){
	//Sacamos el logo viejo (document.getElementById('logo').firstChild.nextSibling es el <a>)
	var logoLink = document.getElementById('logo').firstChild.nextSibling;
	logoLink.style.backgroundImage = 'url()';
	//Eliminamos el margen
	logoLink.style.top=0;
	//Creamos el nuevo y lo metemos como hijo del <a>
	var newLogo = document.createElement('img');
	newLogo.setAttribute('src', url);
	logoLink.appendChild(newLogo);
}



/*
 * Cambia el buscador por ddg o google
 */
function changeSearchEngine(searchEngine) {
	if (searchEngine != 'SMF'){
		var form = document.getElementById('searcharea').firstChild.nextSibling;
		form.action='https://duckduckgo.com/';
		document.getElementsByName('search')[0].name='q';
		if (searchEngine == 'DuckDuckGo') {
			form.addEventListener('submit', function (){document.getElementsByName('q')[0].value=document.getElementsByName('q')[0].value + ' site:portalhacker.net';}, false);
		} else if (searchEngine == 'Google') {
			form.addEventListener('submit', function (){document.getElementsByName('q')[0].value=document.getElementsByName('q')[0].value + ' site:portalhacker.net !g';}, false);
		}
	}
}



/*
 * Elimina cosas que no sirven
 */
function makeSpace(){
	//saca el h2 que dice "Tambien puedes publicar tus dudas en:"
	document.getElementById('toolbar').firstChild.nextSibling.nextSibling.nextSibling.style.display = 'none';
	//saca el rectangulo negro que dice portal hacker
	//solo en el index, adentro de los posts es util
	var div = document.getElementsByClassName('navigate_section')[0];
	if (div.firstChild.nextSibling.childNodes.length < 4){
		div.style.display = 'none';
	}
	//saca los links de mario bros y foro warez
	GM_addStyle('.reset center { display: none; }');
	//saca los cosos redondeados de alrededor del textbox de respuesta
	//va al final porque puede dar error si no estan
	var upperframe = document.getElementsByClassName('upperframe')[0];
	//en el index el upperframe es de las clases upperframe y clear. Si se lo elimina se rompe todo.
	if (upperframe.className.indexOf('clear') == -1) {
		upperframe.style.display = 'none';
	} else {
		upperframe.className = 'clear';
		upperframe.style.display = 'block';
	}
	document.getElementsByClassName('lowerframe')[0].style.display = 'none';
	//Al eliminar el upperframe queda todo pegado. Agregamos padding.
	document.getElementsByClassName('innerframe')[0].style.paddingTop = '9px';
}



/*
 * Agrega un link a los mensajes recientes
 */
function addRecentMessagesLink(){
	var link = document.createElement('a');
	link.innerHTML = 'Mensajes recientes.';
	link.href = 'http://www.portalhacker.net/index.php?action=recent';
	var container = document.getElementsByClassName('reset')[0];
	container.insertBefore(link, container.firstChild.nextSibling.nextSibling.nextSibling.nextSibling.nextSibling.nextSibling);
}



/*
 * Dropdown para mandar temas a las faqs
 */
function sendToFaqs(){
	function secondHandler() { //handles the post
		if(request.readyState === 4){
			if (request.status != 200) {
				alert('Me parece que no se pudo mandar el post a las faqs :(');
			}else{
				alert('Post enviado a las faqs :)');
			}
		}
	}

	function firstHandler(){ //handles the get
		if(request.readyState === 4){
			if (request.status != 200) {
				alert('Me parece que no se pudo mandar el post a las faqs :(');
			}else{
				regexp = new RegExp('<input type="hidden" name="(.*?)" value="(.*?)" />', 'g');
				var tmp = regexp.exec(request.responseText);
				var arreglo = [];
				while (tmp !== null){
					arreglo.push([tmp[1], tmp[2]]);
					tmp = regexp.exec(request.responseText);
				}
				arreglo.pop(); arreglo.pop(); arreglo.pop();
				arreglo.shift(); arreglo.shift();
				arreglo.push(['post', 'Publicar']);
				arreglo.push(['message', '[url='+location.href+']'+document.title+'[/url]']);
				var fd = new FormData();
				for (var i=0; i < arreglo.length; i++){
					fd.append(arreglo[i][0], arreglo[i][1]);
				}

				request = new XMLHttpRequest();
				request.onreadystatechange = secondHandler;
				request.open('POST', 'http://www.portalhacker.net/index.php/action,post2.html', true);
				request.send(fd);
			}
		}
	}

	request = new XMLHttpRequest();
	request.onreadystatechange = firstHandler;
	request.open('GET', 'http://www.portalhacker.net/index.php/topic,' + document.getElementById('caja').value + '.0.html/', true);
	request.send(null);
}

function addFAQsDropdown(){
	regexp = new RegExp('/\\d+/$');
	if ((location.href.search('topic') != -1) || (regexp.test(location.href))){ //si es un topic
		var faqs = [['Enviar a las FAQs', 'NULL'],
					['Hacking General', '138025'],
					['Seguridad a Nivel Web', '64762'],
					['Ingeniería Inversa', '73400'],
					['Seguridad', '88758'],
					['Criptografía', '151769'],
					['Estudio y Desarrollo de Malware', '140135'],
					['Programación en general', '146528'],
					['Algoritmia y matemática', '108076'],
					['Visual Basic 6.0 y anteriores', '68907'],
					['JAVA', '105458'],
					['Python', '136744'],
					['ASM', '148828'],
					['Desarrollo Web', '26688'],
					['GNU/Linux', '82644']];

		var caja = document.createElement('select');
		caja.addEventListener('change', sendToFaqs);
		caja.style.cssFloat = 'right';
		caja.style.marginRight = '10px';
		caja.id = 'caja';
		for ($i=0; $i<faqs.length; $i++){
			var opcion = new Option(faqs[$i][0], faqs[$i][1]);
			caja.appendChild(opcion);
		}
		document.getElementById('bodyarea').firstChild.nextSibling.firstChild.nextSibling.appendChild(caja);
	}
}



/*
 * Elimina las redirecciones en los links
 */
function urldecode(str) {
	return decodeURIComponent((str+'').replace(/\+/g, '%20'));
}

function removeSeoRed(){
	var links = document.links;
	for(var i = 0; i < links.length; i++) {
		links[i].href = urldecode(links[i].href.replace('http://www.portalhacker.net/index.php/index.php?action=seored;u=', ''));
	}
}



/*
 * Permite configurar el plugin
 */
function addConfigurationLink(){
	var a = document.createElement('a');
	a.innerHTML = 'Configurar cph tools.';
	a.className = 'new_win';
	a.href = 'javascript:void(0);';
	a.onclick = createConfigurationDialog;
	var div = document.createElement('div');
	div.id = 'configurar';
	div.appendChild(a);
	document.getElementsByClassName('copyright')[0].appendChild(div);
}

function createConfigurationDialog() {
	GM_addStyle(
		'#configcontainer { position:fixed; top:0; left:0; right:0; bottom:0; z-index:1000; }'+
		'#config { text-align: left; width:400px; padding:10px; margin:40px auto 0; ' +
		'background: none repeat scroll 0 0 #151515;' +
		'border: 1px solid #444444; -moz-border-radius: 5px; ' +
		'}' +
		'#config input, #config select {float: right}' +
		'#config label { display:block }'
	);

	var div = document.createElement('div');
	div.id = 'configcontainer';
	div.innerHTML =
		'<div id="config">' +
			'<h2 style="margin-bottom:10px;">&raquo; Configurar CPH tools</h2>' +
			'<div style="font-size:12px;">' +
				'<label>Cambiar logo por otro que se ve mejor<input id="cambiarLogo" type="checkbox"' + (GM_getValue('cambiarLogo', true) ? ' checked="checked" ' : '') + '></label>' +
				'<label>Hacer espacio eliminando elementos que no se usan<input id="hacerEspacio" type="checkbox"' + (GM_getValue('hacerEspacio', true) ? ' checked="checked" ' : '') + '></label>' +
				'<label>Agregar un link a los mensajes recientes arriba de todo<input id="linkAMensajesRecientes" type="checkbox"' + (GM_getValue('linkAMensajesRecientes', true) ? ' checked="checked" ' : '') + '></label>' +
				'<label>Usar buscador<select id="buscador">' +
					'<option' + (GM_getValue('buscador', 'DuckDuckGo') == 'SMF' ? ' selected="selected"' : '') + '>SMF</option>' +
					'<option' + (GM_getValue('buscador', 'DuckDuckGo') == 'DuckDuckGo' ? ' selected="selected"' : '') + '>DuckDuckGo</option>' +
					'<option' + (GM_getValue('buscador', 'DuckDuckGo') == 'Google' ? ' selected="selected"' : '') + '>Google</option>' +
				'</select></label>' +
				'<div class="clear"></div>' +
				'<div style="text-align:center; margin-top=10px;"><input type="button" style="float:none;" onclick="document.location.reload();" value="Cerrar" /></div>'+
			'</div>' +
		'</div>';
	document.getElementById('configurar').appendChild(div);

	addListener('cambiarLogo');
	addListener('hacerEspacio');
	addListener('linkAMensajesRecientes');
	addListener('buscador');
}

function addListener(id) {
	var element = document.getElementById(id);
	if (element.nodeName == 'SELECT') {
		element.addEventListener('change', function(){GM_setValue(id, this.value);});
	} else if (element.nodeName == 'INPUT' && element.type == 'checkbox') {
		element.addEventListener('click', function(){GM_setValue(id, this.checked);});
	} else {
		console.log('Modificar addListener');
	}
}