NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript==
// @name TJ User Tagging
// @namespace Violentmonkey Scripts
// @match https://tjournal.ru/*
// @grant none
// @version 1.12
// @license MIT
// @author -
// @description 3/29/2020, 5:46:18 PM
// @grant GM_getValue
// @grant GM_setValue
// @grant GM_addValueChangeListener
// ==/UserScript==
let tags = {};
function save(){
GM_setValue('tags', JSON.stringify(tags, (k, v) => v ? v : void 0));
tagsUpdate();
}
function setTag(userId, targetNode) {
let oldColor = '#' + ((tags[userId] ? tags[userId].split('#')[1] : null) || '888888');
let newTag = prompt('Тег, или тег#цвет:', tags[userId] ? tags[userId].split('#')[0] : '');
if (newTag == null) return;
Object.assign(tags, { [userId]: newTag });
save();
if (newTag && newTag.indexOf('#') === -1){
let colorPicker = document.body.appendChild(document.createElement('input'));
let rect = targetNode ? targetNode.getBoundingClientRect() : { x: 32, y: 32 };
colorPicker.type = 'color';
colorPicker.value = oldColor;
colorPicker.style.width = '0px';
colorPicker.style.height = '0px';
colorPicker.style.position = 'fixed';
colorPicker.style.left = `${rect.x - 8}px`;
colorPicker.style.top = `${rect.y - 8}px`;
onchange = function(){
Object.assign(tags, { [userId]: newTag + colorPicker.value });
save();
document.body.removeChild(this);
};
setTimeout(() => colorPicker.click(), 10);
}
}
function svgIcon(){
return `<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="14" height="14" x="0px" y="0px" viewBox="0 0 512 512" style="enable-background:new 0 0 512 512;" xml:space="preserve"><path d="M458.667,0H323.349c-25.643,0-49.771,9.984-67.904,28.117L18.197,265.387C6.635,276.949,0,292.949,0,309.376 c0,16.341,6.635,32.341,18.197,43.904l140.544,140.544C170.283,505.365,186.283,512,202.709,512 c16.341,0,32.341-6.635,43.904-18.197l237.269-237.269C502.016,238.421,512,214.293,512,188.651V53.333 C512,23.915,488.085,0,458.667,0z M394.667,170.667c-29.419,0-53.333-23.915-53.333-53.333c0-29.419,23.915-53.333,53.333-53.333 S448,87.915,448,117.333C448,146.752,424.085,170.667,394.667,170.667z"/></svg>`;
}
function addTagButton() {
let target = document.querySelector('.etc_control[data-subsite-url]');
if (target && !document.querySelector('._tg')) {
with (target.insertAdjacentElement('beforebegin', document.createElement('div'))) {
onclick = function(){ /\/(\d+)-/.test(location.href) && setTag(RegExp.$1, this); };
className = '_tg v-button v-button--default v-button--size-default';
innerHTML = `<div class="v-button__icon">${svgIcon()}</div><span class="v-button__label"></span>`
}
}
setTimeout(addTagButton, 500);
}
function isColorDark(color) {
return !color || (color.length == 6 ? parseInt(color.substr(2, 2), 16) : parseInt(color[1], 16) * 16) < 200;
}
function tagsUpdate() {
(window._tgStyle || (window._tgStyle = document.body.appendChild(document.createElement('style')))).innerHTML = `
.user_name:after, .content-header-author:after, .vote__users__item .vote__users__item__name:after, .live__item__user:after {
display:inline-block; padding:3px 4px 2px 4px; margin:-2px 4px -3px 4px; border-radius:2px; font-weight:normal; font-size:small;
}
.vote__users__item .vote__users__item__name:after {
padding:0 4px 0 4px; margin:-2px 4px -3px 4px;
}
.v-subscribe-button[data-subsite-id] ~ ._tg {
cursor:pointer; position: relative;
}
.v-subscribe-button[data-subsite-id] ~ ._tg span:after {
content:"Тег";
}
` + Object.keys(tags).filter(x => tags[x]).map(x =>
`a[href*="/${x}-"] .user_name:after,
.vote__users__item[href*="/${x}-"] .vote__users__item__name:after,
.content-header-author[href*="/${x}-"]:after,
.live__item__user[href*="/${x}-"]:after,
.v-subscribe-button[data-subsite-id="${x}"] ~ ._tg,
.v-subscribe-button[data-subsite-id="${x}"] ~ ._tg span:after {
content: "${tags[x].split('#')[0]}";
background: #${tags[x].split('#')[1] || '888'} !important; color: #${isColorDark(tags[x].split('#')[1]) ? 'fff' : '000'} !important;
}
.v-subscribe-button[data-subsite-id="${x}"] ~ ._tg .v-button__icon {
filter: ${isColorDark(tags[x].split('#')[1]) ? 'invert(1)' : 'none'};
}`).join('\n');
}
function init(secondRun){
try {
tags = JSON.parse(GM_getValue('tags', '{}') || '{}');
} catch (e){
tags = {};
}
if (!secondRun) addTagButton();
tagsUpdate();
}
init(false);
GM_addValueChangeListener('tags', function(changes, namespace) {
init(true);
});