ETI Dice Roller

Makes it easy to roll dice and post the results on luelinks

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。

您需要先安装用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name        ETI Dice Roller
// @namespace   pendevin
// @description Makes it easy to roll dice and post the results on luelinks
// @include     http://endoftheinter.net/postmsg.php*
// @include     http://endoftheinter.net/inboxthread.php*
// @include     http://boards.endoftheinter.net/postmsg.php*
// @include     http://boards.endoftheinter.net/showmessages.php*
// @include     https://endoftheinter.net/postmsg.php*
// @include     https://endoftheinter.net/inboxthread.php*
// @include     https://boards.endoftheinter.net/postmsg.php*
// @include     https://boards.endoftheinter.net/showmessages.php*
// @include			http://rng.beginningoftheinter.net*
// @version     1
// ==/UserScript==

//xhtmlhttprequest handler
//i got this from shoecream's userscript autoupdater at http://userscripts.org/scripts/show/45904
var XHR={
	// r.doc is the returned page
	// r.respose is the response element
	createDoc:function(response,callback,optional){
		var doc=document.implementation.createDocument('','',null);
		var html=document.createElement("html");
		html.innerHTML=response.responseText;
		doc.appendChild(html);
		var r={};
		r.response=response;
		r.doc=doc;
		callback(r,optional);
	},

	//sends the XHR request, callback is the function to call on the returned page
	get:function(url,callback,optional){
		if(optional==undefined)optional=null;
		GM_xmlhttpRequest({
			method:'GET',
			url:url,
			headers:{
				'User-Agent': navigator.userAgent,
				'Content-Type': 'application/x-www-form-urlencoded',
			},
			onload:function(r){XHR.createDoc(r,callback,optional);}
		});
	}
}

//i totally improved this one
//variables that aren't present return null
//a variable with no value returns the true
function getUrlVars(urlz){
	//thanks for the function citizenray
	var vars=[];
	var hash="";
	var hashes=urlz.slice(urlz.indexOf('?')+1).split('&');
	for(var i=0;i<hashes.length;i++){
		hash=hashes[i].split('=');
		if(hash[1]!=null&&hash[1].indexOf("#")>=0)hash[1]=hash[1].substring(0,hash[1].indexOf("#"));
		if(hash[1]==undefined){
			hash[1]=true;
			if(hash[0].indexOf("#")>=0)hash[0]=hash[0].substring(0,hash[0].indexOf("#"));
		}
		vars.push(hash[0]);
		vars[hash[0]]=hash[1];
	}
	return vars;
}

//all the stuff that does things
function popomatic(){
	//handle the fun stuff
	function rollDice(){
		if(iterator>0){
			iterator--;
			XHR.get(url,function(r){
				var result={};
				result.value=r.doc.getElementById('box_index').textContent.match(/Your result: (\d+)/)[1];
				//ugh chrome
				var here=r.doc.getElementsByTagName('a')[0];
				if(here.href==''){
					document.getElementsByClassName('body')[0].appendChild(here);
					result.link='http://rng.beginningoftheinter.net/results.php#'+here.href.substring(44);
					here.parentNode.removeChild(here);
				}
				else
					result.link='http://rng.beginningoftheinter.net/'+r.doc.getElementsByTagName('a')[0].href;
				result.date=r.doc.getElementById('box_index').firstElementChild.textContent;
				//results validation
				if(0<result.value<values[2]+1){
					results.push(result);
					total+=parseInt(result.value);
				}
				else
					iterator++;
				rollDice();
			});
		}
		//finish up
		else{
			//prepare the results
			var quick='';
			var dirty='';
			for(var i=0;i<results.length;i++){
				quick+='['+results[i].value+']';
				dirty+=results[i].date+' -> <b>'+results[i].value+'</b> ('+results[i].link+')\n';
			}
			//build the string
			var string=input+' -> <b>'+total+'</b> <spoiler caption="'+quick+(values[3]?values[3]:'')+'">\n'+dirty+'</spoiler>';

			//success junk
			roller.firstElementChild.value=string;
			roller.firstElementChild.focus();
			GM_setValue('lastRoll',input);
			roller.firstElementChild.placeholder=input;
			roller.lastChild.value='Clear';
			roller.lastChild.addEventListener('click',function clear(){
				roller.lastChild.removeEventListener('click',clear,false);
				roller.firstElementChild.value='';
				roller.firstElementChild.focus();
				roller.lastChild.value='Roll Dice';
				roller.lastChild.addEventListener('click',popomatic,false);
			},false);
		}
	}

	//we're loading
	roller.lastChild.value='Loading...';
	roller.lastChild.removeEventListener('click',popomatic,false);
	//parse input string
	var input=roller.firstElementChild.value==''?roller.firstElementChild.placeholder:roller.firstElementChild.value;
	//validation :3
	if(input.search(/^\d+d\d+(?:[\+-]\d+)?$/)==-1){
		roller.firstElementChild.value='Error Invalid Input!';roller.firstElementChild.placeholder=input;
		roller.lastChild.value='Clear';
		roller.lastChild.addEventListener('click',function clear(){
			roller.lastChild.removeEventListener('click',clear,false);
			roller.firstElementChild.value='';
			roller.firstElementChild.focus();
			roller.lastChild.value='Roll Dice';
			roller.lastChild.addEventListener('click',popomatic,false);
		},false);
	}
	else{
		//grab input values
		var values=input.match(/^(\d+)d(\d+)(?:([\+-]\d+))?$/);
		//build url
		var url='http://rng.beginningoftheinter.net/rng.php?user='+user+'&topicid='+topic+'&min=1&max='+values[2];
		//iterate the get requests
		var iterator=parseInt(values[1]);
		var results=[];
		var total=values[3]?parseInt(values[3]):0;
		rollDice();
	}
}

//insert the stuff
var roller=document.createElement('span');
roller.id='diceRoller';
roller.innerHTML='\
	<textarea rows="5" cols="20" wrap="off" id="diceRollerInput" style="width:136px;height:16px;margin:0;text-align:right;position:relative;top:3px;overflow-x:hidden;"></textarea>\
	<input type="button" id="diceRollerButton" value="Roll Dice">\
';
//default value is the last roll
roller.firstElementChild.placeholder=GM_getValue('lastRoll','1d20+0');
//the text box is in a different place on different pages
if(document.getElementsByClassName('quickpost-nub')[0])
	document.getElementsByClassName('quickpost-body')[0].appendChild(roller);
else if(document.getElementById('message'))
	document.getElementById('message').parentNode.appendChild(roller);

//get our permanent values and shit
var user=document.getElementsByClassName('userbar')[0].firstChild.textContent;
user=user.substring(0,user.indexOf(' ('));
var topic=getUrlVars(location.href)['topic'];

//time to roll the dice
roller.lastChild.addEventListener('click',popomatic,false);

//when you focus the text box, highlight everything
roller.firstElementChild.addEventListener('focus',function(e){
	e.target.selectionStart=0;
	e.target.selectionEnd=e.target.value.length;
	e.target.selectionDirection='backward';
},false);