[-]
Shout:
Click Refresh to load shouts.

Post Reply 
 
Thread Rating:
  • 1 Votes - 4 Average
  • 1
  • 2
  • 3
  • 4
  • 5
[Greasemonkey] Tibia.com improvements
02-08-2010, 05:20 PM (This post was last modified: 02-09-2010 08:19 PM by Ian. Edit Reason: Added syntax highlighting)
Post: #1
[Greasemonkey] Tibia.com improvements
Hello, I've written two scripts that provide some extra information on tibia.com. I recognize they may not be beautifully written and I encourage you to post here or private message me with any comments, questions and of course corrections.

1. Shows online time and vocation of online players in guild profile- it looks quite like this.

select JavaScript
// ==UserScript==
// @name           Tibia guild online
// @description    Shows online guild members
// @author		   Goodfellow
// @include        <a href="http://*tibia.com/community/?subtopic=guilds*" target="_blank">http://*tibia.com/community/?subtopic=guilds*</a>
// ==/UserScript==
 
var gameWorld = document.body.innerHTML.match(/The guild was founded on [A-Z][^\s]+ on [A-Z][^&]+ \d\d \d\d\d\d\./);
gameWorld = String(gameWorld).replace('The guild was founded on ', '');
gameWorld = String(gameWorld).replace(/ on [A-Z][^&]+ \d\d \d\d\d\d\./, '');
 
