// ==UserScript==
// @name Ukrainian Steam Improvements
// @description Adds (1) the state flag for games that have Ukrainian language, (2) alert emojis for ua and ru -made games, (3) prices at the top, (4) more noticeable score over the game banner.
// @include https://store.steampowered.com/*
// @grant GM_addStyle
// @icon https://community.akamai.steamstatic.com/public/images/countryflags/ua.gif
// @license https://creativecommons.org/licenses/by-sa/4.0/
// @author Prudten
// @version 1.1.2
// @namespace https://greasyfork.org/users/1235514
// ==/UserScript==
'use strict';
GM_addStyle(`
.btn_red_steamui {
border-radius: 2px;
border: none;
padding: 1px;
display: inline-block;
cursor: pointer;
text-decoration: none !important;
color: #D28BA9; !important;
background: transparent; text-shadow: 1px 1px 0px rgba( 0, 0, 0, 0.3 );}
.btn_red_steamui > span {
border-radius: 2px;
display: block;
background: #D34320;
background: -webkit-linear-gradient( top, #D34320 5%, #BC261B 95%);
background: linear-gradient( to bottom, #D34320 5%, #BC261B 95%);
background: linear-gradient( to right, #D94C22 5%, #BC261B 95%); }
.btn_red_steamui:not(.btn_disabled):not(:disabled):not(.btn_active):not(.active):hover {
text-decoration: none !important;
color: #fff; !important;
background: transparent; }
.btn_red_steamui:not(.btn_disabled):not(:disabled):not(.btn_active):not(.active):hover > span {
background: #8E0E29;
background: -webkit-linear-gradient( top, #8E0E29 5%, #CE4221 95%);
background: linear-gradient( to bottom, #8E0E29 5%, #CE4221 95%);
background: linear-gradient( to right, #8E0E29 5%, #CE4221 95%); }
.btn_red_steamui.btn_active, btn_red_steamui.active {
text-decoration: none !important;
color: #fff; !important;
background: transparent; }
.btn_red_steamui.btn_active > span, btn_red_steamui.active > span {
background: #8E0E29;
background: -webkit-linear-gradient( top, #8E0E29 5%, #CE4221 95%);
background: linear-gradient( to bottom, #8E0E29 5%, #CE4221 95%);
background: linear-gradient( to right, #8E0E29 5%, #CE4221 95%); }
.discount_block .discount_pct_red, .discount_pct_red {
font-family: "Motiva Sans", Sans-serif;
font-weight: normal; /* normal */
font-weight: 500;
color: #FF2611;
background: #B00722;
display: inline-block;
}
.game_purchase_discount .discount_pct_red,
.game_purchase_discount .bundle_base_discount {
display: inline-block;
height: 32px;
line-height: 32px;
font-size: 25px;
text-align: center;
overflow: hidden;
padding: 0 6px;
}
.image-container {
position: relative;
display: inline-block;
}
.overlay-text {
position: absolute;
bottom: 0;
right: 0;
background-color: #A00000;
font-size: 20px;
}
.box {
position: absolute;
bottom: 0;
right: 0;
background-color: #FF0000;
float: left;
height: 40px;
width: 40px;
margin-bottom: 1%;
display: flex;
justify-content: center;
align-items: center;
color: #272727;
font-size: 25px;
font-weight: bold;
font-family: HelveticaNeue;
}
.score95 {
background-color: #00D25F;
}
.score85 {
background-color: #66CC33;
}
.score75 {
background-color: #98DD75;
}
.score70 {
background-color: #FFCC33;
}
.score55 {
background-color: #FE9640;
}
`);
function insertAfter(newNode, existingNode) {
existingNode.parentNode.insertBefore(newNode, existingNode.nextSibling);
}
function isNumeric(str) {
if (typeof str != "string") return false
return !isNaN(str) && !isNaN(parseFloat(str))
}
if(window.location.toString().includes("app")) {
// check translations
var cells = document.getElementsByClassName("ellipsis");
var title = document.getElementsByClassName("apphub_AppName")[0];
var oldTitle = title.innerHTML;
var uagif = "<img src=\"https://community.akamai.steamstatic.com/public/images/countryflags/ua.gif\">";
var notSupported = ["\n Не підтримується ",
"\n\t\t\t\t\tНе підтримується\t\t\t\t"];
var russian = ["\n Russian ",
"\n\t\t\t\tRussian\t\t\t",
"\n російська ",
"\n\t\t\t\tросійська\t\t\t"];
var ukrainian = ["\n Ukrainian ",
"\n\t\t\t\tUkrainian\t\t\t",
"\n українська ",
"\n\t\t\t\tукраїнська\t\t\t"];
var sunflower = "🌻"
Array.prototype.forEach.call(cells, function(cell) {
if (russian.includes(cell.textContent) &&
!notSupported.includes(cell.nextSibling.nextSibling.textContent)) {
sunflower = "";
};
});
Array.prototype.forEach.call(cells, function(cell) {
if (ukrainian.includes(cell.textContent) &&
!notSupported.includes(cell.nextSibling.nextSibling.textContent)) {
var original_ua = cell.textContent.split(/(\p{L}.*)/u);
cell.innerHTML = original_ua[0] + uagif + " " + original_ua[1];
title.innerHTML = `${oldTitle} ${sunflower}${uagif}`;
};
});
// check if it's Ukrainian
oldTitle = title.innerHTML;
var imgs = document.getElementsByTagName("img");
var ridne = "93f3a9d4a6868bbaadc90dbbeeecfa13770a59a1";
Array.prototype.forEach.call(imgs, function(img) {
var imgName = img.src.split("/").pop()
if ((imgName == `${ridne}.jpg`) ||
(imgName == `${ridne}_medium.jpg`) ||
(imgName == `${ridne}_full.jpg`)) {
title.innerHTML = `💙💛 ${oldTitle}`;
};
});
// check if it's made by 🐷🐶
oldTitle = title.innerHTML;
var prices = document.querySelectorAll('.game_purchase_price, .discount_final_price');
var btns = document.querySelectorAll('.btn_green_steamui, .btn_blue_steamui');
var dscs = document.querySelectorAll('.discount_pct');
var roosnya = false;
var niroosni = ["329f37319a1d6a0c79c67a388414278e3b2996c0.jpg",
"329f37319a1d6a0c79c67a388414278e3b2996c0_medium.jpg",
"329f37319a1d6a0c79c67a388414278e3b2996c0_full.jpg",
"992f3008daabfe9a3a795896a407525ce11b1cc5.jpg",
"992f3008daabfe9a3a795896a407525ce11b1cc5_medium.jpg",
"992f3008daabfe9a3a795896a407525ce11b1cc5_full.jpg",
"5d05c9a196c34e3860fcb34a389c8d0cd6801de8.jpg",
"5d05c9a196c34e3860fcb34a389c8d0cd6801de8_medium.jpg",
"5d05c9a196c34e3860fcb34a389c8d0cd6801de8_full.jpg"];
Array.prototype.forEach.call(imgs, function(img) {
var imgName = img.src.split("/").pop();
if (!roosnya && niroosni.includes(imgName)) {
roosnya = true;
title.innerHTML = `🐷🐶 <font color="red">${oldTitle}</font>`;
Array.prototype.forEach.call(prices, function(price) {
var oldPrice = price.innerHTML;
price.innerHTML = `<font color="red">${oldPrice}</font> 🐷🐶`;
});
Array.prototype.forEach.call(btns, function(btn) {
btn.classList.remove('btn_green_steamui','btn_blue_steamui');
btn.classList.add('btn_red_steamui');
});
Array.prototype.forEach.call(dscs, function(dsc) {
dsc.classList.remove('discount_pct');
dsc.classList.add('discount_pct_red');
});
};
});
// add elements to the top right corner
var hub = document.getElementsByClassName("btnv6_blue_hoverfade")[0];
hub.innerHTML = "\n <span>✚</span>\n ";
var price = document.createElement("div");
price.classList.add('btnv6_blue_hoverfade','btn_medium');
insertAfter(price, hub);
// check if it's not a demo
if ((document.getElementsByClassName("game_purchase_action").length > 1) &&
(document.getElementById("demoGameBtn"))) {
var priceNode = document.getElementsByClassName("game_purchase_action")[1];
} else {
var priceNode = document.getElementsByClassName("game_purchase_action")[0];
};
// check if it's not released yet
if (document.getElementsByClassName("game_area_comingsoon")[0]) {
var priceText = "В розробці";
if (roosnya) {
priceText = `<font color="red">${priceText}</font> 🐷🐶`;
};
// check the price if it's been released
} else if (priceNode.getElementsByClassName("game_purchase_price").length > 0) {
var priceText = priceNode.getElementsByClassName("game_purchase_price")[0].innerHTML;
// check if it's a free game
if (document.getElementById("freeGameBtn")) {
priceText = `<font color="#beee11">${priceText}</font>`;
};
// check if it's on sale
} else if (priceNode.getElementsByClassName("discount_final_price").length > 0) {
var priceText = priceNode.getElementsByClassName("discount_final_price")[0].innerHTML;
var discount = document.createElement("div");
discount.classList.add('btnv6_blue_hoverfade','btn_medium');
insertAfter(discount, hub);
if (roosnya) {
var discountText = priceNode.getElementsByClassName("discount_pct_red")[0].innerHTML;
discount.innerHTML = `<span><font color="red">${discountText}</font></span>`;
} else {
var discountText = priceNode.getElementsByClassName("discount_pct")[0].innerHTML;
//discount.innerHTML = `<span><font color="#66cc33">${discountText}</font></span>`;
discount.innerHTML = `<span><font color="#a3cf06">${discountText}</font></span>`;
//discount.innerHTML = `<span><font color="#beee11">${discountText}</font></span>`;
};
discount.insertAdjacentText('beforebegin', `\n `);
} else if ((priceNode.getElementsByClassName("game_purchase_price").length === 0) &&
(priceNode.getElementsByClassName("btn_addtocart").length > 0)) {
var priceText = `<font color="#beee11">Безкоштовно</font>`;
};
price.innerHTML = `<span>${priceText}</span>`;
price.insertAdjacentText('beforebegin', `\n `);
// add score
var banner = document.getElementsByClassName("game_header_image_full")[0];
var banner_parent = banner.parentNode;
var banner_wrapper = document.createElement('div');
banner_wrapper.classList.add("image-container");
banner_parent.replaceChild(banner_wrapper, banner);
banner_wrapper.appendChild(banner);
var score_txt = document.getElementsByClassName("user_reviews_summary_row")[1];
if (!score_txt.hasAttribute("data-tooltip-html")) {
score_txt = document.getElementsByClassName("user_reviews_summary_row")[0];
};
score_txt = score_txt.getAttribute("data-tooltip-html").split('%', 1);
if (isNumeric(score_txt[0])) {
var score_int = parseInt(score_txt);
var score = document.createElement("div");
score.classList.add('box');
score.textContent = score_txt;
if (score_int > 95) {
score.classList.add('score95');
} else if (score_int >= 85) {
score.classList.add('score85');
} else if (score_int >= 75) {
score.classList.add('score75');
} else if (score_int >= 70) {
score.classList.add('score70');
} else if (score_int >= 55) {
score.classList.add('score55');
};
banner_wrapper.appendChild(score);
};
};
// insert html inside a text
// and replace specific part of that text
// i.e. insert a tag inside a text node
// from https://stackoverflow.com/a/29301739
// huy znaye yak vono robe ale krasyvo
var matchText = function(node, regex, callback, excludeElements) {
excludeElements || (excludeElements = ['script', 'style', 'iframe', 'canvas']);
var child = node.firstChild;
while (child) {
switch (child.nodeType) {
case 1:
if (excludeElements.indexOf(child.tagName.toLowerCase()) > -1)
break;
matchText(child, regex, callback, excludeElements);
break;
case 3:
var bk = 0;
child.data.replace(regex, function(all) {
var args = [].slice.call(arguments),
offset = args[args.length - 2],
newTextNode = child.splitText(offset+bk), tag;
bk -= child.data.length + all.length;
newTextNode.data = newTextNode.data.substr(all.length);
tag = callback.apply(window, [child].concat(args));
child.parentNode.insertBefore(tag, newTextNode);
child = newTextNode;
});
regex.lastIndex = 0;
break;
}
child = child.nextSibling;
}
return node;
};
// add spaces before ₴ sign
matchText(document.body, new RegExp("₴", "g"), function(node, match, offset) {
var hryvnia = document.createElement("span");
hryvnia.style.cssText += "font-family: 'Calibri Light'; font-weight: bold; font-size: 110%;";
hryvnia.innerHTML = " ₴";
return hryvnia;
});