NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript==
// @name Twitter Vanity Stats
// @namespace https://github.com/leggetter/twitter-vanity-stats-user-script
// @version 0.2
// @description Provides some basic Twitter stats based on time you joined twitter, followers, following and tweets.
// @author Phil Leggetter (@leggetter)
// @match https://twitter.com/*
// @grant none
// ==/UserScript==
function collectStats() {
var joined = new Date(jQuery('.ProfileHeaderCard-joinDateText').text());
var now = new Date();
function daydiff(first, second) {
return parseInt((second-first)/(1000*60*60*24), 10);
}
var daysOnTwitter = daydiff(joined, now);
var tweetCount = parseInt(jQuery('.ProfileNav-item--tweets .ProfileNav-stat[data-nav=tweets]').attr('title').replace(/,/g, ''), 10);
var followerCount = parseInt(jQuery('.ProfileNav-item--followers .ProfileNav-stat').attr('title').replace(/,/g, ''), 10);
var followingCount = parseInt(jQuery('.ProfileNav-item--following .ProfileNav-stat').attr('title').replace(/,/g, ''), 10);
var followersPerDay = (followerCount/daysOnTwitter);
var followersPerTweet = (followerCount/tweetCount);
var followerRatio = (followerCount/followingCount);
return {
tweetCount: tweetCount,
daysOnTwitter: daysOnTwitter,
followerCount: followerCount,
followingCount: followingCount,
followersPerDay: followersPerDay,
followersPerTweet: followersPerTweet,
followerRatio: followerRatio
};
}
function createResultText(stats) {
var facts = [];
facts.push('Days on Twitter: ' + stats.daysOnTwitter);
facts.push('Number of Tweets: ' + stats.tweetCount);
facts.push('Followers: ' + stats.followerCount);
facts.push('Following: ' + stats.followingCount);
var calcs = [];
calcs.push('Followers per day: ' + parseFloat(stats.followersPerDay).toFixed(2));
calcs.push('Followers per tweet: ' + parseFloat(stats.followersPerTweet).toFixed(2));
calcs.push('Following/Follower ratio: ' + parseFloat(stats.followerRatio).toFixed(2));
var resultText = facts.join('\n') + '\n\n' + calcs.join('\n');
return resultText;
}
function runReport(e) {
console.log('collecting stats!!!');
var stats = collectStats();
var text = createResultText(stats);
alert(text);
return false;
}
function addStatsMenuItem() {
var ul = jQuery('.ProfileNav-list');
var li = jQuery('<li class="ProfileNav-item">' +
'<a class="ProfileNav-stat ProfileNav-stat--link u-borderUserColor u-textCenter js-tooltip js-nav u-textUserColor" data-nav="all_lists" href="#">' +
'<span class="ProfileNav-label">Stats</span>' +
'<span class="ProfileNav-value" data-is-compact="false">♥</span>' +
'</a></li>');
ul.append(li);
li.click(runReport);
}
function waitForJQuery() {
if(!window['jQuery']) {
setTimeout(waitForJQuery, 500);
}
else {
addStatsMenuItem();
}
}
window.addEventListener('load', waitForJQuery);