// ==UserScript==
// @name Gab.ai User Stats
// @namespace http://gab.ai/Jeremy20_9
// @version 0.1
// @description Profile a user's timeline by clicking a button that appears on user pages
// @author Jeremiah 20:9
// @match https://gab.ai/*
// @exclude https://gab.ai/self-censor
// @exclude https://gab.ai/notifications
// @exclude https://gab.ai/home
// @exclude https://gab.ai/popular
// @exclude https://gab.ai/pulse
// @exclude https://gab.ai/following
// @exclude https://gab.ai/followers
// @grant none
// ==/UserScript==
$(document).ready(function(){
var btndiv = document.createElement("div");
$(btndiv).click(function(){
var numfollowers = user.follower_count;
var numfollowing = user.following_count;
var numposts = user.post_count;
var introduction = "";
var rextags = /#[A-Za-z0-9_]+/gmi;
var rexats = /@[A-Za-z0-9_]+/gmi;
var plist = (postlist.posts.length > 0) ? postlist.posts : userpostlist.posts;
var mentions = 0;
var replies = 0;
var reposts = 0;
var replyreposts = 0;
var regularposts = 0;
var totalposts = plist.length;
var tags = {};
var ats = {};
var votetotal = 0;
var gifposts = 0;
var linkposts = 0;
var textposts = 0;
var days = new Array(7);
days[0] = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];
days[1] = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];
days[2] = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];
days[3] = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];
days[4] = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];
days[5] = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];
days[6] = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];
for(var p in plist)
{
var body = plist[p].post.body;
var rexgif = /giphy\.com\/media\/\w+\/[\w-_]+\.gif/gmi;
if(plist[p].post.embed.html)
{
if(rexgif.test(plist[p].post.embed.html))
gifposts++;
else
linkposts++;
}
else
{
textposts++;
}
// gather tags
var m = rextags.exec(body);
var posttextval = body;
while(m && m.length > 0)
{
var ttext = m[0].toLowerCase();
if(tags[ttext] === undefined)
tags[ttext] = 1;
else
tags[ttext]++;
posttextval = posttextval.substr(m.index + m[0].length);
m = rextags.exec(posttextval);
}
var cdate = Date.parse(plist[p].post.created_at);
cdate = new Date(cdate);
var day = cdate.getDay();
var hour = cdate.getHours();
days[day][hour]++;
var type = null;
if(plist[p].type == "repost" && !plist[p].post.is_reply)
{
type = "repost";
reposts++;
}
else if(plist[p].type == "repost" && plist[p].post.is_reply)
{
type = "replyrepost";
replyreposts++;
}
else if(plist[p].post.is_reply)
{
type = "reply";
replies++;
}
else if(body.indexOf("@") === 0)
{
type = "mention";
mentions++;
}
else
{
regularposts++;
type = "post";
}
if(type == "post" && /#introduceyourself/gmi.test(body))
{
introduction = body;
}
if(type == "post" || type == "mention" || type == "reply")
{
m = rexats.exec(body);
posttextval = body;
while(m && m.length > 0)
{
var atext = m[0].toLowerCase();
if(ats[atext] === undefined)
ats[atext] = 1;
else
ats[atext]++;
posttextval = posttextval.substr(m.index + m[0].length);
m = rexats.exec(posttextval);
}
}
if(type == "post")
votetotal += plist[p].post.score;
}
var message = "";
if(introduction !== "")
message += "Introduction:\n" + introduction + "\n\n";
var percregposts = Math.round(100 * (regularposts / totalposts));
var percreposts = Math.round(100 * (reposts / totalposts));
var percreplies = Math.round(100 * (replies / totalposts));
var percreplyreposts = Math.round(100 * (replyreposts / totalposts));
var percmentions = Math.round(100 * (mentions / totalposts));
message += "Post Distribution:\n";
message += Math.round(100 * (regularposts / totalposts)) + "% posts\n";
message += Math.round(100 * (reposts / totalposts)) + "% reposts\n";
message += Math.round(100 * (replies / totalposts)) + "% replies\n";
message += Math.round(100 * (replyreposts / totalposts)) + "% reply reposts\n";
message += Math.round(100 * (mentions / totalposts)) + "% mentions\n";
message += "\n\n";
message += "Content Distribution:\n";
message += Math.round(100 * (textposts / totalposts)) + "% text posts\n";
message += Math.round(100 * (linkposts / totalposts)) + "% link posts\n";
message += Math.round(100 * (gifposts / totalposts)) + "% gif posts\n";
message += "\n\n";
message += "Schedule:\n";
var daynames = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"];
for(var d = 0; d < days.length; d++)
{
var daystr = daynames[d][0] + "";
var daytotal = 0;
for(var h = 0; h < days[d].length; h++)
{
if(days[d][h] === 0)
daystr += "▁";
else if(days[d][h] > 0 && days[d][h] <= 2)
daystr += "▃";
else if(days[d][h] > 2 && days[d][h] <= 6)
daystr += "▅";
else if(days[d][h] > 6)
daystr += "█";
daytotal += days[d][h];
}
daystr += "\n";
message += daystr;
}
message += "\n\n";
message += "Avg Score: " + Math.round(votetotal/regularposts) + " per " + regularposts + " posts\n\n";
var sorttags = [];
for(var t in tags)
{
sorttags.push({tag:t, count:tags[t]});
}
if(sorttags.length > 0)
{
message += "Top Tags:\n";
sorttags.sort(sortobjs);
for(var tt = 0; tt < Math.min(sorttags.length,5); tt++)
{
message += sorttags[tt].tag + ": " + sorttags[tt].count + "\n";
}
}
message += "\n";
var sortmentions = [];
for(var a in ats)
{
sortmentions.push({at:a, count:ats[a]});
}
if(sortmentions.length > 0)
{
message += "Top Mentions:\n";
sortmentions.sort(sortobjs);
for(var aa = 0; aa < Math.min(sortmentions.length,10); aa++)
{
message += sortmentions[aa].at + ": " + sortmentions[aa].count + "\n";
}
}
alert(message);
});
var styling = "float: right; display: inline-block; background: #e14283; color: white; padding: 5px 20px; text-transform: uppercase; letter-spacing: 3px; margin-top: 5px; margin-right: 10px; border-radius: 3px; text-decoration: none; -webkit-transition: background .2s, opacity .2s; transition: background .2s, opacity .2s;";
$(btndiv).html('<a style="position:fixed; bottom:10px; right:10px; ' +styling + '" href="#" class="composer__content__button"><span>Profile User</span></a>');
$(document.body).append(btndiv);
});
function sortobjs(a,b) {
if (a.count > b.count)
return -1;
if (a.count < b.count)
return 1;
return 0;
}