NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript==
// @name DISQUS for Mobile
// @namespace
// @version 3.3.2
// @description DISQUS Enhancer for Mobile
// @include https://disqus.com/home/discussion*
// @include https://disqus.com/home/inbox/
// @include https://disqus.com/home/
// @include https://disqus.com/home/forum/*
// @include https://disqus.com/by/*
// @include https://disqus.com/
// @copyright 2017+, Joeviocoe
// @license MIT
// @require https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js
// @icon https://www.google.com/s2/favicons?domain=disqus.com
// @grant none
// @noframes
// ==/UserScript==
// Copyright (c) 2017, Joeviocoe
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//
// * Redistributions of source code must retain the above copyright notice,
// this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above copyright notice,
// this list of conditions and the following disclaimer in the documentation
// and/or other materials provided with the distribution.
// * Neither the name of Joeviocoe nor the names of its contributors
// may be used to endorse or promote products derived from this software
// without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE.
//
/*jslint browser: true*/
/*global $, jQuery, alert */
var dsq, body, win, api = "E8Uh5l5fHZ6gD8U3KycjAIAk46f68Zw7C6eW8WSjZvCLXebZ7p0r1yrYDrLilk2F";
////////////////////////////////////////////////////////////////////////////////////////////////////////
function waitFor(selector, inside, callback) {
if ( $(inside).contents().find(selector).length ) {
callback();
} else {
setTimeout(function() {
waitFor(selector, inside, callback);
}, 250);
}
}
function repeater(callback, delay, repetitions) {
var x = 0;
var intervalID = window.setInterval(function () {
callback();
if (++x === repetitions) {
window.clearInterval(intervalID);
}
}, delay);
}
function getBody(){
var d = new Date(), h = d.getHours(), m = d.getMinutes(), s = d.getSeconds();
dsq = $('iframe[id*="dsq"]').last().attr("id"); console.log("DE: DSQ: " + dsq + " - " + h+":"+m+":"+s);
body = ''; if ( typeof dsq == 'undefined') { body = $('body'); } else { body = $("#"+dsq).contents().find('body'); }
win = ''; if ( typeof dsq == 'undefined') { win = $('window'); } else { win = $("#"+dsq)[0].contentWindow; }
}
function Buttons() {
$('header.site-nav--wrapper').css("position","fixed");
$('a[href="/"]').attr("href", "/home/discussions/");
$('button[data-action="create-discussion"]').attr("data-action","refresh-drawer").attr("onclick", "location.reload(true)");
$('span.icon-create-discussion').attr("class","icon-refresh icon-medium").wrap('<a href="#">');
var home = $('a[href="/home/"][data-page-icon="home"]');
var notifications = $('a[href="/home/inbox/"][data-page-icon="inbox"]');
if ( home.length > 0 & notifications.length > 0 ) {
home.children('span').html(home.children('span').html().replace("Home",""))
home.attr("href", "/home/discussions/").css("margin-left","25px");
notifications.children('span').html(notifications.children('span').html().replace("Notifications",""))
notifications.css("margin-left","25px");
}
$('.align:first').append(home).append(notifications);
$('.notif-count').css("top","auto").css("margin-top","3px").css("margin-right","5px").css("left","auto");
$('.site-nav--secondary').remove();
body.find('.wysiwyg__item.hidden-md').removeClass('hidden-md');
}
function RemoveTrollAvatar() {
body.find('img[src*="avatar92.jpg?1500479976"]').attr('src','//a.disquscdn.com/1523321660/images/noavatar92.png');
body.find('img[src*="avatar92.jpg?1513645725"]').attr('src','//a.disquscdn.com/1523321660/images/noavatar92.png');
body.find('img[src*="avatar92.jpg?1546868353"]').attr('src','//a.disquscdn.com/1523321660/images/noavatar92.png');
body.find('#reactions__container').remove();
}
function unReferLinks() {
setTimeout(function() {
$('a.button-lnk[href*="/home/discussion"]').each(function() {
$(this).attr("target","_newtab")
});
body.find('.comment-policy').remove();
if ( window.location.href.indexOf('//disqus.com/home/inbox/') >= 0 ) {
$('.view-comment').not('.cloned').addClass('cloned').css("margin-left","10px").each(function() {
$(this).clone().addClass('all-comments').appendTo( $(this).parent() );
$(this).children('span:contains("View")').text("Comment");
});
$('.all-comments').each(function(){
$(this).attr("href",$(this).attr("href").split("#")[0]).css("margin-left","2px");
$(this).children('span:contains("View")').text("Discussion");
});
}
body.find('a[href*="disq.us"]').each(function(){
$(this).attr("href", decodeURIComponent($(this).attr("href")).replace("/url","/").split("disq.us/?url=")[1].split(":").slice(0,2).join(':') );
$(this).attr("href", $(this).attr("href").split("&key=")[0] );
});
}, 1000);
}
function Downvotes(){
body.find('.vote-down[dvmark!="1"]').attr('dvmark','1').each(function(){
if ( $(this).attr('class').indexOf('count-') >= 0 ) {
var dv = $(this).attr('class').split('count-')[1].split(' ')[0];
if ( dv > 0 ) {
$(this).append("<span class='updatable count' data-role='likes' style='color: gray;position: relative;top: -1px;font-size: 13px;'> " + dv + "</span>");
}
}
});
}
function showDetails(username){
var userdetails = [];
var req = "https://disqus.com/api/3.0/users/details?user=username%3A"+username+"&api_key="+api;
$.get(req, function(data) {
var arr = data.response;
userdetails.push("Name: "+arr["name"]);
userdetails.push("Username: "+arr["username"]);
userdetails.push("Joined: "+arr["joinedAt"].replace('T',' '));
userdetails.push("Private: "+arr["isPrivate"]);
userdetails.push("ID: "+arr["id"]+"\n");
userdetails.push("Posts: "+arr["numPosts"]);
userdetails.push("Upvotes: "+arr["numLikesReceived"]);
userdetails.push("Reputation: "+arr["reputationLabel"]+" ("+arr["rep"]+")");
userdetails.push("Followers: "+arr["numFollowers"]);
userdetails.push("Following: "+arr["numFollowing"]);
userdetails.push("Forums: "+arr["numForumsFollowing"]+"\n");
userdetails.push("Primary: "+arr["isPrimary"]);
userdetails.push("Anonymous: "+arr["isAnonymous"]);
userdetails.push("Moderator: "+arr["isPowerContributor"]);
userdetails.push("disable3rdPartyTrackers: "+arr["disable3rdPartyTrackers"]+"\n");
userdetails.push("ProfileUrl: "+arr["profileUrl"]);
userdetails.push("URL: "+arr["url"]);
userdetails.push("SignedUrl: "+arr["signedUrl"]);
userdetails.push("Location: "+arr["location"]);
userdetails.push("About: "+arr["about"]);
alert(userdetails.join('\n'));
console.log(userdetails.join('\n'));
});
}
function getDetails(){
body.find('span.author').children('a[data-action="profile"][cloned!="1"]').attr('cloned','1').each(function(){
var button = $(this).clone();
var username = button.attr('data-username');
button.attr('class','profile_details').insertAfter( $(this) ).text("ℹ").removeAttr('href').removeAttr('data-action');
button.css('padding-top','4px').css('padding-left','12px').css('padding-right','20px'); button[0].style.setProperty( 'color', 'gray', 'important' );
button.off().on('click',function(){
showDetails(username);
});
});
body.find('a.name[cloned!="1"]').attr('cloned','1').each(function(){
var button = $(this).clone();
var username = button.attr('href').split('/by/')[1].replace('/','');
button.attr('class','profile_details').insertAfter( $(this) ).text("ℹ").removeAttr('href');
button.css('padding-top','4px').css('padding-left','12px').css('padding-right','20px'); button[0].style.setProperty( 'color', 'gray', 'important' );
button.off().on('click',function(){
showDetails(username);
});
});
}
function getUpvotes(){
body.find('a.vote-up[cloned!="1"]').attr('cloned','1').each(function() {
if ( parseInt($(this).get(0).innerText) > 0 ) {
var button = $(this).clone();
button.attr('class','vote-up showvoted').insertAfter( $(this) ).text("ℹ").removeAttr('href').removeAttr('data-action');
button.css('padding-top','4px'); button[0].style.setProperty( 'color', 'gray', 'important' );
button.off().on('click',function(){
var thread = button.siblings('a.view-comment').attr('data-thread-id') || $('meta[content*="threads"]').attr("content");
thread = thread.split("threads/")[1] || thread;
var post = button.siblings('a.view-comment').attr('href') || button.parents('li.post').attr('id');
post = post.split("comment-")[1] || post.split('post-')[1];
console.log("DSQ: Parse upvotes for thread " + thread + " post " + post);
var req = "https://disqus.com/api/3.0/posts/listUsersVotedPost?post="+post+"&thread="+thread+"&vote=1&limit=50&api_key="+api;
$.get( req, function( data ) {
for ( i=0; i<data.response.length; i++ ){
var upvoter = data.response[i];
showDetails(upvoter["username"]);
}
});
});
}
});
}
function expandTruncate() {
waitFor('.truncate', 'body', function() {
if ( $('.truncate').length > 0 || $('.truncate-line').length > 0 ) {
$('.truncate').each(function() { $(this).text( $(this).attr("title") ); });
$(".truncate").removeClass("truncate"); $(".truncate-line").removeClass("truncate-line").removeAttr("href");
}
});
}
function orderFeeds() {
waitFor('.card[age]', 'body', function() {
var timearray = ["second","minute","hour","day","month"];
$.each(timearray, function(i, time) {
for (i=1; i<60; i++) {
if ( i == 1 ) { j="a" } else { j=i }
if ( i == 1 && time == "hour" ) { j="an" }
$('.card[age*="'+j+" "+time+'"]').detach().appendTo('.layout__content.homepage-feed');
}
expandTruncate();
$('.card-body').css('width','auto').css('padding-bottom','20px');
});
});
}
function feedFrame(id, src, name){
$('div[data-jester-area="feed"]').remove();
$('<iframe>', {
id: id,
src: src,
class: 'feedframe',
width: $(window).width(),
height: 1,
frameborder: 0,
scrolling: 'no'
}).appendTo('#container-page').on('load',function(){
repeater(function() {
$('iframe#'+id).contents().find('.card.card-profile.card-profile-forum').attr("forum",name).detach().appendTo('.layout__content.homepage-feed');
$('.card[forum="'+name+'"]').find('.card-reason').each(function() {
$(this).text( $(this).text().replace("Recent activity", ""+name+": ") );
$(this).parents('.card.card-profile.card-profile-forum').attr("age",$(this).text().split(": ")[1].trim());
});
orderFeeds();
expandTruncate();
}, 1000, 30);
});
}
function feedFrames(){
var name = $('.name')[0].href.split("/")[4];
var req = "https://disqus.com/api/3.0/users/listFollowingForums?limit=100&user=username:"+name+"&order=desc&cursor=&api_key="+api;
$.get( req, function( data ) {
for ( i=0; i<data.response.length; i++ ){
var id = data.response[i].id;
var src = "https://disqus.com/home/forum/"+id+"/";
var name = data.response[i].name;
feedFrame(id, src, name);
}
});
}
////////////////////////////////////////////////////////////////////////////////////////////////////////
function run(){
getBody();
Buttons();
RemoveTrollAvatar();
unReferLinks();
Downvotes();
getUpvotes();
getDetails();
expandTruncate();
}
function Initialize(){
var counter = 0, el = $(window), lastY = el.scrollTop();
getBody();
window.addEventListener('scroll', function() {
if ( counter === 0 ) {
setTimeout (function() {
run();
var currY = el.scrollTop();
if ( currY > lastY) {
$('header.site-nav--wrapper').slideUp();
lastY = currY - 100;
} else {
$('header.site-nav--wrapper').slideDown();
lastY = currY + 100;
}
counter = 0;
}, 100);
}
counter++;
});
window.addEventListener('click', function() {
if ( counter === 0 ) { setTimeout (function() { console.log("DE: Click (window)"); run(); counter = 0; }, 500); }
counter++;
});
body.off().on('click', function() {
if ( counter === 0 ) { setTimeout (function() { console.log("DE: Click (body)"); run(); counter = 0; }, 500); }
counter++;
});
body.click();
if (window.location.href.indexOf('https://disqus.com/home/discussions/') >=0 ) {
setTimeout(function(){
feedFrames();
},2000);
}
}
console.log( "DE: Start of DISQUS_ENHANCER" );
setTimeout (function() {
var expand_timer = setInterval (function() {
console.log( "DE: Waiting" );
getBody();
if ( $(".card__content").length > 0 || $(".card-profile").length > 0 ) {
clearInterval(expand_timer);
console.log( "DE: Initializing" );
Initialize();
Buttons();
}
}, 1000);
}, 1000);