function fixGuild() {
	try {
		GM_log(gameWorld);
		if (typeof gameWorld == 'undefined' || gameWorld == 'null') return;
		GM_xmlhttpRequest({ method: 'GET', url: 'http://www.tibia.com/community/?subtopic=whoisonline&world=' + gameWorld, 
			onload: function(responseDetails) {			
				if (responseDetails.status != 200) return;  //code 200- connection successful, 404- page not found					
				var onlineList = responseDetails.responseText;
				var nicks = document.evaluate('//table[@cellspacing="1"][@cellpadding="4"][1]/tbody/tr/td/a', document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
				var guildMemList = document.evaluate('//table[@cellspacing="1"][@cellpadding="4"][1]/tbody/tr/td', document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
 
				var y=0, x, name, level, vocation, len, pos, totalPlayers = 0, sdShoters = 0, sdPower= 0;
				for (var i=5; i<(guildMemList.snapshotLength-1); i+=3) {		
					x = onlineList.indexOf('>' + to_html(nicks.snapshotItem(i-5-y*2).textContent) + '<');
 
					if (x != -1) {
						name = to_html(nicks.snapshotItem(i-5-y*2).textContent);
						totalPlayers++;
						pos = onlineList.indexOf('<', x+name.length+24)
						len = pos-(x+name.length+24);
						level = onlineList.substr(x+name.length+24, len);
						len = onlineList.indexOf('<', pos+11)-(pos+19);
						vocation = onlineList.substr(pos+19, len);
						if ((vocation == 'Master Sorcerer' || vocation == 'Elder Druid') && parseInt(level) > 80)  {sdShoters++; sdPower +=150;}
 
						guildMemList.snapshotItem(i).style.border = "2px solid #00FF00";
						guildMemList.snapshotItem(i+1).textContent = level;
						guildMemList.snapshotItem(i-1).textContent = vocation;
					} else {
						guildMemList.snapshotItem(i+1).textContent = '';
						guildMemList.snapshotItem(i-1).textContent = '';						
					}
					y++;
				}
				if (totalPlayers > 0)
					guildMemList.snapshotItem(0).innerHTML += '<b> ' + totalPlayers + ' online, ' + sdShoters + ' mages (approx. ' + sdPower + ' of sd damage)</b>';
				guildMemList.snapshotItem(1).innerHTML = '<b>Vocation</b>';
				guildMemList.snapshotItem(3).innerHTML = '<b>Level</b>';
 
			}
		})
	} catch(e) {}
};
 
function to_html (str) {
		str = str.replace(/\s/g, ' ');
		return str;
};
 
fixGuild();


2. Formats player profile just like this (direct links to house, online times taken from pskonejott.com and experiance gains from tibia-stats.com.

select JavaScript
// ==UserScript==
// @name           Tibia fix profiles
// @description    links to houses, adds online time (taken from pskonejott.com) and experience gains (<a href="http://tibia-stats.com/)" target="_blank">http://tibia-stats.com/)</a>
// @author		   Goodfellow
// @include        <a href="http://*tibia.com/community/?subtopic=characters*" target="_blank">http://*tibia.com/community/?subtopic=characters*</a>
// ==/UserScript==
 
var plName = document.evaluate('//table[@cellspacing="1"][@cellpadding="4"][1]/tbody/tr[2]/td[2]', document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
var hasHouse = 0;
var elmHouse = document.evaluate('//table[@cellspacing="1"][@cellpadding="4"][1]/tbody/tr[8]/td[1]', document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
 
if (elmHouse.textContent == 'House:') {	//handling marriages
	hasHouse = 1;
	elmHouse = document.evaluate('//table[@cellspacing="1"][@cellpadding="4"][1]/tbody/tr[8]/td[2]', document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
} else if (document.evaluate('//table[@cellspacing="1"][@cellpadding="4"][1]/tbody/tr[9]/td[1]', document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue.textContent == 'House:') {
	hasHouse = 1;
	elmHouse = document.evaluate('//table[@cellspacing="1"][@cellpadding="4"][1]/tbody/tr[9]/td[2]', document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
}
 
var plWorld = document.evaluate('//table[@cellspacing="1"][@cellpadding="4"][1]/tbody/tr[6]/td[2]', document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
var plHouse = String(elmHouse.textContent).replace(/ \([^)].+/, '');
var plCity = String(elmHouse.textContent).replace(/.*\(/, '');
plCity = plCity.replace(/\).*/, '');
 
//GM_log('World = ' + plWorld.textContent + ' House = ' + plHouse + ' City = ' + plCity);
 
function fixOnlineTime() {
	try {
		if (typeof plName == 'undefined' || plName == 'null') return;	//exit if character does not exist
		GM_xmlhttpRequest({ method: 'GET', url: 'http://www.pskonejott.com/otc_display.php?character=' + encodeURI(plName.textContent), 
		onload: function(responseDetails) {
			if (responseDetails.status != 200) return;  //code 200- connection successful, 404- page not found
			var pskProfile = responseDetails.responseText;
			if (pskProfile.indexOf(plName.textContent + ' has no Online Time Counter entry!') != -1) return;  //exit if pskonejott has no info to show		
			var onTimes = pskProfile.match(/\d+h<BR>\d+m<\/TD><TD class="r">\d+h<BR>\d+m<\/TD><TD class="r_grn">/);
			var weekON = String(onTimes).replace('<\/TD><TD class="r_grn">', '');
			weekON = weekON.replace(/\d+h<BR>\d+m<\/TD><TD class="r">/, '');
			weekON = weekON.replace('<BR>', ' ');	//online this week
			var monthON = String(onTimes).replace(/<\/TD><TD class="r">\d+h<BR>\d+m<\/TD><TD class="r_grn">/, '');
			monthON = monthON.replace('<BR>', ' ');	//online this month
			//GM_log('weekly = ' + weekON + ' monthly = ' +monthON);
 
			//creating table
			var elmlastTable = document.evaluate('//table[@cellspacing="1"][@cellpadding="4"][last()]', document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
			var elmOnlineTable = document.createElement('table');
			elmOnlineTable.width = "100%";
			elmOnlineTable.cellSpacing = "1";
			elmOnlineTable.cellPadding = "4";
			elmOnlineTable.border= "0";
			elmlastTable.parentNode.insertBefore(elmOnlineTable, elmlastTable.nextSibling);
			elmOnlineTable.innerHTML += '<TR BGCOLOR=#505050><TD COLSPAN=4 CLASS=white><B>Online time</B></TD></TR><TR BGCOLOR=#F1E0C6><TD WIDTH=20%>Last week:</TD><TD WIDTH=80%>' + weekON + '<TR BGCOLOR=#D4C0A1><TD>This month:</TD><TD>' + monthON +'</TD></TR>';
 
		}})
	} catch(e) {}
};
 
function linkToHouse(world, houseName, city) {
	try {
		if (hasHouse == 0) return;
		GM_xmlhttpRequest({ method: 'POST', url: 'http://www.tibia.com/community/?subtopic=houses&world=' + world, headers:{'Content-type':'application/x-www-form-urlencoded'},
		data:encodeURI('town=' + city),
		onload: function(responseDetails) {
			if (responseDetails.status != 200) return;
			var check = responseDetails.responseText.indexOf(to_html(houseName));
			if(check == -1) return;
			var start = responseDetails.responseText.indexOf('houseid VALUE=', check);
			var end = responseDetails.responseText.indexOf('>', start);
			var houseID = responseDetails.responseText.substr(start+14, end-start-14);
			if (isNaN(houseID)) return;
			//GM_log(houseID);
 
			var elmlastTable = document.evaluate('//table[@cellspacing="1"][@cellpadding="4"][last()]/tbody/tr[1]', document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
			elmlastTable.innerHTML += '<FORM METHOD="POST" NAME="houseForm" Action ="http://www.tibia.com/community/?subtopic=houses&page=view"><INPUT TYPE="HIDDEN" NAME="world" VALUE="' + plWorld.textContent + '"><INPUT TYPE="HIDDEN" NAME="houseid" VALUE="' +houseID + '"></FORM></td></tr></tbody></table>';
			elmHouse.innerHTML = '<a href="#" o<strong></strong>nClick="document.houseForm.submit();">' + elmHouse.textContent;
		}})
	} catch(e) {}
};
 
function addOnlineTime(name) {
	try {
		GM_xmlhttpRequest({ method: 'GET', url: 'http://tibia-stats.com/index.php?akcja=777&player=' + name,
		onload: function(responseDetails) {
			if (responseDetails.status != 200) return;  //code 200- connection successful, 404- page not found
			var statsProfile = responseDetails.responseText;
			var expDaily, expWeekly;
 
			if (statsProfile.indexOf('Such character does not exists in our database <img src="http://www.tpforums.org/forum/images/smilies/sad.gif" style="vertical-align: middle;" border="0" alt="Sad" title="Sad" />') != -1) {
				return;	//exit if character profile does not exist
			} else if (statsProfile.indexOf('Shows daily experience growth') != -1) {
				var start = statsProfile.indexOf('Shows daily experience growth') + 78;
				var end = statsProfile.indexOf('</td>', start);
				expDaily = statsProfile.substr(start, end-start);
				start = statsProfile.indexOf('Shows weekly experience growth', end) + 80;
				end = statsProfile.indexOf('</td>', start);
				expWeekly = statsProfile.substr(start, end-start);
			} else return;
 
			//creating table
			var elmlastTable = document.evaluate('//table[@cellspacing="1"][@cellpadding="4"][last()]', document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
			var elmOnlineTable = document.createElement('table');
			elmOnlineTable.width = "100%";
			elmOnlineTable.cellSpacing = "1";
			elmOnlineTable.cellPadding = "4";
			elmOnlineTable.border= "0";
			elmlastTable.parentNode.insertBefore(elmOnlineTable, elmlastTable.nextSibling);
			elmOnlineTable.innerHTML += '<TR BGCOLOR=#505050><TD COLSPAN=4 CLASS=white><B>Experience gains:</B></TD></TR><TR BGCOLOR=#F1E0C6><TD WIDTH=20%>Today:</TD><TD WIDTH=80%>' + expDaily + '<TR BGCOLOR=#D4C0A1><TD>Last week:</TD><TD>' + expWeekly +'</TD></TR>';
 
		}})
	} catch(e) {}
};
 
function to_html (str) {
		str = str.replace(/\s/g, ' ');
		return str;
};		
 
if (typeof plWorld != 'undefined' && typeof plHouse != 'undefined' && typeof plCity != 'undefined' && plWorld.textContent != 'null' &&  plHouse != 'null'  && plCity != 'null') 
	linkToHouse(plWorld.textContent, plHouse, plCity);
fixOnlineTime();
if (typeof plName != 'undefined' && plName.textContent != 'null')
	addOnlineTime(plName.textContent);


In case you wonder: Greasemonkey is a Firefox extension which allows you to execute your own javascripts on sites you do not own. Beauty of this addon is that it allows you to do things regular javascript cannot (access any site on the web for instance).
Find all posts by this user
Quote this message in a reply
02-08-2010, 07:52 PM
Post: #2
RE: [Greasemonkey] Tibia.com improvements
Awesome, thanks

Find all posts by this user
Quote this message in a reply
02-09-2010, 08:20 PM (This post was last modified: 02-09-2010 08:21 PM by Ian. Edit Reason: )
Post: #3
RE: [Greasemonkey] Tibia.com improvements
Awesome scripts. Did you post these at http://userscripts.org yet?

OpenTibiaTools, TibiaAPI, SharpOT
Visit this user's website Find all posts by this user
Quote this message in a reply
02-09-2010, 09:49 PM (This post was last modified: 02-09-2010 09:50 PM by DarkstaR. Edit Reason: )
Post: #4
RE: [Greasemonkey] Tibia.com improvements
I tried the char page one. Online time works but houses didnt.

I did some tests, it always stops after the line
if(check == -1) return;
in
function linkToHouse()

Find all posts by this user
Quote this message in a reply
02-24-2010, 09:54 AM (This post was last modified: 02-24-2010 11:00 AM by Goodfellow. Edit Reason: )
Post: #5
RE: [Greasemonkey] Tibia.com improvements
Nope, I haven't posted it on userscripts yet.

@DarkstaR
That's weird. I used it past month and didn't notice anything like that. Can you give me an example of character it fails on?

P.S I am sorry for late reply
Find all posts by this user
Quote this message in a reply
03-16-2010, 09:54 AM (This post was last modified: 03-16-2010 09:55 AM by SetupError. Edit Reason: )
Post: #6
RE: [Greasemonkey] Tibia.com improvements
I love your script, its very usefull

Seems like its not linking on houses.

can you take a look?

and will be awesome if you can make another one wich show online time and exp gained but in 2 new columns on a guild list page

thanks in advance

[Image: SetupError.gif]
Find all posts by this user
Quote this message in a reply
05-27-2010, 05:18 AM
Post: #7
RE: [Greasemonkey] Tibia.com improvements
How can I install this? I have greasmonkey and what do I do with that code now? save them to a user.js file? then what? I dont get it...
Find all posts by this user
Quote this message in a reply
05-31-2010, 10:42 AM
Post: #8
RE: [Greasemonkey] Tibia.com improvements
Nobody knows?
Find all posts by this user
Quote this message in a reply
06-01-2010, 01:13 AM
Post: #9
RE: [Greasemonkey] Tibia.com improvements
(05-31-2010 10:42 AM)Gatsu Wrote:  Nobody knows?

Rename the file to filename.user.js.
Then open it with firefox, or any other browser that has greasemonkey running.

Presenting my Tibia related projects
Visit this user's website Find all posts by this user
Quote this message in a reply
06-02-2010, 06:54 AM
Post: #10
RE: [Greasemonkey] Tibia.com improvements
thank you =)
Find all posts by this user
Quote this message in a reply
Post Reply 



Contact UsTProgrammingReturn to TopReturn to ContentLite (Archive) ModeRSS Syndication