// ==UserScript==
// @name Decreased Productivity Plus
// @icon http://i.imgur.com/ffgP58A.png
// @namespace skoshy.com
// @version 0.9.15
// @description Makes webpages more discreet
// @author Stefan Koshy
// @match *://*/*
// @match http*://*.messenger.com/*
// @match http*://*.slack.com/messages/*
// @match http*://mail.google.com/mail/*
// @match http*://hangouts.google.com/webchat/*
// @grant GM_getValue
// @grant GM_setValue
// ==/UserScript==
var DEBUG_MODE = false;
var SCRIPT_ID = 'dpplus';
var CURRENT_SITE = getCurrentSite();
// From https://gist.github.com/arantius/3123124
// These are replacement functions for GreaseMonkey scripts, but the only work on a single domain instead of being cross domain
// Todo: Implement solution that works cross domain
if (typeof GM_getValue == 'undefined') {
function GM_getValue(aKey, aDefault) {
'use strict';
let val = localStorage.getItem(SCRIPT_ID + aKey);
if (null === val && 'undefined' != typeof aDefault) return aDefault;
return val;
}
}
if (typeof GM_setValue == 'undefined') {
function GM_setValue(aKey, aVal) {
'use strict';
localStorage.setItem(SCRIPT_ID + aKey, aVal);
}
}
var css = {};
css.defaults = {};
css.defaults.imageOpacity = '.05';
css.defaults.imageOpacityHover = '.4';
css.defaults.imageOpacitySmall = '.2';
css.defaults.imageOpacitySmallHover = '.55';
css.overrides = {};
css.overrides.disableUnfocusedTransparency = [
'gmailhangouts'
];
css.common = {};
css.common.css = `
html {
transition: opacity .1s ease-in-out;
}
html.unfocused {
opacity: .1;
}
html, body, div, p, span, a, table, td {
font-family: Arial, sans-serif !important;
font-size: 13px !important;
font-weight: 400 !important;
color: #222 !important;
background-color: rgba(255, 255, 255, .3) !important;
}
img, figure, video
{opacity: {{imageOpacity}};}
img:hover, figure:hover, video:hover
{opacity: {{imageOpacityHover}};}
`;
css.messenger = {};
css.messenger.css = `
._1z8r img {font-size: 30px !important; opacity: .2;} /* Reaction images (emoji) in the react popup */
._55lt img, /* Left hand avatars */
._4ld- div[style]:not([class]), /* Left hand avatars (group icons) */
._3xn1, /* Link Thumbnails */
._4tsk, /* Photo Messages */
.img, /* Other images */
[role="img"], /* more images */
._2pon /* Little blue messenger overlays */
{opacity: {{imageOpacity}};}
._2560, /* Small Emoji */
._1ifu /* Medium Emoji (32x32) */
{ opacity: .2; }
._55lt img:hover,
._4ld- div[style]:not([class]):hover,
._3xn1:hover,
._4tsk:hover,
.img:hover,
[role="img"]:hover,
._2pon:hover
{opacity: {{imageOpacityHover}};}
._1a-, /* small fb emojis */
.emoticon, /* embedded-in-messages emoji */
._5qi2 /* medium fb emojis standalone */
{opacity: {{imageOpacitySmall}};}
._1a-:hover,
.emoticon:hover,
._5qi2:hover,
{opacity: {{imageOpacitySmallHover}};}
/* Unread Messages override */
._1ht3 * { font-weight: bold !important; }
._52mr /* Get rid of messages background */
{ background-color: transparent !important; }
._hw2 ._53ij /* "Delete" Message Background Fix */
,.uiTooltipX .tooltipContent /* Various Tooltips */
{background-color: rgba(0,0,0,.1) !important;}
`;
css.slack = {};
css.slack.css = `
#col_channels_bg, #col_channels, #team_menu, #quick_switcher_btn, #team_menu_overlay, #col_channels_overlay {
background: #f9f9f9 !important;
} /* sidebar background */
#quick_switcher_btn #quick_switcher_label, #quick_switcher_btn .ts_icon, #quick_switcher_btn #quick_switcher_shortcut, body #team_menu_user_name {
color: #222 !important;
}
#team_header_user_name, /* username in sidebar */
body .channels_list_holder ul li .primary_action.im_name > *:not(.unread_highlights) /* Items in sidebar */
{color: black !important;}
body #channels_scroller.show_which_channel_is_active ul li.active .primary_action.im_name > *:not(.unread_highlights) /* Selected item in sidebar */
{color: black !important;}
#col_channels h2 {
color: black !important;
} /* section headers in sidebar */
#channels_scroller.show_which_channel_is_active ul li.active a.channel_name, #channels_scroller.show_which_channel_is_active ul li.active a.group_name, #channels_scroller.show_which_channel_is_active ul li.active a.im_name, #channels_scroller.show_which_channel_is_active ul li.active a.mpim_name, #channels_nav ul li.unread_link.active a {
background: #eee;
} /* highlighted things in slack, like the current tab you're looking at */
body:not(.sorting_mode) .channels_list_holder ul li a:hover, #monkey_scroll_wrapper_for_channels_scroller .monkey_scroll_bar,
body:not(.loading) #team_menu:hover, body:not(.loading) #team_menu.active, #quick_switcher_btn:hover, #quick_switcher_btn:active {
background: #ddd;
} /* highlighted things, hovering over them */
#channel_scroll_up /* the MORE UNREADS thing that shows up in the chat list when there's unread messages */
{top: 10px;}
.ts_tip .ts_tip_multiline_inner, .ts_tip:not(.ts_tip_multiline) .ts_tip_tip /* tooltip, like when mousing over a message reaction */
{background: rgba(0,0,0,.65) !important; border: 1px solid gray; color: white !important;}
#msgs_div img, #msgs_div figure, /* most images */
#msgs_div .member_image /* avatars in message panel */
{opacity: {{imageOpacity}};}
#msgs_div img:hover, #msgs_div figure:hover,
#msgs_div .member_image:hover
{opacity: {{imageOpacityHover}};}
`;
css.gmail = {};
css.gmail.css = `
.wl /*Background color */
{ background: white !important; }
.zE /* Unread Email rows */,
.yO /* Read Email Rows */
{ background: transparent !important; }
.TI .T-I-ax7, .z0 .T-I-ax7, .G-atb .T-I-ax7 /* Buttons, like the settings button, refresh, labels button, etc */
{ background: #ddd !important; }
.ZY /* Header that shows up if you're forwarding any email to a new email address */
{background-color: rgba(255,221,221,.2);}
`;
css.gmailhangouts = {};
css.gmailhangouts.css = `
.TsiDff /* Whole chat box */
{opacity: .2; transition: opacity .1s ease-in-out;}
.TsiDff:hover /* Hover over chat box */
{opacity: 1;}
.Ik /* Chat header */
{background: rgba(0,0,0,.5) !important;}
.uB /* Chat header, new message */
{background: rgba(83, 169, 63,.6) !important; border-bottom-color: rgba(83, 169, 63,.6);}
.GN * /* Chat header text */
{color: white !important;}
div.EV, /* Chat top button bar */
.iN /* Chat background */
{background: rgba(255, 255, 255, .9) !important;}
.Ia .Bb /* Chat list contact */
{transition: background .1s ease-in-out;}
.Ia .Bb:hover, .Ia .Bb:focus /* Chat list contact, hovering */
{background: rgba(35,35,35,.1);}
.Ia .Bb>.R8jgRe>.ng /* Chat list, contact text */
{text-shadow: none;}
`;
css.inbox = {};
css.inbox.css = `
.ss, .qG, .qG * /* Bolded Messages */
{ font-weight: bold !important; }
`;
css.none = {};
css.none.css = ``;
function addGlobalStyle(css, className, enabled, id) {
var head, style;
head = document.getElementsByTagName('head')[0];
if (!head) { return; }
style = document.createElement('style');
style.type = 'text/css';
style.innerHTML = css;
style.id = id;
style.className = className;
head.appendChild(style);
style.disabled = !enabled;
}
function getCssStyleElements() {
return document.getElementsByClassName(SCRIPT_ID+'-css');
}
function getBgElements() {
return document.querySelectorAll('[style*="url("]');
}
function getGradientString() {
return 'linear-gradient(rgba(255, 255, 255, 0.7) 0%, rgba(255, 255, 255, 0.7) 100%), ';
}
function enableStyle() {
var cssToInclude = '';
var bgEls = getBgElements();
var gradientString = getGradientString();
addGlobalStyle(parseCSS(
css.common.css + css[CURRENT_SITE].css
), SCRIPT_ID+'-css', true, SCRIPT_ID+'-css');
// enable all background image manipulations
for (var i = 0; i < bgEls.length; i++) {
bgEls[i].attributes.origBackgroundImage = bgEls[i].style.backgroundImage;
bgEls[i].style.backgroundImage = gradientString + bgEls[i].style.backgroundImage;
}
}
function disableStyle() {
var cssEls = getCssStyleElements();
var bgEls = getBgElements();
for (let i = 0; i < cssEls.length; i++) {
cssEls[i].parentNode.removeChild(cssEls[i]); // remove the element
}
// disable all background image manipulations
for (var i = 0; i < bgEls.length; i++) {
bgEls[i].style.backgroundImage = bgEls[i].attributes.origBackgroundImage;
}
}
function isStyleEnabled() {
var cssEl = document.getElementById(SCRIPT_ID+'-css');
return isTruthy(cssEl);
}
function parseCSS(parsed) {
for (attribute in css.defaults) {
exceptionToReplace = new RegExp('{{'+attribute+'}}', 'g');
parsed = parsed.replace(exceptionToReplace, css['defaults'][attribute]);
}
return parsed;
}
document.addEventListener("keydown", function(e) {
if (e.altKey === true && e.shiftKey === false && e.ctrlKey === false && e.metaKey === false && e.code == 'KeyI') {
if (isStyleEnabled()) {
disableStyle();
if (CURRENT_SITE != 'none') {GM_setValue( 'enabled_'+CURRENT_SITE , false );}
} else {
enableStyle();
if (CURRENT_SITE != 'none') {GM_setValue( 'enabled_'+CURRENT_SITE , true );}
}
}
});
function getCurrentSite() {
var url = document.documentURI;
var toReturn = 'none';
if (url.indexOf('messenger.com') != -1) toReturn = 'messenger';
if (url.indexOf('slack.com') != -1) toReturn = 'slack';
if (url.indexOf('mail.google.com') != -1) toReturn = 'gmail';
if (url.indexOf('hangouts.google.com/webchat') != -1) toReturn = 'gmailhangouts';
if (url.indexOf('inbox.google.com') != -1) toReturn = 'inbox';
return toReturn;
}
function init() {
var styleEnabled = GM_getValue( 'enabled_'+CURRENT_SITE , true );
if (CURRENT_SITE == 'none') styleEnabled = false; // don't automatically enable if the site isn't specifically tailored for the script
if (styleEnabled) {
enableStyle();
}
// unfocus / focus transparency effect
if (css.overrides.disableUnfocusedTransparency.indexOf(CURRENT_SITE) == -1) {
addEvent(window, "mouseout", function(e) {
e = e ? e : window.event;
var from = e.relatedTarget || e.toElement;
if (from == null) {
// the cursor has left the building
hideHtml();
} else {
showHtml();
}
});
addEvent(window, "mouseover", function(e) {
e = e ? e : window.event;
var from = e.relatedTarget || e.toElement;
if (from != null) {
showHtml();
}
});
}
}
function hideHtml() {
document.querySelector('html').classList.add('unfocused');
}
function showHtml() {
document.querySelector('html').classList.remove('unfocused');
}
init();
/*
* Utility functions
*/
function isTruthy(item) {
return !isFalsy(item);
}
// from https://gist.github.com/skoshy/69a7951b3070c2e2496d8257e16d7981
function isFalsy(item) {
if (
!item
|| (typeof item == "object" && (
Object.keys(item).length == 0 // for empty objects, like {}, []
&& !(typeof item.addEventListener == "function") // omit webpage elements
))
)
return true;
else
return false;
}
function addEvent(obj, evt, fn) {
if (obj.addEventListener) {
obj.addEventListener(evt, fn, false);
}
else if (obj.attachEvent) {
obj.attachEvent("on" + evt, fn);
}
}